|
|
1.1 root 1: /* $Source: /src386/usr/bin/pax/port.c,v $
2: *
3: * $Revision: 1.1 $
4: *
5: * port.c - These are routines not available in all environments.
6: *
7: * DESCRIPTION
8: *
9: * The routines contained in this file are provided for portability to
10: * other versions of UNIX or other operating systems (e.g. MSDOS).
11: * Not all systems have the same functions or the same semantics,
12: * these routines attempt to bridge the gap as much as possible.
13: *
14: * AUTHOR
15: *
16: * Mark H. Colburn, NAPS International ([email protected])
17: * John Gilmore (gnu@hoptoad)
18: *
19: * Sponsored by The USENIX Association for public distribution.
20: *
21: * Copyright (c) 1989 Mark H. Colburn.
22: * All rights reserved.
23: *
24: * Redistribution and use in source and binary forms are permitted
25: * provided that the above copyright notice is duplicated in all such
26: * forms and that any documentation, advertising materials, and other
27: * materials related to such distribution and use acknowledge that the
28: * software was developed * by Mark H. Colburn and sponsored by The
29: * USENIX Association.
30: *
31: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
32: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
33: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
34: *
35: * $Log: port.c,v $
36: * Revision 1.1 92/08/28 08:02:56 bin
37: * Initial revision
38: *
39: * Revision 1.1 89/02/14 16:48:39 jep
40: * Initial revision
41: *
42: * Revision 1.1 88/12/23 18:02:29 mark
43: * Initial revision
44: *
45: */
46:
47: #ifndef lint
48: static char *ident = "$Id: port.c,v 1.1 92/08/28 08:02:56 bin Exp Locker: bin $";
49: static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
50: #endif /* ! lint */
51:
52:
53: /* Headers */
54:
55: #include "pax.h"
56:
57:
58: /*
59: * Some computers are not so crass as to align themselves into the BSD or USG
60: * camps. If a system supplies all of the routines we fake here, add it to
61: * the list in the #if !defined()'s below and it'll all be skipped.
62: */
63:
64: #if !defined(mc300) && !defined(mc500) && !defined(mc700) && !defined(BSD)
65:
66: /* mkdir - make a directory
67: *
68: * DESCRIPTION
69: *
70: * Mkdir will make a directory of the name "dpath" with a mode of
71: * "dmode". This is consistent with the BSD mkdir() function and the
72: * P1003.1 definitions of MKDIR.
73: *
74: * PARAMETERS
75: *
76: * dpath - name of directory to create
77: * dmode - mode of the directory
78: *
79: * RETURNS
80: *
81: * Returns 0 if the directory was successfully created, otherwise a
82: * non-zero return value will be passed back to the calling function
83: * and the value of errno should reflect the error.
84: */
85:
86: #if __STDC__
87:
88: int mkdir(char *dpath, int dmode)
89:
90: #else
91:
92: int mkdir(dpath, dmode)
93: char *dpath;
94: int dmode;
95:
96: #endif
97: {
98: int cpid, status;
99: Stat statbuf;
100: extern int errno;
101:
102: if (STAT(dpath, &statbuf) == 0) {
103: errno = EEXIST; /* Stat worked, so it already exists */
104: return (-1);
105: }
106: /* If stat fails for a reason other than non-existence, return error */
107: if (errno != ENOENT)
108: return (-1);
109:
110: switch (cpid = fork()) {
111:
112: case -1: /* Error in fork() */
113: return (-1); /* Errno is set already */
114:
115: case 0: /* Child process */
116:
117: status = umask(0); /* Get current umask */
118: status = umask(status | (0777 & ~dmode)); /* Set for mkdir */
119: execl("/bin/mkdir", "mkdir", dpath, (char *) 0);
120: _exit(-1); /* Can't exec /bin/mkdir */
121:
122: default: /* Parent process */
123: while (cpid != wait(&status)) {
124: /* Wait for child to finish */
125: }
126: }
127:
128: if (TERM_SIGNAL(status) != 0 || TERM_VALUE(status) != 0) {
129: errno = EIO; /* We don't know why, but */
130: return (-1); /* /bin/mkdir failed */
131: }
132: return (0);
133: }
134:
135:
136: /* rmdir - remove a directory
137: *
138: * DESCRIPTION
139: *
140: * Rmdir will remove the directory specified by "dpath". It is
141: * consistent with the BSD and POSIX rmdir functions.
142: *
143: * PARAMETERS
144: *
145: * dpath - name of directory to remove
146: *
147: * RETURNS
148: *
149: * Returns 0 if the directory was successfully deleted, otherwise a
150: * non-zero return value will be passed back to the calling function
151: * and the value of errno should reflect the error.
152: */
153:
154: #if __STDC__
155:
156: int rmdir(char *dpath)
157:
158: #else
159:
160: int rmdir(dpath)
161: char *dpath;
162:
163: #endif
164: {
165: int cpid, status;
166: Stat statbuf;
167: extern int errno;
168:
169: /* check to see if it exists */
170: if (STAT(dpath, &statbuf) == -1) {
171: return (-1);
172: }
173: switch (cpid = fork()) {
174:
175: case -1: /* Error in fork() */
176: return (-1); /* Errno is set already */
177:
178: case 0: /* Child process */
179: execl("/bin/rmdir", "rmdir", dpath, (char *) 0);
180: _exit(-1); /* Can't exec /bin/rmdir */
181:
182: default: /* Parent process */
183: while (cpid != wait(&status)) {
184: /* Wait for child to finish */
185: }
186: }
187:
188: if (TERM_SIGNAL(status) != 0 || TERM_VALUE(status) != 0) {
189: errno = EIO; /* We don't know why, but */
190: return (-1); /* /bin/rmdir failed */
191: }
192: return (0);
193: }
194:
195: #endif /* MASSCOMP, BSD */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.