Whamcloud - gitweb
LU-357 racer test cleanup
[fs/lustre-release.git] / lustre / tests / openfile.c
index ab5cbdb..61ca15f 100644 (file)
@@ -1,12 +1,47 @@
 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
  * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ * GPL HEADER START
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 only,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License version 2 for more details (a copy is included
+ * in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2 along with this program; If not, see
+ * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ * GPL HEADER END
+ */
+/*
+ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Use is subject to license terms.
+ */
+/*
+ * This file is part of Lustre, http://www.lustre.org/
+ * Lustre is a trademark of Sun Microsystems, Inc.
  */
 
 #if 0
 #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 <libcfs/libcfs.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 +71,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}
 };
 
@@ -49,59 +90,63 @@ void Usage_and_abort(void)
 
 int main(int argc, char** argv)
 {
-        int i;
-        int    flags=0;
-        mode_t mode=0;
-        char*  fname=NULL;
-        int    mode_set=0;
-        int    flag_set=0;
-        int    file_set=0;
-        char   c;
-        char*  cloned_flags;
-
-        if(argc == 1) {
+        int    fd;
+        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)
                 Usage_and_abort();
-        }
 
         while ((c = getopt (argc, argv, "f:m:")) != -1) {
                 switch (c) {
                 case 'f': {
                         char *tmp;
 
-                        cloned_flags = (char*)malloc(strlen(optarg));
-                        if (cloned_flags==NULL) {
+                        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));
-                        tmp = strtok(optarg, ":");
-                        while (tmp) {
+                        strncpy(cloned_flags, optarg, strlen(optarg)+1);
+                        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
                                 printf("flags = %s\n",tmp);
 #endif
                                 flag_set = 1;
-                                while (flag_table[i].flag != -1) {
-                                        int r;
-                                        r = strncasecmp(tmp, (flag_table[i].string),
-                                                        strlen((flag_table[i].string)) );
-
-                                        if (r == 0)
+                                for (i = 0; flag_table[i].flag != -1; i++) {
+                                        if (!strcmp(tmp, flag_table[i].string)){
+                                                flags |= flag_table[i].flag;
                                                 break;
-                                        i++;
+                                        }
                                 }
 
-                                if (flag_table[i].flag != -1) {
-                                        flags |= flag_table[i].flag;
-                                } else {
+                                if (flag_table[i].flag == -1) {
                                         fprintf(stderr, "No such flag: %s\n",
                                                 tmp);
-                                        exit(-1);
+                                        save_errno = -1;
+                                        goto out;
                                 }
-
-                                tmp = strtok(NULL, ":");
-
                         }
 #ifdef DEBUG
                         printf("flags = %x\n", flags);
@@ -112,7 +157,7 @@ int main(int argc, char** argv)
 #ifdef DEBUG
                         printf("mode = %s\n", optarg);
 #endif
-                        mode = strtol (optarg, NULL, 8);
+                        mode = strtol(optarg, NULL, 8);
                         mode_set = 1;
 #ifdef DEBUG
                         printf("mode = %o\n", mode);
@@ -120,43 +165,54 @@ 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;
         }
 
 
-        if (mode_set)
-                i = open(fname, flags, mode);
+        if (flags & O_CREAT)
+                fd = open(fname, flags, mode);
         else
-                i = open(fname, flags);
+                fd = open(fname, flags);
 
-        if (i != -1) {
-                fprintf(stderr, "Succeed in opening file \"%s\"(flags=%s",
-                        fname, cloned_flags);
+        save_errno = errno;
+
+        if (fd != -1) {
+                printf("Succeed in opening file \"%s\"(flags=%s",
+                       fname, cloned_flags);
 
                 if (mode_set)
-                        fprintf(stderr, ", mode=%o", mode);
-                fprintf(stderr, ")\n");
-                close (i);
+                        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, ") %s\n", strerror(errno));
+                fprintf(stderr, ") %d: %s\n", save_errno, strerror(save_errno));
         }
-        return(i);
+
+out:
+        if (cloned_flags)
+                free(cloned_flags);
+        if (print_usage)
+                Usage_and_abort();
+
+        return save_errno;
 }