home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / gnu / uucp-1.04 / unix / mkdir.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-02-13  |  1.2 KB  |  59 lines

  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.  
  12. int
  13. mkdir (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, FALSE, 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.