Whamcloud - gitweb
land b1_5 onto HEAD
[fs/lustre-release.git] / lustre / tests / small_write.c
index ebbb2b3..442d0fd 100644 (file)
@@ -7,42 +7,44 @@
 #include <stdlib.h>
 #include <string.h>
 
+#define GOTO(label, rc)   do { rc; goto label; } while (0)
+
 int main (int argc, char **argv) {
-       int fd, i, rc;
+       int fd, i, rc = 0;
        unsigned long bytes, lbytes;
        struct stat st;
        char *str, *str2, *readbuf;
 
        if (argc != 3) {
                fprintf(stderr, "usage: %s <filename> <bytes>\n", argv[0]);
-               return 1;
+               GOTO(out, rc = 1);
        }
 
        bytes = strtoul(argv[2], NULL, 10);
        if (!bytes) {
                printf("No bytes!\n");
-               return 1;
+               GOTO(out, rc = 2);
        }
        if (bytes % 2) {
                printf("Need an even number of bytes!\n");
-               return 1;
+               GOTO(out, rc = 3);
        }
        lbytes = 3*bytes/2;
 
        str = malloc(bytes+1);
        if (!str) {
                printf("No enough memory for %lu bytes.\n", bytes);
-               return 1;
+               GOTO(out, rc = 4);
        }
        str2 = malloc(lbytes+1);
-       if (!str) {
+       if (!str2) {
                printf("No enough memory for %lu bytes.\n", lbytes);
-               return 1;
+               GOTO(out_str, rc = 5);
        }
        readbuf = malloc(bytes*2);
-       if (!str) {
+       if (!readbuf) {
                printf("No enough memory for %lu bytes.\n", bytes*2);
-               return 1;
+               GOTO(out_str2, rc = 6);
        }
 
        for(i=0; i < bytes; i++)
@@ -59,13 +61,13 @@ int main (int argc, char **argv) {
        fd = open(argv[1], O_CREAT|O_RDWR|O_TRUNC, 0700);
        if (fd == -1) {
                printf("Could not open file %s.\n", argv[1]);
-               return 1;
+               GOTO(out_readbuf, rc = 7);
        }
 
        rc = write(fd, str, bytes);
        if (rc != bytes) {
                printf("Write failed!\n");
-               return 1;
+               GOTO(out_fd, rc = 8);
        }
 
        sleep(1);
@@ -74,19 +76,19 @@ int main (int argc, char **argv) {
                printf("bad file %lu size first write %lu != %lu: rc %d\n",
                       (unsigned long)st.st_ino, (unsigned long)st.st_size,
                        bytes, rc);
-               return 1;
+               GOTO(out_fd, rc = 9);
        }
 
        rc = lseek(fd, bytes / 2, SEEK_SET);
        if (rc != bytes / 2) {
                printf("Seek failed!\n");
-               return 1;
+               GOTO(out_fd, rc = 10);
        }
 
        rc = write(fd, str, bytes);
        if (rc != bytes) {
                printf("Write failed!\n");
-               return 1;
+               GOTO(out_fd, rc = 11);
        }
 
        rc = fstat(fd, &st);
@@ -94,13 +96,13 @@ int main (int argc, char **argv) {
                printf("bad file %lu size second write %lu != %lu: rc %d\n",
                       (unsigned long)st.st_ino, (unsigned long)st.st_size,
                        bytes, rc);
-               return 1;
+               GOTO(out_fd, rc = 12);
        }
 
        rc = lseek(fd, 0, SEEK_SET);
        if (rc != 0) {
                printf("Seek failed!\n");
-               return 1;
+               GOTO(out_fd, rc = 13);
        }
 
        rc = read(fd, readbuf, bytes * 2);
@@ -115,23 +117,29 @@ int main (int argc, char **argv) {
                        printf("bad file size after read %lu != %lu: rc %d\n",
                               (unsigned long)st.st_size, bytes + bytes / 2,
                                rc);
-                       return 1;
+                       GOTO(out_fd, rc = 14);
                }
 
-               return 1;
+               GOTO(out_fd, rc = 15);
        }
-
-       fd = close(fd);
-       if (fd == -1)
-               return 1;
+       rc = 0;
 
        if (bytes < 320)
                printf("%s\n%s\n", readbuf, str2);
        if (strcmp(readbuf, str2)) {
                printf("No match!\n");
-               return 1;
+               GOTO(out_fd, rc = 16);
        }
 
        printf("Pass!\n");
-       return 0;
+out_fd:
+       close(fd);
+out_readbuf:
+        free(readbuf);
+out_str2:
+        free(str2);
+out_str:
+        free(str);
+out:
+        return rc;
 }