1/* mkdir.c
2   Create a directory.  We must go through a subsidiary program to
3   force our real uid to be the uucp owner before invoking the setuid
4   /bin/mkdir program.  */
5
6#include "uucp.h"
7
8#include "sysdep.h"
9
10#include <errno.h>
11
12int
13mkdir (zdir, imode)
14     const char *zdir;
15     int imode;
16{
17  struct stat s;
18  const char *azargs[3];
19  int aidescs[3];
20  pid_t ipid;
21
22  /* Make sure the directory does not exist, since we will otherwise
23     get the wrong errno value.  */
24  if (stat (zdir, &s) == 0)
25    {
26      errno = EEXIST;
27      return -1;
28    }
29
30  /* /bin/mkdir will create the directory with mode 777, so we set our
31     umask to get the mode we want.  */
32  (void) umask ((~ imode) & (S_IRWXU | S_IRWXG | S_IRWXO));
33
34  azargs[0] = UUDIR_PROGRAM;
35  azargs[1] = zdir;
36  azargs[2] = NULL;
37  aidescs[0] = SPAWN_NULL;
38  aidescs[1] = SPAWN_NULL;
39  aidescs[2] = SPAWN_NULL;
40
41  ipid = ixsspawn (azargs, aidescs, TRUE, FALSE, (const char *) NULL,
42		   TRUE, FALSE, (const char *) NULL,
43		   (const char *) NULL, (const char *) NULL);
44
45  (void) umask (0);
46
47  if (ipid < 0)
48    return -1;
49
50  if (ixswait ((unsigned long) ipid, (const char *) NULL) != 0)
51    {
52      /* Make up an errno value.  */
53      errno = EACCES;
54      return -1;
55    }
56
57  return 0;
58}
59