/* 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
# 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 <stdlib.h>
#endif
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 may not have honored the `special' bits. */
+ if ((mode & ~S_IRWXUGO)
+ && chmod (basename_dir, mode))
+ {
+ error (0, errno, _("cannot chmod %s"), dirpath);
+ retval = 1;
}
CLEANUP_CWD;