Annotation of embedaddon/lrzsz/lib/mkdir.c, revision 1.1.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>