[net.sources] A new mkdir program "nmkdir".

rmr@sdcsvax.UUCP (Robert Rother) (08/20/85)

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