diff options
Diffstat (limited to 'time/emkdir.c')
-rw-r--r-- | time/emkdir.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/time/emkdir.c b/time/emkdir.c new file mode 100644 index 0000000..5cc62d2 --- /dev/null +++ b/time/emkdir.c @@ -0,0 +1,85 @@ +#ifndef lint +#ifndef NOID +static char elsieid[] = "@(#)emkdir.c 8.23"; +#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((int) (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++ = '\''; +#endif /* defined unix */ +#ifndef 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"; +#endif /* defined unix */ +#ifndef unix + format = "mkdir %s"; +#endif /* !defined unix */ + command = imalloc((int) (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 was a registered trademark of UNIX System Laboratories in 1993. +*/ + +#endif /* !defined emkdir */ |