54 const char *myname =
"make_dirs";
60 mode_t saved_mode = 0;
66 cp = (
unsigned char *) (saved_path =
mystrdup(path));
72 #define SKIP_WHILE(cond, ptr) { while(*ptr && (cond)) ptr++; }
78 if ((saved_ch = *cp) != 0)
80 if ((ret =
stat(saved_path, &st)) >= 0) {
81 if (!S_ISDIR(st.st_mode)) {
86 saved_mode = st.st_mode;
104 if (saved_mode & S_IWOTH) {
105 msg_warn(
"refusing to mkdir %s: parent directory is writable by everyone",
112 if ((ret = mkdir(saved_path, perms)) < 0) {
116 if ((ret =
stat(saved_path, &st)) < 0)
118 if (!S_ISDIR(st.st_mode)) {
129 if ((ret =
stat(saved_path, &st)) < 0) {
130 msg_warn(
"%s: stat %s: %m", myname, saved_path);
135 if (st.st_gid != egid && (ret = chown(saved_path, -1, egid)) < 0) {
136 msg_warn(
"%s: chgrp %s: %m", myname, saved_path);
162 int main(
int argc,
char **argv)
167 while (--argc > 0 && *++argv != 0)
char * mystrdup(const char *str)
int main(int argc, char **argv)
void msg_warn(const char *fmt,...)
NORETURN msg_fatal(const char *fmt,...)
#define SKIP_WHILE(cond, ptr)
void msg_vstream_init(const char *name, VSTREAM *vp)
int make_dirs(const char *path, int perms)