Home | History | Annotate | Download | only in sys
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #include "lint.h"
     28 #include <string.h>
     29 #include <utime.h>
     30 #include <fcntl.h>
     31 #include <sys/stat.h>
     32 #include <sys/time.h>
     33 #include <sys/syscall.h>
     34 
     35 int
     36 futimens(int fd, const timespec_t times[2])
     37 {
     38 	return (syscall(SYS_utimesys, 0, fd, times));
     39 }
     40 
     41 int
     42 utimensat(int fd, const char *path, const timespec_t times[2], int flag)
     43 {
     44 	return (syscall(SYS_utimesys, 1, fd, path, times, flag));
     45 }
     46 
     47 #pragma weak _utime = utime
     48 int
     49 utime(const char *path, const struct utimbuf *times)
     50 {
     51 	struct utimbuf ltimes;
     52 	timespec_t ts[2];
     53 	timespec_t *tsp;
     54 
     55 	if (times == NULL) {
     56 		tsp = NULL;
     57 	} else {
     58 		/* use uucopy() to behave like a system call */
     59 		if (uucopy(times, &ltimes, sizeof (ltimes)) != 0)
     60 			return (-1);	/* uucopy() set errno to EFAULT */
     61 		ts[0].tv_sec = ltimes.actime;
     62 		ts[0].tv_nsec = 0;
     63 		ts[1].tv_sec = ltimes.modtime;
     64 		ts[1].tv_nsec = 0;
     65 		tsp = ts;
     66 	}
     67 	return (utimensat(AT_FDCWD, path, tsp, 0));
     68 }
     69 
     70 int
     71 utimes(const char *path, const struct timeval times[2])
     72 {
     73 	struct timeval ltimes[2];
     74 	timespec_t ts[2];
     75 	timespec_t *tsp;
     76 
     77 	if (times == NULL) {
     78 		tsp = NULL;
     79 	} else {
     80 		/* use uucopy() to behave like a system call */
     81 		if (uucopy(times, ltimes, sizeof (ltimes)) != 0)
     82 			return (-1);	/* uucopy() set errno to EFAULT */
     83 		ts[0].tv_sec = ltimes[0].tv_sec;
     84 		ts[0].tv_nsec = ltimes[0].tv_usec * 1000;
     85 		ts[1].tv_sec = ltimes[1].tv_sec;
     86 		ts[1].tv_nsec = ltimes[1].tv_usec * 1000;
     87 		tsp = ts;
     88 	}
     89 	return (utimensat(AT_FDCWD, path, tsp, 0));
     90 }
     91 
     92 #pragma weak _futimesat = futimesat
     93 int
     94 futimesat(int fd, const char *path, const struct timeval times[2])
     95 {
     96 	struct timeval ltimes[2];
     97 	timespec_t ts[2];
     98 	timespec_t *tsp;
     99 
    100 	if (times == NULL) {
    101 		tsp = NULL;
    102 	} else {
    103 		/* use uucopy() to behave like a system call */
    104 		if (uucopy(times, ltimes, sizeof (ltimes)) != 0)
    105 			return (-1);	/* uucopy() set errno to EFAULT */
    106 		ts[0].tv_sec = ltimes[0].tv_sec;
    107 		ts[0].tv_nsec = ltimes[0].tv_usec * 1000;
    108 		ts[1].tv_sec = ltimes[1].tv_sec;
    109 		ts[1].tv_nsec = ltimes[1].tv_usec * 1000;
    110 		tsp = ts;
    111 	}
    112 
    113 	if (path == NULL)
    114 		return (futimens(fd, tsp));
    115 
    116 	return (utimensat(fd, path, tsp, 0));
    117 }
    118