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)
66 while ((c = getopt (argc, argv, "f:m:")) != -1) {
71 cloned_flags = (char*)malloc(strlen(optarg));
72 if (cloned_flags==NULL) {
73 fprintf(stderr, "Insufficient memory.\n");
77 strncpy(cloned_flags, optarg, strlen(optarg));
78 tmp = strtok(optarg, ":");
82 printf("flags = %s\n",tmp);
85 while (flag_table[i].flag != -1) {
87 r = strncasecmp(tmp, (flag_table[i].string),
88 strlen((flag_table[i].string)) );
95 if (flag_table[i].flag != -1) {
96 flags |= flag_table[i].flag;
98 fprintf(stderr, "No such flag: %s\n",
103 tmp = strtok(NULL, ":");
107 printf("flags = %x\n", flags);
113 printf("mode = %s\n", optarg);
115 mode = strtol (optarg, NULL, 8);
118 printf("mode = %o\n", mode);
122 fprintf(stderr, "Bad parameters.\n");
127 if (optind == argc) {
128 fprintf(stderr, "Bad parameters.\n");
132 fname = argv[optind];
135 if (!flag_set || !file_set) {
136 fprintf(stderr, "Missing flag or file-name\n");
142 i = open(fname, flags, mode);
144 i = open(fname, flags);
147 fprintf(stderr, "Succeed in opening file \"%s\"(flags=%s",
148 fname, cloned_flags);
151 fprintf(stderr, ", mode=%o", mode);
152 fprintf(stderr, ")\n");
155 fprintf(stderr, "Error in opening file \"%s\"(flags=%s",
156 fname, cloned_flags);
158 fprintf(stderr, ", mode=%o", mode);
159 fprintf(stderr, ") %s\n", strerror(errno));