#include #include #include #include #include #include #include #define DEF_MODE 022 int error(char *s, char *t, char *u) { write(2, s, strlen(s) * sizeof(char)); write(2, t, strlen(t) * sizeof(char)); write(2, u, strlen(u) * sizeof(char)); } int main(int argc, char *argv[]) { char *filename; /* name of file to create */ int fd; /* file descriptor */ mode_t umsk, mode; char *ep; /* first is the file name */ if (argc > 1) filename = argv[1]; /* next comes the desired protection mode */ if (argc > 2){ if (strcmp(argv[2], "-") == 0) mode = DEF_MODE; else{ mode = strtol(argv[2], &ep, 8); if (*ep != '\0' || mode < 0 || mode > 0777){ error("Bad mode: '", argv[2], "'\n"); return(1); } } } /* next comes the desired umask */ if (argc > 3){ if (strcmp(argv[2], "-") != 0){ umsk = strtol(argv[3], &ep, 8); if (*ep != '\0' || umsk < 0 || umsk > 0777){ error("Bad umask: '", argv[3], "'\n"); return(1); } umask(umsk); } } /* if there's anything else, error */ if (argc > 4){ error("Usage: ", argv[0], " filename [-|mode] [umask]\n"); return(1); } printf("mode = %o, umask = %o\n", mode, umsk); if ((fd = open(argv[1], O_WRONLY|O_CREAT, mode)) < 0){ error(argv[1], ":", " "); error(strerror(errno), "\n", ""); } return(0); }