]> Zhao Yanbai Git Server - minix.git/commitdiff
Added fchdir() system call, with corresponding manpage, Changelog and
authorBen Gras <ben@minix3.org>
Wed, 29 Jun 2005 19:28:26 +0000 (19:28 +0000)
committerBen Gras <ben@minix3.org>
Wed, 29 Jun 2005 19:28:26 +0000 (19:28 +0000)
system include modifications.

include/minix/callnr.h
include/unistd.h
lib/posix/_chdir.c
man/man2/chdir.2
servers/fs/proto.h
servers/fs/stadir.c
servers/fs/table.c
servers/pm/table.c

index 45249511d3afacd80e08c9d3bb9967937c90c71b..1ed0d6b499b102e68ef0a29061f950fd79c53fce 100755 (executable)
@@ -1,4 +1,4 @@
-#define NCALLS           86    /* number of system calls allowed */
+#define NCALLS           87    /* number of system calls allowed */
 
 #define EXIT              1 
 #define FORK              2 
@@ -74,3 +74,4 @@
 #define ALLOCMEM         83    /* to PM */
 #define FREEMEM                  84    /* to PM */
 #define SELECT            85   /* to FS */
+#define FCHDIR            86   /* to FS */
index ab62354ad17c5d371b271b2ac75c7960ae195d19..d23249c0b1f88c129302aefb3a1529c7ec0807bf 100755 (executable)
@@ -85,6 +85,7 @@ _PROTOTYPE( void _exit, (int _status)                                 );
 _PROTOTYPE( int access, (const char *_path, int _amode)                        );
 _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 close, (int _fd)                                       );
 _PROTOTYPE( char *ctermid, (char *_s)                                  );
index 566cde1e8e4f94f3f463d2dca088d2041a99257a..34c177a6b9cb218aeaaf160e6edf2282f4348792 100755 (executable)
@@ -10,3 +10,13 @@ _CONST char *name;
   _loadname(name, &m);
   return(_syscall(FS, CHDIR, &m));
 }
+
+PUBLIC int fchdir(fd)
+int fd;
+{
+  message m;
+
+  m.m1_i1 = fd;
+  return(_syscall(FS, FCHDIR, &m));
+}
+
index d7b180a7e125cab238b07c0859f09910b6c7b0c9..b47fa672b4244473d71d0890e69368ac7b6d99b6 100644 (file)
@@ -7,18 +7,22 @@
 .TH CHDIR 2 "August 26, 1985"
 .UC 4
 .SH NAME
-chdir \- change current working directory
+chdir, fchdir \- change current working directory
 .SH SYNOPSIS
 .nf
 .ft B
 #include <unistd.h>
 
 int chdir(const char *\fIpath\fP)
+int fchdir(int \fIfd\fP)
 .ft R
 .fi
 .SH DESCRIPTION
 .I Path
 is the pathname of a directory.
+.I Fd
+is the file descriptor of a directory.
+
 .B Chdir
 causes this directory
 to become the current working directory,
index ac6248f3c7a142a99ff065171b73c2517106d83d..915501e5f21cfe094ccb6d2e2257e91fff79ea8e 100644 (file)
@@ -142,6 +142,7 @@ _PROTOTYPE( zone_t rd_indir, (struct buf *bp, int index)            );
 
 /* stadir.c */
 _PROTOTYPE( int do_chdir, (void)                                       );
+_PROTOTYPE( int do_fchdir, (void)                                      );
 _PROTOTYPE( int do_chroot, (void)                                      );
 _PROTOTYPE( int do_fstat, (void)                                       );
 _PROTOTYPE( int do_stat, (void)                                                );
index bb029ed69ea9ae6ad74d61c35f5c83a3c5f7aa7d..dbc2f6d14be33b584dbffa66362d256d4fc90351 100644 (file)
 #include "super.h"
 
 FORWARD _PROTOTYPE( int change, (struct inode **iip, char *name_ptr, int len));
+FORWARD _PROTOTYPE( int change_into, (struct inode **iip, struct inode *ip));
 FORWARD _PROTOTYPE( int stat_inode, (struct inode *rip, struct filp *fil_ptr,
                        char *user_addr)                                );
 
+/*===========================================================================*
+ *                             do_fchdir                                    *
+ *===========================================================================*/
+PUBLIC int do_fchdir()
+{
+       /* Change directory on already-opened fd. */
+       struct filp *rfilp;
+
+       /* Is the file descriptor valid? */
+       if ( (rfilp = get_filp(m_in.fd)) == NIL_FILP) return(err_code);
+
+       return change_into(&fp->fp_workdir, rfilp->filp_ino);
+}
+
 /*===========================================================================*
  *                             do_chdir                                     *
  *===========================================================================*/
@@ -86,13 +101,22 @@ char *name_ptr;                    /* pointer to the directory name to change to */
 int len;                       /* length of the directory name string */
 {
 /* Do the actual work for chdir() and chroot(). */
-
   struct inode *rip;
-  register int r;
 
   /* Try to open the new directory. */
   if (fetch_name(name_ptr, len, M3) != OK) return(err_code);
   if ( (rip = eat_path(user_path)) == NIL_INODE) return(err_code);
+  return change_into(iip, rip);
+}
+
+/*===========================================================================*
+ *                             change_into                                          *
+ *===========================================================================*/
+PRIVATE int change_into(iip, rip)
+struct inode **iip;            /* pointer to the inode pointer for the dir */
+struct inode *rip;             /* this is what the inode has to become */
+{
+  register int r;
 
   /* It must be a directory and also be searchable. */
   if ( (rip->i_mode & I_TYPE) != I_DIRECTORY)
@@ -112,7 +136,6 @@ int len;                    /* length of the directory name string */
   return(OK);
 }
 
-
 /*===========================================================================*
  *                             do_stat                                      *
  *===========================================================================*/
index 5505bda0aa321d7b23e54f5992945c0e9c5159e4..9e9c463af029b2b4ef8303013bd518549e064de3 100644 (file)
@@ -103,6 +103,7 @@ PUBLIC _PROTOTYPE (int (*call_vec[]), (void) ) = {
        no_sys,         /* 83 = memalloc */
        no_sys,         /* 84 = memfree */
        do_select,      /* 85 = select */
+       do_fchdir,      /* 86 = fchdir */
 };
 /* This should not fail with "array size is negative": */
 extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1];
index 8bb49cf58130c91d3195cc40968df10430b9dd3b..3adec3153334ce99b2a44e1343354f3904d3f487 100644 (file)
@@ -102,6 +102,7 @@ _PROTOTYPE (int (*call_vec[NCALLS]), (void) ) = {
        do_allocmem,    /* 83 = memalloc */
        do_freemem,     /* 84 = memfree */
        no_sys,         /* 85 = select */
+       no_sys,         /* 86 = fchdir */
 };
 /* This should not fail with "array size is negative": */
 extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1];