]> Zhao Yanbai Git Server - minix.git/commitdiff
Added fchmod() and fchown()
authorBen Gras <ben@minix3.org>
Tue, 18 Apr 2006 11:26:04 +0000 (11:26 +0000)
committerBen Gras <ben@minix3.org>
Tue, 18 Apr 2006 11:26:04 +0000 (11:26 +0000)
14 files changed:
include/minix/callnr.h
include/sys/stat.h
include/unistd.h
lib/posix/Makefile.in
lib/posix/_fchmod.c [new file with mode: 0755]
lib/posix/_fchown.c [new file with mode: 0755]
lib/syscall/Makefile.in
lib/syscall/fchmod.s [new file with mode: 0755]
lib/syscall/fchown.s [new file with mode: 0755]
man/man2/chmod.2
man/man2/chown.2
servers/fs/protect.c
servers/fs/table.c
servers/pm/table.c

index 571ddf9db830b083aafe5b46f710b6bd16940237..7e9118ff2e45d83408559acb14a7b684652a9c28 100755 (executable)
@@ -1,4 +1,4 @@
-#define NCALLS           95    /* number of system calls allowed */
+#define NCALLS           97    /* number of system calls allowed */
 
 #define EXIT              1 
 #define FORK              2 
@@ -86,3 +86,5 @@
 #define SETEGID                  92    /* to PM */
 #define TRUNCATE         93    /* to FS */
 #define FTRUNCATE        94    /* to FS */
