Add the lchflags() syscall.
authorPeter Avalos <pavalos@dragonflybsd.org>
Tue, 11 Nov 2008 00:55:49 +0000 (00:55 +0000)
committerPeter Avalos <pavalos@dragonflybsd.org>
Tue, 11 Nov 2008 00:55:49 +0000 (00:55 +0000)
This is essentially the same as chflags(), but it operates on the symlink,
not on the underlying file.

Documentation-from: FreeBSD
Reviewed-by: dillon
13 files changed:
lib/libarchive/config.h
lib/libc/sys/Makefile.inc
lib/libc/sys/chflags.2
sys/kern/init_sysent.c
sys/kern/syscalls.c
sys/kern/vfs_syscalls.c
sys/sys/param.h
sys/sys/stat.h
sys/sys/syscall-hide.h
sys/sys/syscall.h
sys/sys/syscall.mk
sys/sys/sysproto.h
sys/sys/sysunion.h

index daa84b2..943f5e4 100644 (file)
@@ -1,4 +1,4 @@
-/* $DragonFly: src/lib/libarchive/config.h,v 1.13 2008/07/12 14:57:33 pavalos Exp $ */
+/* $DragonFly: src/lib/libarchive/config.h,v 1.14 2008/11/11 00:55:48 pavalos Exp $ */
 /* config.h.  Generated from config.h.in by configure.  */
 /* config.h.in.  Generated from configure.ac by autoheader.  */
 
 #define HAVE_LANGINFO_H 1
 
 /* Define to 1 if you have the `lchflags' function. */
-/* #undef HAVE_LCHFLAGS */
+#define HAVE_LCHFLAGS 1
 
 /* Define to 1 if you have the `lchmod' function. */
 #define HAVE_LCHMOD 1
index 62432e7..5606215 100644 (file)
@@ -1,6 +1,6 @@
 #      @(#)Makefile.inc        8.3 (Berkeley) 10/24/94
 # $FreeBSD: src/lib/libc/sys/Makefile.inc,v 1.75.2.7 2003/04/22 17:31:18 trhodes Exp $
-# $DragonFly: src/lib/libc/sys/Makefile.inc,v 1.38 2008/10/16 07:58:43 matthias Exp $
+# $DragonFly: src/lib/libc/sys/Makefile.inc,v 1.39 2008/11/11 00:55:49 pavalos Exp $
 
 # sys sources
 .PATH: ${.CURDIR}/../libc/${MACHINE_ARCH}/sys ${.CURDIR}/../libc/sys
@@ -101,7 +101,7 @@ MAN+=       sched_get_priority_max.2 sched_setparam.2 \
 MLINKS+=brk.2 sbrk.2
 MLINKS+=caps_sys_get.2 caps_sys_wait.2
 MLINKS+=chdir.2 fchdir.2
-MLINKS+=chflags.2 fchflags.2
+MLINKS+=chflags.2 fchflags.2 chflags.2 lchflags.2
 MLINKS+=chmod.2 fchmod.2 chmod.2 lchmod.2
 MLINKS+=chown.2 fchown.2 chown.2 lchown.2
 MLINKS+=clock_gettime.2 clock_getres.2 clock_gettime.2 clock_settime.2
index b08c007..a01f99e 100644 (file)
 .\"
 .\"    @(#)chflags.2   8.3 (Berkeley) 5/2/95
 .\" $FreeBSD: src/lib/libc/sys/chflags.2,v 1.11.2.7 2001/12/14 18:34:00 ru Exp $
-.\" $DragonFly: src/lib/libc/sys/chflags.2,v 1.4 2008/06/24 07:58:00 swildner Exp $
+.\" $DragonFly: src/lib/libc/sys/chflags.2,v 1.5 2008/11/11 00:55:49 pavalos Exp $
 .\"
