Annotation of embedaddon/lrzsz/lib/mkdir.c, revision 1.1

1.1     ! misho       1: /* mkdir.c -- BSD compatible make directory function for System V
        !             2:    Copyright (C) 1988, 1990 Free Software Foundation, Inc.
        !             3: 
        !             4:    This program is free software; you can redistribute it and/or modify
        !             5:    it under the terms of the GNU General Public License as published by
        !             6:    the Free Software Foundation; either version 2, or (at your option)
        !             7:    any later version.
        !             8: 
        !             9:    This program is distributed in the hope that it will be useful,
        !            10:    but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            11:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            12:    GNU General Public License for more details.
        !            13: 
        !            14:    You should have received a copy of the GNU General Public License
        !            15:    along with this program; if not, write to the Free Software
        !            16:    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
        !            17: 
        !            18: #ifdef HAVE_CONFIG_H
        !            19: #include <config.h>
        !            20: #endif
        !            21: 
        !            22: #include <sys/types.h>
        !            23: #include <sys/stat.h>
        !            24: #include <errno.h>
        !            25: #ifndef errno
        !            26: extern int errno;
        !            27: #endif
        !            28: 
        !            29: #ifdef STAT_MACROS_BROKEN
        !            30: #undef S_ISDIR
        !            31: #endif
        !            32: 
        !            33: #if !defined(S_ISDIR) && defined(S_IFDIR)
        !            34: #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
        !            35: #endif
        !            36: 
        !            37: /* mkdir adapted from GNU tar.  */
        !            38: 
        !            39: /* Make directory DPATH, with permission mode DMODE.
        !            40: 
        !            41:    Written by Robert Rother, Mariah Corporation, August 1985
        !            42:    (sdcsvax!rmr or rmr@uscd).  If you want it, it's yours.
        !            43: 
        !            44:    Severely hacked over by John Gilmore to make a 4.2BSD compatible
        !            45:    subroutine. 11Mar86; hoptoad!gnu
        !            46: 
        !            47:    Modified by rmtodd@uokmax 6-28-87 -- when making an already existing dir,
        !            48:    subroutine didn't return EEXIST.  It does now.  */
        !            49: 
        !            50: int
        !            51: mkdir (dpath, dmode)
        !            52:      char *dpath;
        !            53:      int dmode;
        !            54: {
        !            55:   int cpid, status;
        !            56:   struct stat statbuf;
        !            57: 
        !            58:   if (stat (dpath, &statbuf) == 0)
        !            59:     {
        !            60:       errno = EEXIST;          /* stat worked, so it already exists.  */
        !            61:       return -1;
        !            62:     }
        !            63: 
        !            64:   /* If stat fails for a reason other than non-existence, return error.  */
        !            65:   if (errno != ENOENT)
        !            66:     return -1;
        !            67: 
        !            68:   cpid = fork ();
        !            69:   switch (cpid)
        !            70:     {
        !            71:     case -1:                   /* Cannot fork.  */
        !            72:       return -1;               /* errno is already set.  */
        !            73: 
        !            74:     case 0:                    /* Child process.  */
        !            75:       /* Cheap hack to set mode of new directory.  Since this child
        !            76:         process is going away anyway, we zap its umask.
        !            77:         This won't suffice to set SUID, SGID, etc. on this
        !            78:         directory, so the parent process calls chmod afterward.  */
        !            79:       status = umask (0);      /* Get current umask.  */
        !            80:       umask (status | (0777 & ~dmode));        /* Set for mkdir.  */
        !            81:       execl ("/bin/mkdir", "mkdir", dpath, (char *) 0);
        !            82:       _exit (1);
        !            83: 
        !            84:     default:                   /* Parent process.  */
        !            85:       /* Wait for kid to finish.  */
        !            86:       while (wait (&status) != cpid)
        !            87:        /* Do nothing.  */ ;
        !            88: 
        !            89:       if (status & 0xFFFF)
        !            90:        {
        !            91:          /* /bin/mkdir failed.  */
        !            92:          errno = EIO;
        !            93:          return -1;
        !            94:        }
        !            95:       return chmod (dpath, dmode);
        !            96:     }
        !            97: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>