+#define FCHMOD           95    /* to FS */
+#define FCHOWN           96    /* to FS */
index 45debc803eafaef8ad0c16147ceac0aab956bde0..4dec6c1cab8aff5d6fc59f7ddd7c07ac4854a2be 100755 (executable)
@@ -68,6 +68,7 @@ struct stat {
 
 /* Function Prototypes. */
 _PROTOTYPE( int chmod, (const char *_path, _mnx_Mode_t _mode)          );
+_PROTOTYPE( int fchmod, (int fd, _mnx_Mode_t _mode)                    );
 _PROTOTYPE( int fstat, (int _fildes, struct stat *_buf)                        );
 _PROTOTYPE( int mkdir, (const char *_path, _mnx_Mode_t _mode)          );
 _PROTOTYPE( int mkfifo, (const char *_path, _mnx_Mode_t _mode)         );
index 2d50fcf980d204f5195ba2bad2544b294ef9b9ba..03f741d9f7c1a56b11e0616a3465d4e4549d672b 100755 (executable)
@@ -96,6 +96,7 @@ _PROTOTYPE( unsigned int alarm, (unsigned int _seconds)                       );
 _PROTOTYPE( int chdir, (const char *_path)                             );
 _PROTOTYPE( int fchdir, (int fd)                                       );
 _PROTOTYPE( int chown, (const char *_path, _mnx_Uid_t _owner, _mnx_Gid_t _group)       );
+_PROTOTYPE( int fchown, (int fd, _mnx_Uid_t _owner, _mnx_Gid_t _group) );
 _PROTOTYPE( int close, (int _fd)                                       );
 _PROTOTYPE( char *ctermid, (char *_s)                                  );
 _PROTOTYPE( char *cuserid, (char *_s)                                  );
index 6e0587d1a9cfe27fff5cd62fb2032fbd91ac3a62..3e95fc7124871fb0bf8614ac1273e9e2f5324236 100644 (file)
@@ -27,6 +27,8 @@ libc_FILES=" \
        _execv.c \
        _execve.c \
        _execvp.c \
+       _fchmod.c \
+       _fchown.c \
        _fcntl.c \
        _fork.c \
        _fpathconf.c \
diff --git a/lib/posix/_fchmod.c b/lib/posix/_fchmod.c
new file mode 100755 (executable)
index 0000000..54fdd19
--- /dev/null
@@ -0,0 +1,14 @@
+#include <lib.h>
+#define fchmod _fchmod
+#include <sys/stat.h>
+
+PUBLIC int fchmod(fd, mode)
+int fd;
+_mnx_Mode_t mode;
+{
+  message m;
+
+  m.m3_i1 = fd;
+  m.m3_i2 = mode;
+  return(_syscall(FS, FCHMOD, &m));
+}
diff --git a/lib/posix/_fchown.c b/lib/posix/_fchown.c
new file mode 100755 (executable)
index 0000000..49f4e7b
--- /dev/null
@@ -0,0 +1,17 @@
+#include <lib.h>
+#define fchown _fchown
+#include <string.h>
+#include <unistd.h>
+
+PUBLIC int fchown(fd, owner, grp)
+int fd;
+_mnx_Uid_t owner;
+_mnx_Gid_t grp;
+{
+  message m;
+
+  m.m1_i1 = fd;
+  m.m1_i2 = owner;
+  m.m1_i3 = grp;
+  return(_syscall(FS, FCHOWN, &m));
+}
index c3b7490b1bf65d55cffcdab2f0c8a179cc1df236..556aa4f25a818788962d0c396796981257cf65cf 100644 (file)
@@ -29,6 +29,8 @@ libc_FILES=" \
        execv.s \
        execve.s \
        execvp.s \
+       fchown.s \
+       fchmod.s \
        fcntl.s \
        fork.s \
        fpathconf.s \
diff --git a/lib/syscall/fchmod.s b/lib/syscall/fchmod.s
new file mode 100755 (executable)
index 0000000..a8544ea
--- /dev/null
@@ -0,0 +1,7 @@
+.sect .text
+.extern        __fchmod
+.define        _fchmod
+.align 2
+
+_fchmod:
+       jmp     __fchmod
diff --git a/lib/syscall/fchown.s b/lib/syscall/fchown.s
new file mode 100755 (executable)
index 0000000..1a0c949
--- /dev/null
@@ -0,0 +1,7 @@
+.sect .text
+.extern        __fchown
+.define        _fchown
+.align 2
+
+_fchown:
+       jmp     __fchown
index 9a30318aa1ede4d432ec93523b47c7c2d1bbc02a..d7f138721611422a4a9fbbe2ee5350be90eddb7e 100644 (file)
@@ -7,7 +7,7 @@
 .TH CHMOD 2 "May 13, 1986"
 .UC 4
 .SH NAME
-chmod \- change mode of file
+chmod, fchmod \- change mode of file
 .SH SYNOPSIS
 .nf
 .ft B
index 6d854f07c2bc531212560ff357a7a38c5462c930..e15c6652cb380f11c13cea044c48e3281c16cc95 100644 (file)
@@ -7,7 +7,7 @@
 .TH CHOWN 2 "May 22, 1986"
 .UC 4
 .SH NAME
-chown \- change owner and group of a file
+chown, fchown \- change owner and group of a file
 .SH SYNOPSIS
 .nf
 .ft B
@@ -64,7 +64,6 @@ Search permission is denied for a component of the path prefix.
 .TP 15
 [ELOOP]
 Too many symbolic links were encountered in translating the pathname.
-(Minix-vmd)
 .TP 15
 [EPERM]
 The effective user ID is not the super-user.
index ddca80e89a7554d16690952984003548d88ec216..221d91ff0430d4e0e765a47dbd3fc91ddffe4d1d 100644 (file)
@@ -2,8 +2,8 @@
  * for four system calls that relate to protection.
  *
  * The entry points into this file are
- *   do_chmod: perform the CHMOD system call
- *   do_chown: perform the CHOWN system call
+ *   do_chmod: perform the CHMOD and FCHMOD system calls
+ *   do_chown: perform the CHOWN and FCHOWN system calls
  *   do_umask: perform the UMASK system call
  *   do_access:        perform the ACCESS system call
  *   forbidden:        check to see if a given access is allowed on a given inode
@@ -29,9 +29,15 @@ PUBLIC int do_chmod()
   register struct inode *rip;
   register int r;
 
-  /* Temporarily open the file. */
-  if (fetch_name(m_in.name, m_in.name_length, M3) != OK) return(err_code);
-  if ( (rip = eat_path(user_path)) == NIL_INODE) return(err_code);
+  if(call_nr == CHMOD) {
+    /* Temporarily open the file. */
+    if (fetch_name(m_in.name, m_in.name_length, M3) != OK) return(err_code);
+    if ( (rip = eat_path(user_path)) == NIL_INODE) return(err_code);
+  } else if(call_nr == FCHMOD) {
+    struct filp *filp;
+    if(!(filp = get_filp(m_in.m3_i1))) return(err_code);
+    rip = filp->filp_ino;
+  } else panic(__FILE__, "do_chmod called with strange call_nr", call_nr);
 
   /* Only the owner or the super_user may change the mode of a file.
    * No one may change the mode of a file on a read-only file system.
@@ -43,7 +49,7 @@ PUBLIC int do_chmod()
 
   /* If error, return inode. */
   if (r != OK) {
-       put_inode(rip);
+       if(call_nr == CHMOD) put_inode(rip);
        return(r);
   }
 
@@ -53,7 +59,7 @@ PUBLIC int do_chmod()
   rip->i_update |= CTIME;
   rip->i_dirt = DIRTY;
 
-  put_inode(rip);
+  if(call_nr == CHMOD) put_inode(rip);
   return(OK);
 }
 