-.Dd June 24, 2008
+.Dd November 10, 2008
 .Dt CHFLAGS 2
 .Os
 .Sh NAME
 .Nm chflags ,
+.Nm lchflags ,
 .Nm fchflags
 .Nd set file flags
 .Sh LIBRARY
@@ -48,6 +49,8 @@
 .Ft int
 .Fn chflags "const char *path"  "u_long flags"
 .Ft int
+.Fn lchflags "const char *path" "u_long flags"
+.Ft int
 .Fn fchflags "int fd" "u_long flags"
 .Sh DESCRIPTION
 The file whose name
@@ -58,6 +61,16 @@ or referenced by the descriptor
 has its flags changed to
 .Fa flags .
 .Pp
+The
+.Fn lchflags
+system call is like
+.Fn chflags
+except in the case where the named file is a symbolic link,
+in which case
+.Fn lchflags
+will change the flags of the link itself,
+rather than the file it points to.
+.Pp
 The flags specified are formed by
 .Em or Ns 'ing
 the following values
index 9f7e483..65cdd1a 100644 (file)
@@ -2,8 +2,8 @@
  * System call switch table.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/kern/init_sysent.c,v 1.62 2008/06/01 19:55:30 dillon Exp $
- * created from DragonFly
+ * $DragonFly: src/sys/kern/init_sysent.c,v 1.63 2008/11/11 00:55:49 pavalos Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.60 2008/11/10 22:11:45 pavalos Exp 
  */
 
 #include "opt_compat.h"
