Whamcloud - gitweb
b=16437
[fs/lustre-release.git] / lustre / tests / openfile.c
index 1cb36ea..6638ac1 100644 (file)
@@ -7,7 +7,9 @@
 #endif
 
 /* for O_DIRECTORY and O_DIRECT */
+#ifndef _GNU_SOURCE
 #define _GNU_SOURCE
+#endif
 
 #include <stdio.h>
 #include <sys/types.h>
@@ -36,7 +38,9 @@ FLAG_MAPPING flag_table[] = {
        {"O_NONBLOCK", O_NONBLOCK},
        {"O_NDELAY", O_NDELAY},
        {"O_SYNC", O_SYNC},
+#ifdef O_DIRECT
        {"O_DIRECT", O_DIRECT},
+#endif
        {"O_LARGEFILE", O_LARGEFILE},
        {"O_DIRECTORY", O_DIRECTORY},
        {"O_NOFOLLOW", O_NOFOLLOW},
@@ -54,13 +58,14 @@ void Usage_and_abort(void)
 int main(int argc, char** argv)
 {
         int    fd;
-        int    flags=0;
-        mode_t mode=0644;
-        char*  fname=NULL;
-        int    mode_set=0;
-        int    flag_set=0;
-        int    file_set=0;
-        char   c;
+        int    flags = 0;
+        mode_t mode = 0644;
+        char*  fname = NULL;
+        int    mode_set = 0;
+        int    flag_set = 0;
+        int    c;
+        int    save_errno = 0;
+        int    print_usage = 0;
         char*  cloned_flags = NULL;
 
         if (argc == 1)
@@ -74,11 +79,22 @@ int main(int argc, char** argv)
                         cloned_flags = (char *)malloc(strlen(optarg)+1);
                         if (cloned_flags == NULL) {
                                 fprintf(stderr, "Insufficient memory.\n");
-                                exit(-1);
+                                save_errno = -1;
+                                goto out;
                         }
 
                         strncpy(cloned_flags, optarg, strlen(optarg)+1);
-                        for (tmp = strtok(optarg, ":|"); tmp;
+                        flags = atoi(cloned_flags);
+                        if (flags > 0) {
+                                flag_set = 1;
+#ifdef DEBUG
+                                printf("flags = %d\n",flags);
+#endif
+                                break;
+                        } else 
+                                flags = 0;
+                        
+                        for (tmp = strtok(cloned_flags, ":|"); tmp;
                              tmp = strtok(NULL, ":|")) {
                                 int i = 0;
 #ifdef DEBUG
@@ -95,7 +111,8 @@ int main(int argc, char** argv)
                                 if (flag_table[i].flag == -1) {
                                         fprintf(stderr, "No such flag: %s\n",
                                                 tmp);
-                                        exit(-1);
+                                        save_errno = -1;
+                                        goto out;
                                 }
                         }
 #ifdef DEBUG
@@ -115,21 +132,23 @@ int main(int argc, char** argv)
                         break;
                 default:
                         fprintf(stderr, "Bad parameters.\n");
-                        Usage_and_abort();
+                        print_usage = 1;
+                        goto out;
                 }
         }
 
         if (optind == argc) {
                 fprintf(stderr, "Bad parameters.\n");
-                Usage_and_abort();
+                print_usage = 1;
+                goto out;
         }
 
         fname = argv[optind];
-        file_set = 1;
 
-        if (!flag_set || !file_set) {
+        if (!flag_set) {
                 fprintf(stderr, "Missing flag or file-name\n");
-                exit(-1);
+                save_errno = -1;
+                goto out;
         }
 
 
@@ -138,6 +157,8 @@ int main(int argc, char** argv)
         else
                 fd = open(fname, flags);
 
+        save_errno = errno;
+
         if (fd != -1) {
                 printf("Succeed in opening file \"%s\"(flags=%s",
                        fname, cloned_flags);
@@ -146,14 +167,21 @@ int main(int argc, char** argv)
                         printf(", mode=%o", mode);
                 printf(")\n");
                 close(fd);
-                return 0;
+        } else {
+                fprintf(stderr, "Error in opening file \"%s\"(flags=%s",
+                        fname, cloned_flags);
         }
 
-        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));
+        fprintf(stderr, ") %d: %s\n", save_errno, strerror(save_errno));
 
-        return errno;
+out:
+        if (cloned_flags)
+                free(cloned_flags);
+        if (print_usage)
+                Usage_and_abort();
+
+        return save_errno;
 }
+