1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
12 #include <sys/types.h>
20 typedef struct flag_mapping {
25 FLAG_MAPPING flag_table[] = {
26 {"O_RDONLY", O_RDONLY},
27 {"O_WRONLY", O_WRONLY},
31 {"O_NOCTTY", O_NOCTTY},
33 {"O_APPEND", O_APPEND},
34 {"O_NONBLOCK", O_NONBLOCK},
35 {"O_NDELAY", O_NDELAY},
37 {"O_NOFOLLOW", O_NOFOLLOW},
38 {"O_DIRECTORY", O_DIRECTORY},
39 {"O_LARGEFILE", O_LARGEFILE},
43 void Usage_and_abort(void)
45 fprintf(stderr, "Usage: openfile -f flags [ -m mode ] filename \n");
46 fprintf(stderr, "e.g. openfile -f O_RDWR:O_CREAT -m 0755 /etc/passwd\n");
50 int main(int argc, char** argv)
65 while ((c = getopt (argc, argv, "f:m:")) != -1) {
70 cloned_flags = (char *)malloc(strlen(optarg)+1);
71 if (cloned_flags == NULL) {
72 fprintf(stderr, "Insufficient memory.\n");
76 strncpy(cloned_flags, optarg, strlen(optarg)+1);
77 for (tmp = strtok(optarg, ":|"); tmp;
78 tmp = strtok(NULL, ":|")) {
81 printf("flags = %s\n",tmp);
84 for (i = 0; flag_table[i].flag != -1; i++) {
85 if (!strcmp(tmp, flag_table[i].string)){
86 flags |= flag_table[i].flag;
91 if (flag_table[i].flag == -1) {
92 fprintf(stderr, "No such flag: %s\n",
98 printf("flags = %x\n", flags);
104 printf("mode = %s\n", optarg);
106 mode = strtol(optarg, NULL, 8);
109 printf("mode = %o\n", mode);
113 fprintf(stderr, "Bad parameters.\n");
118 if (optind == argc) {
119 fprintf(stderr, "Bad parameters.\n");
123 fname = argv[optind];
126 if (!flag_set || !file_set) {
127 fprintf(stderr, "Missing flag or file-name\n");
133 fd = open(fname, flags, mode);
135 fd = open(fname, flags);
138 fprintf(stderr, "Succeed in opening file \"%s\"(flags=%s",
139 fname, cloned_flags);
142 fprintf(stderr, ", mode=%o", mode);
143 fprintf(stderr, ")\n");
146 fprintf(stderr, "Error in opening file \"%s\"(flags=%s",
147 fname, cloned_flags);
149 fprintf(stderr, ", mode=%o", mode);
150 fprintf(stderr, ") %d: %s\n", errno, strerror(errno));