/*
* 4.2BSD mkdir simulation
*/
#include <stdio.h>
#include <errno.h>
#include "fixerrno.h"
#include <sys/types.h> /* argh */
#include "libc.h"
/* system call returns */
#define SYS_OK 0
#define SYS_ERR (-1)
#define UMASK_MASK 0777
#define STRLEN(s) (sizeof (s) - 1) /* s must be a char array */
int
mkdir(dir, mode)
char *dir;
int mode;
{
register char *cbuf = malloc((unsigned)STRLEN("mkdir ") + strlen(dir) + 1);
register int oldmask, ret;
if (cbuf == NULL) {
errno = ENOMEM; /* kludge */
return SYS_ERR;
}
oldmask = umask(0);
(void) umask(~(mode & ~oldmask) & UMASK_MASK);
(void) sprintf(cbuf, "mkdir %s", dir);
ret = (system(cbuf) != 0? SYS_ERR: SYS_OK);
if (ret == SYS_ERR)
errno = EINVAL; /* kludge */
(void) umask(oldmask);
free(cbuf);
return ret;
}
syntax highlighted by Code2HTML, v. 0.9.1