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>