X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fmkdir.c;h=1829a9e2575a46ac39a541b0ffae53c2c723e11b;hb=e911cfd715b17d7314df5882f00b86a2cef6c3ad;hp=b00199d3fa76c490acea8a590d0d5a3d03d7d46d;hpb=edab1a8ee7ddc0b5b4ce9fca08557efc1be8b64a;p=gnulib.git diff --git a/lib/mkdir.c b/lib/mkdir.c index b00199d3f..1829a9e25 100644 --- a/lib/mkdir.c +++ b/lib/mkdir.c @@ -1,5 +1,5 @@ -/* mkdir.c -- BSD compatible directory functions for System V - Copyright (C) 1988, 1990 Free Software Foundation, Inc. +/* BSD compatible make directory function for System V + Copyright (C) 1988, 1990, 1998 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 @@ -12,40 +12,39 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#ifdef HAVE_CONFIG_H -#if defined (CONFIG_BROKETS) -/* We use instead of "config.h" so that a compilation - using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h - (which it would do because it found this file in $srcdir). */ -#include -#else -#include "config.h" -#endif + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include #endif #include #include #include -#ifndef STDC_HEADERS +#ifndef errno extern int errno; #endif -#ifdef STAT_MACROS_BROKEN -#ifdef S_ISDIR -#undef S_ISDIR +#if STAT_MACROS_BROKEN +# undef S_ISDIR #endif -#endif /* STAT_MACROS_BROKEN. */ #if !defined(S_ISDIR) && defined(S_IFDIR) -#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #endif -#include "safe-stat.h" +#ifndef S_IRWXU +# define S_IRWXU 0700 +#endif +#ifndef S_IRWXG +# define S_IRWXG 0070 +#endif +#ifndef S_IRWXO +# define S_IRWXO 0007 +#endif -/* mkdir and rmdir adapted from GNU tar. */ +/* mkdir adapted from GNU tar. */ /* Make directory DPATH, with permission mode DMODE. @@ -59,14 +58,14 @@ extern int errno; subroutine didn't return EEXIST. It does now. */ int -mkdir (dpath, dmode) - char *dpath; - int dmode; +mkdir (const char *dpath, mode_t dmode) { - int cpid, status; + pid_t cpid; + mode_t mode; + int status; struct stat statbuf; - if (SAFE_STAT (dpath, &statbuf) == 0) + if (stat (dpath, &statbuf) == 0) { errno = EEXIST; /* stat worked, so it already exists. */ return -1; @@ -80,69 +79,30 @@ mkdir (dpath, dmode) switch (cpid) { case -1: /* Cannot fork. */ - return -1; /* errno is set already. */ + return -1; /* errno is already set. */ case 0: /* Child process. */ /* Cheap hack to set mode of new directory. Since this child process is going away anyway, we zap its umask. This won't suffice to set SUID, SGID, etc. on this directory, so the parent process calls chmod afterward. */ - status = umask (0); /* Get current umask. */ - umask (status | (0777 & ~dmode)); /* Set for mkdir. */ + mode = umask (0); /* Get current umask. */ + /* Set for mkdir. */ + umask (mode | ((S_IRWXU | S_IRWXG | S_IRWXO) & ~dmode)); execl ("/bin/mkdir", "mkdir", dpath, (char *) 0); _exit (1); default: /* Parent process. */ - while (wait (&status) != cpid) /* Wait for kid to finish. */ + /* Wait for kid to finish. */ + while (wait (&status) != cpid) /* Do nothing. */ ; - if (status & 0xFFFF) + if (status) { - errno = EIO; /* /bin/mkdir failed. */ + /* /bin/mkdir failed. */ + errno = EIO; return -1; } return chmod (dpath, dmode); } } - -/* Remove directory DPATH. - Return 0 if successful, -1 if not. */ - -int -rmdir (dpath) - char *dpath; -{ - int cpid, status; - struct stat statbuf; - - if (SAFE_STAT (dpath, &statbuf) != 0) - return -1; /* stat set errno. */ - - if (!S_ISDIR (statbuf.st_mode)) - { - errno = ENOTDIR; - return -1; - } - - cpid = fork (); - switch (cpid) - { - case -1: /* Cannot fork. */ - return -1; /* errno is set already. */ - - case 0: /* Child process. */ - execl ("/bin/rmdir", "rmdir", dpath, (char *) 0); - _exit (1); - - default: /* Parent process. */ - while (wait (&status) != cpid) /* Wait for kid to finish. */ - /* Do nothing. */ ; - - if (status & 0xFFFF) - { - errno = EIO; /* /bin/rmdir failed. */ - return -1; - } - return 0; - } -}