@@ -67,9 +73,15 @@ PUBLIC int do_chown()
   register struct inode *rip;
   register int r;
 
-  /* Temporarily open the file. */
-  if (fetch_name(m_in.name1, m_in.name1_length, M1) != OK) return(err_code);
-  if ( (rip = eat_path(user_path)) == NIL_INODE) return(err_code);
+  if(call_nr == CHOWN) {
+    /* Temporarily open the file. */
+    if (fetch_name(m_in.name1, m_in.name1_length, M1) != OK) return(err_code);
+    if ( (rip = eat_path(user_path)) == NIL_INODE) return(err_code);
+  } else if(call_nr == FCHOWN) {
+    struct filp *filp;
+    if(!(filp = get_filp(m_in.m1_i1))) return(err_code);
+    rip = filp->filp_ino;
+  } else panic(__FILE__, "do_chown called with strange call_nr", call_nr);
 
   /* Not permitted to change the owner of a file on a read-only file sys. */
   r = read_only(rip);
@@ -92,7 +104,7 @@ PUBLIC int do_chown()
        rip->i_dirt = DIRTY;
   }
 
-  put_inode(rip);
+  if(call_nr == CHOWN) put_inode(rip);
   return(r);
 }
 
index 4b1df0811092ca93096c20a0315f6c1621d853a1..7c521708da9c839ae2353ca86f83f4f6a7265e48 100644 (file)
@@ -112,6 +112,8 @@ PUBLIC _PROTOTYPE (int (*call_vec[]), (void) ) = {
        no_sys,         /* 92 = setegid */
        do_truncate,    /* 93 = truncate */
        do_ftruncate,   /* 94 = truncate */
+       do_chmod,       /* 95 = fchmod */
+       do_chown,       /* 96 = fchown */
 };
 /* This should not fail with "array size is negative": */
 extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1];
index d494f2bc4d2bd0db22da7be19bc190487ce5c288..d1e8a5b8b2d8d80d40fe7d4207f85ef10a240534 100644 (file)
@@ -110,6 +110,8 @@ _PROTOTYPE (int (*call_vec[NCALLS]), (void) ) = {
        do_getset,      /* 92 = setegid */
        no_sys,         /* 93 = truncate */
        no_sys,         /* 94 = ftruncate */
+       no_sys,         /* 95 = fchmod */
+       no_sys,         /* 96 = fchown */
 };
 /* This should not fail with "array size is negative": */
 extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1];