Module Name: src Committed By: manu Date: Mon Aug 8 12:08:54 UTC 2011
Modified Files: src/distrib/sets/lists/comp: mi src/include: unistd.h src/lib/libc/sys: Makefile.inc link.2 src/sys/kern: kern_exec.c syscalls.master vfs_syscalls.c src/sys/sys: fcntl.h stat.h Log Message: First stage of support for Extended API set 2. Most of the think is unimplemented, except enough of linkat(2) to hardlink to a symlink. Everything new in headers is guarded #ifdef _INCOMPLETE_XOPEN_C063 since some software (e.g.: xcvs in our own tree) will assume they can use openat(2) when AT_FDCWD is defined. _INCOMPLETE_XOPEN_C063 will go away once support will be completed. To generate a diff of this commit: cvs rdiff -u -r1.1658 -r1.1659 src/distrib/sets/lists/comp/mi cvs rdiff -u -r1.126 -r1.127 src/include/unistd.h cvs rdiff -u -r1.207 -r1.208 src/lib/libc/sys/Makefile.inc cvs rdiff -u -r1.24 -r1.25 src/lib/libc/sys/link.2 cvs rdiff -u -r1.316 -r1.317 src/sys/kern/kern_exec.c cvs rdiff -u -r1.250 -r1.251 src/sys/kern/syscalls.master cvs rdiff -u -r1.432 -r1.433 src/sys/kern/vfs_syscalls.c cvs rdiff -u -r1.39 -r1.40 src/sys/sys/fcntl.h cvs rdiff -u -r1.60 -r1.61 src/sys/sys/stat.h 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.1658 src/distrib/sets/lists/comp/mi:1.1659 --- src/distrib/sets/lists/comp/mi:1.1658 Sun Aug 7 13:33:02 2011 +++ src/distrib/sets/lists/comp/mi Mon Aug 8 12:08:52 2011 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.1658 2011/08/07 13:33:02 rmind Exp $ +# $NetBSD: mi,v 1.1659 2011/08/08 12:08:52 manu Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. # @@ -4708,6 +4708,7 @@ ./usr/share/man/cat2/lfs_segclean.0 comp-c-catman .cat ./usr/share/man/cat2/lfs_segwait.0 comp-c-catman .cat ./usr/share/man/cat2/link.0 comp-c-catman .cat +./usr/share/man/cat2/linkat.0 comp-c-catman .cat ./usr/share/man/cat2/listen.0 comp-c-catman .cat ./usr/share/man/cat2/lseek.0 comp-c-catman .cat ./usr/share/man/cat2/lstat.0 comp-c-catman .cat @@ -10887,6 +10888,7 @@ ./usr/share/man/html2/lfs_segclean.html comp-c-htmlman html ./usr/share/man/html2/lfs_segwait.html comp-c-htmlman html ./usr/share/man/html2/link.html comp-c-htmlman html +./usr/share/man/html2/linkat.html comp-c-htmlman html ./usr/share/man/html2/listen.html comp-c-htmlman html ./usr/share/man/html2/lseek.html comp-c-htmlman html ./usr/share/man/html2/lstat.html comp-c-htmlman html @@ -16846,6 +16848,7 @@ ./usr/share/man/man2/lfs_segclean.2 comp-c-man .man ./usr/share/man/man2/lfs_segwait.2 comp-c-man .man ./usr/share/man/man2/link.2 comp-c-man .man +./usr/share/man/man2/linkat.2 comp-c-man .man ./usr/share/man/man2/listen.2 comp-c-man .man ./usr/share/man/man2/lseek.2 comp-c-man .man ./usr/share/man/man2/lstat.2 comp-c-man .man Index: src/include/unistd.h diff -u src/include/unistd.h:1.126 src/include/unistd.h:1.127 --- src/include/unistd.h:1.126 Sun Jun 26 16:42:40 2011 +++ src/include/unistd.h Mon Aug 8 12:08:53 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: unistd.h,v 1.126 2011/06/26 16:42:40 christos Exp $ */ +/* $NetBSD: unistd.h,v 1.127 2011/08/08 12:08:53 manu Exp $ */ /*- * Copyright (c) 1998, 1999, 2008 The NetBSD Foundation, Inc. @@ -291,6 +291,24 @@ ssize_t pwrite(int, const void *, size_t, off_t); #endif +/* + * X/Open Extended API set 2 (a.k.a. C063) + */ +#if defined(_INCOMPLETE_XOPEN_C063) +int linkat(int, const char *, int, const char *, int); +int renameat(int, const char *, int, const char *); +int mkfifoat(int, const char *, mode_t); +int mknodat(int, const char *, mode_t, uint32_t); +int mkdirat(int, const char *, mode_t); +int faccessat(int, const char *, int, int); +int fchmodat(int, const char *, mode_t, int); +int fchownat(int, const char *, uid_t, gid_t, int); +int fexecve(int, char * const *, char * const *); +int readlinkat(int, const char *, char *, size_t); +int symlinkat(const char *, int, const char *); +int unlinkat(int, const char *, int); +#endif + /* * Implementation-defined extensions Index: src/lib/libc/sys/Makefile.inc diff -u src/lib/libc/sys/Makefile.inc:1.207 src/lib/libc/sys/Makefile.inc:1.208 --- src/lib/libc/sys/Makefile.inc:1.207 Mon Jun 27 16:39:44 2011 +++ src/lib/libc/sys/Makefile.inc Mon Aug 8 12:08:53 2011 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.inc,v 1.207 2011/06/27 16:39:44 manu Exp $ +# $NetBSD: Makefile.inc,v 1.208 2011/08/08 12:08:53 manu Exp $ # @(#)Makefile.inc 8.3 (Berkeley) 10/24/94 # sys sources @@ -87,9 +87,10 @@ setxattr.S getxattr.S listxattr.S removexattr.S \ lsetxattr.S lgetxattr.S llistxattr.S lremovexattr.S \ fsetxattr.S fgetxattr.S flistxattr.S fremovexattr.S \ - fchdir.S fchflags.S fchmod.S fchown.S fchroot.S \ - __fhopen40.S __fhstat50.S __fhstatvfs140.S fktrace.S \ - flock.S fpathconf.S __fstat50.S fstatvfs1.S __futimes50.S \ + 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 \ __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 \ @@ -100,22 +101,24 @@ _ksem_post.S _ksem_trywait.S _ksem_unlink.S _ksem_wait.S \ _ksem_open.S \ lchflags.S lchmod.S lchown.S lfs_bmapv.S lfs_markv.S lfs_segclean.S \ - __lfs_segwait50.S link.S listen.S __lstat50.S __lutimes50.S \ - _lwp_create.S _lwp_exit.S _lwp_kill.S ___lwp_park50.S \ - _lwp_self.S _lwp_wait.S _lwp_unpark.S _lwp_unpark_all.S \ - _lwp_suspend.S _lwp_continue.S _lwp_wakeup.S _lwp_detach.S \ - _lwp_setprivate.S \ + __lfs_segwait50.S link.S linkat.S listen.S __lstat50.S \ + __lutimes50.S _lwp_create.S _lwp_exit.S _lwp_kill.S \ + ___lwp_park50.S _lwp_self.S _lwp_wait.S _lwp_unpark.S \ + _lwp_unpark_all.S _lwp_suspend.S _lwp_continue.S \ + _lwp_wakeup.S _lwp_detach.S _lwp_setprivate.S \ _lwp_setname.S _lwp_getname.S _lwp_ctl.S \ - madvise.S mincore.S minherit.S mkdir.S mkfifo.S __mknod50.S \ - mlock.S mlockall.S modctl.S __mount50.S mprotect.S \ - __msgctl50.S msgget.S munlock.S munlockall.S munmap.S \ + madvise.S mincore.S minherit.S mkdir.S mkdirat.S mkfifo.S mkfifoat.S \ + __mknod50.S mknodat.S mlock.S mlockall.S modctl.S __mount50.S \ + mprotect.S __msgctl50.S msgget.S munlock.S munlockall.S \ + munmap.S \ nfssvc.S __ntp_gettime50.S \ + openat.S \ paccept.S pathconf.S pipe2.S pmc_get_info.S pmc_control.S \ __posix_chown.S __posix_fchown.S __posix_lchown.S \ __posix_rename.S profil.S \ __quotactl50.S \ - rasctl.S reboot.S recvfrom.S recvmsg.S rename.S revoke.S \ - rmdir.S \ + rasctl.S readlinkat.S reboot.S recvfrom.S recvmsg.S rename.S \ + renameat.S revoke.S rmdir.S \ sa_register.S sa_stacks.S sa_enable.S sa_setconcurrency.S sa_yield.S \ sa_preempt.S semconfig.S semget.S semop.S \ sendmsg.S sendto.S setegid.S setcontext.S seteuid.S setgid.S \ @@ -126,11 +129,11 @@ sigqueueinfo.S \ __sigaltstack14.S __sigpending14.S __sigaction_sigtramp.S \ ____sigtimedwait50.S __socket30.S socketpair.S __stat50.S \ - statvfs1.S swapctl.S symlink.S __sysctl.S \ + statvfs1.S swapctl.S symlink.S symlinkat.S __sysctl.S \ timer_create.S timer_delete.S __timer_gettime50.S timer_getoverrun.S \ ____semctl50.S __timer_settime50.S \ - umask.S undelete.S unlink.S unmount.S __utimes50.S utrace.S uuidgen.S \ - vadvise.S + umask.S undelete.S unlink.S unlinkat.S unmount.S __utimes50.S \ + utimensat.S utrace.S uuidgen.S vadvise.S # modules with potentially non default implementations ASM_MD= _lwp_getprivate.S mremap.S @@ -283,6 +286,7 @@ MLINKS+=kqueue.2 kevent.2 MLINKS+=ktrace.2 fktrace.2 MLINKS+=lseek.2 seek.2 +MLINKS+=link.2 linkat.2 MLINKS+=_lwp_suspend.2 _lwp_continue.2 MLINKS+=_lwp_getprivate.2 _lwp_setprivate.2 MLINKS+=madvise.2 posix_madvise.2 Index: src/lib/libc/sys/link.2 diff -u src/lib/libc/sys/link.2:1.24 src/lib/libc/sys/link.2:1.25 --- src/lib/libc/sys/link.2:1.24 Mon May 31 12:16:20 2010 +++ src/lib/libc/sys/link.2 Mon Aug 8 12:08:53 2011 @@ -1,6 +1,6 @@ -.\" $NetBSD: link.2,v 1.24 2010/05/31 12:16:20 njoly Exp $ +.\" $NetBSD: link.2,v 1.25 2011/08/08 12:08:53 manu Exp $ .\" -.\" Copyright (c) 1980, 1991, 1993 +.\" Copyright (c) 1980, 1991, 1993, 2011 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -41,6 +41,8 @@ .In unistd.h .Ft int .Fn link "const char *name1" "const char *name2" +.Ft int +.Fn linkat "int fd1" "const char *name1" "int fd2" "const char *name2" "int flags" .Sh DESCRIPTION The .Fn link @@ -77,6 +79,26 @@ .Fa name1 may not be a directory unless the caller is the super-user and the file system containing it supports linking to directories. +.Pp +When operating on a symlink, +.Fn link +resolves the symlink and creates a hard link on the target. +.Fn linkat +will do the same if +.Dv AT_SYMLINK_FOLLOW +is set in +.Fa flags , +but it will link on the symlink itself if the flag is clear. +.Pp +At the moment, +.Fn linkat +is partially implemented. It will return +.Er ENOSYS for +.Fa fd1 +and +.Fa fd2 +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 @@ -155,6 +177,9 @@ .Sh SEE ALSO .Xr symlink 2 , .Xr unlink 2 +.Sh BUGS +.Fn linkat +is partially implemented. .Sh STANDARDS The .Fn link Index: src/sys/kern/kern_exec.c diff -u src/sys/kern/kern_exec.c:1.316 src/sys/kern/kern_exec.c:1.317 --- src/sys/kern/kern_exec.c:1.316 Mon Jun 6 22:04:34 2011 +++ src/sys/kern/kern_exec.c Mon Aug 8 12:08:53 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_exec.c,v 1.316 2011/06/06 22:04:34 matt Exp $ */ +/* $NetBSD: kern_exec.c,v 1.317 2011/08/08 12:08:53 manu Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -59,7 +59,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.316 2011/06/06 22:04:34 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.317 2011/08/08 12:08:53 manu Exp $"); #include "opt_ktrace.h" #include "opt_modular.h" @@ -460,6 +460,19 @@ SCARG(uap, envp), execve_fetch_element); } +int +sys_fexecve(struct lwp *l, const struct sys_fexecve_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(char * const *) argp; + syscallarg(char * const *) envp; + } */ + + return ENOSYS; +} + /* * Load modules to try and execute an image that we do not understand. * If no execsw entries are present, we load those likely to be needed Index: src/sys/kern/syscalls.master diff -u src/sys/kern/syscalls.master:1.250 src/sys/kern/syscalls.master:1.251 --- src/sys/kern/syscalls.master:1.250 Mon Jul 18 11:28:24 2011 +++ src/sys/kern/syscalls.master Mon Aug 8 12:08:53 2011 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.250 2011/07/18 11:28:24 drochner Exp $ + $NetBSD: syscalls.master,v 1.251 2011/08/08 12:08:53 manu Exp $ ; @(#)syscalls.master 8.2 (Berkeley) 1/13/94 @@ -893,3 +893,33 @@ 456 STD RUMP { int|sys||paccept(int s, struct sockaddr *name, \ socklen_t *anamelen, const sigset_t *mask, \ int flags); } +457 STD RUMP { int|sys||linkat(int fd1, const char *name1, \ + int fd2, const char *name2, int flags); } +458 STD RUMP { int|sys||renameat(int fromfd, const char *from, \ + int tofd, const char *to); } +459 STD RUMP { int|sys||mkfifoat(int fd, const char *path, \ + mode_t mode); } +460 STD RUMP { int|sys||mknodat(int fd, const char *path, \ + mode_t mode, uint32_t dev); } +461 STD RUMP { int|sys||mkdirat(int fd, const char *path, \ + mode_t mode); } +462 STD RUMP { int|sys||faccessat(int fd, const char *path, \ + int amode, int flag); } +463 STD RUMP { int|sys||fchmodat(int fd, const char *path, \ + mode_t mode, int flag); } +464 STD RUMP { int|sys||fchownat(int fd, const char *path, \ + uid_t owner, gid_t group, int flag); } +465 STD RUMP { int|sys||fexecve(int fd, \ + char * const *argp, char * const *envp); } +466 STD RUMP { int|sys||fstatat(int fd, const char *path, \ + struct stat *buf, int flag); } +467 STD RUMP { int|sys||utimensat(int fd, const char *path, \ + const struct timespec *tptr, int flag); } +468 STD RUMP { int|sys||openat(int fd, const char *path, \ + int oflags, ... mode_t mode); } +469 STD RUMP { int|sys||readlinkat(int fd, const char *path, \ + char *buf, size_t bufsize); } +470 STD RUMP { int|sys||symlinkat(const char *path1, int fd, \ + const char *path2); } +471 STD RUMP { int|sys||unlinkat(int fd, const char *path, \ + int flag); } Index: src/sys/kern/vfs_syscalls.c diff -u src/sys/kern/vfs_syscalls.c:1.432 src/sys/kern/vfs_syscalls.c:1.433 --- src/sys/kern/vfs_syscalls.c:1.432 Sun Jul 24 09:40:10 2011 +++ src/sys/kern/vfs_syscalls.c Mon Aug 8 12:08:53 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_syscalls.c,v 1.432 2011/07/24 09:40:10 martin Exp $ */ +/* $NetBSD: vfs_syscalls.c,v 1.433 2011/08/08 12:08:53 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.432 2011/07/24 09:40:10 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.433 2011/08/08 12:08:53 manu Exp $"); #ifdef _KERNEL_OPT #include "opt_fileassoc.h" @@ -83,6 +83,7 @@ #include <sys/filedesc.h> #include <sys/kernel.h> #include <sys/file.h> +#include <sys/fcntl.h> #include <sys/stat.h> #include <sys/vnode.h> #include <sys/mount.h> @@ -1160,6 +1161,19 @@ return (0); } +int +sys_openat(struct lwp *l, const struct sys_openat_args *uap, register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(const char *) path; + syscallarg(int) flags; + syscallarg(int) mode; + } */ + + return ENOSYS; +} + static void vfs__fhfree(fhandle_t *fhp) { @@ -1616,6 +1630,20 @@ } int +sys_mknodat(struct lwp *l, const struct sys_mknodat_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(const char *) path; + syscallarg(mode_t) mode; + syscallarg(uint32_t) dev; + } */ + + return ENOSYS; +} + +int do_sys_mknod(struct lwp *l, const char *pathname, mode_t mode, dev_t dev, register_t *retval, enum uio_seg seg) { @@ -1771,27 +1799,41 @@ return (error); } -/* - * Make a hard file link. - */ -/* ARGSUSED */ int -sys_link(struct lwp *l, const struct sys_link_args *uap, register_t *retval) +sys_mkfifoat(struct lwp *l, const struct sys_mkfifoat_args *uap, + register_t *retval) { /* { + syscallarg(int) fd; syscallarg(const char *) path; - syscallarg(const char *) link; + syscallarg(int) mode; } */ + + return ENOSYS; +} +/* + * Make a hard file link. + */ +/* ARGSUSED */ +static int +do_sys_link(struct lwp *l, const char *path, const char *link, + int follow, register_t *retval) +{ struct vnode *vp; struct pathbuf *linkpb; struct nameidata nd; + namei_simple_flags_t namei_simple_flags; int error; - error = namei_simple_user(SCARG(uap, path), - NSM_FOLLOW_TRYEMULROOT, &vp); + if (follow) + namei_simple_flags = NSM_FOLLOW_TRYEMULROOT; + else + namei_simple_flags = NSM_NOFOLLOW_TRYEMULROOT; + + error = namei_simple_user(path, namei_simple_flags, &vp); if (error != 0) return (error); - error = pathbuf_copyin(SCARG(uap, link), &linkpb); + error = pathbuf_copyin(link, &linkpb); if (error) { goto out1; } @@ -1830,6 +1872,46 @@ } int +sys_link(struct lwp *l, const struct sys_link_args *uap, register_t *retval) +{ + /* { + syscallarg(const char *) path; + syscallarg(const char *) link; + } */ + const char *path = SCARG(uap, path); + const char *link = SCARG(uap, link); + + return do_sys_link(l, path, link, 1, retval); +} + +int +sys_linkat(struct lwp *l, const struct sys_linkat_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd1; + syscallarg(const char *) name1; + syscallarg(int) fd2; + syscallarg(const char *) name2; + syscallarg(int) flags; + } */ + const char *name1 = SCARG(uap, name1); + const char *name2 = SCARG(uap, name2); + int follow; + + /* + * Specified fd1 and fd2 are not yet implemented + */ + if ((SCARG(uap, fd1) != AT_FDCWD) || (SCARG(uap, fd2) != AT_FDCWD)) + return ENOSYS; + + follow = SCARG(uap, flags) & AT_SYMLINK_FOLLOW; + + return do_sys_link(l, name1, name2, follow, retval); +} + + +int do_sys_symlink(const char *patharg, const char *link, enum uio_seg seg) { struct proc *p = curproc; @@ -1854,6 +1936,8 @@ goto out1; } } + ktrkuser("symlink-target", path, strlen(path)); + NDINIT(&nd, CREATE, LOCKPARENT | TRYEMULROOT, linkpb); if ((error = namei(&nd)) != 0) goto out2; @@ -1897,6 +1981,19 @@ UIO_USERSPACE); } +int +sys_symlinkat(struct lwp *l, const struct sys_symlinkat_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(const char *) path; + syscallarg(const char *) link; + } */ + + return ENOSYS; +} + /* * Delete a whiteout from the filesystem. */ @@ -1956,6 +2053,18 @@ } int +sys_unlinkat(struct lwp *l, const struct sys_unlinkat_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(const char *) path; + } */ + + return ENOSYS; +} + +int do_sys_unlink(const char *arg, enum uio_seg seg) { struct vnode *vp; @@ -2267,6 +2376,20 @@ return (error); } +int +sys_faccessat(struct lwp *l, const struct sys_faccessat_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(const char *) path; + syscallarg(int) amode; + syscallarg(int) flag; + } */ + + return ENOSYS; +} + /* * Common code for all sys_stat functions, including compat versions. */ @@ -2333,6 +2456,19 @@ return copyout(&sb, SCARG(uap, ub), sizeof(sb)); } +int +sys_fstatat(struct lwp *l, const struct sys_fstatat_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(const char *) path; + syscallarg(struct stat *) ub; + syscallarg(int) flag; + } */ + + return ENOSYS; +} /* * Get configurable pathname variables. */ @@ -2413,6 +2549,20 @@ return (error); } +int +sys_readlinkat(struct lwp *l, const struct sys_readlinkat_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(const char *) path; + syscallarg(char *) buf; + syscallarg(size_t) count; + } */ + + return ENOSYS; +} + /* * Change flags of a file given a path name. */ @@ -2560,6 +2710,20 @@ return (error); } +int +sys_fchmodat(struct lwp *l, const struct sys_fchmodat_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(const char *) path; + syscallarg(int) mode; + syscallarg(int) flag; + } */ + + return ENOSYS; +} + /* * Change mode of a file given path name; this version does not follow links. */ @@ -2679,6 +2843,21 @@ return (error); } +int +sys_fchownat(struct lwp *l, const struct sys_fchownat_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(const char *) path; + syscallarg(uid_t) uid; + syscallarg(gid_t) gid; + syscallarg(int) flag; + } */ + + return ENOSYS; +} + /* * Set ownership given a file descriptor, providing POSIX/XPG semantics. */ @@ -2869,6 +3048,20 @@ SCARG(uap, tptr), UIO_USERSPACE); } +int +sys_utimensat(struct lwp *l, const struct sys_utimensat_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(const char *) path; + syscallarg(const struct timespec *) tptr; + syscallarg(int) flag; + } */ + + return ENOSYS; +} + /* * Common routine to set access and modification times given a vnode. */ @@ -3149,6 +3342,20 @@ return (do_sys_rename(SCARG(uap, from), SCARG(uap, to), UIO_USERSPACE, 0)); } +int +sys_renameat(struct lwp *l, const struct sys_renameat_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fromfd; + syscallarg(const char *) from; + syscallarg(int) tofd; + syscallarg(const char *) to; + } */ + + return ENOSYS; +} + /* * Rename files, POSIX semantics frontend. */ @@ -3362,6 +3569,20 @@ } int +sys_mkdirat(struct lwp *l, const struct sys_mkdirat_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(const char *) path; + syscallarg(int) mode; + } */ + + return ENOSYS; +} + + +int do_sys_mkdir(const char *path, mode_t mode, enum uio_seg seg) { struct proc *p = curlwp->l_proc; Index: src/sys/sys/fcntl.h diff -u src/sys/sys/fcntl.h:1.39 src/sys/sys/fcntl.h:1.40 --- src/sys/sys/fcntl.h:1.39 Sat Jul 30 12:08:36 2011 +++ src/sys/sys/fcntl.h Mon Aug 8 12:08:54 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: fcntl.h,v 1.39 2011/07/30 12:08:36 jmcneill Exp $ */ +/* $NetBSD: fcntl.h,v 1.40 2011/08/08 12:08:54 manu Exp $ */ /*- * Copyright (c) 1983, 1990, 1993 @@ -114,6 +114,9 @@ #define O_DIRECTORY 0x00200000 /* fail if not a directory */ #define O_CLOEXEC 0x00400000 /* set close on exec */ +#if defined(_INCOMPLETE_XOPEN_C063) || defined(_KERNEL) +#define O_SEARCH 0x00800000 /* skip search permission checks */ +#endif #ifdef _KERNEL /* convert from open() flags to/from fflags; convert O_RD/WR to FREAD/FWRITE */ @@ -277,6 +280,18 @@ #define POSIX_FADV_DONTNEED 4 /* not be needed in near future */ #define POSIX_FADV_NOREUSE 5 /* be accessed once */ +/* + * Constants for linkat(2) + */ +#if defined(_INCOMPLETE_XOPEN_C063) || defined(_KERNEL) +#define AT_FDCWD -100 /* Use cwd for relative link target */ +#define AT_EACCESS 0x100 /* Use euig/egid for access checks */ +#define AT_SYMLINK_NOFOLLOW 0x200 /* Do not follow symlinks */ +#define AT_SYMLINK_FOLLOW 0x400 /* Follow symlinks */ +#define AT_REMOVEDIR 0x800 /* Remove directory only */ +#endif + + #ifndef _KERNEL #include <sys/cdefs.h> @@ -288,6 +303,13 @@ int flock(int, int); #endif /* _NETBSD_SOURCE */ int posix_fadvise(int, off_t, off_t, int); + +/* + * X/Open Extended API set 2 (a.k.a. C063) + */ +#if defined(_INCOMPLETE_XOPEN_C063) +int openat(int, const char *, int oflags, ...); +#endif __END_DECLS #endif /* !_KERNEL */ Index: src/sys/sys/stat.h diff -u src/sys/sys/stat.h:1.60 src/sys/sys/stat.h:1.61 --- src/sys/sys/stat.h:1.60 Sun Mar 6 17:08:38 2011 +++ src/sys/sys/stat.h Mon Aug 8 12:08:54 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: stat.h,v 1.60 2011/03/06 17:08:38 bouyer Exp $ */ +/* $NetBSD: stat.h,v 1.61 2011/08/08 12:08:54 manu Exp $ */ /*- * Copyright (c) 1982, 1986, 1989, 1993 @@ -233,6 +233,15 @@ int lchflags(const char *, unsigned long); int lchmod(const char *, mode_t); #endif /* defined(_NETBSD_SOURCE) */ + +/* + * X/Open Extended API set 2 (a.k.a. C063) + */ +#if defined(_INCOMPLETE_XOPEN_C063) +int fstatat(int, const char *, struct stat *, int); +int utimensat(int, const char *, const struct timespec *, int); +#endif + __END_DECLS #endif /* !_KERNEL && !_STANDALONE */