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