X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fmakepath.c;h=9763b4c04c271f8877c4b8197fab6cc7f23a3f2c;hb=f71611c47848e687376f7f18620bb148523bfbf3;hp=018b17e567402d68509de4ca6f3a90fc51b31192;hpb=6564fd9944c6478655dfec306aa9cd046e694a23;p=gnulib.git diff --git a/lib/makepath.c b/lib/makepath.c index 018b17e56..9763b4c04 100644 --- a/lib/makepath.c +++ b/lib/makepath.c @@ -1,5 +1,5 @@ /* makepath.c -- Ensure that a directory path exists. - Copyright (C) 1990, 1997, 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1990, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -50,6 +50,10 @@ char *alloca (); # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #endif +#ifndef S_IRWXUGO +# define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO) +#endif + #if STDC_HEADERS # include #endif @@ -308,7 +312,7 @@ make_path (const char *argpath, if (newly_created_dir) { if (verbose_fmt_string) - fprintf (stderr, verbose_fmt_string, dirpath); + error (0, 0, verbose_fmt_string, dirpath); if ((owner != (uid_t) -1 || group != (gid_t) -1) && chown (basename_dir, owner, group) @@ -380,13 +384,18 @@ make_path (const char *argpath, error (0, errno, _("cannot chown %s"), dirpath); retval = 1; } - /* chown may have turned off some permission bits we wanted. */ - if ((mode & (S_ISUID | S_ISGID | S_ISVTX)) - && chmod (basename_dir, mode)) - { - error (0, errno, _("cannot chmod %s"), dirpath); - retval = 1; - } + } + + /* The above chown may have turned off some permission bits in MODE. + Another reason we may have to use chmod here is that mkdir(2) is + required to honor only the file permission bits. In particular, + it need not honor the `special' bits, so if MODE includes any + special bits, set them here. */ + if ((mode & ~S_IRWXUGO) + && chmod (basename_dir, mode)) + { + error (0, errno, _("cannot chmod %s"), dirpath); + retval = 1; } CLEANUP_CWD;