From 23524fb9509369fc89f843fbbad0a3de06bb0d1d Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Tue, 3 Aug 1993 07:02:38 +0000 Subject: [PATCH] * config.h.in: Add #undefs for HAVE_MKDIR and HAVE_RMDIR, for configure to edit. * sysdep.c [not HAVE_MKDIR] (mkdir): New function, taken from tar, for use on systems lacking the mkdir function. [not HAVE_RMDIR] (rmdir): New function, taken from tar, for use on systems lacking the rmdir function. --- src/config.in | 3 +- src/sysdep.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 1 deletion(-) diff --git a/src/config.in b/src/config.in index 7b19feef5a..dafb759749 100644 --- a/src/config.in +++ b/src/config.in @@ -113,8 +113,9 @@ and this notice must be preserved on all copies. */ #undef HAVE_XRMSETDATABASE #undef HAVE_XSCREENRESOURCESTRING +#undef HAVE_MKDIR +#undef HAVE_RMDIR #undef HAVE_RANDOM - #undef HAVE_BCOPY #undef HAVE_AIX_SMT_EXP diff --git a/src/sysdep.c b/src/sysdep.c index 3cc0a8cf80..d765fa79ec 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -3091,6 +3091,118 @@ readdirver (dirp) #endif /* VMS */ #endif /* NONSYSTEM_DIR_LIBRARY */ + + +/* mkdir and rmdir functions, for systems which don't have them. */ + +#ifndef HAVE_MKDIR +/* + * Written by Robert Rother, Mariah Corporation, August 1985. + * + * If you want it, it's yours. All I ask in return is that if you + * figure out how to do this in a Bourne Shell script you send me + * a copy. + * sdcsvax!rmr or rmr@uscd + * + * Severely hacked over by John Gilmore to make a 4.2BSD compatible + * subroutine. 11Mar86; hoptoad!gnu + * + * Modified by rmtodd@uokmax 6-28-87 -- when making an already existing dir, + * subroutine didn't return EEXIST. It does now. + */ + +/* + * Make a directory. + */ +int +mkdir (dpath, dmode) + char *dpath; + int dmode; +{ + int cpid, status; + struct stat statbuf; + + if (stat (dpath, &statbuf) == 0) + { + errno = EEXIST; /* Stat worked, so it already exists */ + return -1; + } + + /* If stat fails for a reason other than non-existence, return error */ + if (errno != ENOENT) + return -1; + + switch (cpid = fork ()) + { + + case -1: /* Error in fork() */ + return (-1); /* Errno is set already */ + + case 0: /* Child process */ + /* + * Cheap hack to set mode of new directory. Since this + * child process is going away anyway, we zap its umask. + * FIXME, this won't suffice to set SUID, SGID, etc. on this + * directory. Does anybody care? + */ + status = umask (0); /* Get current umask */ + status = umask (status | (0777 & ~dmode)); /* Set for mkdir */ + execl ("/bin/mkdir", "mkdir", dpath, (char *) 0); + _exit (-1); /* Can't exec /bin/mkdir */ + + default: /* Parent process */ + while (cpid != wait (&status)); /* Wait for kid to finish */ + } + + if (WIFSIGNALED (status) || WEXITSTATUS (status) != 0) + { + errno = EIO; /* We don't know why, but */ + return -1; /* /bin/mkdir failed */ + } + + return 0; +} +#endif /* not HAVE_MKDIR */ + +#ifndef HAVE_RMDIR +int +rmdir (dpath) + char *dpath; +{ + int cpid, status; + struct stat statbuf; + + if (stat (dpath, &statbuf) != 0) + { + /* Stat just set errno. We don't have to */ + return -1; + } + + switch (cpid = fork ()) + { + + case -1: /* Error in fork() */ + return (-1); /* Errno is set already */ + + case 0: /* Child process */ + execl ("/bin/rmdir", "rmdir", dpath, (char *) 0); + _exit (-1); /* Can't exec /bin/mkdir */ + + default: /* Parent process */ + while (cpid != wait (&status)); /* Wait for kid to finish */ + } + + if (WIFSIGNALED (status) || WEXITSTATUS (status) != 0) + { + errno = EIO; /* We don't know why, but */ + return -1; /* /bin/mkdir failed */ + } + + return 0; +} +#endif /* !HAVE_RMDIR */ + + /* Functions for VMS */ #ifdef VMS -- 2.20.1