File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / lrzsz / lib / mkdir.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Thu Oct 24 15:49:50 2019 UTC (4 years, 8 months ago) by misho
Branches: lrzsz, MAIN
CVS tags: v0_12_20p5, HEAD
lrzsz ver 0.12.20

    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>