ref: 543e6478226a896bfff8e749c53dc41cfc42ed4d
dir: /sys/src/ape/cmd/pax/port.c/
/* $Source: /u/mark/src/pax/RCS/port.c,v $ * * $Revision: 1.2 $ * * port.c - These are routines not available in all environments. * * DESCRIPTION * * The routines contained in this file are provided for portability to * other versions of UNIX or other operating systems (e.g. MSDOS). * Not all systems have the same functions or the same semantics, * these routines attempt to bridge the gap as much as possible. * * AUTHOR * * Mark H. Colburn, NAPS International (mark@jhereg.mn.org) * John Gilmore (gnu@hoptoad) * * Sponsored by The USENIX Association for public distribution. * * Copyright (c) 1989 Mark H. Colburn. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice is duplicated in all such * forms and that any documentation, advertising materials, and other * materials related to such distribution and use acknowledge that the * software was developed * by Mark H. Colburn and sponsored by The * USENIX Association. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * $Log: port.c,v $ * Revision 1.2 89/02/12 10:05:35 mark * 1.2 release fixes * * Revision 1.1 88/12/23 18:02:29 mark * Initial revision * */ #ifndef lint static char *ident = "$Id: port.c,v 1.2 89/02/12 10:05:35 mark Exp $"; static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n"; #endif /* ! lint */ /* Headers */ #include "pax.h" /* * Some computers are not so crass as to align themselves into the BSD or USG * camps. If a system supplies all of the routines we fake here, add it to * the list in the #if !defined()'s below and it'll all be skipped. */ #if !defined(mc300) && !defined(mc500) && !defined(mc700) && !defined(BSD) && !defined(_POSIX_SOURCE) /* mkdir - make a directory * * DESCRIPTION * * Mkdir will make a directory of the name "dpath" with a mode of * "dmode". This is consistent with the BSD mkdir() function and the * P1003.1 definitions of MKDIR. * * PARAMETERS * * dpath - name of directory to create * dmode - mode of the directory * * RETURNS * * Returns 0 if the directory was successfully created, otherwise a * non-zero return value will be passed back to the calling function * and the value of errno should reflect the error. */ #ifdef __STDC__ int mkdir(char *dpath, int dmode) #else int mkdir(dpath, dmode) char *dpath; int dmode; #endif { int cpid, status; Stat statbuf; extern int errno; if (STAT(dpath, &statbuf) == 0) { errno = EEXIST; /* Stat worked, so it already exists */ return (-1); } /* If stat fails for a reason other than non-existence, return error */ if (errno != ENOENT) return (-1); switch (cpid = fork()) { case -1: /* Error in fork() */ return (-1); /* Errno is set already */ case 0: /* Child process */ status = umask(0); /* Get current umask */ status = umask(status | (0777 & ~dmode)); /* Set for mkdir */ execl("/bin/mkdir", "mkdir", dpath, (char *) 0); _exit(-1); /* Can't exec /bin/mkdir */ default: /* Parent process */ while (cpid != wait(&status)) { /* Wait for child to finish */ } } if (TERM_SIGNAL(status) != 0 || TERM_VALUE(status) != 0) { errno = EIO; /* We don't know why, but */ return (-1); /* /bin/mkdir failed */ } return (0); } /* rmdir - remove a directory * * DESCRIPTION * * Rmdir will remove the directory specified by "dpath". It is * consistent with the BSD and POSIX rmdir functions. * * PARAMETERS * * dpath - name of directory to remove * * RETURNS * * Returns 0 if the directory was successfully deleted, otherwise a * non-zero return value will be passed back to the calling function * and the value of errno should reflect the error. */ #ifdef __STDC__ int rmdir(char *dpath) #else int rmdir(dpath) char *dpath; #endif { int cpid, status; Stat statbuf; extern int errno; /* check to see if it exists */ if (STAT(dpath, &statbuf) == -1) { return (-1); } switch (cpid = fork()) { case -1: /* Error in fork() */ return (-1); /* Errno is set already */ case 0: /* Child process */ execl("/bin/rmdir", "rmdir", dpath, (char *) 0); _exit(-1); /* Can't exec /bin/rmdir */ default: /* Parent process */ while (cpid != wait(&status)) { /* Wait for child to finish */ } } if (TERM_SIGNAL(status) != 0 || TERM_VALUE(status) != 0) { errno = EIO; /* We don't know why, but */ return (-1); /* /bin/rmdir failed */ } return (0); } #endif /* MASSCOMP, BSD */