A new mkdir program "nmkdir".
Robert Rother
rmr at sdcsvax.UUCP
Tue Aug 20 15:13:47 AEST 1985
This is a copy of a program I wrote to use in a software installation
sh script. The only difference (I hope!) between this program and the
original mkdir is that given the command
nmkdir a/b/c
if any part of the path does not exist, it will make the appropriate
directories. In other words, just c, b/c or a/b/c.
Robert Rother
Mariah Corporation
--------------------------- Cut here ------------------------------
/*
** NMKDIR.C
**
** Written by Robert Rother, Mariah Corporation, August 1985.
**
** I wrote this out of shear disgust with myself because I couldn't
** figure out how to do this in /bin/sh.
**
** If you want it, it's yours. All I ask in return is that if you
** figure out how to do this in a Bourne Shell script you send me
** a copy.
** sdcsvax!rmr or rmr at uscd
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <stdio.h>
#include <errno.h>
/*
** If you are running 4.2BSD you probably want neither of the following,
** on the other hand if your not running of 4.2BSD you probably want
** both.
*/
#define MKDIR /* Define this if you do not have the mkdir(2) call. */
#define index strchr /* Define this if you do not have the index(3c) call. */
int errcnt;
int vflag;
extern int errno;
main(argc, argv)
int argc;
register char *argv[];
{
while (*++argv) {
if (**argv == '-' && *(*argv + 1) == 'v')
vflag++;
else
mymkdir(*argv);
}
exit(errcnt != 0);
}
mymkdir(path)
register char *path;
{
register char *pptr;
char *index();
if (!path || !*path) return;
pptr = *path == '/' ? path + 1 : path;
do
{
if (pptr = index(pptr, '/'))
*pptr = '\0';
if (!access(path, 0)) {
struct stat buf;
if (stat(path, &buf) < 0) {
perror(path);
errcnt++;
break;
}
if ((buf.st_mode & S_IFMT) != S_IFDIR) {
fprintf(stderr, "%s already exists\n", path);
errcnt++;
break;
}
} else {
if (vflag) printf("making directory %s\n", path);
if (mkdir(path, 0777) < 0) {
fprintf(stderr, "mkdir: ");
perror(path);
errcnt++;
break;
}
}
if (pptr) *pptr++ = '/';
} while (pptr);
}
#ifdef MKDIR
mkdir(dpath, dmode)
char *dpath;
int dmode;
{
int tmp, cpid, status;
register int (*istat)(), (*qstat)();
if ((cpid = fork()) == 0) {
execl("/bin/mkdir", "mkdir", dpath, (char *)0);
return(-1);
}
if (cpid != -1) {
istat = signal(SIGINT, SIG_IGN);
qstat = signal(SIGQUIT, SIG_IGN);
while((tmp = wait(&status)) != cpid)
if (errno != EINTR) break;
(void)signal(SIGINT, istat);
(void)signal(SIGQUIT, qstat);
return (tmp == -1 ? -1 : 0);
} return(-1);
}
#endif
More information about the Comp.sources.unix
mailing list