|
|
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.