home *** CD-ROM | disk | FTP | other *** search
/ Unix System Administration Handbook 1997 October / usah_oct97.iso / news / cnews.tar / libfake / mkdir.c < prev    next >
C/C++ Source or Header  |  1990-10-28  |  791b  |  43 lines

  1. /*
  2.  * 4.2BSD mkdir simulation
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <errno.h>
  7. #include "fixerrno.h"
  8. #include <sys/types.h>    /* argh */
  9. #include "libc.h"
  10.  
  11. /* system call returns */
  12. #define SYS_OK 0
  13. #define SYS_ERR (-1)
  14.  
  15. #define UMASK_MASK 0777
  16.  
  17. #define STRLEN(s) (sizeof (s) - 1)        /* s must be a char array */
  18.  
  19. int
  20. mkdir(dir, mode)
  21. char *dir;
  22. int mode;
  23. {
  24.     register char *cbuf = malloc((unsigned)STRLEN("mkdir ") + strlen(dir) + 1);
  25.     register int oldmask, ret;
  26.  
  27.     if (cbuf == NULL) {
  28.         errno = ENOMEM;            /* kludge */
  29.         return SYS_ERR;
  30.     }
  31.     oldmask = umask(0);
  32.     (void) umask(~(mode & ~oldmask) & UMASK_MASK);
  33.  
  34.     (void) sprintf(cbuf, "mkdir %s", dir);
  35.     ret = (system(cbuf) != 0? SYS_ERR: SYS_OK);
  36.     if (ret == SYS_ERR)
  37.         errno = EINVAL;            /* kludge */
  38.  
  39.     (void) umask(oldmask);
  40.     free(cbuf);
  41.     return ret;
  42. }
  43.