Whamcloud - gitweb
LU-15152 tests: auster reports wrong testsuite status
[fs/lustre-release.git] / lustre / tests / writeme.c
index 837552d..0c9eaf2 100644 (file)
@@ -1,6 +1,4 @@
-/* -*- 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.
  *
  * 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.
+ * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * GPL HEADER END
  */
 /*
  * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
+ *
+ * Copyright (c) 2011, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
  */
 
 #include <fcntl.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <stdbool.h>
 
 void usage(char *prog)
 {
-        printf("usage: %s [-s] filename\n", prog);
+       printf("usage: %s [-s] [-b <bytes>] filename\n", prog);
+       exit(1);
 }
 
 int main(int argc, char **argv)
 {
-        int fd, rc;
-       int do_sync = 0;
-        int i = 0;
-       int file_arg = 1;
-        char buf[4096];
+       bool limit_write = false, do_sync = false;
+       int c, per_write, fd, rc;
+       unsigned long bytes = 0;
+       char buf[4096];
+       char *endptr = NULL;
 
-        memset(buf, 0, 4096);
+       while ((c = getopt(argc, argv, "sb:")) != -1) {
+               switch (c) {
+               case 's':
+                       do_sync = true;
+                       break;
+               case 'b':
+                       limit_write = true;
+                       bytes = strtoul(optarg, &endptr, 10);
+                       if (endptr != NULL && *endptr != '\0')
+                               usage(argv[0]);
+                       break;
+               default:
+                       usage(argv[0]);
+                       break;
+               }
+       }
 
-        if (argc < 2 || argc > 3) {
+       if (argc - optind != 1)
                usage(argv[0]);
-                exit(1);
-        }
 
-        if (strcmp(argv[1], "-s") == 0) {
-                do_sync = 1;
-               file_arg++;
-        }
+       memset(buf, 0, 4096);
+       fd = open(argv[optind], O_RDWR | O_CREAT, 0600);
+       if (fd == -1) {
+               printf("Error opening %s\n", argv[1]);
+               exit(1);
+       }
+
+       /* Even 0 bytes, write at least once */
+       if (limit_write) {
+               do {
+                       per_write = bytes > 4096 ? 4096 : bytes;
+                       rc = write(fd, buf, per_write);
+                       if (rc > 0)
+                               bytes -= rc;
+                       else if (rc < 0)
+                               break;
+               } while (bytes > 0);
 
-        fd = open(argv[file_arg], O_RDWR | O_CREAT, 0600);
-        if (fd == -1) {
-                printf("Error opening %s\n", argv[1]);
-                exit(1);
-        }
+               return rc >= 0 ? 0 : rc;
+       }
 
-        while (1) {
-                sprintf(buf, "write %d\n", i);
-                rc = write(fd, buf, sizeof(buf));
+       for (rc = 0; ;) {
+               sprintf(buf, "write %d\n", rc);
+               rc = write(fd, buf, sizeof(buf));
                if (do_sync)
                        sync();
-                sleep(1);
-        }
-        return 0;
+               sleep(1);
+       }
+
+       return 0;
 }