mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 10:50:07 +00:00
86 lines
1.6 KiB
C
86 lines
1.6 KiB
C
#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 */
|