+
+struct flag_mapping {
+ const char *string;
+ const int flag;
+} flag_table[] = {
+ {"O_RDONLY", O_RDONLY},
+ {"O_WRONLY", O_WRONLY},
+ {"O_RDWR", O_RDWR},
+ {"O_CREAT", O_CREAT},
+ {"O_EXCL", O_EXCL},
+ {"O_NOCTTY", O_NOCTTY},
+ {"O_TRUNC", O_TRUNC},
+ {"O_APPEND", O_APPEND},
+ {"O_NONBLOCK", O_NONBLOCK},
+ {"O_NDELAY", O_NDELAY},
+ {"O_SYNC", O_SYNC},
+#ifdef O_DIRECT
+ {"O_DIRECT", O_DIRECT},
+#endif
+#ifdef O_NOATIME
+ {"O_NOATIME", O_NOATIME},
+#endif
+ {"O_LARGEFILE", O_LARGEFILE},
+ {"O_DIRECTORY", O_DIRECTORY},
+ {"O_NOFOLLOW", O_NOFOLLOW},
+ {"O_LOV_DELAY_CREATE", O_LOV_DELAY_CREATE},
+ {"", -1}
+};
+
+int get_flags(char *data, int *rflags)
+{
+ char *cloned_flags;
+ char *tmp;
+ int flag_set = 0;
+ int flags = 0;
+ int size = 0;
+
+ cloned_flags = strdup(data);
+ if (cloned_flags == NULL) {
+ fprintf(stderr, "Insufficient memory.\n");
+ exit(-1);
+ }
+
+ for (tmp = strtok(cloned_flags, ":"); tmp;
+ tmp = strtok(NULL, ":")) {
+ int i;
+
+ size = tmp - cloned_flags;
+ for (i = 0; flag_table[i].flag != -1; i++) {
+ if (!strcmp(tmp, flag_table[i].string)){
+ flags |= flag_table[i].flag;
+ size += strlen(flag_table[i].string);
+ flag_set = 1;
+ break;
+ }
+ }
+ }
+ free(cloned_flags);
+
+ if (!flag_set) {
+ *rflags = O_RDONLY;
+ return 0;
+ }
+
+ *rflags = flags;
+ return size;
+}
+