Mail Archives: djgpp-workers/2003/02/20/07:06:23
Hello.
Below is a patch to add FSEXT hooks for chmod, chown. OK to commit?
Thanks, bye, Rich =]
Index: include/sys/fsext.h
===================================================================
RCS file: /cvs/djgpp/djgpp/include/sys/fsext.h,v
retrieving revision 1.8
diff -p -u -3 -r1.8 fsext.h
--- include/sys/fsext.h 4 Feb 2003 20:25:29 -0000 1.8
+++ include/sys/fsext.h 20 Feb 2003 12:04:04 -0000
@@ -43,6 +43,8 @@ typedef enum {
__FSEXT_llseek,
__FSEXT_readlink,
__FSEXT_symlink,
+ __FSEXT_chmod,
+ __FSEXT_chown,
__FSEXT_fchown
} __FSEXT_Fnumber;
Index: src/libc/fsext/fsext.txh
===================================================================
RCS file: /cvs/djgpp/djgpp/src/libc/fsext/fsext.txh,v
retrieving revision 1.17
diff -p -u -3 -r1.17 fsext.txh
--- src/libc/fsext/fsext.txh 29 Jan 2003 12:51:07 -0000 1.17
+++ src/libc/fsext/fsext.txh 20 Feb 2003 12:04:06 -0000
@@ -167,6 +167,20 @@ symlinks in other than DJGPP symlink fil
The source and destination file names are passed to the handler unchanged.
+@item __FSEXT_chmod
+
+A file chmod handler (@pxref{chmod}). This is called when
+the permissions are to be changed for a file.
+
+The file name passed to the handler will have all its symlinks resolved.
+
+@item __FSEXT_chown
+
+A file chown handler (@pxref{chown}). This is called when
+the ownership is to be changed for a file.
+
+The file name passed to the handler will have all its symlinks resolved.
+
@item __FSEXT_fchown
A file fchown handler (@pxref{fchown}). This is called when
Index: src/libc/posix/sys/stat/chmod.c
===================================================================
RCS file: /cvs/djgpp/djgpp/src/libc/posix/sys/stat/chmod.c,v
retrieving revision 1.2
diff -p -u -3 -r1.2 chmod.c
--- src/libc/posix/sys/stat/chmod.c 22 Aug 2000 18:40:19 -0000 1.2
+++ src/libc/posix/sys/stat/chmod.c 20 Feb 2003 12:04:12 -0000
@@ -1,3 +1,4 @@
+/* Copyright (C) 2003 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2000 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
#include <libc/stubs.h>
@@ -5,6 +6,8 @@
#include <sys/stat.h>
#include <io.h>
#include <stdio.h>
+#include <sys/fsext.h>
+#include <libc/fsexthlp.h>
int
chmod(const char *filename, int pmode)
@@ -12,9 +15,15 @@ chmod(const char *filename, int pmode)
int dmode;
char real_name[FILENAME_MAX];
int attr;
+ int rv;
if (!__solve_symlinks(filename, real_name))
return -1;
+
+ /* See if a file system extension has a hook for this file. */
+ if (__FSEXT_call_open_handlers_wrapper(__FSEXT_chmod, &rv,
+ real_name, pmode))
+ return rv;
attr = _chmod(real_name, 0, 0);
Index: src/libc/posix/sys/stat/chmod.txh
===================================================================
RCS file: /cvs/djgpp/djgpp/src/libc/posix/sys/stat/chmod.txh,v
retrieving revision 1.3
diff -p -u -3 -r1.3 chmod.txh
--- src/libc/posix/sys/stat/chmod.txh 29 Jan 2003 12:51:41 -0000 1.3
+++ src/libc/posix/sys/stat/chmod.txh 20 Feb 2003 12:04:12 -0000
@@ -28,6 +28,9 @@ Make the file writable
Other @code{S_I*} values could be included, but they will be ignored.
+This function can be hooked by File System Extensions
+(@pxref{File System Extensions}).
+
@subheading Return Value
Zero if the file exists and the mode was changed, else nonzero.
Index: src/libc/posix/unistd/chown.c
===================================================================
RCS file: /cvs/djgpp/djgpp/src/libc/posix/unistd/chown.c,v
retrieving revision 1.2
diff -p -u -3 -r1.2 chown.c
--- src/libc/posix/unistd/chown.c 28 Jun 2000 18:37:17 -0000 1.2
+++ src/libc/posix/unistd/chown.c 20 Feb 2003 12:04:17 -0000
@@ -1,21 +1,37 @@
+/* Copyright (C) 2003 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2000 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
#include <libc/stubs.h>
+#include <libc/symlink.h>
#include <unistd.h>
#include <errno.h>
+#include <stdio.h>
+#include <sys/fsext.h>
+#include <libc/fsexthlp.h>
/* MS-DOS couldn't care less about file ownerships, so we could
always succeed. At least fail for non-existent files
- and for devices. */
+ and for devices. Let FSEXTs handle it, if they want. */
int
-chown(const char *path, uid_t owner __attribute__((__unused__)),
- gid_t group __attribute__((__unused__)))
+chown(const char *path, uid_t owner, gid_t group)
{
+ char real_name[FILENAME_MAX];
+ int rv;
+
if (access(path, F_OK)) /* non-existent file */
{
errno = ENOENT;
return -1;
}
+
+ if (!__solve_symlinks(path, real_name))
+ return -1;
+
+ /* See if a file system extension has a hook for this file. */
+ if (__FSEXT_call_open_handlers_wrapper(__FSEXT_chown, &rv,
+ real_name, owner, group))
+ return rv;
+
return 0;
}
Index: src/libc/posix/unistd/chown.txh
===================================================================
RCS file: /cvs/djgpp/djgpp/src/libc/posix/unistd/chown.txh,v
retrieving revision 1.5
diff -p -u -3 -r1.5 chown.txh
--- src/libc/posix/unistd/chown.txh 29 Jan 2003 12:51:41 -0000 1.5
+++ src/libc/posix/unistd/chown.txh 20 Feb 2003 12:04:17 -0000
@@ -13,7 +13,8 @@ int chown(const char *file, int owner, i
This function changes the ownership of the open file specified by @var{file}
to the user ID @var{owner} and group ID @var{group}.
-This function does nothing under MS-DOS.
+This function does nothing under MS-DOS. This function can
+be hooked by File System Extensions (@pxref{File System Extensions}).
@subheading Return Value
Index: src/libc/fsext/fse_zero.c
===================================================================
RCS file: /cvs/djgpp/djgpp/src/libc/fsext/fse_zero.c,v
retrieving revision 1.3
diff -p -u -3 -r1.3 fse_zero.c
--- src/libc/fsext/fse_zero.c 10 Jan 2003 19:07:12 -0000 1.3
+++ src/libc/fsext/fse_zero.c 20 Feb 2003 12:04:23 -0000
@@ -607,6 +607,8 @@ dev_fsext (__FSEXT_Fnumber n, int *rv, v
break;
case __FSEXT_unlink:
+ case __FSEXT_chmod:
+ case __FSEXT_chown:
filename = va_arg(args, char *);
/* Check the filename */
@@ -624,7 +626,8 @@ dev_fsext (__FSEXT_Fnumber n, int *rv, v
/* This must be emulated, since the FSEXT has been called. */
emul = 1;
- /* The zero device cannot be removed. */
+ /* The zero device cannot be removed or have its mode or ownership
+ * changed. */
errno = EPERM;
*rv = -1;
break;
Index: src/docs/kb/wc204.txi
===================================================================
RCS file: /cvs/djgpp/djgpp/src/docs/kb/wc204.txi,v
retrieving revision 1.138
diff -p -u -3 -r1.138 wc204.txi
--- src/docs/kb/wc204.txi 4 Feb 2003 20:19:22 -0000 1.138
+++ src/docs/kb/wc204.txi 20 Feb 2003 12:04:28 -0000
@@ -860,3 +860,7 @@ The constants @code{HUGE_VALF} and @code
The error code @code{EILSEQ} was added --- @code{errno} may be assigned it.
@code{perror} and @code{strerror} were updated to display/return
an error message for @code{EILSEQ}.
+
+@cindex File System Extensions, and @code{chmod}
+@cindex File System Extensions, and @code{chown}
+@code{chmod} and @code{chown} can now be hooked by File System Extensions.
Index: tests/libc/fsext/tzero.c
===================================================================
RCS file: /cvs/djgpp/djgpp/tests/libc/fsext/tzero.c,v
retrieving revision 1.2
diff -p -u -3 -r1.2 tzero.c
--- tests/libc/fsext/tzero.c 14 Jun 2002 09:11:07 -0000 1.2
+++ tests/libc/fsext/tzero.c 20 Feb 2003 12:04:34 -0000
@@ -1,3 +1,4 @@
+/* Copyright (C) 2003 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2002 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2001 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2000 DJ Delorie, see COPYING.DJ for details */
@@ -367,6 +368,30 @@ main (int argc, char *argv[])
if (n >= 0) {
fprintf(stderr,
"unlink() succeeded in removing %s - it should fail\n",
+ DEV_ZERO_PATH);
+ return(EXIT_FAILURE);
+ }
+
+ assert(errno == EPERM);
+
+ /* - Check chmod() fails - */
+ n = chmod(DEV_ZERO_PATH, S_IWUSR);
+ if (n >= 0) {
+ fprintf(stderr,
+ "chmod() succeeded in changing permissions of %s -"
+ "it should fail\n",
+ DEV_ZERO_PATH);
+ return(EXIT_FAILURE);
+ }
+
+ assert(errno == EPERM);
+
+ /* - Check chown() fails - */
+ n = chown(DEV_ZERO_PATH, 2 * getuid(), 2 * getgid());
+ if (n >= 0) {
+ fprintf(stderr,
+ "chown() succeeded in changing ownership of %s -"
+ "it should fail\n",
DEV_ZERO_PATH);
return(EXIT_FAILURE);
}
- Raw text -