Whamcloud - gitweb
Branch HEAD
[fs/lustre-release.git] / lustre / tests / openfile.c
index 7d8cc6b..6cba76b 100644 (file)
@@ -6,7 +6,10 @@
 #define DEBUG
 #endif
 
+/* for O_DIRECTORY and O_DIRECT */
+#ifndef _GNU_SOURCE
 #define _GNU_SOURCE
+#endif
 
 #include <stdio.h>
 #include <sys/types.h>
 #include <string.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <lustre/lustre_user.h>
 
 typedef struct flag_mapping {
-       char string[20];
-       int  flag;
+       const char *string;
+       const int  flag;
 } FLAG_MAPPING;
 
 FLAG_MAPPING flag_table[] = {
@@ -34,9 +38,13 @@ FLAG_MAPPING flag_table[] = {
        {"O_NONBLOCK", O_NONBLOCK},
        {"O_NDELAY", O_NDELAY},
        {"O_SYNC", O_SYNC},
-       {"O_NOFOLLOW", O_NOFOLLOW},
-       {"O_DIRECTORY", O_DIRECTORY},
+#ifdef O_DIRECT
+       {"O_DIRECT", O_DIRECT},
+#endif
        {"O_LARGEFILE", O_LARGEFILE},
+       {"O_DIRECTORY", O_DIRECTORY},
+       {"O_NOFOLLOW", O_NOFOLLOW},
+       {"O_LOV_DELAY_CREATE", O_LOV_DELAY_CREATE},
        {"", -1}
 };
 
@@ -51,13 +59,14 @@ int main(int argc, char** argv)
 {
         int    fd;
         int    flags=0;
-        mode_t mode=0;
+        mode_t mode=0644;
         char*  fname=NULL;
         int    mode_set=0;
         int    flag_set=0;
         int    file_set=0;
-        char   c;
-        char*  cloned_flags;
+        int    c;
+        int    save_errno;
+        char*  cloned_flags = NULL;
 
         if (argc == 1)
                 Usage_and_abort();
@@ -67,14 +76,14 @@ int main(int argc, char** argv)
                 case 'f': {
                         char *tmp;
 
-                        cloned_flags = (char *)malloc(strlen(optarg));
+                        cloned_flags = (char *)malloc(strlen(optarg)+1);
                         if (cloned_flags == NULL) {
                                 fprintf(stderr, "Insufficient memory.\n");
                                 exit(-1);
                         }
 
-                        strncpy(cloned_flags, optarg, strlen(optarg));
-                        for (tmp = strtok(optarg, ":|"); tmp;
+                        strncpy(cloned_flags, optarg, strlen(optarg)+1);
+                        for (tmp = strtok(cloned_flags, ":|"); tmp;
                              tmp = strtok(NULL, ":|")) {
                                 int i = 0;
 #ifdef DEBUG
@@ -94,6 +103,7 @@ int main(int argc, char** argv)
                                         exit(-1);
                                 }
                         }
+                        free(cloned_flags);
 #ifdef DEBUG
                         printf("flags = %x\n", flags);
 #endif
@@ -129,25 +139,29 @@ int main(int argc, char** argv)
         }
 
 
-        if (mode_set)
+        if (flags & O_CREAT)
                 fd = open(fname, flags, mode);
         else
                 fd = open(fname, flags);
 
+        save_errno = errno;
+
         if (fd != -1) {
-                fprintf(stderr, "Succeed in opening file \"%s\"(flags=%s",
-                        fname, cloned_flags);
+                printf("Succeed in opening file \"%s\"(flags=%s",
+                       fname, cloned_flags);
 
                 if (mode_set)
-                        fprintf(stderr, ", mode=%o", mode);
-                fprintf(stderr, ")\n");
+                        printf(", mode=%o", mode);
+                printf(")\n");
                 close(fd);
-        } else {
-                fprintf(stderr, "Error in opening file \"%s\"(flags=%s",
-                        fname, cloned_flags);
-                if (mode_set)
-                        fprintf(stderr, ", mode=%o", mode);
-                fprintf(stderr, ") %d: %s\n", errno, strerror(errno));
+                return 0;
         }
-        return errno;
+
+        fprintf(stderr, "Error in opening file \"%s\"(flags=%s",
+                fname, cloned_flags);
+        if (mode_set)
+                fprintf(stderr, ", mode=%o", mode);
+        fprintf(stderr, ") %d: %s\n", save_errno, strerror(save_errno));
+
+        return save_errno;
 }