@@ -426,7 +426,7 @@ struct sysent sysent[] = {
        { 0, (sy_call_t *)sys_nosys },                  /* 388 = nosys */
        { 0, (sy_call_t *)sys_nosys },                  /* 389 = nosys */
        { 0, (sy_call_t *)sys_nosys },                  /* 390 = nosys */
-       { 0, (sy_call_t *)sys_nosys },                  /* 391 = nosys */
+       { AS(lchflags_args), (sy_call_t *)sys_lchflags },       /* 391 = lchflags */
        { AS(uuidgen_args), (sy_call_t *)sys_uuidgen }, /* 392 = uuidgen */
        { AS(sendfile_args), (sy_call_t *)sys_sendfile },       /* 393 = sendfile */
        { 0, (sy_call_t *)sys_nosys },                  /* 394 = nosys */
index 1aa40e1..a9b333c 100644 (file)
@@ -2,8 +2,8 @@
  * System call names.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/kern/syscalls.c,v 1.61 2008/06/01 19:55:30 dillon Exp $
- * created from DragonFly
+ * $DragonFly: src/sys/kern/syscalls.c,v 1.62 2008/11/11 00:55:49 pavalos Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.60 2008/11/10 22:11:45 pavalos Exp 
  */
 
 char *syscallnames[] = {
@@ -400,7 +400,7 @@ char *syscallnames[] = {
        "#388",                 /* 388 = nosys */
        "#389",                 /* 389 = nosys */
        "#390",                 /* 390 = nosys */
-       "#391",                 /* 391 = nosys */
+       "lchflags",                     /* 391 = lchflags */
        "uuidgen",                      /* 392 = uuidgen */
        "sendfile",                     /* 393 = sendfile */
        "#394",                 /* 394 = nosys */
index 36c9a1d..04b5a21 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)vfs_syscalls.c      8.13 (Berkeley) 4/15/94
  * $FreeBSD: src/sys/kern/vfs_syscalls.c,v 1.151.2.18 2003/04/04 20:35:58 tegge Exp $
- * $DragonFly: src/sys/kern/vfs_syscalls.c,v 1.134 2008/09/17 21:44:18 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_syscalls.c,v 1.135 2008/11/11 00:55:49 pavalos Exp $
  */
 
 #include <sys/param.h>
@@ -2583,6 +2583,36 @@ sys_chflags(struct chflags_args *uap)
        return (error);
 }
 
+/*
+ * lchflags(char *path, int flags)
+ *
+ * Change flags of a file given a path name, but don't follow symlinks.
+ */
+/* ARGSUSED */
+int
+sys_lchflags(struct lchflags_args *uap)
+{
+       struct nlookupdata nd;
+       struct vnode *vp;
+       int error;
+
+       vp = NULL;
+       error = nlookup_init(&nd, uap->path, UIO_USERSPACE, 0);
+       /* XXX Add NLC flag indicating modifying operation? */
+       if (error == 0)
+               error = nlookup(&nd);
+       if (error == 0)
+               error = ncp_writechk(&nd.nl_nch);
+       if (error == 0)
+               error = cache_vref(&nd.nl_nch, nd.nl_cred, &vp);
+       nlookup_done(&nd);
+       if (error == 0) {
+               error = setfflags(vp, uap->flags);
+               vrele(vp);
+       }
+       return (error);
+}
+
 /*
  * fchflags_args(int fd, int flags)
  *
index ea1a4c2..0265dca 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)param.h     8.3 (Berkeley) 4/4/95
  * $FreeBSD: src/sys/sys/param.h,v 1.61.2.38 2003/05/22 17:12:01 fjoe Exp $
- * $DragonFly: src/sys/sys/param.h,v 1.52 2008/09/09 04:06:20 dillon Exp $
+ * $DragonFly: src/sys/sys/param.h,v 1.53 2008/11/11 00:55:49 pavalos Exp $
  */
 
 #ifndef _SYS_PARAM_H_
  * 199900 - base development version before 2.0 branch
  * 200000 - 2.0 branch
  * 200100 - base development version after 2.0 branch
+ * 200101 - lchflags syscall
  */
 #undef __DragonFly_version
-#define __DragonFly_version 200100     /* Master, propagated to newvers */
+#define __DragonFly_version 200101     /* Master, propagated to newvers */
 
 #ifdef __FreeBSD__
 /* 
index e49c7b7..1b4fefc 100644 (file)
@@ -33,7 +33,7 @@
  *
  *     @(#)stat.h      8.12 (Berkeley) 6/16/95
  * $FreeBSD: src/sys/sys/stat.h,v 1.20 1999/12/29 04:24:47 peter Exp $
- * $DragonFly: src/sys/sys/stat.h,v 1.13 2008/06/02 20:13:37 dillon Exp $
+ * $DragonFly: src/sys/sys/stat.h,v 1.14 2008/11/11 00:55:49 pavalos Exp $
  */
 
 #ifndef _SYS_STAT_H_
@@ -217,6 +217,7 @@ mode_t      umask (mode_t);
 #ifndef _POSIX_SOURCE
 int    chflags (const char *, u_long);
 int    fchflags (int, u_long);
+int    lchflags (const char *, u_long);
 int    fchmod (int, mode_t);
 int    lchmod (const char *, mode_t);
 int    lstat (const char *, struct stat *);
index f086937..918e57c 100644 (file)
@@ -2,8 +2,8 @@
  * System call hiders.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/sys/syscall-hide.h,v 1.62 2008/06/01 19:55:32 dillon Exp $
- * created from DragonFly
+ * $DragonFly: src/sys/sys/syscall-hide.h,v 1.63 2008/11/11 00:55:49 pavalos Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.60 2008/11/10 22:11:45 pavalos Exp 
  */
 
 #ifdef COMPAT_43
@@ -279,6 +279,7 @@ HIDE_BSD(getresgid)
 HIDE_BSD(kqueue)
 HIDE_BSD(kevent)
 HIDE_BSD(sctp_peeloff)
+HIDE_BSD(lchflags)
 HIDE_BSD(uuidgen)
 HIDE_BSD(sendfile)
 HIDE_BSD(varsym_set)
index 81cb462..ac8e40b 100644 (file)
@@ -2,8 +2,8 @@
  * System call numbers.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/sys/syscall.h,v 1.62 2008/06/01 19:55:32 dillon Exp $
- * created from DragonFly
+ * $DragonFly: src/sys/sys/syscall.h,v 1.63 2008/11/11 00:55:49 pavalos Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.60 2008/11/10 22:11:45 pavalos Exp 
  */
 
 #define        SYS_syscall     0
 #define        SYS_kqueue      362
 #define        SYS_kevent      363
 #define        SYS_sctp_peeloff        364
+#define        SYS_lchflags    391
 #define        SYS_uuidgen     392
 #define        SYS_sendfile    393
 #define        SYS_varsym_set  450
index 44d84af..2d1da78 100644 (file)
@@ -1,7 +1,7 @@
 # DragonFly system call names.
 # DO NOT EDIT-- this file is automatically generated.
-# $DragonFly: src/sys/sys/syscall.mk,v 1.62 2008/06/01 19:55:32 dillon Exp $
-# created from DragonFly
+# $DragonFly: src/sys/sys/syscall.mk,v 1.63 2008/11/11 00:55:49 pavalos Exp $
+# created from DragonFly: src/sys/kern/syscalls.master,v 1.60 2008/11/10 22:11:45 pavalos Exp 
 MIASM =  \
        syscall.o \
        exit.o \
@@ -231,6 +231,7 @@ MIASM =  \
        kqueue.o \
        kevent.o \
        sctp_peeloff.o \
+       lchflags.o \
        uuidgen.o \
        sendfile.o \
        varsym_set.o \
index 57049cb..cdecd77 100644 (file)
@@ -2,8 +2,8 @@
  * System call prototypes.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/sys/sysproto.h,v 1.62 2008/06/01 19:55:32 dillon Exp $
- * created from DragonFly
+ * $DragonFly: src/sys/sys/sysproto.h,v 1.63 2008/11/11 00:55:49 pavalos Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.60 2008/11/10 22:11:45 pavalos Exp 
  */
 
 #ifndef _SYS_SYSPROTO_H_
@@ -1692,6 +1692,13 @@ struct   sctp_peeloff_args {
        int     sd;     char sd_[PAD_(int)];
        caddr_t name;   char name_[PAD_(caddr_t)];
 };
+struct lchflags_args {
+#ifdef _KERNEL
+       struct sysmsg sysmsg;
+#endif
+       char *  path;   char path_[PAD_(char *)];
+       int     flags;  char flags_[PAD_(int)];
+};
 struct uuidgen_args {
 #ifdef _KERNEL
        struct sysmsg sysmsg;
@@ -2683,6 +2690,7 @@ int       sys_getresgid (struct getresgid_args *);
 int    sys_kqueue (struct kqueue_args *);
 int    sys_kevent (struct kevent_args *);
 int    sys_sctp_peeloff (struct sctp_peeloff_args *);
+int    sys_lchflags (struct lchflags_args *);
 int    sys_uuidgen (struct uuidgen_args *);
 int    sys_sendfile (struct sendfile_args *);
 int    sys_varsym_set (struct varsym_set_args *);
index 34196aa..c4d189f 100644 (file)
@@ -2,8 +2,8 @@
  * Union of syscall args for messaging.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/sys/sysunion.h,v 1.59 2008/06/01 19:55:32 dillon Exp $
- * created from DragonFly
+ * $DragonFly: src/sys/sys/sysunion.h,v 1.60 2008/11/11 00:55:49 pavalos Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.60 2008/11/10 22:11:45 pavalos Exp 
  */
 
 union sysunion {
@@ -335,6 +335,7 @@ union sysunion {
        struct  kqueue_args kqueue;
        struct  kevent_args kevent;
        struct  sctp_peeloff_args sctp_peeloff;
+       struct  lchflags_args lchflags;
        struct  uuidgen_args uuidgen;
        struct  sendfile_args sendfile;
        struct  varsym_set_args varsym_set;