Module Name: src Committed By: manu Date: Wed Aug 17 07:22:35 UTC 2011
Modified Files: src/distrib/sets/lists/comp: mi src/lib/libc/sys: Makefile.inc utimes.2 src/sys/kern: syscalls.master vfs_syscalls.c Log Message: Add futimens(2) and part of utimnsat(2) To generate a diff of this commit: cvs rdiff -u -r1.1662 -r1.1663 src/distrib/sets/lists/comp/mi cvs rdiff -u -r1.208 -r1.209 src/lib/libc/sys/Makefile.inc cvs rdiff -u -r1.26 -r1.27 src/lib/libc/sys/utimes.2 cvs rdiff -u -r1.251 -r1.252 src/sys/kern/syscalls.master cvs rdiff -u -r1.433 -r1.434 src/sys/kern/vfs_syscalls.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/sets/lists/comp/mi diff -u src/distrib/sets/lists/comp/mi:1.1662 src/distrib/sets/lists/comp/mi:1.1663 --- src/distrib/sets/lists/comp/mi:1.1662 Mon Aug 15 15:14:00 2011 +++ src/distrib/sets/lists/comp/mi Wed Aug 17 07:22:34 2011 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.1662 2011/08/15 15:14:00 wiz Exp $ +# $NetBSD: mi,v 1.1663 2011/08/17 07:22:34 manu Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. # @@ -4680,6 +4680,7 @@ ./usr/share/man/cat2/fsync_range.0 comp-c-catman .cat ./usr/share/man/cat2/ftruncate.0 comp-c-catman .cat ./usr/share/man/cat2/futimes.0 comp-c-catman .cat +./usr/share/man/cat2/futimens.0 comp-c-catman .cat ./usr/share/man/cat2/getcontext.0 comp-c-catman .cat ./usr/share/man/cat2/getdents.0 comp-c-catman .cat ./usr/share/man/cat2/getdirentries.0 comp-obsolete obsolete @@ -4865,6 +4866,7 @@ ./usr/share/man/cat2/undelete.0 comp-c-catman .cat ./usr/share/man/cat2/unlink.0 comp-c-catman .cat ./usr/share/man/cat2/unmount.0 comp-c-catman .cat +./usr/share/man/cat2/utimensat.0 comp-c-catman .cat ./usr/share/man/cat2/utimes.0 comp-c-catman .cat ./usr/share/man/cat2/utrace.0 comp-c-catman .cat ./usr/share/man/cat2/uuidgen.0 comp-c-catman .cat @@ -10864,6 +10866,7 @@ ./usr/share/man/html2/fsync_range.html comp-c-htmlman html ./usr/share/man/html2/ftruncate.html comp-c-htmlman html ./usr/share/man/html2/futimes.html comp-c-htmlman html +./usr/share/man/html2/futimens.html comp-c-htmlman html ./usr/share/man/html2/getcontext.html comp-c-htmlman html ./usr/share/man/html2/getdents.html comp-c-htmlman html ./usr/share/man/html2/getegid.html comp-c-htmlman html @@ -11037,6 +11040,7 @@ ./usr/share/man/html2/undelete.html comp-c-htmlman html ./usr/share/man/html2/unlink.html comp-c-htmlman html ./usr/share/man/html2/unmount.html comp-c-htmlman html +./usr/share/man/html2/utimensat.html comp-c-htmlman html ./usr/share/man/html2/utimes.html comp-c-htmlman html ./usr/share/man/html2/utrace.html comp-c-htmlman html ./usr/share/man/html2/uuidgen.html comp-c-htmlman html @@ -16822,6 +16826,7 @@ ./usr/share/man/man2/fsync_range.2 comp-c-man .man ./usr/share/man/man2/ftruncate.2 comp-c-man .man ./usr/share/man/man2/futimes.2 comp-c-man .man +./usr/share/man/man2/futimens.2 comp-c-man .man ./usr/share/man/man2/getcontext.2 comp-c-man .man ./usr/share/man/man2/getdents.2 comp-c-man .man ./usr/share/man/man2/getegid.2 comp-c-man .man @@ -17005,6 +17010,7 @@ ./usr/share/man/man2/undelete.2 comp-c-man .man ./usr/share/man/man2/unlink.2 comp-c-man .man ./usr/share/man/man2/unmount.2 comp-c-man .man +./usr/share/man/man2/utimensat.2 comp-c-man .man ./usr/share/man/man2/utimes.2 comp-c-man .man ./usr/share/man/man2/utrace.2 comp-c-man .man ./usr/share/man/man2/uuidgen.2 comp-c-man .man Index: src/lib/libc/sys/Makefile.inc diff -u src/lib/libc/sys/Makefile.inc:1.208 src/lib/libc/sys/Makefile.inc:1.209 --- src/lib/libc/sys/Makefile.inc:1.208 Mon Aug 8 12:08:53 2011 +++ src/lib/libc/sys/Makefile.inc Wed Aug 17 07:22:33 2011 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.inc,v 1.208 2011/08/08 12:08:53 manu Exp $ +# $NetBSD: Makefile.inc,v 1.209 2011/08/17 07:22:33 manu Exp $ # @(#)Makefile.inc 8.3 (Berkeley) 10/24/94 # sys sources @@ -90,7 +90,7 @@ faccessat.S fchdir.S fchflags.S fchmod.S fchmodat.S fchown.S \ fchownat.S fchroot.S fexecve.S __fhopen40.S __fhstat50.S \ __fhstatvfs140.S fktrace.S flock.S fpathconf.S __fstat50.S \ - fstatvfs1.S fstatat.S __futimes50.S \ + fstatvfs1.S fstatat.S __futimes50.S futimens.S \ __getcwd.S __getdents30.S __getfh30.S getvfsstat.S getgroups.S\ __getitimer50.S __getlogin.S getpeername.S getpgid.S getpgrp.S \ getpriority.S getrlimit.S __getrusage50.S getsid.S \ @@ -315,6 +315,7 @@ MLINKS+=syscall.2 __syscall.2 MLINKS+=truncate.2 ftruncate.2 MLINKS+=utimes.2 futimes.2 utimes.2 lutimes.2 +MLINKS+=utimes.2 futimens.2 utimes.2 utimensat.2 MLINKS+=wait.2 wait3.2 wait.2 wait4.2 wait.2 waitpid.2 MLINKS+=write.2 writev.2 write.2 pwrite.2 write.2 pwritev.2 MLINKS+=pipe.2 pipe2.2 Index: src/lib/libc/sys/utimes.2 diff -u src/lib/libc/sys/utimes.2:1.26 src/lib/libc/sys/utimes.2:1.27 --- src/lib/libc/sys/utimes.2:1.26 Thu Apr 29 17:02:38 2010 +++ src/lib/libc/sys/utimes.2 Wed Aug 17 07:22:33 2011 @@ -1,4 +1,4 @@ -.\" $NetBSD: utimes.2,v 1.26 2010/04/29 17:02:38 jruoho Exp $ +.\" $NetBSD: utimes.2,v 1.27 2011/08/17 07:22:33 manu Exp $ .\" .\" Copyright (c) 1990, 1993 .\" The Regents of the University of California. All rights reserved. @@ -35,7 +35,9 @@ .Sh NAME .Nm utimes , .Nm lutimes , -.Nm futimes +.Nm futimes , +.Nm futimens , +.Nm utimensat .Nd set file access and modification times .Sh LIBRARY .Lb libc @@ -47,6 +49,11 @@ .Fn lutimes "const char *path" "const struct timeval times[2]" .Ft int .Fn futimes "int fd" "const struct timeval times[2]" +.Ft int +.Fn futimens "int fd" "const struct timespec times[2]" +.Ft int +.Fn utimensat "int fd" "const char *path" "const struct timespec times[2]" "\ +int flag" .Sh DESCRIPTION The access and modification times of the file named by .Fa path @@ -93,15 +100,52 @@ while .Fn utimes changes the times of the file the link references. +.Pp +.Fn futimens +is like +.Fn futimes +except that time is specified with nanosecond instead of microseconds. +.Pp +.Fn utimensat +also allows time to be specifed with nanoseconds. When it operates on +a symbolic link, it will change the target's time if +.Ar follow +is unset. +If +.Ar follow +is set to +.Dv AT_SYMLINK_NOFOLLOW , +the symbolic link's dates are changed. +.Pp +The nanosecond fields for +.Fn futimes +and +.Fn utimensat +can be set to the special value +.Dv UTIME_NOW +to set the current time, or to +.Dv UTIME_OMIT +to let the time unchanged (this allows changing access time but not +modification time, and vice-versa). +.Pp +.Fn utimensat +is partially implemented. +It will return +.Er ENOSYS +for +.Fa fd +values different than +.Dv AT_FDCWD . .Sh RETURN VALUES Upon successful completion, a value of 0 is returned. Otherwise, a value of \-1 is returned and .Va errno is set to indicate the error. .Sh ERRORS -.Fn utimes +.Fn utimes , +.Fn lutimes , and -.Fn lutimes +.Fn utimensat will fail if: .Bl -tag -width Er .It Bq Er EACCES @@ -144,6 +188,8 @@ .El .Pp .Fn futimes +and +.Fn futimens will fail if: .Bl -tag -width Er .It Bq Er EACCES @@ -184,6 +230,11 @@ It was however marked as legacy in the .St -p1003.1-2004 revision. +.Fn futimens +and +.Fn utmensat +functions conform to +.St -p1003.1-2008 . .Sh HISTORY The .Fn utimes @@ -199,3 +250,11 @@ .Nx 1.3 . Birthtime setting support was added in .Nx 5.0 . +.Fn futimens +and +.Fn utimensat +functions calls appreared in +.Nx 6.0 +.Sh BUGS +.Fn utimensat +is partially implemented. Index: src/sys/kern/syscalls.master diff -u src/sys/kern/syscalls.master:1.251 src/sys/kern/syscalls.master:1.252 --- src/sys/kern/syscalls.master:1.251 Mon Aug 8 12:08:53 2011 +++ src/sys/kern/syscalls.master Wed Aug 17 07:22:34 2011 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.251 2011/08/08 12:08:53 manu Exp $ + $NetBSD: syscalls.master,v 1.252 2011/08/17 07:22:34 manu Exp $ ; @(#)syscalls.master 8.2 (Berkeley) 1/13/94 @@ -923,3 +923,5 @@ const char *path2); } 471 STD RUMP { int|sys||unlinkat(int fd, const char *path, \ int flag); } +472 STD RUMP { int|sys||futimens(int fd, \ + const struct timespec *tptr); } Index: src/sys/kern/vfs_syscalls.c diff -u src/sys/kern/vfs_syscalls.c:1.433 src/sys/kern/vfs_syscalls.c:1.434 --- src/sys/kern/vfs_syscalls.c:1.433 Mon Aug 8 12:08:53 2011 +++ src/sys/kern/vfs_syscalls.c Wed Aug 17 07:22:34 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_syscalls.c,v 1.433 2011/08/08 12:08:53 manu Exp $ */ +/* $NetBSD: vfs_syscalls.c,v 1.434 2011/08/17 07:22:34 manu Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -70,7 +70,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.433 2011/08/08 12:08:53 manu Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.434 2011/08/17 07:22:34 manu Exp $"); #ifdef _KERNEL_OPT #include "opt_fileassoc.h" @@ -3031,6 +3031,26 @@ return (error); } +int +sys_futimens(struct lwp *l, const struct sys_futimens_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(const struct timespec *) tptr; + } */ + int error; + file_t *fp; + + /* fd_getvnode() will use the descriptor for us */ + if ((error = fd_getvnode(SCARG(uap, fd), &fp)) != 0) + return (error); + error = do_sys_utimens(l, fp->f_data, NULL, 0, SCARG(uap, tptr), + UIO_USERSPACE); + fd_putfile(SCARG(uap, fd)); + return (error); +} + /* * Set the access and modification times given a path name; this * version does not follow links. @@ -3058,6 +3078,20 @@ syscallarg(const struct timespec *) tptr; syscallarg(int) flag; } */ + int follow; + const struct timespec *tptr; + + /* + * Specified fd is not yet implemented + */ + if (SCARG(uap, fd) != AT_FDCWD) + return ENOSYS; + + tptr = SCARG(uap, tptr); + follow = (SCARG(uap, flag) & AT_SYMLINK_NOFOLLOW) ? NOFOLLOW : FOLLOW; + + return do_sys_utimens(l, NULL, SCARG(uap, path), follow, + tptr, UIO_USERSPACE); return ENOSYS; } @@ -3066,8 +3100,8 @@ * Common routine to set access and modification times given a vnode. */ int -do_sys_utimes(struct lwp *l, struct vnode *vp, const char *path, int flag, - const struct timeval *tptr, enum uio_seg seg) +do_sys_utimens(struct lwp *l, struct vnode *vp, const char *path, int flag, + const struct timespec *tptr, enum uio_seg seg) { struct vattr vattr; int error, dorele = 0; @@ -3092,19 +3126,20 @@ nanotime(&ts[0]); ts[1] = ts[0]; } else { - struct timeval tv[2]; - vanull = false; if (seg != UIO_SYSSPACE) { - error = copyin(tptr, tv, sizeof (tv)); + error = copyin(tptr, ts, sizeof (ts)); if (error != 0) return error; - tptr = tv; } - TIMEVAL_TO_TIMESPEC(&tptr[0], &ts[0]); - TIMEVAL_TO_TIMESPEC(&tptr[1], &ts[1]); } + if (ts[0].tv_nsec == UTIME_NOW) + nanotime(&ts[0]); + + if (ts[1].tv_nsec == UTIME_NOW) + nanotime(&ts[1]); + if (vp == NULL) { /* note: SEG describes TPTR, not PATH; PATH is always user */ error = namei_simple_user(path, sflags, &vp); @@ -3117,10 +3152,16 @@ setbirthtime = (VOP_GETATTR(vp, &vattr, l->l_cred) == 0 && timespeccmp(&ts[1], &vattr.va_birthtime, <)); vattr_null(&vattr); - vattr.va_atime = ts[0]; - vattr.va_mtime = ts[1]; - if (setbirthtime) - vattr.va_birthtime = ts[1]; + + if (ts[0].tv_nsec != UTIME_OMIT) + vattr.va_atime = ts[0]; + + if (ts[1].tv_nsec != UTIME_OMIT) { + vattr.va_mtime = ts[1]; + if (setbirthtime) + vattr.va_birthtime = ts[1]; + } + if (vanull) vattr.va_vaflags |= VA_UTIMES_NULL; error = VOP_SETATTR(vp, &vattr, l->l_cred); @@ -3132,6 +3173,42 @@ return error; } +int +do_sys_utimes(struct lwp *l, struct vnode *vp, const char *path, int flag, + const struct timeval *tptr, enum uio_seg seg) +{ + struct timespec ts[2]; + struct timespec *tsptr = NULL; + int error; + + if (tptr != NULL) { + struct timeval tv[2]; + + if (seg != UIO_SYSSPACE) { + error = copyin(tptr, tv, sizeof (tv)); + if (error != 0) + return error; + tptr = tv; + } + + if ((tv[0].tv_usec == UTIME_NOW) || + (tv[0].tv_usec == UTIME_OMIT)) + ts[0].tv_nsec = tv[0].tv_usec; + else + TIMEVAL_TO_TIMESPEC(&tptr[0], &ts[0]); + + if ((tv[1].tv_usec == UTIME_NOW) || + (tv[1].tv_usec == UTIME_OMIT)) + ts[1].tv_nsec = tv[1].tv_usec; + else + TIMEVAL_TO_TIMESPEC(&tptr[1], &ts[1]); + + tsptr = &ts[0]; + } + + return do_sys_utimens(l, vp, path, flag, tsptr, UIO_SYSSPACE); +} + /* * Truncate a file given its path name. */