88 lines
1.5 KiB
C
88 lines
1.5 KiB
C
#ifdef LIBC
|
|
#include <ansidecl.h>
|
|
#endif
|
|
|
|
#ifndef lint
|
|
#ifndef NOID
|
|
static char elsieid[] = "@(#)emkdir.c 8.20";
|
|
#endif /* !defined NOID */
|
|
#endif /* !defined lint */
|
|
|
|
#ifndef emkdir
|
|
|
|
/*LINTLIBRARY*/
|
|
|
|
#include "private.h"
|
|
|
|
extern char * imalloc P((int n));
|
|
extern void ifree P((char * p));
|
|
|
|
static char *
|
|
quoted(name)
|
|
register const char * name;
|
|
{
|
|
register char * result;
|
|
register char * cp;
|
|
register int c;
|
|
|
|
if (name == NULL)
|
|
name = "";
|
|
result = imalloc(4 * strlen(name) + 3);
|
|
if (result == NULL)
|
|
return NULL;
|
|
cp = result;
|
|
#ifdef unix
|
|
*cp++ = '\'';
|
|
while ((c = *name++) != '\0')
|
|
if (c == '\'') {
|
|
*cp++ = c;
|
|
*cp++ = '\\';
|
|
*cp++ = c;
|
|
*cp++ = c;
|
|
} else *cp++ = c;
|
|
*cp++ = '\'';
|
|
#else /* !defined unix */
|
|
while ((c = *name++) != '\0')
|
|
if (c == '/')
|
|
*cp++ = '\\';
|
|
else *cp++ = c;
|
|
#endif /* !defined unix */
|
|
*cp = '\0';
|
|
return result;
|
|
}
|
|
|
|
int
|
|
emkdir(name, mode)
|
|
const char * name;
|
|
const int mode;
|
|
{
|
|
register int result;
|
|
register const char * format;
|
|
register char * command;
|
|
register char * qname;
|
|
|
|
if ((qname = quoted(name)) == NULL)
|
|
return -1;
|
|
#ifdef unix
|
|
format = "mkdir 2>&- %s && chmod 2>&- %o %s";
|
|
#else /* !defined unix */
|
|
format = "mkdir %s";
|
|
#endif /* !defined unix */
|
|
command = imalloc(strlen(format) + 2 * strlen(qname) + 20 + 1);
|
|
if (command == NULL) {
|
|
ifree(qname);
|
|
return -1;
|
|
}
|
|
(void) sprintf(command, format, qname, mode, qname);
|
|
ifree(qname);
|
|
result = system(command);
|
|
ifree(command);
|
|
return (result == 0) ? 0 : -1;
|
|
}
|
|
|
|
/*
|
|
** UNIX is a registered trademark of AT&T.
|
|
*/
|
|
|
|
#endif /* !defined emkdir */
|