diff options
-rw-r--r-- | sys/kern/init_sysent.c | 3 | ||||
-rw-r--r-- | sys/kern/syscalls.c | 3 | ||||
-rw-r--r-- | sys/kern/vfs_extattr.c | 23 | ||||
-rw-r--r-- | sys/kern/vfs_syscalls.c | 23 | ||||
-rw-r--r-- | sys/sys/stat.h | 1 | ||||
-rw-r--r-- | sys/sys/syscall.h | 5 | ||||
-rw-r--r-- | sys/sys/syscall.mk | 5 | ||||
-rw-r--r-- | sys/sys/sysproto.h | 7 |
8 files changed, 63 insertions, 7 deletions
diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c index b212aaf..567ce4b 100644 --- a/sys/kern/init_sysent.c +++ b/sys/kern/init_sysent.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: src/sys/kern/syscalls.master,v 1.109 2002/04/14 05:31:47 alc Exp + * created from FreeBSD: src/sys/kern/syscalls.master,v 1.111 2002/05/05 23:37:44 mux Exp */ #include "opt_compat.h" @@ -413,4 +413,5 @@ struct sysent sysent[] = { { 0, (sy_call_t *)nosys }, /* 388 = __mac_set_fd */ { 0, (sy_call_t *)nosys }, /* 389 = __mac_set_file */ { AS(kenv_args), (sy_call_t *)kenv }, /* 390 = kenv */ + { AS(lchflags_args), (sy_call_t *)lchflags }, /* 391 = lchflags */ }; diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c index 34a1382..7b0b49e 100644 --- a/sys/kern/syscalls.c +++ b/sys/kern/syscalls.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: src/sys/kern/syscalls.master,v 1.109 2002/04/14 05:31:47 alc Exp + * created from FreeBSD: src/sys/kern/syscalls.master,v 1.111 2002/05/05 23:37:44 mux Exp */ char *syscallnames[] = { @@ -398,4 +398,5 @@ char *syscallnames[] = { "#388", /* 388 = __mac_set_fd */ "#389", /* 389 = __mac_set_file */ "kenv", /* 390 = kenv */ + "lchflags", /* 391 = lchflags */ }; diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c index 1db5510..f256e9e 100644 --- a/sys/kern/vfs_extattr.c +++ b/sys/kern/vfs_extattr.c @@ -2894,6 +2894,29 @@ chflags(td, uap) } /* + * Same as chflags() but doesn't follow symlinks. + */ +int +lchflags(td, uap) + struct thread *td; + register struct lchflags_args /* { + syscallarg(char *) path; + syscallarg(int) flags; + } */ *uap; +{ + int error; + struct nameidata nd; + + NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, SCARG(uap, path), td); + if ((error = namei(&nd)) != 0) + return (error); + NDFREE(&nd, NDF_ONLY_PNBUF); + error = setfflags(td, nd.ni_vp, SCARG(uap, flags)); + vrele(nd.ni_vp); + return error; +} + +/* * Change flags of a file given a file descriptor. */ #ifndef _SYS_SYSPROTO_H_ diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 1db5510..f256e9e 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -2894,6 +2894,29 @@ chflags(td, uap) } /* + * Same as chflags() but doesn't follow symlinks. + */ +int +lchflags(td, uap) + struct thread *td; + register struct lchflags_args /* { + syscallarg(char *) path; + syscallarg(int) flags; + } */ *uap; +{ + int error; + struct nameidata nd; + + NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, SCARG(uap, path), td); + if ((error = namei(&nd)) != 0) + return (error); + NDFREE(&nd, NDF_ONLY_PNBUF); + error = setfflags(td, nd.ni_vp, SCARG(uap, flags)); + vrele(nd.ni_vp); + return error; +} + +/* * Change flags of a file given a file descriptor. */ #ifndef _SYS_SYSPROTO_H_ diff --git a/sys/sys/stat.h b/sys/sys/stat.h index a53960d..00c8de0 100644 --- a/sys/sys/stat.h +++ b/sys/sys/stat.h @@ -255,6 +255,7 @@ mode_t umask(mode_t); #ifndef _POSIX_SOURCE int chflags(const char *, u_long); +int lchflags(const char *, int); int fchflags(int, u_long); int fchmod(int, mode_t); int lchmod(const char *, mode_t); diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h index c336453..31c0c9a 100644 --- a/sys/sys/syscall.h +++ b/sys/sys/syscall.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: src/sys/kern/syscalls.master,v 1.109 2002/04/14 05:31:47 alc Exp + * created from FreeBSD: src/sys/kern/syscalls.master,v 1.111 2002/05/05 23:37:44 mux Exp */ #define SYS_syscall 0 @@ -304,4 +304,5 @@ #define SYS_thread_wakeup 382 #define SYS_kse_yield 383 #define SYS_kenv 390 -#define SYS_MAXSYSCALL 391 +#define SYS_lchflags 391 +#define SYS_MAXSYSCALL 392 diff --git a/sys/sys/syscall.mk b/sys/sys/syscall.mk index 4c25a9e..d269daf 100644 --- a/sys/sys/syscall.mk +++ b/sys/sys/syscall.mk @@ -1,7 +1,7 @@ # FreeBSD system call names. # DO NOT EDIT-- this file is automatically generated. # $FreeBSD$ -# created from FreeBSD: src/sys/kern/syscalls.master,v 1.109 2002/04/14 05:31:47 alc Exp +# created from FreeBSD: src/sys/kern/syscalls.master,v 1.111 2002/05/05 23:37:44 mux Exp MIASM = \ syscall.o \ exit.o \ @@ -253,4 +253,5 @@ MIASM = \ kse_new.o \ thread_wakeup.o \ kse_yield.o \ - kenv.o + kenv.o \ + lchflags.o diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h index 80385c0..011dc92 100644 --- a/sys/sys/sysproto.h +++ b/sys/sys/sysproto.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: src/sys/kern/syscalls.master,v 1.109 2002/04/14 05:31:47 alc Exp + * created from FreeBSD: src/sys/kern/syscalls.master,v 1.111 2002/05/05 23:37:44 mux Exp */ #ifndef _SYS_SYSPROTO_H_ @@ -1111,6 +1111,10 @@ struct kenv_args { char value_l_[PADL_(char *)]; char * value; char value_r_[PADR_(char *)]; char len_l_[PADL_(int)]; int len; char len_r_[PADR_(int)]; }; +struct lchflags_args { + char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)]; + char flags_l_[PADL_(int)]; int flags; char flags_r_[PADR_(int)]; +}; int nosys(struct thread *, struct nosys_args *); void sys_exit(struct thread *, struct sys_exit_args *); int fork(struct thread *, struct fork_args *); @@ -1361,6 +1365,7 @@ int kse_new(struct thread *, struct kse_new_args *); int thread_wakeup(struct thread *, struct thread_wakeup_args *); int kse_yield(struct thread *, struct kse_yield_args *); int kenv(struct thread *, struct kenv_args *); +int lchflags(struct thread *, struct lchflags_args *); #ifdef COMPAT_43 |