📄 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 lintstatic 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 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -