diff options
Diffstat (limited to 'extras')
| -rw-r--r-- | extras/benchmarking/glfs-bm.c | 509 | ||||
| -rw-r--r-- | extras/benchmarking/rdd.c | 1001 | ||||
| -rw-r--r-- | extras/create_new_xlator/new-xlator-tmpl.c | 141 | ||||
| -rw-r--r-- | extras/geo-rep/gsync-sync-gfid.c | 165 | ||||
| -rw-r--r-- | extras/stripe-merge.c | 687 | ||||
| -rw-r--r-- | extras/test/ld-preload-test/ld-preload-lib.c | 598 | ||||
| -rw-r--r-- | extras/test/ld-preload-test/ld-preload-test.c | 503 | ||||
| -rw-r--r-- | extras/test/open-fd-tests.c | 83 | ||||
| -rw-r--r-- | extras/test/test-ffop.c | 1638 | 
9 files changed, 2636 insertions, 2689 deletions
diff --git a/extras/benchmarking/glfs-bm.c b/extras/benchmarking/glfs-bm.c index dc717f33c16..f7f5873f84d 100644 --- a/extras/benchmarking/glfs-bm.c +++ b/extras/benchmarking/glfs-bm.c @@ -25,365 +25,338 @@  #include <sys/time.h>  struct state { -        char need_op_write:1; -        char need_op_read:1; +    char need_op_write : 1; +    char need_op_read : 1; -        char need_iface_fileio:1; -        char need_iface_xattr:1; +    char need_iface_fileio : 1; +    char need_iface_xattr : 1; -        char need_mode_posix:1; +    char need_mode_posix : 1; -        char prefix[512]; -        long int count; +    char prefix[512]; +    long int count; -        size_t block_size; +    size_t block_size; -        char *specfile; +    char *specfile; -        long int io_size; +    long int io_size;  }; - -#define MEASURE(func, arg) measure (func, #func, arg) - +#define MEASURE(func, arg) measure(func, #func, arg)  void -tv_difference (struct timeval *tv_stop, -               struct timeval *tv_start, -               struct timeval *tv_diff) +tv_difference(struct timeval *tv_stop, struct timeval *tv_start, +              struct timeval *tv_diff)  { -        if (tv_stop->tv_usec < tv_start->tv_usec) { -                tv_diff->tv_usec = (tv_stop->tv_usec + 1000000) - tv_start->tv_usec; -                tv_diff->tv_sec = (tv_stop->tv_sec - 1 - tv_start->tv_sec); -        } else { -                tv_diff->tv_usec = tv_stop->tv_usec - tv_start->tv_usec; -                tv_diff->tv_sec = tv_stop->tv_sec - tv_start->tv_sec; -        } +    if (tv_stop->tv_usec < tv_start->tv_usec) { +        tv_diff->tv_usec = (tv_stop->tv_usec + 1000000) - tv_start->tv_usec; +        tv_diff->tv_sec = (tv_stop->tv_sec - 1 - tv_start->tv_sec); +    } else { +        tv_diff->tv_usec = tv_stop->tv_usec - tv_start->tv_usec; +        tv_diff->tv_sec = tv_stop->tv_sec - tv_start->tv_sec; +    }  } -  void -measure (int (*func)(struct state *state), -         char *func_name, struct state *state) +measure(int (*func)(struct state *state), char *func_name, struct state *state)  { -        struct timeval tv_start, tv_stop, tv_diff; -        state->io_size = 0; -        long int count; +    struct timeval tv_start, tv_stop, tv_diff; +    state->io_size = 0; +    long int count; -        gettimeofday (&tv_start, NULL); -        count = func (state); -        gettimeofday (&tv_stop, NULL); +    gettimeofday(&tv_start, NULL); +    count = func(state); +    gettimeofday(&tv_stop, NULL); -        tv_difference (&tv_stop, &tv_start, &tv_diff); +    tv_difference(&tv_stop, &tv_start, &tv_diff); -        fprintf (stdout, "%s: count=%ld, size=%ld, time=%ld:%ld\n", -                 func_name, count, state->io_size, -                 tv_diff.tv_sec, tv_diff.tv_usec); +    fprintf(stdout, "%s: count=%ld, size=%ld, time=%ld:%ld\n", func_name, count, +            state->io_size, tv_diff.tv_sec, tv_diff.tv_usec);  } -  static error_t -parse_opts (int key, char *arg, -            struct argp_state *_state) +parse_opts(int key, char *arg, struct argp_state *_state)  { -        struct state *state = _state->input; +    struct state *state = _state->input; -        switch (key) -        { +    switch (key) {          case 'o': -                if (strcasecmp (arg, "read") == 0) { -                        state->need_op_write = 0; -                        state->need_op_read = 1; -                } else if (strcasecmp (arg, "write") == 0) { -                        state->need_op_write = 1; -                        state->need_op_read = 0; -                } else if (strcasecmp (arg, "both") == 0) { -                        state->need_op_write = 1; -                        state->need_op_read = 1; -                } else { -                        fprintf (stderr, "unknown op: %s\n", arg); -                        return -1; -                } -                break; +            if (strcasecmp(arg, "read") == 0) { +                state->need_op_write = 0; +                state->need_op_read = 1; +            } else if (strcasecmp(arg, "write") == 0) { +                state->need_op_write = 1; +                state->need_op_read = 0; +            } else if (strcasecmp(arg, "both") == 0) { +                state->need_op_write = 1; +                state->need_op_read = 1; +            } else { +                fprintf(stderr, "unknown op: %s\n", arg); +                return -1; +            } +            break;          case 'i': -                if (strcasecmp (arg, "fileio") == 0) { -                        state->need_iface_fileio = 1; -                        state->need_iface_xattr = 0; -                } else if (strcasecmp (arg, "xattr") == 0) { -                        state->need_iface_fileio = 0; -                        state->need_iface_xattr = 1; -                } else if (strcasecmp (arg, "both") == 0) { -                        state->need_iface_fileio = 1; -                        state->need_iface_xattr = 1; -                } else { -                        fprintf (stderr, "unknown interface: %s\n", arg); -                        return -1; -                } -                break; -        case 'b': -        { -                size_t block_size = atoi (arg); -                if (!block_size) { -                        fprintf (stderr, "incorrect size: %s\n", arg); -                        return -1; -                } -                state->block_size = block_size; -        } -        break; +            if (strcasecmp(arg, "fileio") == 0) { +                state->need_iface_fileio = 1; +                state->need_iface_xattr = 0; +            } else if (strcasecmp(arg, "xattr") == 0) { +                state->need_iface_fileio = 0; +                state->need_iface_xattr = 1; +            } else if (strcasecmp(arg, "both") == 0) { +                state->need_iface_fileio = 1; +                state->need_iface_xattr = 1; +            } else { +                fprintf(stderr, "unknown interface: %s\n", arg); +                return -1; +            } +            break; +        case 'b': { +            size_t block_size = atoi(arg); +            if (!block_size) { +                fprintf(stderr, "incorrect size: %s\n", arg); +                return -1; +            } +            state->block_size = block_size; +        } break;          case 's': -                state->specfile = strdup (arg); -                break; +            state->specfile = strdup(arg); +            break;          case 'p': -                fprintf (stderr, "using prefix: %s\n", arg); -                strncpy (state->prefix, arg, 512); -                break; -        case 'c': -        { -                long count = atol (arg); -                if (!count) { -                        fprintf (stderr, "incorrect count: %s\n", arg); -                        return -1; -                } -                state->count = count; -        } -        break; +            fprintf(stderr, "using prefix: %s\n", arg); +            strncpy(state->prefix, arg, 512); +            break; +        case 'c': { +            long count = atol(arg); +            if (!count) { +                fprintf(stderr, "incorrect count: %s\n", arg); +                return -1; +            } +            state->count = count; +        } break;          case ARGP_KEY_NO_ARGS: -                break; +            break;          case ARGP_KEY_ARG: -                break; -        } +            break; +    } -        return 0; +    return 0;  }  int -do_mode_posix_iface_fileio_write (struct state *state) +do_mode_posix_iface_fileio_write(struct state *state)  { -        long int i; -        int ret = -1; -        char block[state->block_size]; - -        for (i=0; i<state->count; i++) { -                int fd = -1; -                char filename[512]; - -                sprintf (filename, "%s.%06ld", state->prefix, i); - -                fd = open (filename, O_CREAT|O_WRONLY, 00600); -                if (fd == -1) { -                        fprintf (stderr, "open(%s) => %s\n", filename, strerror (errno)); -                        break; -                } -                ret = write (fd, block, state->block_size); -                if (ret != state->block_size) { -                        fprintf (stderr, "write (%s) => %d/%s\n", filename, ret, -                                 strerror (errno)); -                        close (fd); -                        break; -                } -                close (fd); -                state->io_size += ret; +    long int i; +    int ret = -1; +    char block[state->block_size]; + +    for (i = 0; i < state->count; i++) { +        int fd = -1; +        char filename[512]; + +        sprintf(filename, "%s.%06ld", state->prefix, i); + +        fd = open(filename, O_CREAT | O_WRONLY, 00600); +        if (fd == -1) { +            fprintf(stderr, "open(%s) => %s\n", filename, strerror(errno)); +            break; +        } +        ret = write(fd, block, state->block_size); +        if (ret != state->block_size) { +            fprintf(stderr, "write (%s) => %d/%s\n", filename, ret, +                    strerror(errno)); +            close(fd); +            break;          } +        close(fd); +        state->io_size += ret; +    } -        return i; +    return i;  } -  int -do_mode_posix_iface_fileio_read (struct state *state) +do_mode_posix_iface_fileio_read(struct state *state)  { -        long int i; -        int ret = -1; -        char block[state->block_size]; - -        for (i=0; i<state->count; i++) { -                int fd = -1; -                char filename[512]; - -                sprintf (filename, "%s.%06ld", state->prefix, i); - -                fd = open (filename, O_RDONLY); -                if (fd == -1) { -                        fprintf (stderr, "open(%s) => %s\n", filename, strerror (errno)); -                        break; -                } -                ret = read (fd, block, state->block_size); -                if (ret == -1) { -                        fprintf (stderr, "read(%s) => %d/%s\n", filename, ret, strerror (errno)); -                        close (fd); -                        break; -                } -                close (fd); -                state->io_size += ret; +    long int i; +    int ret = -1; +    char block[state->block_size]; + +    for (i = 0; i < state->count; i++) { +        int fd = -1; +        char filename[512]; + +        sprintf(filename, "%s.%06ld", state->prefix, i); + +        fd = open(filename, O_RDONLY); +        if (fd == -1) { +            fprintf(stderr, "open(%s) => %s\n", filename, strerror(errno)); +            break;          } +        ret = read(fd, block, state->block_size); +        if (ret == -1) { +            fprintf(stderr, "read(%s) => %d/%s\n", filename, ret, +                    strerror(errno)); +            close(fd); +            break; +        } +        close(fd); +        state->io_size += ret; +    } -        return i; +    return i;  } -  int -do_mode_posix_iface_fileio (struct state *state) +do_mode_posix_iface_fileio(struct state *state)  { -        if (state->need_op_write) -                MEASURE (do_mode_posix_iface_fileio_write, state); +    if (state->need_op_write) +        MEASURE(do_mode_posix_iface_fileio_write, state); -        if (state->need_op_read) -                MEASURE (do_mode_posix_iface_fileio_read, state); +    if (state->need_op_read) +        MEASURE(do_mode_posix_iface_fileio_read, state); -        return 0; +    return 0;  } -  int -do_mode_posix_iface_xattr_write (struct state *state) +do_mode_posix_iface_xattr_write(struct state *state)  { -        long int i; -        int ret = -1; -        char block[state->block_size]; -        char *dname = NULL, *dirc = NULL; -        char *bname = NULL, *basec = NULL; - -        dirc = strdup (state->prefix); -        basec = strdup (state->prefix); -        dname = dirname (dirc); -        bname = basename (basec); - -        for (i=0; i<state->count; i++) { -                char key[512]; - -                sprintf (key, "glusterfs.file.%s.%06ld", bname, i); - -                ret = lsetxattr (dname, key, block, state->block_size, 0); - -                if (ret != 0) { -                        fprintf (stderr, "lsetxattr (%s, %s, %p) => %s\n", -                                 dname, key, block, strerror (errno)); -                        break; -                } -                state->io_size += state->block_size; +    long int i; +    int ret = -1; +    char block[state->block_size]; +    char *dname = NULL, *dirc = NULL; +    char *bname = NULL, *basec = NULL; + +    dirc = strdup(state->prefix); +    basec = strdup(state->prefix); +    dname = dirname(dirc); +    bname = basename(basec); + +    for (i = 0; i < state->count; i++) { +        char key[512]; + +        sprintf(key, "glusterfs.file.%s.%06ld", bname, i); + +        ret = lsetxattr(dname, key, block, state->block_size, 0); + +        if (ret != 0) { +            fprintf(stderr, "lsetxattr (%s, %s, %p) => %s\n", dname, key, block, +                    strerror(errno)); +            break;          } +        state->io_size += state->block_size; +    } -        free (dirc); -        free (basec); +    free(dirc); +    free(basec); -        return i; +    return i;  } -  int -do_mode_posix_iface_xattr_read (struct state *state) +do_mode_posix_iface_xattr_read(struct state *state)  { -        long int i; -        int ret = -1; -        char block[state->block_size]; -        char *dname = NULL, *dirc = NULL; -        char *bname = NULL, *basec = NULL; - -        dirc = strdup (state->prefix); -        basec = strdup (state->prefix); -        dname = dirname (dirc); -        bname = basename (basec); - -        for (i=0; i<state->count; i++) { -                char key[512]; - -                sprintf (key, "glusterfs.file.%s.%06ld", bname, i); - -                ret = lgetxattr (dname, key, block, state->block_size); - -                if (ret < 0) { -                        fprintf (stderr, "lgetxattr (%s, %s, %p) => %s\n", -                                 dname, key, block, strerror (errno)); -                        break; -                } -                state->io_size += ret; +    long int i; +    int ret = -1; +    char block[state->block_size]; +    char *dname = NULL, *dirc = NULL; +    char *bname = NULL, *basec = NULL; + +    dirc = strdup(state->prefix); +    basec = strdup(state->prefix); +    dname = dirname(dirc); +    bname = basename(basec); + +    for (i = 0; i < state->count; i++) { +        char key[512]; + +        sprintf(key, "glusterfs.file.%s.%06ld", bname, i); + +        ret = lgetxattr(dname, key, block, state->block_size); + +        if (ret < 0) { +            fprintf(stderr, "lgetxattr (%s, %s, %p) => %s\n", dname, key, block, +                    strerror(errno)); +            break;          } +        state->io_size += ret; +    } -        return i; +    return i;  } -  int -do_mode_posix_iface_xattr (struct state *state) +do_mode_posix_iface_xattr(struct state *state)  { -        if (state->need_op_write) -                MEASURE (do_mode_posix_iface_xattr_write, state); +    if (state->need_op_write) +        MEASURE(do_mode_posix_iface_xattr_write, state); -        if (state->need_op_read) -                MEASURE (do_mode_posix_iface_xattr_read, state); +    if (state->need_op_read) +        MEASURE(do_mode_posix_iface_xattr_read, state); -        return 0; +    return 0;  }  int -do_mode_posix (struct state *state) +do_mode_posix(struct state *state)  { -        if (state->need_iface_fileio) -                do_mode_posix_iface_fileio (state); +    if (state->need_iface_fileio) +        do_mode_posix_iface_fileio(state); -        if (state->need_iface_xattr) -                do_mode_posix_iface_xattr (state); +    if (state->need_iface_xattr) +        do_mode_posix_iface_xattr(state); -        return 0; +    return 0;  } -  int -do_actions (struct state *state) +do_actions(struct state *state)  { -        if (state->need_mode_posix) -                do_mode_posix (state); +    if (state->need_mode_posix) +        do_mode_posix(state); -        return 0; +    return 0;  }  static struct argp_option options[] = { -        {"op", 'o', "OPERATIONS", 0, -         "WRITE|READ|BOTH - defaults to BOTH"}, -        {"iface", 'i', "INTERFACE", 0, -         "FILEIO|XATTR|BOTH - defaults to FILEIO"}, -        {"block", 'b', "BLOCKSIZE", 0, -         "<NUM> - defaults to 4096"}, -        {"specfile", 's', "SPECFILE", 0, -         "absolute path to specfile"}, -        {"prefix", 'p', "PREFIX", 0, -         "filename prefix"}, -        {"count", 'c', "COUNT", 0, -         "number of files"}, -        {0, 0, 0, 0, 0} -}; +    {"op", 'o', "OPERATIONS", 0, "WRITE|READ|BOTH - defaults to BOTH"}, +    {"iface", 'i', "INTERFACE", 0, "FILEIO|XATTR|BOTH - defaults to FILEIO"}, +    {"block", 'b', "BLOCKSIZE", 0, "<NUM> - defaults to 4096"}, +    {"specfile", 's', "SPECFILE", 0, "absolute path to specfile"}, +    {"prefix", 'p', "PREFIX", 0, "filename prefix"}, +    {"count", 'c', "COUNT", 0, "number of files"}, +    {0, 0, 0, 0, 0}}; -static struct argp argp = { -        options, -        parse_opts, -        "tool", -        "tool to benchmark small file performance" -}; +static struct argp argp = {options, parse_opts, "tool", +                           "tool to benchmark small file performance"};  int -main (int argc, char *argv[]) +main(int argc, char *argv[])  { -        struct state state = {0, }; +    struct state state = { +        0, +    }; -        state.need_op_write = 1; -        state.need_op_read = 1; +    state.need_op_write = 1; +    state.need_op_read = 1; -        state.need_iface_fileio = 1; -        state.need_iface_xattr = 0; +    state.need_iface_fileio = 1; +    state.need_iface_xattr = 0; -        state.need_mode_posix = 1; +    state.need_mode_posix = 1; -        state.block_size = 4096; +    state.block_size = 4096; -        strcpy (state.prefix, "tmpfile"); -        state.count = 1048576; +    strcpy(state.prefix, "tmpfile"); +    state.count = 1048576; -        if (argp_parse (&argp, argc, argv, 0, 0, &state) != 0) { -                fprintf (stderr, "argp_parse() failed\n"); -                return 1; -        } +    if (argp_parse(&argp, argc, argv, 0, 0, &state) != 0) { +        fprintf(stderr, "argp_parse() failed\n"); +        return 1; +    } -        do_actions (&state); +    do_actions(&state); -        return 0; +    return 0;  } diff --git a/extras/benchmarking/rdd.c b/extras/benchmarking/rdd.c index a667c6a1d65..efc9d342a37 100644 --- a/extras/benchmarking/rdd.c +++ b/extras/benchmarking/rdd.c @@ -20,633 +20,586 @@  #define TWO_POWER(power) (2UL << (power)) -#define RDD_INTEGER_VALUE ((TWO_POWER ((sizeof (int) * 8))) - 1) +#define RDD_INTEGER_VALUE ((TWO_POWER((sizeof(int) * 8))) - 1)  #ifndef UNIX_PATH_MAX  #define UNIX_PATH_MAX 108  #endif  #define UNIT_KB 1024ULL -#define UNIT_MB UNIT_KB*1024ULL -#define UNIT_GB UNIT_MB*1024ULL -#define UNIT_TB UNIT_GB*1024ULL -#define UNIT_PB UNIT_TB*1024ULL +#define UNIT_MB UNIT_KB * 1024ULL +#define UNIT_GB UNIT_MB * 1024ULL +#define UNIT_TB UNIT_GB * 1024ULL +#define UNIT_PB UNIT_TB * 1024ULL -#define UNIT_KB_STRING    "KB" -#define UNIT_MB_STRING    "MB" -#define UNIT_GB_STRING    "GB" -#define UNIT_TB_STRING    "TB" -#define UNIT_PB_STRING    "PB" +#define UNIT_KB_STRING "KB" +#define UNIT_MB_STRING "MB" +#define UNIT_GB_STRING "GB" +#define UNIT_TB_STRING "TB" +#define UNIT_PB_STRING "PB"  struct rdd_file { -        char path[UNIX_PATH_MAX]; -        struct stat st; -        int fd; +    char path[UNIX_PATH_MAX]; +    struct stat st; +    int fd;  };  struct rdd_config { -        long iters; -        long max_ops_per_seq; -        size_t max_bs; -        size_t min_bs; -        int thread_count; -        pthread_t *threads; -        pthread_barrier_t barrier; -        pthread_mutex_t lock; -        struct rdd_file in_file; -        struct rdd_file out_file; -        ssize_t file_size; +    long iters; +    long max_ops_per_seq; +    size_t max_bs; +    size_t min_bs; +    int thread_count; +    pthread_t *threads; +    pthread_barrier_t barrier; +    pthread_mutex_t lock; +    struct rdd_file in_file; +    struct rdd_file out_file; +    ssize_t file_size;  };  static struct rdd_config rdd_config;  enum rdd_keys { -        RDD_MIN_BS_KEY = 1, -        RDD_MAX_BS_KEY, +    RDD_MIN_BS_KEY = 1, +    RDD_MAX_BS_KEY,  };  static error_t -rdd_parse_opts (int key, char *arg, -                struct argp_state *_state) +rdd_parse_opts(int key, char *arg, struct argp_state *_state)  { -        switch (key) { -        case 'o': -        { -                int len = 0; -                len = strlen (arg); -                if (len > UNIX_PATH_MAX) { -                        fprintf (stderr, "output file name too long (%s)\n", -                                 arg); -                        return -1; -                } - -                strncpy (rdd_config.out_file.path, arg, len); -        } -        break; - -        case 'i': -        { -                int len = 0; -                len = strlen (arg); -                if (len > UNIX_PATH_MAX) { -                        fprintf (stderr, "input file name too long (%s)\n", -                                 arg); -                        return -1; -                } - -                strncpy (rdd_config.in_file.path, arg, len); -                rdd_config.in_file.path[len] = '\0'; -        } -        break; - -        case 'f': -        { -                char *tmp = NULL; -                unsigned long long fs = 0; -                if (string2bytesize (arg, &fs) == -1) { -                        fprintf (stderr, "invalid argument for file size " -                                 "(%s)\n", arg); -                        return -1; -                } - -                rdd_config.file_size = fs; -        } -        break; - -        case RDD_MIN_BS_KEY: -        { -                char *tmp = NULL; -                long bs = 0; -                bs = strtol (arg, &tmp, 10); -                if ((bs == LONG_MAX) || (bs == LONG_MIN) || (tmp && *tmp)) { -                        fprintf (stderr, "invalid argument for minimum block" -                                 "size (%s)\n", arg); -                        return -1; -                } - -                rdd_config.min_bs = bs; -        } -        break; - -        case RDD_MAX_BS_KEY: -        { -                char *tmp = NULL; -                long bs = 0; -                bs = strtol (arg, &tmp, 10); -                if ((bs == LONG_MAX) || (bs == LONG_MIN) || (tmp && *tmp)) { -                        fprintf (stderr, "invalid argument for maximum block" -                                 "size (%s)\n", arg); -                        return -1; -                } - -                rdd_config.max_bs = bs; -        } -        break; - -        case 'r': -        { -                char *tmp = NULL; -                long iters = 0; -                iters = strtol (arg, &tmp, 10); -                if ((iters == LONG_MAX) || -                    (iters == LONG_MIN) || -                    (tmp && *tmp)) { -                        fprintf (stderr, "invalid argument for iterations" -                                 "(%s)\n", arg); -                        return -1; -                } - -                rdd_config.iters = iters; -        } -        break; - -        case 'm': -        { -                char *tmp = NULL; -                long max_ops = 0; -                max_ops = strtol (arg, &tmp, 10); -                if ((max_ops == LONG_MAX) || -                    (max_ops == LONG_MIN) || -                    (tmp && *tmp)) { -                        fprintf (stderr, "invalid argument for max-ops" -                                 "(%s)\n", arg); -                        return -1; -                } +    switch (key) { +        case 'o': { +            int len = 0; +            len = strlen(arg); +            if (len > UNIX_PATH_MAX) { +                fprintf(stderr, "output file name too long (%s)\n", arg); +                return -1; +            } -                rdd_config.max_ops_per_seq = max_ops; -        } -        break; +            strncpy(rdd_config.out_file.path, arg, len); +        } break; -        case 't': -        { -                char *tmp = NULL; -                long threads = 0; -                threads = strtol (arg, &tmp, 10); -                if ((threads == LONG_MAX) || -                    (threads == LONG_MIN) || -                    (tmp && *tmp)) { -                        fprintf (stderr, "invalid argument for thread count" -                                 "(%s)\n", arg); -                        return -1; -                } +        case 'i': { +            int len = 0; +            len = strlen(arg); +            if (len > UNIX_PATH_MAX) { +                fprintf(stderr, "input file name too long (%s)\n", arg); +                return -1; +            } + +            strncpy(rdd_config.in_file.path, arg, len); +            rdd_config.in_file.path[len] = '\0'; +        } break; + +        case 'f': { +            char *tmp = NULL; +            unsigned long long fs = 0; +            if (string2bytesize(arg, &fs) == -1) { +                fprintf(stderr, +                        "invalid argument for file size " +                        "(%s)\n", +                        arg); +                return -1; +            } + +            rdd_config.file_size = fs; +        } break; + +        case RDD_MIN_BS_KEY: { +            char *tmp = NULL; +            long bs = 0; +            bs = strtol(arg, &tmp, 10); +            if ((bs == LONG_MAX) || (bs == LONG_MIN) || (tmp && *tmp)) { +                fprintf(stderr, +                        "invalid argument for minimum block" +                        "size (%s)\n", +                        arg); +                return -1; +            } + +            rdd_config.min_bs = bs; +        } break; + +        case RDD_MAX_BS_KEY: { +            char *tmp = NULL; +            long bs = 0; +            bs = strtol(arg, &tmp, 10); +            if ((bs == LONG_MAX) || (bs == LONG_MIN) || (tmp && *tmp)) { +                fprintf(stderr, +                        "invalid argument for maximum block" +                        "size (%s)\n", +                        arg); +                return -1; +            } + +            rdd_config.max_bs = bs; +        } break; + +        case 'r': { +            char *tmp = NULL; +            long iters = 0; +            iters = strtol(arg, &tmp, 10); +            if ((iters == LONG_MAX) || (iters == LONG_MIN) || (tmp && *tmp)) { +                fprintf(stderr, +                        "invalid argument for iterations" +                        "(%s)\n", +                        arg); +                return -1; +            } + +            rdd_config.iters = iters; +        } break; + +        case 'm': { +            char *tmp = NULL; +            long max_ops = 0; +            max_ops = strtol(arg, &tmp, 10); +            if ((max_ops == LONG_MAX) || (max_ops == LONG_MIN) || +                (tmp && *tmp)) { +                fprintf(stderr, +                        "invalid argument for max-ops" +                        "(%s)\n", +                        arg); +                return -1; +            } + +            rdd_config.max_ops_per_seq = max_ops; +        } break; + +        case 't': { +            char *tmp = NULL; +            long threads = 0; +            threads = strtol(arg, &tmp, 10); +            if ((threads == LONG_MAX) || (threads == LONG_MIN) || +                (tmp && *tmp)) { +                fprintf(stderr, +                        "invalid argument for thread count" +                        "(%s)\n", +                        arg); +                return -1; +            } -                rdd_config.thread_count = threads; -        } -        break; +            rdd_config.thread_count = threads; +        } break;          case ARGP_KEY_NO_ARGS: -                break; +            break;          case ARGP_KEY_ARG: -                break; +            break;          case ARGP_KEY_END: -                if (_state->argc == 1) { -                        argp_usage (_state); -                } +            if (_state->argc == 1) { +                argp_usage(_state); +            } +    } -        } - -        return 0; +    return 0;  }  int -string2bytesize (const char *str, unsigned long long *n) +string2bytesize(const char *str, unsigned long long *n)  { -        unsigned long long value = 0ULL; -        char *tail = NULL; -        int old_errno = 0; -        const char *s = NULL; - -        if (str == NULL || n == NULL) -        { -                errno = EINVAL; -                return -1; -        } - -        for (s = str; *s != '\0'; s++) -        { -                if (isspace (*s)) -                { -                        continue; -                } -                if (*s == '-') -                { -                        return -1; -                } -                break; +    unsigned long long value = 0ULL; +    char *tail = NULL; +    int old_errno = 0; +    const char *s = NULL; + +    if (str == NULL || n == NULL) { +        errno = EINVAL; +        return -1; +    } + +    for (s = str; *s != '\0'; s++) { +        if (isspace(*s)) { +            continue;          } - -        old_errno = errno; -        errno = 0; -        value = strtoull (str, &tail, 10); - -        if (errno == ERANGE || errno == EINVAL) -        { -                return -1; +        if (*s == '-') { +            return -1;          } - -        if (errno == 0) -        { -                errno = old_errno; +        break; +    } + +    old_errno = errno; +    errno = 0; +    value = strtoull(str, &tail, 10); + +    if (errno == ERANGE || errno == EINVAL) { +        return -1; +    } + +    if (errno == 0) { +        errno = old_errno; +    } + +    if (tail[0] != '\0') { +        if (strcasecmp(tail, UNIT_KB_STRING) == 0) { +            value *= UNIT_KB; +        } else if (strcasecmp(tail, UNIT_MB_STRING) == 0) { +            value *= UNIT_MB; +        } else if (strcasecmp(tail, UNIT_GB_STRING) == 0) { +            value *= UNIT_GB; +        } else if (strcasecmp(tail, UNIT_TB_STRING) == 0) { +            value *= UNIT_TB; +        } else if (strcasecmp(tail, UNIT_PB_STRING) == 0) { +            value *= UNIT_PB;          } -        if (tail[0] != '\0') -        { -                if (strcasecmp (tail, UNIT_KB_STRING) == 0) -                { -                        value *= UNIT_KB; -                } -                else if (strcasecmp (tail, UNIT_MB_STRING) == 0) -                { -                        value *= UNIT_MB; -                } -                else if (strcasecmp (tail, UNIT_GB_STRING) == 0) -                { -                        value *= UNIT_GB; -                } -                else if (strcasecmp (tail, UNIT_TB_STRING) == 0) -                { -                        value *= UNIT_TB; -                } -                else if (strcasecmp (tail, UNIT_PB_STRING) == 0) -                { -                        value *= UNIT_PB; -                } - -                else -                { -                        return -1; -                } +        else { +            return -1;          } +    } -        *n = value; +    *n = value; -        return 0; +    return 0;  }  static struct argp_option rdd_options[] = { -        {"if", 'i', "INPUT_FILE", 0, "input-file"}, -        {"of", 'o', "OUTPUT_FILE", 0, "output-file"}, -        {"threads", 't', "COUNT", 0, "number of threads to spawn (defaults to 2)"}, -        {"min-bs", RDD_MIN_BS_KEY, "MIN_BLOCK_SIZE", 0, -         "Minimum block size in bytes (defaults to 1024)"}, -        {"max-bs", RDD_MAX_BS_KEY, "MAX_BLOCK_SIZE", 0, -         "Maximum block size in bytes (defaults to 4096)"}, -        {"iters", 'r', "ITERS", 0, -         "Number of read-write sequences (defaults to 1000000)"}, -        {"max-ops", 'm', "MAXOPS", 0, -         "maximum number of read-writes to be performed in a sequence (defaults to 1)"}, -        {"file-size", 'f', "FILESIZE", 0, -         "the size of the file which will be created and upon it I/O will be done" -         " (defaults to 100MB"}, -        {0, 0, 0, 0, 0} -}; +    {"if", 'i', "INPUT_FILE", 0, "input-file"}, +    {"of", 'o', "OUTPUT_FILE", 0, "output-file"}, +    {"threads", 't', "COUNT", 0, "number of threads to spawn (defaults to 2)"}, +    {"min-bs", RDD_MIN_BS_KEY, "MIN_BLOCK_SIZE", 0, +     "Minimum block size in bytes (defaults to 1024)"}, +    {"max-bs", RDD_MAX_BS_KEY, "MAX_BLOCK_SIZE", 0, +     "Maximum block size in bytes (defaults to 4096)"}, +    {"iters", 'r', "ITERS", 0, +     "Number of read-write sequences (defaults to 1000000)"}, +    {"max-ops", 'm', "MAXOPS", 0, +     "maximum number of read-writes to be performed in a sequence (defaults to " +     "1)"}, +    {"file-size", 'f', "FILESIZE", 0, +     "the size of the file which will be created and upon it I/O will be done" +     " (defaults to 100MB"}, +    {0, 0, 0, 0, 0}};  static struct argp argp = { -  rdd_options, -  rdd_parse_opts, -  "", -  "random dd - tool to do a sequence of random block-sized continuous" -  "read writes starting at a random offset" -}; - +    rdd_options, rdd_parse_opts, "", +    "random dd - tool to do a sequence of random block-sized continuous" +    "read writes starting at a random offset"};  static void -rdd_default_config (void) +rdd_default_config(void)  { -        char *tmp_path = "rdd.in"; - -        rdd_config.thread_count = 2; -        rdd_config.iters = 1000000; -        rdd_config.max_bs = 4096; -        rdd_config.min_bs = 1024; -        rdd_config.in_file.fd = rdd_config.out_file.fd = -1; -        rdd_config.max_ops_per_seq = 1; -        strncpy (rdd_config.in_file.path, tmp_path, strlen (tmp_path)); -        rdd_config.file_size = 104857600; - -        return; +    char *tmp_path = "rdd.in"; + +    rdd_config.thread_count = 2; +    rdd_config.iters = 1000000; +    rdd_config.max_bs = 4096; +    rdd_config.min_bs = 1024; +    rdd_config.in_file.fd = rdd_config.out_file.fd = -1; +    rdd_config.max_ops_per_seq = 1; +    strncpy(rdd_config.in_file.path, tmp_path, strlen(tmp_path)); +    rdd_config.file_size = 104857600; + +    return;  } -  static char -rdd_valid_config (void) +rdd_valid_config(void)  { -        char ret = 1; -        int fd = -1; +    char ret = 1; +    int fd = -1; -        fd = open (rdd_config.in_file.path, O_RDONLY); -        if (fd == -1 && (errno != ENOENT)) { -                fprintf (stderr, "open: (%s)", strerror (errno)); -                ret = 0; -                goto out; -        } -        close (fd); - -        if (rdd_config.min_bs > rdd_config.max_bs) { -                fprintf (stderr, "minimum blocksize %ld is greater than the " -                         "maximum blocksize %ld", rdd_config.min_bs, -                         rdd_config.max_bs); -                ret = 0; -                goto out; -        } +    fd = open(rdd_config.in_file.path, O_RDONLY); +    if (fd == -1 && (errno != ENOENT)) { +        fprintf(stderr, "open: (%s)", strerror(errno)); +        ret = 0; +        goto out; +    } +    close(fd); + +    if (rdd_config.min_bs > rdd_config.max_bs) { +        fprintf(stderr, +                "minimum blocksize %ld is greater than the " +                "maximum blocksize %ld", +                rdd_config.min_bs, rdd_config.max_bs); +        ret = 0; +        goto out; +    } -        if (strlen (rdd_config.out_file.path) == 0) { -                sprintf (rdd_config.out_file.path, "%s.rddout", -                         rdd_config.in_file.path); -        } +    if (strlen(rdd_config.out_file.path) == 0) { +        sprintf(rdd_config.out_file.path, "%s.rddout", rdd_config.in_file.path); +    }  out: -        return ret; +    return ret;  } -  static void * -rdd_read_write (void *arg) +rdd_read_write(void *arg)  { -        int i = 0, ret = 0; -        size_t bs = 0; -        off_t offset = 0; -        long rand = 0; -        long max_ops = 0; -        char *buf = NULL; - -        buf = calloc (1, rdd_config.max_bs); -        if (!buf) { -                fprintf (stderr, "calloc failed (%s)\n", strerror (errno)); +    int i = 0, ret = 0; +    size_t bs = 0; +    off_t offset = 0; +    long rand = 0; +    long max_ops = 0; +    char *buf = NULL; + +    buf = calloc(1, rdd_config.max_bs); +    if (!buf) { +        fprintf(stderr, "calloc failed (%s)\n", strerror(errno)); +        ret = -1; +        goto out; +    } + +    for (i = 0; i < rdd_config.iters; i++) { +        pthread_mutex_lock(&rdd_config.lock); +        { +            int bytes = 0; +            rand = random(); + +            if (rdd_config.min_bs == rdd_config.max_bs) { +                bs = rdd_config.max_bs; +            } else { +                bs = rdd_config.min_bs + +                     (rand % (rdd_config.max_bs - rdd_config.min_bs)); +            } + +            offset = rand % rdd_config.in_file.st.st_size; +            max_ops = rand % rdd_config.max_ops_per_seq; +            if (!max_ops) { +                max_ops++; +            } + +            ret = lseek(rdd_config.in_file.fd, offset, SEEK_SET); +            if (ret != offset) { +                fprintf(stderr, "lseek failed (%s)\n", strerror(errno));                  ret = -1; -                goto out; -        } +                goto unlock; +            } -        for (i = 0; i < rdd_config.iters; i++) -        { -                pthread_mutex_lock (&rdd_config.lock); -                { -                        int bytes = 0; -                        rand = random (); - -                        if (rdd_config.min_bs == rdd_config.max_bs) { -                                bs = rdd_config.max_bs; -                        } else { -                                bs = rdd_config.min_bs + -                                        (rand % -                                         (rdd_config.max_bs - -                                          rdd_config.min_bs)); -                        } - -                        offset = rand % rdd_config.in_file.st.st_size; -                        max_ops = rand % rdd_config.max_ops_per_seq; -                        if (!max_ops) { -                                max_ops ++; -                        } - -                        ret = lseek (rdd_config.in_file.fd, offset, SEEK_SET); -                        if (ret != offset) { -                                fprintf (stderr, "lseek failed (%s)\n", -                                         strerror (errno)); -                                ret = -1; -                                goto unlock; -                        } - -                        ret = lseek (rdd_config.out_file.fd, offset, SEEK_SET); -                        if (ret != offset) { -                                fprintf (stderr, "lseek failed (%s)\n", -                                         strerror (errno)); -                                ret = -1; -                                goto unlock; -                        } - -                        while (max_ops--) -                        { -                                bytes = read (rdd_config.in_file.fd, buf, bs); -                                if (!bytes) { -                                        break; -                                } - -                                if (bytes == -1) { -                                        fprintf (stderr, "read failed (%s)\n", -                                                 strerror (errno)); -                                        ret = -1; -                                        goto unlock; -                                } - -                                if (write (rdd_config.out_file.fd, buf, bytes) -                                    != bytes) { -                                        fprintf (stderr, "write failed (%s)\n", -                                                 strerror (errno)); -                                        ret = -1; -                                        goto unlock; -                                } -                        } +            ret = lseek(rdd_config.out_file.fd, offset, SEEK_SET); +            if (ret != offset) { +                fprintf(stderr, "lseek failed (%s)\n", strerror(errno)); +                ret = -1; +                goto unlock; +            } + +            while (max_ops--) { +                bytes = read(rdd_config.in_file.fd, buf, bs); +                if (!bytes) { +                    break;                  } -        unlock: -                pthread_mutex_unlock (&rdd_config.lock); -                if (ret == -1) { -                        goto out; + +                if (bytes == -1) { +                    fprintf(stderr, "read failed (%s)\n", strerror(errno)); +                    ret = -1; +                    goto unlock; +                } + +                if (write(rdd_config.out_file.fd, buf, bytes) != bytes) { +                    fprintf(stderr, "write failed (%s)\n", strerror(errno)); +                    ret = -1; +                    goto unlock;                  } -                ret = 0; +            }          } +    unlock: +        pthread_mutex_unlock(&rdd_config.lock); +        if (ret == -1) { +            goto out; +        } +        ret = 0; +    }  out: -        free (buf); -        pthread_barrier_wait (&rdd_config.barrier); +    free(buf); +    pthread_barrier_wait(&rdd_config.barrier); -        return NULL; +    return NULL;  }  static void -cleanup (void) +cleanup(void)  { -        close (rdd_config.in_file.fd); -        close (rdd_config.out_file.fd); -        rdd_config.in_file.fd = rdd_config.out_file.fd = -1; +    close(rdd_config.in_file.fd); +    close(rdd_config.out_file.fd); +    rdd_config.in_file.fd = rdd_config.out_file.fd = -1;  }  static int -check_and_create (void) +check_and_create(void)  { -        int ret = -1; -        char buf[4096] = {0,}; -        struct stat stbuf = {0,}; -        int  fd[2] = {-1,}; -        size_t  total_size = -1; - -        total_size = rdd_config.file_size; - -        ret = stat (rdd_config.in_file.path, &stbuf); -        if (ret == -1 && (errno != ENOENT)) +    int ret = -1; +    char buf[4096] = { +        0, +    }; +    struct stat stbuf = { +        0, +    }; +    int fd[2] = { +        -1, +    }; +    size_t total_size = -1; + +    total_size = rdd_config.file_size; + +    ret = stat(rdd_config.in_file.path, &stbuf); +    if (ret == -1 && (errno != ENOENT)) +        goto out; + +    fd[1] = open(rdd_config.in_file.path, O_CREAT | O_WRONLY | O_TRUNC); +    if (fd[1] == -1) +        goto out; + +    fd[0] = open("/dev/urandom", O_RDONLY); +    if (fd[0] == -1) +        goto out; + +    while (total_size > 0) { +        if (total_size >= 4096) { +            ret = read(fd[0], buf, 4096); +            if (ret == -1)                  goto out; - -        fd[1] = open (rdd_config.in_file.path, O_CREAT | O_WRONLY | O_TRUNC); -        if (fd[1] == -1) +            ret = write(fd[1], buf, 4096); +            if (ret == -1)                  goto out; - -        fd[0] = open ("/dev/urandom", O_RDONLY); -        if (fd[0] == -1) +            total_size = total_size - 4096; +        } else { +            ret = read(fd[0], buf, total_size); +            if (ret == -1)                  goto out; - -        while (total_size > 0) { -                if (total_size >= 4096) { -                        ret = read (fd[0], buf, 4096); -                        if (ret == -1) -                                goto out; -                        ret = write (fd[1], buf, 4096); -                        if (ret == -1) -                                goto out; -                        total_size = total_size - 4096; -                } else { -                        ret = read (fd[0], buf, total_size); -                        if (ret == -1) -                                goto out; -                        ret = write (fd[1], buf, total_size); -                        if (ret == -1) -                                goto out; -                        total_size = total_size - total_size; -                } - +            ret = write(fd[1], buf, total_size); +            if (ret == -1) +                goto out; +            total_size = total_size - total_size;          } +    } -        ret = 0; +    ret = 0;  out: -        if (fd[0] > 0) -                close (fd[0]); -        if (fd[1] > 0) -                close (fd[1]); -        return ret; +    if (fd[0] > 0) +        close(fd[0]); +    if (fd[1] > 0) +        close(fd[1]); +    return ret;  }  static int -rdd_spawn_threads (void) +rdd_spawn_threads(void)  { -        int i = 0, ret = -1, fd = -1; -        char buf[4096]; - -        ret = check_and_create (); -        if (ret == -1) -                goto out; - -        fd = open (rdd_config.in_file.path, O_RDONLY); -        if (fd < 0) { -                fprintf (stderr, "cannot open %s (%s)\n", -                         rdd_config.in_file.path, strerror (errno)); -                ret = -1; -                goto out; -        } -        ret = fstat (fd, &rdd_config.in_file.st); -        if (ret != 0) { -                close (fd); -                fprintf (stderr, "cannot stat %s (%s)\n", -                         rdd_config.in_file.path, strerror (errno)); -                ret = -1; -                goto out; -        } -        rdd_config.in_file.fd = fd; - -        fd = open (rdd_config.out_file.path, O_WRONLY | O_CREAT | O_TRUNC, -                   S_IRWXU | S_IROTH); -        if (fd < 0) { -                close (rdd_config.in_file.fd); -                rdd_config.in_file.fd = -1; -                fprintf (stderr, "cannot open %s (%s)\n", -                         rdd_config.out_file.path, strerror (errno)); -                ret = -1; -                goto out; -        } -        rdd_config.out_file.fd = fd; - -        while ((ret = read (rdd_config.in_file.fd, buf, 4096)) > 0) { -                if (write (rdd_config.out_file.fd, buf, ret) != ret) { -                        fprintf (stderr, "write failed (%s)\n", -                                 strerror (errno)); -                        cleanup (); -                        ret = -1; -                        goto out; -                } -        } - -        rdd_config.threads = calloc (rdd_config.thread_count, -                                     sizeof (pthread_t)); -        if (rdd_config.threads == NULL) { -                fprintf (stderr, "calloc() failed (%s)\n", strerror (errno)); - -                ret = -1; -                cleanup (); -                goto out; -        } - -        ret = pthread_barrier_init (&rdd_config.barrier, NULL, -                                    rdd_config.thread_count + 1); -        if (ret != 0) { -                fprintf (stderr, "pthread_barrier_init() failed (%s)\n", -                         strerror (ret)); - -                free (rdd_config.threads); -                cleanup (); -                ret = -1; -                goto out; +    int i = 0, ret = -1, fd = -1; +    char buf[4096]; + +    ret = check_and_create(); +    if (ret == -1) +        goto out; + +    fd = open(rdd_config.in_file.path, O_RDONLY); +    if (fd < 0) { +        fprintf(stderr, "cannot open %s (%s)\n", rdd_config.in_file.path, +                strerror(errno)); +        ret = -1; +        goto out; +    } +    ret = fstat(fd, &rdd_config.in_file.st); +    if (ret != 0) { +        close(fd); +        fprintf(stderr, "cannot stat %s (%s)\n", rdd_config.in_file.path, +                strerror(errno)); +        ret = -1; +        goto out; +    } +    rdd_config.in_file.fd = fd; + +    fd = open(rdd_config.out_file.path, O_WRONLY | O_CREAT | O_TRUNC, +              S_IRWXU | S_IROTH); +    if (fd < 0) { +        close(rdd_config.in_file.fd); +        rdd_config.in_file.fd = -1; +        fprintf(stderr, "cannot open %s (%s)\n", rdd_config.out_file.path, +                strerror(errno)); +        ret = -1; +        goto out; +    } +    rdd_config.out_file.fd = fd; + +    while ((ret = read(rdd_config.in_file.fd, buf, 4096)) > 0) { +        if (write(rdd_config.out_file.fd, buf, ret) != ret) { +            fprintf(stderr, "write failed (%s)\n", strerror(errno)); +            cleanup(); +            ret = -1; +            goto out;          } - -        ret = pthread_mutex_init (&rdd_config.lock, NULL); +    } + +    rdd_config.threads = calloc(rdd_config.thread_count, sizeof(pthread_t)); +    if (rdd_config.threads == NULL) { +        fprintf(stderr, "calloc() failed (%s)\n", strerror(errno)); + +        ret = -1; +        cleanup(); +        goto out; +    } + +    ret = pthread_barrier_init(&rdd_config.barrier, NULL, +                               rdd_config.thread_count + 1); +    if (ret != 0) { +        fprintf(stderr, "pthread_barrier_init() failed (%s)\n", strerror(ret)); + +        free(rdd_config.threads); +        cleanup(); +        ret = -1; +        goto out; +    } + +    ret = pthread_mutex_init(&rdd_config.lock, NULL); +    if (ret != 0) { +        fprintf(stderr, "pthread_mutex_init() failed (%s)\n", strerror(ret)); + +        free(rdd_config.threads); +        pthread_barrier_destroy(&rdd_config.barrier); +        cleanup(); +        ret = -1; +        goto out; +    } + +    for (i = 0; i < rdd_config.thread_count; i++) { +        ret = pthread_create(&rdd_config.threads[i], NULL, rdd_read_write, +                             NULL);          if (ret != 0) { -                fprintf (stderr, "pthread_mutex_init() failed (%s)\n", -                         strerror (ret)); - -                free (rdd_config.threads); -                pthread_barrier_destroy (&rdd_config.barrier); -                cleanup (); -                ret = -1; -                goto out; -        } - -        for (i = 0; i < rdd_config.thread_count; i++) -        { -                ret = pthread_create (&rdd_config.threads[i], NULL, -                                      rdd_read_write, NULL); -                if (ret != 0) { -                        fprintf (stderr, "pthread_create failed (%s)\n", -                                 strerror (errno)); -                        exit (1); -                } +            fprintf(stderr, "pthread_create failed (%s)\n", strerror(errno)); +            exit(1);          } +    }  out: -        return ret; +    return ret;  }  static void -rdd_wait_for_completion (void) +rdd_wait_for_completion(void)  { -        pthread_barrier_wait (&rdd_config.barrier); +    pthread_barrier_wait(&rdd_config.barrier);  } -  int -main (int argc, char *argv[]) +main(int argc, char *argv[])  { -        int ret = -1; +    int ret = -1; -        rdd_default_config (); +    rdd_default_config(); -        ret = argp_parse (&argp, argc, argv, 0, 0, NULL); -        if (ret != 0) { -                ret = -1; -                fprintf (stderr, "%s: argp_parse() failed\n", argv[0]); -                goto err; -        } +    ret = argp_parse(&argp, argc, argv, 0, 0, NULL); +    if (ret != 0) { +        ret = -1; +        fprintf(stderr, "%s: argp_parse() failed\n", argv[0]); +        goto err; +    } -        if (!rdd_valid_config ()) { -                ret = -1; -                fprintf (stderr, "%s: configuration validation failed\n", -                         argv[0]); -                goto err; -        } +    if (!rdd_valid_config()) { +        ret = -1; +        fprintf(stderr, "%s: configuration validation failed\n", argv[0]); +        goto err; +    } -        ret = rdd_spawn_threads (); -        if (ret != 0) { -                fprintf (stderr, "%s: spawning threads failed\n", argv[0]); -                goto err; -        } +    ret = rdd_spawn_threads(); +    if (ret != 0) { +        fprintf(stderr, "%s: spawning threads failed\n", argv[0]); +        goto err; +    } -        rdd_wait_for_completion (); +    rdd_wait_for_completion();  err: -        return ret; +    return ret;  } diff --git a/extras/create_new_xlator/new-xlator-tmpl.c b/extras/create_new_xlator/new-xlator-tmpl.c index 474144c1c81..caa10b374d1 100644 --- a/extras/create_new_xlator/new-xlator-tmpl.c +++ b/extras/create_new_xlator/new-xlator-tmpl.c @@ -1,37 +1,32 @@  #pragma fragment CBK_TEMPLATE -int32_t -@FOP_PREFIX@_@NAME@_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -        int32_t op_ret, int32_t op_errno, @UNWIND_PARAMS@) +int32_t @FOP_PREFIX @_ @NAME +    @_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, +          int32_t op_errno, @UNWIND_PARAMS @)  { -        STACK_UNWIND_STRICT (@NAME@, frame, op_ret, op_errno, -                             @UNWIND_ARGS@); -        return 0; +    STACK_UNWIND_STRICT(@NAME @, frame, op_ret, op_errno, @UNWIND_ARGS @); +    return 0;  }  #pragma fragment COMMENT -If you are generating the leaf xlators, remove the STACK_WIND -and replace the @ERROR_ARGS@ to @UNWIND_ARGS@ if necessary +If you are generating the leaf xlators, remove the STACK_WIND and replace the +    @ERROR_ARGS @to @UNWIND_ARGS @ if necessary  #pragma fragment FOP_TEMPLATE -int32_t -@FOP_PREFIX@_@NAME@ (call_frame_t *frame, xlator_t *this, -        @WIND_PARAMS@) +        int32_t @FOP_PREFIX @_ @NAME +    @(call_frame_t *frame, xlator_t *this, @WIND_PARAMS @)  { -        STACK_WIND (frame, @FOP_PREFIX@_@NAME@_cbk, -                    FIRST_CHILD(this), FIRST_CHILD(this)->fops->@NAME@, -                    @WIND_ARGS@); -        return 0; +    STACK_WIND(frame, @FOP_PREFIX @_ @NAME @_cbk, FIRST_CHILD(this), +               FIRST_CHILD(this)->fops->@NAME @, @WIND_ARGS @); +    return 0;  err: -        STACK_UNWIND_STRICT (@NAME@, frame, -1, errno, -                             @ERROR_ARGS@); -        return 0; +    STACK_UNWIND_STRICT(@NAME @, frame, -1, errno, @ERROR_ARGS @); +    return 0;  }  #pragma fragment FUNC_TEMPLATE -@RET_TYPE@ -@FOP_PREFIX@_@NAME@ (@FUNC_PARAMS@) +@RET_TYPE @ @FOP_PREFIX @_ @NAME @(@FUNC_PARAMS @)  { -        return @RET_VAR@; +    return @RET_VAR @;  }  #pragma fragment CP @@ -50,77 +45,71 @@ err:  #pragma fragment XLATOR_METHODS -static int32_t -@FOP_PREFIX@_init (xlator_t *this) +static int32_t @FOP_PREFIX @_init(xlator_t *this)  { -        return 0; +    return 0;  } -static void -@FOP_PREFIX@_fini (xlator_t *this) +static void @FOP_PREFIX @_fini(xlator_t *this)  { -        return; +    return;  } -static int32_t -@FOP_PREFIX@_reconfigure (xlator_t *this, dict_t *dict) +static int32_t @FOP_PREFIX @_reconfigure(xlator_t *this, dict_t *dict)  { -        return 0; +    return 0;  } -static int -@FOP_PREFIX@_notify (xlator_t *this, int event, void *data, ...) +static int @FOP_PREFIX @_notify(xlator_t *this, int event, void *data, ...)  { -        return default_notify (this, event, data); +    return default_notify(this, event, data);  } -static int32_t -@FOP_PREFIX@_mem_acct_init (xlator_t *this) +static int32_t @FOP_PREFIX @_mem_acct_init(xlator_t *this)  { -        int     ret = -1; +    int ret = -1; -        ret = xlator_mem_acct_init (this, gf_@FOP_PREFIX@_mt_end + 1); -        return ret; +    ret = xlator_mem_acct_init(this, gf_ @FOP_PREFIX @_mt_end + 1); +    return ret;  } -static int32_t -@FOP_PREFIX@_dump_metrics (xlator_t *this, int fd) +static int32_t @FOP_PREFIX @_dump_metrics(xlator_t *this, int fd)  { -        return 0; +    return 0;  } -struct volume_options @FOP_PREFIX@_options[] = { -        /*{ .key  = {""}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "", -          .op_version = {GD_OP_VERSION_}, -          .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC | OPT_FLAG_CLIENT_OPT, -          .tags = {""}, -          .description = "", -          .category = GF_EXPERIMENTAL, -        }, -        { .key = {NULL} }, -        */ +struct volume_options @FOP_PREFIX @_options[] = { +    /*{ .key  = {""}, +      .type = GF_OPTION_TYPE_BOOL, +      .default_value = "", +      .op_version = {GD_OP_VERSION_}, +      .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC | OPT_FLAG_CLIENT_OPT, +      .tags = {""}, +      .description = "", +      .category = GF_EXPERIMENTAL, +    }, +    { .key = {NULL} }, +    */  };  xlator_api_t xlator_api = { -        .init          = @FOP_PREFIX@_init, -        .fini          = @FOP_PREFIX@_fini, -        .notify        = @FOP_PREFIX@_notify, -        .reconfigure   = @FOP_PREFIX@_reconfigure, -        .mem_acct_init = @FOP_PREFIX@_mem_acct_init, -        .dump_metrics  = @FOP_PREFIX@_dump_metrics, -        .op_version    = {GD_OP_VERSION_}, -        .dumpops       = &@FOP_PREFIX@_dumpops, -        .fops          = &@FOP_PREFIX@_fops, -        .cbks          = &@FOP_PREFIX@_cbks, -        .options       = @FOP_PREFIX@_options, -        .identifier    = "@XL_NAME@", -        .category      = GF_EXPERIMENTAL, +    .init = @FOP_PREFIX @_init, +    .fini = @FOP_PREFIX @_fini, +    .notify = @FOP_PREFIX @_notify, +    .reconfigure = @FOP_PREFIX @_reconfigure, +    .mem_acct_init = @FOP_PREFIX @_mem_acct_init, +    .dump_metrics = @FOP_PREFIX @_dump_metrics, +    .op_version = {GD_OP_VERSION_}, +    .dumpops = &@FOP_PREFIX @_dumpops, +    .fops = &@FOP_PREFIX @_fops, +    .cbks = &@FOP_PREFIX @_cbks, +    .options = @FOP_PREFIX @_options, +    .identifier = "@XL_NAME@", +    .category = GF_EXPERIMENTAL,  };  #pragma fragment HEADER_FMT -#ifndef __@HFL_NAME@_H__ -#define __@HFL_NAME@_H__ +#ifndef __ @HFL_NAME @_H__ +#define __ @HFL_NAME @_H__  #include "@XL_NAME@-mem-types.h"  #include "@XL_NAME@-messages.h" @@ -131,21 +120,21 @@ xlator_api_t xlator_api = {  #endif /* __@HFL_NAME@_H__ */  #pragma fragment MEM_HEADER_FMT -#ifndef __@HFL_NAME@_H__ -#define __@HFL_NAME@_H__ +#ifndef __ @HFL_NAME @_H__ +#define __ @HFL_NAME @_H__  #include "mem-types.h"  enum gf_mdc_mem_types_ { -        gf_@FOP_PREFIX@_mt_   = gf_common_mt_end + 1, -        gf_@FOP_PREFIX@_mt_end +    gf_ @FOP_PREFIX @_mt_ = gf_common_mt_end + 1, +    gf_ @FOP_PREFIX @_mt_end  };  #endif /* __@HFL_NAME@_H__ */  #pragma fragment MSG_HEADER_FMT -#ifndef __@HFL_NAME@_H__ -#define __@HFL_NAME@_H__ +#ifndef __ @HFL_NAME @_H__ +#define __ @HFL_NAME @_H__  #include "glfs-message-id.h" @@ -159,8 +148,6 @@ enum gf_mdc_mem_types_ {   * glfs-message-id.h.   */ -GLFS_MSGID(@FOP_PREFIX@, -        @FOP_PREFIX@_MSG_NO_MEMORY -); +GLFS_MSGID(@FOP_PREFIX @, @FOP_PREFIX @_MSG_NO_MEMORY);  #endif /* __@HFL_NAME@_H__ */ diff --git a/extras/geo-rep/gsync-sync-gfid.c b/extras/geo-rep/gsync-sync-gfid.c index 4f4fde94e40..b0c5d31ba0b 100644 --- a/extras/geo-rep/gsync-sync-gfid.c +++ b/extras/geo-rep/gsync-sync-gfid.c @@ -15,96 +15,95 @@  #endif  #ifndef GF_FUSE_AUX_GFID_HEAL -#define GF_FUSE_AUX_GFID_HEAL    "glusterfs.gfid.heal" +#define GF_FUSE_AUX_GFID_HEAL "glusterfs.gfid.heal"  #endif -#define GLFS_LINE_MAX           (PATH_MAX + (2 * UUID_CANONICAL_FORM_LEN)) +#define GLFS_LINE_MAX (PATH_MAX + (2 * UUID_CANONICAL_FORM_LEN))  int -main (int argc, char *argv[]) +main(int argc, char *argv[])  { -        char *file                = NULL; -        char *tmp = NULL; -        char *tmp1 = NULL; -        char *parent_dir = NULL; -        char *gfid                = NULL; -        char *bname = NULL; -        int   ret                 = -1; -        int   len                 = 0; -        FILE *fp                  = NULL; -        char  line[GLFS_LINE_MAX] = {0,}; -        char *path = NULL; -        void  *blob               = NULL; -        void  *tmp_blob               = NULL; - -        if (argc != 2) { -                /* each line in the file has the following format -                 * uuid-in-canonical-form path-relative-to-gluster-mount. -                 * Both uuid and relative path are from master mount. -                 */ -                fprintf (stderr, "usage: %s <file-of-paths-to-be-synced>\n", -                         argv[0]); -                goto out; +    char *file = NULL; +    char *tmp = NULL; +    char *tmp1 = NULL; +    char *parent_dir = NULL; +    char *gfid = NULL; +    char *bname = NULL; +    int ret = -1; +    int len = 0; +    FILE *fp = NULL; +    char line[GLFS_LINE_MAX] = { +        0, +    }; +    char *path = NULL; +    void *blob = NULL; +    void *tmp_blob = NULL; + +    if (argc != 2) { +        /* each line in the file has the following format +         * uuid-in-canonical-form path-relative-to-gluster-mount. +         * Both uuid and relative path are from master mount. +         */ +        fprintf(stderr, "usage: %s <file-of-paths-to-be-synced>\n", argv[0]); +        goto out; +    } + +    file = argv[1]; + +    fp = fopen(file, "r"); +    if (fp == NULL) { +        fprintf(stderr, "cannot open %s for reading (%s)\n", file, +                strerror(errno)); +        goto out; +    } + +    while (fgets(line, GLFS_LINE_MAX, fp) != NULL) { +        tmp = line; +        path = gfid = line; + +        path += UUID_CANONICAL_FORM_LEN + 1; + +        while (isspace(*path)) +            path++; + +        len = strlen(line); +        if ((len < GLFS_LINE_MAX) && (line[len - 1] == '\n')) +            line[len - 1] = '\0'; + +        line[UUID_CANONICAL_FORM_LEN] = '\0'; + +        tmp = strdup(path); +        tmp1 = strdup(path); +        parent_dir = dirname(tmp); +        bname = basename(tmp1); + +        /* gfid + '\0' + bname + '\0' */ +        len = UUID_CANONICAL_FORM_LEN + 1 + strlen(bname) + 1; + +        blob = malloc(len); + +        memcpy(blob, gfid, UUID_CANONICAL_FORM_LEN); + +        tmp_blob = blob + UUID_CANONICAL_FORM_LEN + 1; + +        memcpy(tmp_blob, bname, strlen(bname)); + +        ret = sys_lsetxattr(parent_dir, GF_FUSE_AUX_GFID_HEAL, blob, len, 0); +        if (ret < 0) { +            fprintf(stderr, "setxattr on %s/%s failed (%s)\n", parent_dir, +                    bname, strerror(errno));          } +        memset(line, 0, GLFS_LINE_MAX); -        file = argv[1]; +        free(blob); +        free(tmp); +        free(tmp1); +        blob = NULL; +    } -        fp = fopen (file, "r"); -        if (fp == NULL) { -                fprintf (stderr, "cannot open %s for reading (%s)\n", -                         file, strerror (errno)); -                goto out; -        } - -        while (fgets (line, GLFS_LINE_MAX, fp) != NULL) { -                tmp = line; -                path = gfid = line; - -                path += UUID_CANONICAL_FORM_LEN + 1; - -                while(isspace (*path)) -                        path++; - -                len = strlen (line); -                if ((len < GLFS_LINE_MAX) && -                    (line[len - 1] == '\n')) -                        line[len - 1] = '\0'; - -                line[UUID_CANONICAL_FORM_LEN] = '\0'; - -                tmp = strdup (path); -                tmp1 = strdup (path); -                parent_dir = dirname (tmp); -                bname = basename (tmp1); - -                /* gfid + '\0' + bname + '\0' */ -                len = UUID_CANONICAL_FORM_LEN + 1 + strlen (bname) + 1; - -                blob = malloc (len); - -                memcpy (blob, gfid, UUID_CANONICAL_FORM_LEN); - -                tmp_blob = blob + UUID_CANONICAL_FORM_LEN + 1; - -                memcpy (tmp_blob, bname, strlen (bname)); - -                ret = sys_lsetxattr (parent_dir, GF_FUSE_AUX_GFID_HEAL,  -                                blob, len, 0); -                if (ret < 0) { -                        fprintf (stderr, "setxattr on %s/%s failed (%s)\n", -                                 parent_dir, bname, strerror (errno)); -                } -                memset (line, 0, GLFS_LINE_MAX); - -                free (blob); -                free (tmp); free (tmp1); -                blob = NULL; -        } - -        ret = 0; +    ret = 0;  out: -        if (fp) -                fclose(fp); -        return ret; +    if (fp) +        fclose(fp); +    return ret;  } - diff --git a/extras/stripe-merge.c b/extras/stripe-merge.c index 332690eea66..e013a6e6e8a 100644 --- a/extras/stripe-merge.c +++ b/extras/stripe-merge.c @@ -40,33 +40,33 @@  #define INVALID_MODE UINT32_MAX  struct file_stripe_info { -	int stripe_count; -	int stripe_size; -	int coalesce; -	mode_t mode; -	int fd[0]; +    int stripe_count; +    int stripe_size; +    int coalesce; +    mode_t mode; +    int fd[0];  }; -static int close_files(struct file_stripe_info *); +static int +close_files(struct file_stripe_info *); -static struct -file_stripe_info *alloc_file_stripe_info(int count) +static struct file_stripe_info * +alloc_file_stripe_info(int count)  { -	int i; -	struct file_stripe_info *finfo; +    int i; +    struct file_stripe_info *finfo; -	finfo = calloc(1, sizeof(struct file_stripe_info) + -		(sizeof(int) * count)); -	if (!finfo) -		return NULL; +    finfo = calloc(1, sizeof(struct file_stripe_info) + (sizeof(int) * count)); +    if (!finfo) +        return NULL; -	for (i = 0; i < count; i++) -		finfo->fd[i] = INVALID_FD; +    for (i = 0; i < count; i++) +        finfo->fd[i] = INVALID_FD; -	finfo->mode = INVALID_MODE; -	finfo->coalesce = INVALID_FD; +    finfo->mode = INVALID_MODE; +    finfo->coalesce = INVALID_FD; -	return finfo; +    return finfo;  }  /* @@ -77,39 +77,39 @@ file_stripe_info *alloc_file_stripe_info(int count)  static int  get_stripe_attr_name(const char *path, const char *pattern, char **attrname)  { -	char attrbuf[4096]; -	char *ptr, *match = NULL; -	int len, r, match_count = 0; - -	if (!path || !pattern || !attrname) -		return -1; - -	len = listxattr(path, attrbuf, sizeof(attrbuf)); -	if (len < 0) -		return len; - -	ptr = attrbuf; -	while (ptr) { -		r = fnmatch(pattern, ptr, 0); -		if (!r) { -			if (!match) -				match = ptr; -			match_count++; -		} else if (r != FNM_NOMATCH) { -			return -1; -		} - -		len -= strlen(ptr) + 1; -		if (len > 0) -			ptr += strlen(ptr) + 1; -		else -			ptr = NULL; -	} - -	if (match) -		*attrname = strdup(match); - -	return match_count; +    char attrbuf[4096]; +    char *ptr, *match = NULL; +    int len, r, match_count = 0; + +    if (!path || !pattern || !attrname) +        return -1; + +    len = listxattr(path, attrbuf, sizeof(attrbuf)); +    if (len < 0) +        return len; + +    ptr = attrbuf; +    while (ptr) { +        r = fnmatch(pattern, ptr, 0); +        if (!r) { +            if (!match) +                match = ptr; +            match_count++; +        } else if (r != FNM_NOMATCH) { +            return -1; +        } + +        len -= strlen(ptr) + 1; +        if (len > 0) +            ptr += strlen(ptr) + 1; +        else +            ptr = NULL; +    } + +    if (match) +        *attrname = strdup(match); + +    return match_count;  }  /* @@ -118,19 +118,19 @@ get_stripe_attr_name(const char *path, const char *pattern, char **attrname)  static int  get_stripe_attr_val(const char *path, const char *attr, int *val)  { -	char attrbuf[4096]; -	int len; +    char attrbuf[4096]; +    int len; -	if (!path || !attr || !val) -		return -1; +    if (!path || !attr || !val) +        return -1; -	len = getxattr(path, attr, attrbuf, sizeof(attrbuf)); -	if (len < 0) -		return len; +    len = getxattr(path, attr, attrbuf, sizeof(attrbuf)); +    if (len < 0) +        return len; -	*val = atoi(attrbuf); +    *val = atoi(attrbuf); -	return 0; +    return 0;  }  /* @@ -145,29 +145,31 @@ get_stripe_attr_val(const char *path, const char *attr, int *val)  static int  get_attr(const char *path, const char *pattern, char **buf, int *val)  { -	int count = 1; - -	if (!buf) -		return -1; - -	if (!*buf) { -		count = get_stripe_attr_name(path, pattern, buf); -		if (count > 1) { -			/* pattern isn't good enough */ -			fprintf(stderr, "ERROR: duplicate attributes found " -				"matching pattern: %s\n", pattern); -			free(*buf); -			*buf = NULL; -			return count; -		} else if (count < 1) { -			return count; -		} -	} - -	if (get_stripe_attr_val(path, *buf, val) < 0) -		return -1; - -	return count; +    int count = 1; + +    if (!buf) +        return -1; + +    if (!*buf) { +        count = get_stripe_attr_name(path, pattern, buf); +        if (count > 1) { +            /* pattern isn't good enough */ +            fprintf(stderr, +                    "ERROR: duplicate attributes found " +                    "matching pattern: %s\n", +                    pattern); +            free(*buf); +            *buf = NULL; +            return count; +        } else if (count < 1) { +            return count; +        } +    } + +    if (get_stripe_attr_val(path, *buf, val) < 0) +        return -1; + +    return count;  }  /* @@ -178,164 +180,168 @@ get_attr(const char *path, const char *pattern, char **buf, int *val)   * print a warning if any files are missing. We proceed without error in the   * latter case to support partial recovery.   */ -static struct -file_stripe_info *validate_and_open_files(char *paths[], int count) +static struct file_stripe_info * +validate_and_open_files(char *paths[], int count)  { -	int i, val, tmp; -	struct stat sbuf; -	char *stripe_count_attr = NULL; -	char *stripe_size_attr = NULL; -	char *stripe_index_attr = NULL; -	char *stripe_coalesce_attr = NULL; -	struct file_stripe_info *finfo = NULL; - -	for (i = 0; i < count; i++) { -		if (!paths[i]) -			goto err; - -		/* -		 * Check the stripe count first so we can allocate the info -		 * struct with the appropriate number of fds. -		 */ -		if (get_attr(paths[i], ATTRNAME_STRIPE_COUNT, -				&stripe_count_attr, &val) != 1) { -			fprintf(stderr, "ERROR: %s: attribute: '%s'\n", -				paths[i], ATTRNAME_STRIPE_COUNT); -			goto err; -		} -		if (!finfo) { -			finfo = alloc_file_stripe_info(val); -			if (!finfo) -				goto err; - -			if (val != count) -				fprintf(stderr, "WARNING: %s: stripe-count " -					"(%d) != file count (%d). Result may " -					"be incomplete.\n", paths[i], val, -					count); - -			finfo->stripe_count = val; -		} else if (val != finfo->stripe_count) { -			fprintf(stderr, "ERROR %s: invalid stripe count: %d " -				"(expected %d)\n", paths[i], val, -				finfo->stripe_count); -			goto err; -		} - -		/* -		 * Get and validate the chunk size. -		 */ -		if (get_attr(paths[i], ATTRNAME_STRIPE_SIZE, &stripe_size_attr, -				&val) != 1) { -			fprintf(stderr, "ERROR: %s: attribute: '%s'\n", -				paths[i], ATTRNAME_STRIPE_SIZE); -			goto err; -		} - -		if (!finfo->stripe_size) { -			finfo->stripe_size = val; -		} else if (val != finfo->stripe_size) { -			fprintf(stderr, "ERROR: %s: invalid stripe size: %d " -				"(expected %d)\n", paths[i], val, -				finfo->stripe_size); -			goto err; -		} - -		/* -		 * stripe-coalesce is a backward compatible attribute. If the -		 * attribute does not exist, assume a value of zero for the -		 * traditional stripe format. -		 */ -		tmp = get_attr(paths[i], ATTRNAME_STRIPE_COALESCE, -				&stripe_coalesce_attr, &val); -		if (!tmp) { -			val = 0; -		} else if (tmp != 1) { -			fprintf(stderr, "ERROR: %s: attribute: '%s'\n", -				paths[i], ATTRNAME_STRIPE_COALESCE); -			goto err; -		} - -		if (finfo->coalesce == INVALID_FD) { -			finfo->coalesce = val; -		} else if (val != finfo->coalesce) { -			fprintf(stderr, "ERROR: %s: invalid coalesce flag\n", -				paths[i]); -			goto err; -		} - -		/* -		 * Get/validate the stripe index and open the file in the -		 * appropriate fd slot. -		 */ -		if (get_attr(paths[i], ATTRNAME_STRIPE_INDEX, -				&stripe_index_attr, &val) != 1) { -			fprintf(stderr, "ERROR: %s: attribute: '%s'\n", -				paths[i], ATTRNAME_STRIPE_INDEX); -			goto err; -		} -		if (finfo->fd[val] != INVALID_FD) { -			fprintf(stderr, "ERROR: %s: duplicate stripe index: " -				"%d\n", paths[i], val); -			goto err; -		} - -		finfo->fd[val] = open(paths[i], O_RDONLY); -		if (finfo->fd[val] < 0) -			goto err; - -		/* -		 * Get the creation mode for the file. -		 */ -		if (fstat(finfo->fd[val], &sbuf) < 0) -			goto err; -		if (finfo->mode == INVALID_MODE) { -			finfo->mode = sbuf.st_mode; -		} else if (sbuf.st_mode != finfo->mode) { -			fprintf(stderr, "ERROR: %s: invalid mode\n", paths[i]); -			goto err; -		} -	} - -	free(stripe_count_attr); -	free(stripe_size_attr); -	free(stripe_index_attr); -	free(stripe_coalesce_attr); - -	return finfo; +    int i, val, tmp; +    struct stat sbuf; +    char *stripe_count_attr = NULL; +    char *stripe_size_attr = NULL; +    char *stripe_index_attr = NULL; +    char *stripe_coalesce_attr = NULL; +    struct file_stripe_info *finfo = NULL; + +    for (i = 0; i < count; i++) { +        if (!paths[i]) +            goto err; + +        /* +         * Check the stripe count first so we can allocate the info +         * struct with the appropriate number of fds. +         */ +        if (get_attr(paths[i], ATTRNAME_STRIPE_COUNT, &stripe_count_attr, +                     &val) != 1) { +            fprintf(stderr, "ERROR: %s: attribute: '%s'\n", paths[i], +                    ATTRNAME_STRIPE_COUNT); +            goto err; +        } +        if (!finfo) { +            finfo = alloc_file_stripe_info(val); +            if (!finfo) +                goto err; + +            if (val != count) +                fprintf(stderr, +                        "WARNING: %s: stripe-count " +                        "(%d) != file count (%d). Result may " +                        "be incomplete.\n", +                        paths[i], val, count); + +            finfo->stripe_count = val; +        } else if (val != finfo->stripe_count) { +            fprintf(stderr, +                    "ERROR %s: invalid stripe count: %d " +                    "(expected %d)\n", +                    paths[i], val, finfo->stripe_count); +            goto err; +        } + +        /* +         * Get and validate the chunk size. +         */ +        if (get_attr(paths[i], ATTRNAME_STRIPE_SIZE, &stripe_size_attr, &val) != +            1) { +            fprintf(stderr, "ERROR: %s: attribute: '%s'\n", paths[i], +                    ATTRNAME_STRIPE_SIZE); +            goto err; +        } + +        if (!finfo->stripe_size) { +            finfo->stripe_size = val; +        } else if (val != finfo->stripe_size) { +            fprintf(stderr, +                    "ERROR: %s: invalid stripe size: %d " +                    "(expected %d)\n", +                    paths[i], val, finfo->stripe_size); +            goto err; +        } + +        /* +         * stripe-coalesce is a backward compatible attribute. If the +         * attribute does not exist, assume a value of zero for the +         * traditional stripe format. +         */ +        tmp = get_attr(paths[i], ATTRNAME_STRIPE_COALESCE, +                       &stripe_coalesce_attr, &val); +        if (!tmp) { +            val = 0; +        } else if (tmp != 1) { +            fprintf(stderr, "ERROR: %s: attribute: '%s'\n", paths[i], +                    ATTRNAME_STRIPE_COALESCE); +            goto err; +        } + +        if (finfo->coalesce == INVALID_FD) { +            finfo->coalesce = val; +        } else if (val != finfo->coalesce) { +            fprintf(stderr, "ERROR: %s: invalid coalesce flag\n", paths[i]); +            goto err; +        } + +        /* +         * Get/validate the stripe index and open the file in the +         * appropriate fd slot. +         */ +        if (get_attr(paths[i], ATTRNAME_STRIPE_INDEX, &stripe_index_attr, +                     &val) != 1) { +            fprintf(stderr, "ERROR: %s: attribute: '%s'\n", paths[i], +                    ATTRNAME_STRIPE_INDEX); +            goto err; +        } +        if (finfo->fd[val] != INVALID_FD) { +            fprintf(stderr, +                    "ERROR: %s: duplicate stripe index: " +                    "%d\n", +                    paths[i], val); +            goto err; +        } + +        finfo->fd[val] = open(paths[i], O_RDONLY); +        if (finfo->fd[val] < 0) +            goto err; + +        /* +         * Get the creation mode for the file. +         */ +        if (fstat(finfo->fd[val], &sbuf) < 0) +            goto err; +        if (finfo->mode == INVALID_MODE) { +            finfo->mode = sbuf.st_mode; +        } else if (sbuf.st_mode != finfo->mode) { +            fprintf(stderr, "ERROR: %s: invalid mode\n", paths[i]); +            goto err; +        } +    } + +    free(stripe_count_attr); +    free(stripe_size_attr); +    free(stripe_index_attr); +    free(stripe_coalesce_attr); + +    return finfo;  err: -	free(stripe_count_attr); -	free(stripe_size_attr); -	free(stripe_index_attr); -	free(stripe_coalesce_attr); +    free(stripe_count_attr); +    free(stripe_size_attr); +    free(stripe_index_attr); +    free(stripe_coalesce_attr); -	if (finfo) { -		close_files(finfo); -		free(finfo); -	} +    if (finfo) { +        close_files(finfo); +        free(finfo); +    } -	return NULL; +    return NULL;  }  static int  close_files(struct file_stripe_info *finfo)  { -	int i, ret; +    int i, ret; -	if (!finfo) -		return -1; +    if (!finfo) +        return -1; -	for (i = 0; i < finfo->stripe_count; i++) { -		if (finfo->fd[i] == INVALID_FD) -			continue; +    for (i = 0; i < finfo->stripe_count; i++) { +        if (finfo->fd[i] == INVALID_FD) +            continue; -		ret = close(finfo->fd[i]); -		if (ret < 0) -			return ret; -	} +        ret = close(finfo->fd[i]); +        if (ret < 0) +            return ret; +    } -	return ret; +    return ret;  }  /* @@ -351,43 +357,43 @@ close_files(struct file_stripe_info *finfo)  static int  generate_file_coalesce(int target, struct file_stripe_info *finfo)  { -	char *buf; -	int ret = 0; -	int r, w, i; - -	buf = malloc(finfo->stripe_size); -	if (!buf) -		return -1; - -	i = 0; -	while (1) { -		if (finfo->fd[i] == INVALID_FD) { -			if (lseek(target, finfo->stripe_size, SEEK_CUR) < 0) -				break; - -			i = (i + 1) % finfo->stripe_count; -			continue; -		} - -		r = read(finfo->fd[i], buf, finfo->stripe_size); -		if (r < 0) { -			ret = r; -			break; -		} -		if (!r) -			break; - -		w = write(target, buf, r); -		if (w < 0) { -			ret = w; -			break; -		} - -		i = (i + 1) % finfo->stripe_count; -	} - -	free(buf); -	return ret; +    char *buf; +    int ret = 0; +    int r, w, i; + +    buf = malloc(finfo->stripe_size); +    if (!buf) +        return -1; + +    i = 0; +    while (1) { +        if (finfo->fd[i] == INVALID_FD) { +            if (lseek(target, finfo->stripe_size, SEEK_CUR) < 0) +                break; + +            i = (i + 1) % finfo->stripe_count; +            continue; +        } + +        r = read(finfo->fd[i], buf, finfo->stripe_size); +        if (r < 0) { +            ret = r; +            break; +        } +        if (!r) +            break; + +        w = write(target, buf, r); +        if (w < 0) { +            ret = w; +            break; +        } + +        i = (i + 1) % finfo->stripe_count; +    } + +    free(buf); +    return ret;  }  /* @@ -398,97 +404,100 @@ generate_file_coalesce(int target, struct file_stripe_info *finfo)  static int  generate_file_traditional(int target, struct file_stripe_info *finfo)  { -	int i, j, max_ret, ret; -	char buf[finfo->stripe_count][4096]; - -	do { -		char newbuf[4096] = {0, }; - -		max_ret = 0; -		for (i = 0; i < finfo->stripe_count; i++) { -			memset(buf[i], 0, 4096); -			ret = read(finfo->fd[i], buf[i], 4096); -			if (ret > max_ret) -				max_ret = ret; -		} -		for (i = 0; i < max_ret; i++) -			for (j = 0; j < finfo->stripe_count; j++) -				newbuf[i] |= buf[j][i]; -			write(target, newbuf, max_ret); -	} while (max_ret); - -	return 0; +    int i, j, max_ret, ret; +    char buf[finfo->stripe_count][4096]; + +    do { +        char newbuf[4096] = { +            0, +        }; + +        max_ret = 0; +        for (i = 0; i < finfo->stripe_count; i++) { +            memset(buf[i], 0, 4096); +            ret = read(finfo->fd[i], buf[i], 4096); +            if (ret > max_ret) +                max_ret = ret; +        } +        for (i = 0; i < max_ret; i++) +            for (j = 0; j < finfo->stripe_count; j++) +                newbuf[i] |= buf[j][i]; +        write(target, newbuf, max_ret); +    } while (max_ret); + +    return 0;  }  static int  generate_file(int target, struct file_stripe_info *finfo)  { -	if (finfo->coalesce) -		return generate_file_coalesce(target, finfo); +    if (finfo->coalesce) +        return generate_file_coalesce(target, finfo); -	return generate_file_traditional(target, finfo); +    return generate_file_traditional(target, finfo);  }  static void  usage(char *name)  { -	fprintf(stderr, "Usage: %s [-o <outputfile>] <inputfile1> " -		"<inputfile2> ...\n", name); +    fprintf(stderr, +            "Usage: %s [-o <outputfile>] <inputfile1> " +            "<inputfile2> ...\n", +            name);  }  int  main(int argc, char *argv[])  { -	int file_count, opt; -	char *opath = NULL; -	int targetfd; -	struct file_stripe_info *finfo; - -	while ((opt = getopt(argc, argv, "o:")) != -1) { -		switch (opt) { -		case 'o': -			opath = optarg; -			break; -		default: -			usage(argv[0]); -			return -1; -		} -	} - -	file_count = argc - optind; - -	if (!opath || !file_count) { -		usage(argv[0]); -		return -1; -	} - -	finfo = validate_and_open_files(&argv[optind], file_count); -	if (!finfo) -		goto err; - -	targetfd = open(opath, O_RDWR|O_CREAT, finfo->mode); -	if (targetfd < 0) -		goto err; - -	if (generate_file(targetfd, finfo) < 0) -		goto err; - -	if (fsync(targetfd) < 0) -		fprintf(stderr, "ERROR: %s\n", strerror(errno)); -	if (close(targetfd) < 0) -		fprintf(stderr, "ERROR: %s\n", strerror(errno)); - -	close_files(finfo); -	free(finfo); - -	return 0; +    int file_count, opt; +    char *opath = NULL; +    int targetfd; +    struct file_stripe_info *finfo; + +    while ((opt = getopt(argc, argv, "o:")) != -1) { +        switch (opt) { +            case 'o': +                opath = optarg; +                break; +            default: +                usage(argv[0]); +                return -1; +        } +    } + +    file_count = argc - optind; + +    if (!opath || !file_count) { +        usage(argv[0]); +        return -1; +    } + +    finfo = validate_and_open_files(&argv[optind], file_count); +    if (!finfo) +        goto err; + +    targetfd = open(opath, O_RDWR | O_CREAT, finfo->mode); +    if (targetfd < 0) +        goto err; + +    if (generate_file(targetfd, finfo) < 0) +        goto err; + +    if (fsync(targetfd) < 0) +        fprintf(stderr, "ERROR: %s\n", strerror(errno)); +    if (close(targetfd) < 0) +        fprintf(stderr, "ERROR: %s\n", strerror(errno)); + +    close_files(finfo); +    free(finfo); + +    return 0;  err: -	if (finfo) { -		close_files(finfo); -		free(finfo); -	} +    if (finfo) { +        close_files(finfo); +        free(finfo); +    } -	return -1; +    return -1;  } - diff --git a/extras/test/ld-preload-test/ld-preload-lib.c b/extras/test/ld-preload-test/ld-preload-lib.c index 181b5c1e9c7..d120c053a69 100644 --- a/extras/test/ld-preload-test/ld-preload-lib.c +++ b/extras/test/ld-preload-test/ld-preload-lib.c @@ -40,596 +40,576 @@  /* Err number that is assigned to errno so that test application can   * verify that the function was intercepted correctly.   */ -#define PRELOAD_ERRNO_VERF      6449 -#define set_errno()             (errno = PRELOAD_ERRNO_VERF) +#define PRELOAD_ERRNO_VERF 6449 +#define set_errno() (errno = PRELOAD_ERRNO_VERF)  void -intercept (char *call, int tabs) +intercept(char *call, int tabs)  { -        while (tabs > 0) { -                fprintf (stdout, "\t"); -                --tabs; -        } +    while (tabs > 0) { +        fprintf(stdout, "\t"); +        --tabs; +    } -        fprintf (stdout, "Intercepted by %s", call); +    fprintf(stdout, "Intercepted by %s", call);  }  int -creat64 (const char *pathname, mode_t mode) +creat64(const char *pathname, mode_t mode)  { -        intercept ("creat64", 2); -        set_errno (); -        return -1; +    intercept("creat64", 2); +    set_errno(); +    return -1;  }  int -creat (const char *pathname, mode_t mode) +creat(const char *pathname, mode_t mode)  { -        intercept ("creat", 2); -        set_errno (); -        return -1; +    intercept("creat", 2); +    set_errno(); +    return -1;  } -  int -close (int fd) +close(int fd)  { -        intercept ("close", 2); -        set_errno (); -        return -1; +    intercept("close", 2); +    set_errno(); +    return -1;  }  int -open64 (const char *pathname, int flags, ...) +open64(const char *pathname, int flags, ...)  { -        intercept ("open64", 2); -        set_errno (); -        return -1; +    intercept("open64", 2); +    set_errno(); +    return -1;  } -  int -open (const char *pathname, int flags, ...) +open(const char *pathname, int flags, ...)  { -        intercept ("open", 2); -        set_errno (); -        return -1; +    intercept("open", 2); +    set_errno(); +    return -1;  }  ssize_t -read (int fd, void *buf, size_t count) +read(int fd, void *buf, size_t count)  { -        intercept ("read", 2); -        set_errno (); -        return -1; +    intercept("read", 2); +    set_errno(); +    return -1;  }  ssize_t -readv (int fd, const struct iovec *vector, int count) +readv(int fd, const struct iovec *vector, int count)  { -        intercept ("readv", 2); -        set_errno (); -        return -1; +    intercept("readv", 2); +    set_errno(); +    return -1;  }  ssize_t -pread (int fd, void *buf, size_t count, unsigned long offset) +pread(int fd, void *buf, size_t count, unsigned long offset)  { -        intercept ("pread", 2); -        set_errno (); -        return -1; +    intercept("pread", 2); +    set_errno(); +    return -1;  } -  ssize_t -pread64 (int fd, void *buf, size_t count, uint64_t offset) +pread64(int fd, void *buf, size_t count, uint64_t offset)  { -        intercept ("pread64", 2); -        set_errno (); -        return -1; +    intercept("pread64", 2); +    set_errno(); +    return -1;  }  ssize_t -write (int fd, const void *buf, size_t count) +write(int fd, const void *buf, size_t count)  { -        intercept ("write", 2); -        set_errno (); -        return -1; +    intercept("write", 2); +    set_errno(); +    return -1;  }  ssize_t -writev (int fd, const struct iovec *vector, int count) +writev(int fd, const struct iovec *vector, int count)  { -        intercept ("writev", 2); -        set_errno (); -        return -1; +    intercept("writev", 2); +    set_errno(); +    return -1;  }  ssize_t -pwrite (int fd, const void *buf, size_t count, unsigned long offset) +pwrite(int fd, const void *buf, size_t count, unsigned long offset)  { -        intercept ("pwrite", 2); -        set_errno (); -        return -1; +    intercept("pwrite", 2); +    set_errno(); +    return -1;  }  ssize_t -pwrite64 (int fd, const void *buf, size_t count, uint64_t offset) +pwrite64(int fd, const void *buf, size_t count, uint64_t offset)  { -        intercept ("pwrite64", 2); -        set_errno (); -        return -1; +    intercept("pwrite64", 2); +    set_errno(); +    return -1;  } -  off_t -lseek (int fildes, unsigned long offset, int whence) +lseek(int fildes, unsigned long offset, int whence)  { -        intercept ("lseek", 2); -        set_errno (); -        return -1; +    intercept("lseek", 2); +    set_errno(); +    return -1;  }  off_t -lseek64 (int fildes, uint64_t offset, int whence) +lseek64(int fildes, uint64_t offset, int whence)  { -        intercept ("lseek64", 2); -        set_errno (); -        return -1; +    intercept("lseek64", 2); +    set_errno(); +    return -1;  } -  int -dup (int fd) +dup(int fd)  { -        intercept ("dup", 2); -        set_errno (); -        return -1; +    intercept("dup", 2); +    set_errno(); +    return -1;  }  int -dup2 (int oldfd, int newfd) +dup2(int oldfd, int newfd)  { -        intercept ("dup2", 2); -        set_errno (); -        return -1; +    intercept("dup2", 2); +    set_errno(); +    return -1;  }  int -mkdir (const char *pathname, mode_t mode) +mkdir(const char *pathname, mode_t mode)  { -        intercept ("mkdir", 2); -        set_errno (); -        return -1; +    intercept("mkdir", 2); +    set_errno(); +    return -1;  }  int -rmdir (const char *pathname) +rmdir(const char *pathname)  { -        intercept ("rmdir", 2); -        set_errno (); -        return -1; +    intercept("rmdir", 2); +    set_errno(); +    return -1;  }  int -chmod (const char *pathname, mode_t mode) +chmod(const char *pathname, mode_t mode)  { -        intercept ("chmod", 2); -        set_errno (); -        return -1; +    intercept("chmod", 2); +    set_errno(); +    return -1;  }  int -chown (const char *pathname, uid_t owner, gid_t group) +chown(const char *pathname, uid_t owner, gid_t group)  { -        intercept ("chown", 2); -        set_errno (); -        return -1; +    intercept("chown", 2); +    set_errno(); +    return -1;  }  int -fchmod (int fd, mode_t mode) +fchmod(int fd, mode_t mode)  { -        intercept ("fchmod", 2); -        set_errno (); -        return -1; +    intercept("fchmod", 2); +    set_errno(); +    return -1;  }  int -fchown (int fd, uid_t uid, gid_t gid) +fchown(int fd, uid_t uid, gid_t gid)  { -        intercept ("fchown", 2); -        set_errno (); -        return -1; +    intercept("fchown", 2); +    set_errno(); +    return -1;  } -int fsync (int fd) +int +fsync(int fd)  { -        intercept ("fsync", 2); -        set_errno (); -        return -1; +    intercept("fsync", 2); +    set_errno(); +    return -1;  } -  int -ftruncate (int fd, off_t length) +ftruncate(int fd, off_t length)  { -        intercept ("ftruncate", 1); -        set_errno (); -        return -1; +    intercept("ftruncate", 1); +    set_errno(); +    return -1;  } -  int -ftruncate64 (int fd, off_t length) +ftruncate64(int fd, off_t length)  { -        intercept ("ftruncate64", 1); -        set_errno (); -        return -1; +    intercept("ftruncate64", 1); +    set_errno(); +    return -1;  }  int -link (const char *oldpath, const char *newname) +link(const char *oldpath, const char *newname)  { -        intercept ("link", 2); -        set_errno (); -        return -1; +    intercept("link", 2); +    set_errno(); +    return -1;  }  int -rename (const char *oldpath, const char *newpath) +rename(const char *oldpath, const char *newpath)  { -        intercept ("rename", 2); -        set_errno (); -        return -1; +    intercept("rename", 2); +    set_errno(); +    return -1;  }  int -utimes (const char *path, const struct timeval times[2]) +utimes(const char *path, const struct timeval times[2])  { -        intercept ("utimes", 2); -        set_errno (); -        return -1; +    intercept("utimes", 2); +    set_errno(); +    return -1;  }  int -futimes (int fd, const struct timeval times[2]) +futimes(int fd, const struct timeval times[2])  { -        intercept ("futimes", 2); -        set_errno (); -        return -1; +    intercept("futimes", 2); +    set_errno(); +    return -1;  }  int -utime (const char *path, const struct utimbuf *buf) +utime(const char *path, const struct utimbuf *buf)  { -        intercept ("utime", 2); -        set_errno (); -        return -1; +    intercept("utime", 2); +    set_errno(); +    return -1;  } -  int -mknod (const char *path, mode_t mode, dev_t dev) +mknod(const char *path, mode_t mode, dev_t dev)  { -        intercept ("mknod", 2); -        set_errno (); -        return -1; +    intercept("mknod", 2); +    set_errno(); +    return -1;  }  int -__xmknod (int ver, const char *path, mode_t mode, dev_t *dev) +__xmknod(int ver, const char *path, mode_t mode, dev_t *dev)  { -        intercept ("__xmknod", 2); -        set_errno (); -        return -1; +    intercept("__xmknod", 2); +    set_errno(); +    return -1;  }  int -mkfifo (const char *path, mode_t mode) +mkfifo(const char *path, mode_t mode)  { -        intercept ("mkfifo", 2); -        set_errno (); -        return -1; +    intercept("mkfifo", 2); +    set_errno(); +    return -1;  }  int -unlink (const char *path) +unlink(const char *path)  { -        intercept ("unlink", 2); -        set_errno (); -        return -1; +    intercept("unlink", 2); +    set_errno(); +    return -1;  } -  int -symlink (const char *oldpath, const char *newpath) +symlink(const char *oldpath, const char *newpath)  { -        intercept ("symlink", 2); -        set_errno (); -        return -1; +    intercept("symlink", 2); +    set_errno(); +    return -1;  }  int -readlink (const char *path, char *buf, size_t bufsize) +readlink(const char *path, char *buf, size_t bufsize)  { -        intercept ("readlink", 1); -        set_errno (); -        return -1; +    intercept("readlink", 1); +    set_errno(); +    return -1;  } -  char * -realpath (const char *path, char *resolved) +realpath(const char *path, char *resolved)  { -        intercept ("realpath", 1); -        set_errno (); -        return NULL; +    intercept("realpath", 1); +    set_errno(); +    return NULL;  } -  DIR * -opendir (const char *path) +opendir(const char *path)  { -        intercept ("opendir", 2); -        set_errno (); -        return NULL; +    intercept("opendir", 2); +    set_errno(); +    return NULL;  } -  struct dirent * -readdir (DIR *dir) +readdir(DIR *dir)  { -        intercept ("readdir\t", 2); -        set_errno (); -        return NULL; +    intercept("readdir\t", 2); +    set_errno(); +    return NULL;  }  struct dirent * -readdir64 (DIR *dir) +readdir64(DIR *dir)  { -        intercept ("readdir64", 2); -        set_errno (); -        return NULL; +    intercept("readdir64", 2); +    set_errno(); +    return NULL;  } -  int -readdir_r (DIR *dir, struct dirent *entry, struct dirent **result) +readdir_r(DIR *dir, struct dirent *entry, struct dirent **result)  { -        intercept ("readdir_r", 1); -        set_errno (); -        return -1; +    intercept("readdir_r", 1); +    set_errno(); +    return -1;  }  int -readdir64_r (DIR *dir, struct dirent *entry, struct dirent **result) +readdir64_r(DIR *dir, struct dirent *entry, struct dirent **result)  { -        intercept ("readdir64_r", 1); -        set_errno (); -        return -1; +    intercept("readdir64_r", 1); +    set_errno(); +    return -1;  } -  int -closedir (DIR *dh) +closedir(DIR *dh)  { -        intercept ("closedir", 1); -        set_errno (); -        return -1; +    intercept("closedir", 1); +    set_errno(); +    return -1;  }  int -__xstat (int ver, const char *path, struct stat *buf) +__xstat(int ver, const char *path, struct stat *buf)  { -        intercept ("__xstat\t", 2); -        set_errno (); -        return -1; +    intercept("__xstat\t", 2); +    set_errno(); +    return -1;  } -  int -__xstat64 (int ver, const char *path, struct stat *buf) +__xstat64(int ver, const char *path, struct stat *buf)  { -        intercept ("__xstat64", 2); -        set_errno (); -        return -1; +    intercept("__xstat64", 2); +    set_errno(); +    return -1;  }  int -stat (const char *path, struct stat *buf) +stat(const char *path, struct stat *buf)  { -        intercept ("stat", 2); -        set_errno (); -        return -1; +    intercept("stat", 2); +    set_errno(); +    return -1;  }  int -stat64 (const char *path, struct stat *buf) +stat64(const char *path, struct stat *buf)  { -        intercept ("stat64", 2); -        set_errno (); -        return -1; +    intercept("stat64", 2); +    set_errno(); +    return -1;  }  int -__fxstat (int ver, int fd, struct stat *buf) +__fxstat(int ver, int fd, struct stat *buf)  { -        intercept ("__fxstat\t", 2); -        set_errno (); -        return -1; +    intercept("__fxstat\t", 2); +    set_errno(); +    return -1;  } -  int -__fxstat64 (int ver, int fd, struct stat *buf) +__fxstat64(int ver, int fd, struct stat *buf)  { -        intercept ("__fxstat64", 2); -        set_errno (); -        return -1; +    intercept("__fxstat64", 2); +    set_errno(); +    return -1;  }  int -fstat (int fd, struct stat *buf) +fstat(int fd, struct stat *buf)  { -        intercept ("fstat", 2); -        set_errno (); -        return -1; +    intercept("fstat", 2); +    set_errno(); +    return -1;  }  int -fstat64 (int fd , struct stat *buf) +fstat64(int fd, struct stat *buf)  { -        intercept ("fstat64", 2); -        set_errno (); -        return -1; +    intercept("fstat64", 2); +    set_errno(); +    return -1;  }  int -__lxstat (int ver, const char *path, struct stat *buf) +__lxstat(int ver, const char *path, struct stat *buf)  { -        intercept ("__lxstat\t", 2); -        set_errno (); -        return -1; +    intercept("__lxstat\t", 2); +    set_errno(); +    return -1;  }  int -__lxstat64 (int ver, const char *path, struct stat *buf) +__lxstat64(int ver, const char *path, struct stat *buf)  { -        intercept ("__lxstat64", 2); -        set_errno (); -        return -1; +    intercept("__lxstat64", 2); +    set_errno(); +    return -1;  }  int -lstat (const char *path, struct stat *buf) +lstat(const char *path, struct stat *buf)  { -        intercept ("lstat", 2); -        set_errno (); -        return -1; +    intercept("lstat", 2); +    set_errno(); +    return -1;  }  int -lstat64 (const char *path, struct stat *buf) +lstat64(const char *path, struct stat *buf)  { -        intercept ("lstat64", 2); -        set_errno (); -        return -1; +    intercept("lstat64", 2); +    set_errno(); +    return -1;  }  int -statfs (const char *path, struct statfs *buf) +statfs(const char *path, struct statfs *buf)  { -        intercept ("statfs", 2); -        set_errno (); -        return -1; +    intercept("statfs", 2); +    set_errno(); +    return -1;  } -  int -statfs64 (const char *path, struct statfs *buf) +statfs64(const char *path, struct statfs *buf)  { -        intercept ("statfs64", 2); -        set_errno (); -        return -1; +    intercept("statfs64", 2); +    set_errno(); +    return -1;  }  int -statvfs (const char *path, struct statvfs *buf) +statvfs(const char *path, struct statvfs *buf)  { -        intercept ("statvfs\t", 2); -        set_errno (); -        return -1; +    intercept("statvfs\t", 2); +    set_errno(); +    return -1;  } -  int -statvfs64 (const char *path, struct statvfs *buf) +statvfs64(const char *path, struct statvfs *buf)  { -        intercept ("statvfs64", 2); -        set_errno (); -        return -1; +    intercept("statvfs64", 2); +    set_errno(); +    return -1;  }  ssize_t -getxattr (const char *path, const char *name, void *value, size_t size) +getxattr(const char *path, const char *name, void *value, size_t size)  { -        intercept ("getxattr", 1); -        set_errno (); -        return -1; +    intercept("getxattr", 1); +    set_errno(); +    return -1;  }  ssize_t -lgetxattr (const char *path, const char *name, void *value, size_t size) +lgetxattr(const char *path, const char *name, void *value, size_t size)  { -        intercept ("lgetxattr", 1); -        set_errno (); -        return -1; +    intercept("lgetxattr", 1); +    set_errno(); +    return -1;  } -  int -remove (const char* path) +remove(const char *path)  { -        intercept ("remove", 2); -        set_errno (); -        return -1; +    intercept("remove", 2); +    set_errno(); +    return -1;  }  int -lchown (const char *path, uid_t owner, gid_t group) +lchown(const char *path, uid_t owner, gid_t group)  { -        intercept ("lchown", 2); -        set_errno (); -        return -1; +    intercept("lchown", 2); +    set_errno(); +    return -1;  }  void -rewinddir (DIR *dirp) +rewinddir(DIR *dirp)  { -        intercept ("rewinddir", 1); -        set_errno (); -        return; +    intercept("rewinddir", 1); +    set_errno(); +    return;  }  void -seekdir (DIR *dirp, off_t offset) +seekdir(DIR *dirp, off_t offset)  { -        intercept ("seekdir", 2); -        set_errno (); -        return; +    intercept("seekdir", 2); +    set_errno(); +    return;  }  off_t -telldir (DIR *dirp) +telldir(DIR *dirp)  { -        intercept ("telldir", 2); -        set_errno (); -        return -1; +    intercept("telldir", 2); +    set_errno(); +    return -1;  }  ssize_t -sendfile (int out_fd, int in_fd, off_t *offset, size_t count) +sendfile(int out_fd, int in_fd, off_t *offset, size_t count)  { -        intercept ("sendfile\t", 1); -        set_errno (); -        return -1; +    intercept("sendfile\t", 1); +    set_errno(); +    return -1;  }  ssize_t -sendfile64 (int out_fd, int in_fd, off_t *offset, size_t count) +sendfile64(int out_fd, int in_fd, off_t *offset, size_t count)  { -        intercept ("sendfile64", 1); -        set_errno (); -        return -1; +    intercept("sendfile64", 1); +    set_errno(); +    return -1;  } -  int -fcntl (int fd, int cmd, ...) +fcntl(int fd, int cmd, ...)  { -        intercept ("fcntl", 2); -        set_errno (); -        return -1; +    intercept("fcntl", 2); +    set_errno(); +    return -1;  } - diff --git a/extras/test/ld-preload-test/ld-preload-test.c b/extras/test/ld-preload-test/ld-preload-test.c index 46e3e0e4172..54dde8c7d54 100644 --- a/extras/test/ld-preload-test/ld-preload-test.c +++ b/extras/test/ld-preload-test/ld-preload-test.c @@ -49,319 +49,310 @@  #include <sys/xattr.h>  #include <sys/sendfile.h> - -#define PRELOAD_ERRNO_VERF      6449 +#define PRELOAD_ERRNO_VERF 6449  void  check_err(int ret, char *call, int tabs)  { -        while (tabs > 0) { -                fprintf (stdout, "\t"); -                --tabs; -        } -        if (ret != -1) { -                fprintf (stdout, "Not intercepted: %s\n", call); -                return; -        } - -        if (errno != PRELOAD_ERRNO_VERF) { -                fprintf (stdout, "Not intercepted: %s: err: %s\n", call, -                         strerror (errno)); -                return; -        } +    while (tabs > 0) { +        fprintf(stdout, "\t"); +        --tabs; +    } +    if (ret != -1) { +        fprintf(stdout, "Not intercepted: %s\n", call); +        return; +    } -        fprintf (stdout, "Intercept verified: %s\n", call); +    if (errno != PRELOAD_ERRNO_VERF) { +        fprintf(stdout, "Not intercepted: %s: err: %s\n", call, +                strerror(errno));          return; +    } + +    fprintf(stdout, "Intercept verified: %s\n", call); +    return;  }  void -usage (FILE *fp) +usage(FILE *fp)  { -        fprintf (fp, "Usage: ld-preload-test <Options>\n"); -        fprintf (fp, "Options\n"); -        fprintf (fp, "\t--path\t\tPathname is used as the file/directory" -                     " created for the test.\n"); - +    fprintf(fp, "Usage: ld-preload-test <Options>\n"); +    fprintf(fp, "Options\n"); +    fprintf(fp, +            "\t--path\t\tPathname is used as the file/directory" +            " created for the test.\n");  } -  int -run_file_tests (char *testfile) +run_file_tests(char *testfile)  { -        int             ret = -1; -        struct stat     buf; +    int ret = -1; +    struct stat buf; -        assert (testfile); -        fprintf (stdout, "Testing creat"); -        ret = creat (testfile, S_IRWXU); -        check_err (ret, "creat", 2); +    assert(testfile); +    fprintf(stdout, "Testing creat"); +    ret = creat(testfile, S_IRWXU); +    check_err(ret, "creat", 2); -        fprintf (stdout, "Testing close"); -        ret = close (ret); -        check_err (ret, "close", 2); +    fprintf(stdout, "Testing close"); +    ret = close(ret); +    check_err(ret, "close", 2); -        fprintf (stdout, "Testing open"); -        ret = open (testfile, O_RDONLY); -        check_err (ret, "open", 2); +    fprintf(stdout, "Testing open"); +    ret = open(testfile, O_RDONLY); +    check_err(ret, "open", 2); -        fprintf (stdout, "Testing read"); -        ret = read (0, NULL, 0); -        check_err (ret, "read", 2); +    fprintf(stdout, "Testing read"); +    ret = read(0, NULL, 0); +    check_err(ret, "read", 2); -        fprintf (stdout, "Testing readv"); -        ret = readv (0, NULL, 0); -        check_err (ret, "readv", 2); +    fprintf(stdout, "Testing readv"); +    ret = readv(0, NULL, 0); +    check_err(ret, "readv", 2); -        fprintf (stdout, "Testing pread"); -        ret = pread (0, NULL, 0, 0); -        check_err (ret, "pread", 2); +    fprintf(stdout, "Testing pread"); +    ret = pread(0, NULL, 0, 0); +    check_err(ret, "pread", 2); -        fprintf (stdout, "Testing write"); -        ret = write (0, NULL, 0); -        check_err (ret, "write", 2); +    fprintf(stdout, "Testing write"); +    ret = write(0, NULL, 0); +    check_err(ret, "write", 2); -        fprintf (stdout, "Testing writev"); -        ret = writev (0, NULL, 0); -        check_err (ret, "writev", 2); +    fprintf(stdout, "Testing writev"); +    ret = writev(0, NULL, 0); +    check_err(ret, "writev", 2); -        fprintf (stdout, "Testing pwrite"); -        ret = pwrite (0, NULL, 0, 0); -        check_err (ret, "pwrite", 2); +    fprintf(stdout, "Testing pwrite"); +    ret = pwrite(0, NULL, 0, 0); +    check_err(ret, "pwrite", 2); -        fprintf (stdout, "Testing lseek"); -        ret = lseek (0, 0, 0); -        check_err (ret, "lseek", 2); +    fprintf(stdout, "Testing lseek"); +    ret = lseek(0, 0, 0); +    check_err(ret, "lseek", 2); -        fprintf (stdout, "Testing dup"); -        ret = dup (0); -        check_err (ret, "dup", 2); +    fprintf(stdout, "Testing dup"); +    ret = dup(0); +    check_err(ret, "dup", 2); -        fprintf (stdout, "Testing dup2"); -        ret = dup2 (0, 0); -        check_err (ret, "dup2", 2); +    fprintf(stdout, "Testing dup2"); +    ret = dup2(0, 0); +    check_err(ret, "dup2", 2); -        fprintf (stdout, "Testing fchmod"); -        ret = fchmod (0, 0); -        check_err (ret, "fchmod", 2); +    fprintf(stdout, "Testing fchmod"); +    ret = fchmod(0, 0); +    check_err(ret, "fchmod", 2); -        fprintf (stdout, "Testing fchown"); -        ret = fchown (0, 0, 0); -        check_err (ret, "fchown", 2); +    fprintf(stdout, "Testing fchown"); +    ret = fchown(0, 0, 0); +    check_err(ret, "fchown", 2); -        fprintf (stdout, "Testing fsync"); -        ret = fsync (0); -        check_err (ret, "fsync", 2); +    fprintf(stdout, "Testing fsync"); +    ret = fsync(0); +    check_err(ret, "fsync", 2); -        fprintf (stdout, "Testing ftruncate"); -        ret = ftruncate (0, 0); -        check_err (ret, "ftruncate", 1); +    fprintf(stdout, "Testing ftruncate"); +    ret = ftruncate(0, 0); +    check_err(ret, "ftruncate", 1); -        fprintf (stdout, "Testing fstat"); -        ret = fstat (0, &buf); -        check_err (ret, "fstat", 1); +    fprintf(stdout, "Testing fstat"); +    ret = fstat(0, &buf); +    check_err(ret, "fstat", 1); -        fprintf (stdout, "Testing sendfile"); -        ret = sendfile (0, 0, NULL, 0); -        check_err (ret, "sendfile", 1); +    fprintf(stdout, "Testing sendfile"); +    ret = sendfile(0, 0, NULL, 0); +    check_err(ret, "sendfile", 1); -        fprintf (stdout, "Testing fcntl"); -        ret = fcntl (0, 0, NULL); -        check_err (ret, "fcntl", 2); +    fprintf(stdout, "Testing fcntl"); +    ret = fcntl(0, 0, NULL); +    check_err(ret, "fcntl", 2); -        fprintf (stdout, "Testing close"); -        ret = close (ret); -        check_err (ret, "close", 2); +    fprintf(stdout, "Testing close"); +    ret = close(ret); +    check_err(ret, "close", 2); -        fprintf (stdout, "Testing remove"); -        ret = remove (testfile); -        check_err (ret, "remove", 2); +    fprintf(stdout, "Testing remove"); +    ret = remove(testfile); +    check_err(ret, "remove", 2); -        return ret; +    return ret;  } -  int -run_attr_tests (char *testfile) +run_attr_tests(char *testfile)  { -        int             ret = -1; -        char            *res = NULL; -        struct stat     buf; -        struct statfs   sbuf; -        struct statvfs  svbuf; - -        assert (testfile); - -        fprintf (stdout, "Testing chmod"); -        ret = chmod (testfile, 0); -        check_err (ret, "chmod", 2); - -        fprintf (stdout, "Testing chown"); -        ret = chown (testfile, 0, 0); -        check_err (ret, "chown", 2); - -        fprintf (stdout, "Testing link"); -        ret = link (testfile, testfile); -        check_err (ret, "link", 2); - -        fprintf (stdout, "Testing rename"); -        ret = rename (testfile, testfile); -        check_err (ret, "rename", 2); - -        fprintf (stdout, "Testing utimes"); -        ret = utimes (testfile, NULL); -        check_err (ret, "utimes", 2); - -        fprintf (stdout, "Testing utime"); -        ret = utime (testfile, NULL); -        check_err (ret, "utime", 2); - -        fprintf (stdout, "Testing unlink"); -        ret = unlink (testfile); -        check_err (ret, "unlink", 2); - -        fprintf (stdout, "Testing symlink"); -        ret = symlink (testfile, testfile); -        check_err (ret, "symlink", 2); - -        fprintf (stdout, "Testing readlink"); -        ret = readlink (testfile, testfile, 0); -        check_err (ret, "readlink", 2); - -        fprintf (stdout, "Testing realpath"); -        ret = 0; -        res = realpath ((const char *)testfile, testfile); -        if (!res) -                ret = -1; -        check_err (ret, "realpath", 2); - -        fprintf (stdout, "Testing stat"); -        ret = stat (testfile, &buf); -        check_err (ret, "stat", 1); - -        fprintf (stdout, "Testing lstat"); -        ret = lstat (testfile, &buf); -        check_err (ret, "lstat", 1); - -        fprintf (stdout, "Testing statfs"); -        ret = statfs (testfile, &sbuf); -        check_err (ret, "statfs", 2); - -        fprintf (stdout, "Testing statvfs"); -        ret = statvfs (testfile, &svbuf); -        check_err (ret, "statvfs", 1); - -        fprintf (stdout, "Testing getxattr"); -        ret = getxattr (testfile, NULL, NULL, 0); -        check_err (ret, "getxattr", 2); - -        fprintf (stdout, "Testing lgetxattr"); -        ret = lgetxattr (testfile, NULL, NULL, 0); -        check_err (ret, "lgetxattr", 1); - -        fprintf (stdout, "Testing lchown"); -        ret = lchown (testfile, 0, 0); -        check_err (ret, "lchown", 2); -        return 0; +    int ret = -1; +    char *res = NULL; +    struct stat buf; +    struct statfs sbuf; +    struct statvfs svbuf; + +    assert(testfile); + +    fprintf(stdout, "Testing chmod"); +    ret = chmod(testfile, 0); +    check_err(ret, "chmod", 2); + +    fprintf(stdout, "Testing chown"); +    ret = chown(testfile, 0, 0); +    check_err(ret, "chown", 2); + +    fprintf(stdout, "Testing link"); +    ret = link(testfile, testfile); +    check_err(ret, "link", 2); + +    fprintf(stdout, "Testing rename"); +    ret = rename(testfile, testfile); +    check_err(ret, "rename", 2); + +    fprintf(stdout, "Testing utimes"); +    ret = utimes(testfile, NULL); +    check_err(ret, "utimes", 2); + +    fprintf(stdout, "Testing utime"); +    ret = utime(testfile, NULL); +    check_err(ret, "utime", 2); + +    fprintf(stdout, "Testing unlink"); +    ret = unlink(testfile); +    check_err(ret, "unlink", 2); + +    fprintf(stdout, "Testing symlink"); +    ret = symlink(testfile, testfile); +    check_err(ret, "symlink", 2); + +    fprintf(stdout, "Testing readlink"); +    ret = readlink(testfile, testfile, 0); +    check_err(ret, "readlink", 2); + +    fprintf(stdout, "Testing realpath"); +    ret = 0; +    res = realpath((const char *)testfile, testfile); +    if (!res) +        ret = -1; +    check_err(ret, "realpath", 2); + +    fprintf(stdout, "Testing stat"); +    ret = stat(testfile, &buf); +    check_err(ret, "stat", 1); + +    fprintf(stdout, "Testing lstat"); +    ret = lstat(testfile, &buf); +    check_err(ret, "lstat", 1); + +    fprintf(stdout, "Testing statfs"); +    ret = statfs(testfile, &sbuf); +    check_err(ret, "statfs", 2); + +    fprintf(stdout, "Testing statvfs"); +    ret = statvfs(testfile, &svbuf); +    check_err(ret, "statvfs", 1); + +    fprintf(stdout, "Testing getxattr"); +    ret = getxattr(testfile, NULL, NULL, 0); +    check_err(ret, "getxattr", 2); + +    fprintf(stdout, "Testing lgetxattr"); +    ret = lgetxattr(testfile, NULL, NULL, 0); +    check_err(ret, "lgetxattr", 1); + +    fprintf(stdout, "Testing lchown"); +    ret = lchown(testfile, 0, 0); +    check_err(ret, "lchown", 2); +    return 0;  } -  int -run_dev_tests (char *testfile) +run_dev_tests(char *testfile)  { -        int     ret = -1; +    int ret = -1; -        assert (testfile); +    assert(testfile); -        fprintf (stdout, "Testing mknod"); -        ret = mknod (testfile, 0, 0); -        check_err (ret, "mknod", 2); +    fprintf(stdout, "Testing mknod"); +    ret = mknod(testfile, 0, 0); +    check_err(ret, "mknod", 2); -        fprintf (stdout, "Testing mkfifo"); -        ret = mkfifo (testfile, 0); -        check_err (ret, "mkfifo", 2); -        return 0; +    fprintf(stdout, "Testing mkfifo"); +    ret = mkfifo(testfile, 0); +    check_err(ret, "mkfifo", 2); +    return 0;  }  int -run_dir_tests (char *testpath) +run_dir_tests(char *testpath)  { -        int             ret = -1; -        DIR             *dh = NULL; -        struct dirent   *dire = NULL; - -        assert (testpath); - -        fprintf (stdout, "Testing mkdir"); -        ret = mkdir (testpath, 0); -        check_err (ret, "mkdir", 2); - -        fprintf (stdout, "Testing rmdir"); -        ret = rmdir (testpath); -        check_err (ret, "rmdir", 2); - -        fprintf (stdout, "Testing opendir"); -        ret = 0; -        dh = opendir (testpath); -        if (!dh) -                ret = -1; -        check_err (ret, "opendir", 2); - -        fprintf (stdout, "Testing readdir"); -        ret = 0; -        dire = readdir (dh); -        if (!dire) -                ret = -1; -        check_err (ret, "readdir", 1); - -        fprintf (stdout, "Testing readdir_r"); -        ret = readdir_r (dh, dire, &dire); -        check_err (ret, "readdir_r", 1); - -        fprintf (stdout, "Testing rewinddir"); -        rewinddir (dh); -        check_err (-1, "rewinddir", 1); - -        fprintf (stdout, "Testing seekdir"); -        seekdir (dh, 0); -        check_err (-1, "seekdir", 2); - -        fprintf (stdout, "Testing telldir"); -        ret = telldir (dh); -        check_err (ret, "telldir", 2); - -        fprintf (stdout, "Testing closedir"); -        ret = closedir (dh); -        check_err (ret, "closedir", 2); -        return 0; +    int ret = -1; +    DIR *dh = NULL; +    struct dirent *dire = NULL; + +    assert(testpath); + +    fprintf(stdout, "Testing mkdir"); +    ret = mkdir(testpath, 0); +    check_err(ret, "mkdir", 2); + +    fprintf(stdout, "Testing rmdir"); +    ret = rmdir(testpath); +    check_err(ret, "rmdir", 2); + +    fprintf(stdout, "Testing opendir"); +    ret = 0; +    dh = opendir(testpath); +    if (!dh) +        ret = -1; +    check_err(ret, "opendir", 2); + +    fprintf(stdout, "Testing readdir"); +    ret = 0; +    dire = readdir(dh); +    if (!dire) +        ret = -1; +    check_err(ret, "readdir", 1); + +    fprintf(stdout, "Testing readdir_r"); +    ret = readdir_r(dh, dire, &dire); +    check_err(ret, "readdir_r", 1); + +    fprintf(stdout, "Testing rewinddir"); +    rewinddir(dh); +    check_err(-1, "rewinddir", 1); + +    fprintf(stdout, "Testing seekdir"); +    seekdir(dh, 0); +    check_err(-1, "seekdir", 2); + +    fprintf(stdout, "Testing telldir"); +    ret = telldir(dh); +    check_err(ret, "telldir", 2); + +    fprintf(stdout, "Testing closedir"); +    ret = closedir(dh); +    check_err(ret, "closedir", 2); +    return 0;  } - -  int -main (int argc, char *argv[]) +main(int argc, char *argv[])  { -        char            *testpath = NULL; -        int             x = 0; - -        for (;x < argc; ++x) { -                if (strcmp (argv[x], "--path") == 0) { -                        testpath = argv[x+1]; -                        continue; -                } +    char *testpath = NULL; +    int x = 0; +    for (; x < argc; ++x) { +        if (strcmp(argv[x], "--path") == 0) { +            testpath = argv[x + 1]; +            continue;          } +    } -        if (!testpath) { -                fprintf (stderr, "--path not specified\n"); -                usage (stderr); -                return -1; -        } +    if (!testpath) { +        fprintf(stderr, "--path not specified\n"); +        usage(stderr); +        return -1; +    } -        run_file_tests (testpath); -        run_dir_tests (testpath); -        run_attr_tests (testpath); -        run_dev_tests (testpath); +    run_file_tests(testpath); +    run_dir_tests(testpath); +    run_attr_tests(testpath); +    run_dev_tests(testpath); -        return 0; +    return 0;  } - - diff --git a/extras/test/open-fd-tests.c b/extras/test/open-fd-tests.c index ab902697228..509952b4180 100644 --- a/extras/test/open-fd-tests.c +++ b/extras/test/open-fd-tests.c @@ -9,56 +9,59 @@  #include <string.h>  int -main (int argc, char *argv[]) +main(int argc, char *argv[])  { -        int          ret      = -1; -        int          fd       = 0; -        char        *filename = NULL; -        int          loop     = 0; -        struct stat  stbuf    = {0,}; -        char         string[1024] = {0,}; +    int ret = -1; +    int fd = 0; +    char *filename = NULL; +    int loop = 0; +    struct stat stbuf = { +        0, +    }; +    char string[1024] = { +        0, +    }; -        if (argc > 1) -                filename = argv[1]; +    if (argc > 1) +        filename = argv[1]; -        if (!filename) -                filename = "temp-fd-test-file"; +    if (!filename) +        filename = "temp-fd-test-file"; -        fd = open (filename, O_RDWR|O_CREAT|O_TRUNC); -        if (fd < 0) { -                fd = 0; -                fprintf (stderr, "open failed : %s\n", strerror (errno)); -                goto out; -        } - -        while (loop < 1000) { -                /* Use it as a mechanism to test time delays */ -                memset (string, 0, 1024); -                scanf ("%s", string); +    fd = open(filename, O_RDWR | O_CREAT | O_TRUNC); +    if (fd < 0) { +        fd = 0; +        fprintf(stderr, "open failed : %s\n", strerror(errno)); +        goto out; +    } -                ret = write (fd, string, strlen (string)); -                if (ret != strlen (string)) { -                        fprintf (stderr, "write failed : %s (%s %d)\n", -                                 strerror (errno), string, loop); -                        goto out; -                } +    while (loop < 1000) { +        /* Use it as a mechanism to test time delays */ +        memset(string, 0, 1024); +        scanf("%s", string); -                ret = write (fd, "\n", 1); -                if (ret != 1) { -                        fprintf (stderr, "write failed : %s (%d)\n", -                                 strerror (errno), loop); -                        goto out; -                } +        ret = write(fd, string, strlen(string)); +        if (ret != strlen(string)) { +            fprintf(stderr, "write failed : %s (%s %d)\n", strerror(errno), +                    string, loop); +            goto out; +        } -                loop++; +        ret = write(fd, "\n", 1); +        if (ret != 1) { +            fprintf(stderr, "write failed : %s (%d)\n", strerror(errno), loop); +            goto out;          } -        fprintf (stdout, "finishing the test after %d loops\n", loop); +        loop++; +    } + +    fprintf(stdout, "finishing the test after %d loops\n", loop); -        ret = 0; +    ret = 0;  out: -        if (fd) -                close (fd); +    if (fd) +        close(fd); -        return ret; +    return ret;  } diff --git a/extras/test/test-ffop.c b/extras/test/test-ffop.c index 67c6a0fb33d..1d9c125db67 100644 --- a/extras/test/test-ffop.c +++ b/extras/test/test-ffop.c @@ -8,772 +8,820 @@  #include <string.h>  #include <dirent.h> -int fd_based_fops_1 (char *filename); //for fd based fops after unlink -int fd_based_fops_2 (char *filename); //for fd based fops before unlink -int dup_fd_based_fops (char *filename); // fops based on fd after dup -int path_based_fops (char *filename); //for fops based on path -int dir_based_fops (char *filename); // for fops which operate on directory -int link_based_fops (char *filename); //for fops which operate in link files (symlinks) -int test_open_modes (char *filename); // to test open syscall with open modes available. -int generic_open_read_write (char *filename, int flag); // generic function which does open write and read. +int +fd_based_fops_1(char *filename);  // for fd based fops after unlink +int +fd_based_fops_2(char *filename);  // for fd based fops before unlink +int +dup_fd_based_fops(char *filename);  // fops based on fd after dup +int +path_based_fops(char *filename);  // for fops based on path +int +dir_based_fops(char *filename);  // for fops which operate on directory +int +link_based_fops( +    char *filename);  // for fops which operate in link files (symlinks) +int +test_open_modes( +    char *filename);  // to test open syscall with open modes available. +int +generic_open_read_write( +    char *filename, +    int flag);  // generic function which does open write and read.  int -main (int argc, char *argv[]) +main(int argc, char *argv[])  { -        int   ret           = -1; -        char  filename[255] = {0,}; - -        if (argc > 1) -                strcpy(filename, argv[1]); -        else -                strcpy(filename, "temp-xattr-test-file"); - -        ret = fd_based_fops_1 (strcat(filename, "_1")); -        if (ret < 0) -                fprintf (stderr, "fd based file operation 1 failed\n"); -        else -                fprintf (stdout, "fd based file operation 1 passed\n"); - -        ret = fd_based_fops_2 (strcat(filename, "_2")); -        if (ret < 0) -                fprintf (stderr, "fd based file operation 2 failed\n"); -        else -                fprintf (stdout, "fd based file operation 2 passed\n"); - -        ret = dup_fd_based_fops (strcat (filename, "_3")); -        if (ret < 0) -                fprintf (stderr, "dup fd based file operation failed\n"); -        else -                fprintf (stdout, "dup fd based file operation passed\n"); - -        ret = path_based_fops (strcat (filename, "_4")); -        if (ret < 0) -                fprintf (stderr, "path based file operation failed\n"); -        else -                fprintf (stdout, "path based file operation passed\n"); - -        ret = dir_based_fops (strcat (filename, "_5")); -        if (ret < 0) -                fprintf (stderr, "directory based file operation failed\n"); -        else -                fprintf (stdout, "directory based file operation passed\n"); - -        ret = link_based_fops (strcat (filename, "_5")); -        if (ret < 0) -                fprintf (stderr, "link based file operation failed\n"); -        else -                fprintf (stdout, "link based file operation passed\n"); - -        ret = test_open_modes (strcat (filename, "_5")); -        if (ret < 0) -                fprintf (stderr, "testing modes of 'open' call failed\n"); -        else -                fprintf (stdout, "testing modes of 'open' call passed\n"); +    int ret = -1; +    char filename[255] = { +        0, +    }; + +    if (argc > 1) +        strcpy(filename, argv[1]); +    else +        strcpy(filename, "temp-xattr-test-file"); + +    ret = fd_based_fops_1(strcat(filename, "_1")); +    if (ret < 0) +        fprintf(stderr, "fd based file operation 1 failed\n"); +    else +        fprintf(stdout, "fd based file operation 1 passed\n"); + +    ret = fd_based_fops_2(strcat(filename, "_2")); +    if (ret < 0) +        fprintf(stderr, "fd based file operation 2 failed\n"); +    else +        fprintf(stdout, "fd based file operation 2 passed\n"); + +    ret = dup_fd_based_fops(strcat(filename, "_3")); +    if (ret < 0) +        fprintf(stderr, "dup fd based file operation failed\n"); +    else +        fprintf(stdout, "dup fd based file operation passed\n"); + +    ret = path_based_fops(strcat(filename, "_4")); +    if (ret < 0) +        fprintf(stderr, "path based file operation failed\n"); +    else +        fprintf(stdout, "path based file operation passed\n"); + +    ret = dir_based_fops(strcat(filename, "_5")); +    if (ret < 0) +        fprintf(stderr, "directory based file operation failed\n"); +    else +        fprintf(stdout, "directory based file operation passed\n"); + +    ret = link_based_fops(strcat(filename, "_5")); +    if (ret < 0) +        fprintf(stderr, "link based file operation failed\n"); +    else +        fprintf(stdout, "link based file operation passed\n"); + +    ret = test_open_modes(strcat(filename, "_5")); +    if (ret < 0) +        fprintf(stderr, "testing modes of 'open' call failed\n"); +    else +        fprintf(stdout, "testing modes of 'open' call passed\n");  out: -        return ret; +    return ret;  }  int -fd_based_fops_1 (char *filename) +fd_based_fops_1(char *filename)  { -        int         fd        = 0; -        int         ret       = -1; -        struct stat stbuf     = {0,}; -        char        wstr[50]  = {0,}; -        char        rstr[50]  = {0,}; - -        fd = open (filename, O_RDWR|O_CREAT); -        if (fd < 0) { -                fd = 0; -                fprintf (stderr, "open failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = unlink (filename); -        if (ret < 0) { -                fprintf (stderr, "unlink failed : %s\n", strerror (errno)); -                goto out; -        } - -        strcpy (wstr, "This is my string\n"); -        ret = write (fd, wstr, strlen(wstr)); -        if (ret <= 0) { -                ret = -1; -                fprintf (stderr, "write failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = lseek (fd, 0, SEEK_SET); -        if (ret < 0) { -                fprintf (stderr, "lseek failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = read (fd, rstr, strlen(wstr)); -        if (ret <= 0) { -                ret = -1; -                fprintf (stderr, "read failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = memcmp (rstr, wstr, strlen (wstr)); -        if (ret != 0) { -                ret = -1; -                fprintf (stderr, "read returning junk\n"); -                goto out; -        } - -        ret = ftruncate (fd, 0); -        if (ret < 0) { -                fprintf (stderr, "ftruncate failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fstat (fd, &stbuf); -        if (ret < 0) { -                fprintf (stderr, "fstat failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fchmod (fd, 0640); -        if (ret < 0) { -                fprintf (stderr, "fchmod failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fchown (fd, 10001, 10001); -        if (ret < 0) { -                fprintf (stderr, "fchown failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fsync (fd); -        if (ret < 0) { -                fprintf (stderr, "fsync failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fsetxattr (fd, "trusted.xattr-test", "working", 8, 0); -        if (ret < 0) { -                fprintf (stderr, "fsetxattr failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fdatasync (fd); -        if (ret < 0) { -                fprintf (stderr, "fdatasync failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = flistxattr (fd, NULL, 0); -        if (ret <= 0) { -                ret = -1; -                fprintf (stderr, "flistxattr failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fgetxattr (fd, "trusted.xattr-test", NULL, 0); -        if (ret <= 0) { -                ret = -1; -                fprintf (stderr, "fgetxattr failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fremovexattr (fd, "trusted.xattr-test"); -        if (ret < 0) { -                fprintf (stderr, "fremovexattr failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = 0; +    int fd = 0; +    int ret = -1; +    struct stat stbuf = { +        0, +    }; +    char wstr[50] = { +        0, +    }; +    char rstr[50] = { +        0, +    }; + +    fd = open(filename, O_RDWR | O_CREAT); +    if (fd < 0) { +        fd = 0; +        fprintf(stderr, "open failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = unlink(filename); +    if (ret < 0) { +        fprintf(stderr, "unlink failed : %s\n", strerror(errno)); +        goto out; +    } + +    strcpy(wstr, "This is my string\n"); +    ret = write(fd, wstr, strlen(wstr)); +    if (ret <= 0) { +        ret = -1; +        fprintf(stderr, "write failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = lseek(fd, 0, SEEK_SET); +    if (ret < 0) { +        fprintf(stderr, "lseek failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = read(fd, rstr, strlen(wstr)); +    if (ret <= 0) { +        ret = -1; +        fprintf(stderr, "read failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = memcmp(rstr, wstr, strlen(wstr)); +    if (ret != 0) { +        ret = -1; +        fprintf(stderr, "read returning junk\n"); +        goto out; +    } + +    ret = ftruncate(fd, 0); +    if (ret < 0) { +        fprintf(stderr, "ftruncate failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fstat(fd, &stbuf); +    if (ret < 0) { +        fprintf(stderr, "fstat failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fchmod(fd, 0640); +    if (ret < 0) { +        fprintf(stderr, "fchmod failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fchown(fd, 10001, 10001); +    if (ret < 0) { +        fprintf(stderr, "fchown failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fsync(fd); +    if (ret < 0) { +        fprintf(stderr, "fsync failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fsetxattr(fd, "trusted.xattr-test", "working", 8, 0); +    if (ret < 0) { +        fprintf(stderr, "fsetxattr failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fdatasync(fd); +    if (ret < 0) { +        fprintf(stderr, "fdatasync failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = flistxattr(fd, NULL, 0); +    if (ret <= 0) { +        ret = -1; +        fprintf(stderr, "flistxattr failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fgetxattr(fd, "trusted.xattr-test", NULL, 0); +    if (ret <= 0) { +        ret = -1; +        fprintf(stderr, "fgetxattr failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fremovexattr(fd, "trusted.xattr-test"); +    if (ret < 0) { +        fprintf(stderr, "fremovexattr failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = 0;  out: -        if (fd) -                close (fd); +    if (fd) +        close(fd); -        return ret; +    return ret;  } -  int -fd_based_fops_2 (char *filename) +fd_based_fops_2(char *filename)  { -        int         fd    = 0; -        int         ret   = -1; -        struct stat stbuf = {0,}; -        char        wstr[50]  = {0,}; -        char        rstr[50]  = {0,}; - -        fd = open (filename, O_RDWR|O_CREAT); -        if (fd < 0) { -                fd = 0; -                fprintf (stderr, "open failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = ftruncate (fd, 0); - -        if (ret < 0) { -                fprintf (stderr, "ftruncate failed : %s\n", strerror (errno)); -                goto out; -        } - -        strcpy (wstr, "This is my second string\n"); -        ret = write (fd, wstr, strlen (wstr)); -        if (ret < 0) { -                ret = -1; -                fprintf (stderr, "write failed: %s\n", strerror (errno)); -                goto out; -        } - -        lseek (fd, 0, SEEK_SET); -        if (ret < 0) { -                fprintf (stderr, "lseek failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = read (fd, rstr, strlen (wstr)); -        if (ret <= 0) { -                ret = -1; -                fprintf (stderr, "read failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = memcmp (rstr, wstr, strlen (wstr)); -        if (ret != 0) { -                ret = -1; -                fprintf (stderr, "read returning junk\n"); -                goto out; -        } - -        ret = fstat (fd, &stbuf); -        if (ret < 0) { -                fprintf (stderr, "fstat failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fchmod (fd, 0640); -        if (ret < 0) { -                fprintf (stderr, "fchmod failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fchown (fd, 10001, 10001); -        if (ret < 0) { -                fprintf (stderr, "fchown failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fsync (fd); -        if (ret < 0) { -                fprintf (stderr, "fsync failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fsetxattr (fd, "trusted.xattr-test", "working", 8, 0); -        if (ret < 0) { -                fprintf (stderr, "fsetxattr failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fdatasync (fd); -        if (ret < 0) { -                fprintf (stderr, "fdatasync failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = flistxattr (fd, NULL, 0); -        if (ret <= 0) { -                ret = -1; -                fprintf (stderr, "flistxattr failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fgetxattr (fd, "trusted.xattr-test", NULL, 0); -        if (ret <= 0) { -                ret = -1; -                fprintf (stderr, "fgetxattr failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fremovexattr (fd, "trusted.xattr-test"); -        if (ret < 0) { -                fprintf (stderr, "fremovexattr failed : %s\n", strerror (errno)); -                goto out; -        } +    int fd = 0; +    int ret = -1; +    struct stat stbuf = { +        0, +    }; +    char wstr[50] = { +        0, +    }; +    char rstr[50] = { +        0, +    }; + +    fd = open(filename, O_RDWR | O_CREAT); +    if (fd < 0) { +        fd = 0; +        fprintf(stderr, "open failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = ftruncate(fd, 0); + +    if (ret < 0) { +        fprintf(stderr, "ftruncate failed : %s\n", strerror(errno)); +        goto out; +    } + +    strcpy(wstr, "This is my second string\n"); +    ret = write(fd, wstr, strlen(wstr)); +    if (ret < 0) { +        ret = -1; +        fprintf(stderr, "write failed: %s\n", strerror(errno)); +        goto out; +    } + +    lseek(fd, 0, SEEK_SET); +    if (ret < 0) { +        fprintf(stderr, "lseek failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = read(fd, rstr, strlen(wstr)); +    if (ret <= 0) { +        ret = -1; +        fprintf(stderr, "read failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = memcmp(rstr, wstr, strlen(wstr)); +    if (ret != 0) { +        ret = -1; +        fprintf(stderr, "read returning junk\n"); +        goto out; +    } + +    ret = fstat(fd, &stbuf); +    if (ret < 0) { +        fprintf(stderr, "fstat failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fchmod(fd, 0640); +    if (ret < 0) { +        fprintf(stderr, "fchmod failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fchown(fd, 10001, 10001); +    if (ret < 0) { +        fprintf(stderr, "fchown failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fsync(fd); +    if (ret < 0) { +        fprintf(stderr, "fsync failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fsetxattr(fd, "trusted.xattr-test", "working", 8, 0); +    if (ret < 0) { +        fprintf(stderr, "fsetxattr failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fdatasync(fd); +    if (ret < 0) { +        fprintf(stderr, "fdatasync failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = flistxattr(fd, NULL, 0); +    if (ret <= 0) { +        ret = -1; +        fprintf(stderr, "flistxattr failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fgetxattr(fd, "trusted.xattr-test", NULL, 0); +    if (ret <= 0) { +        ret = -1; +        fprintf(stderr, "fgetxattr failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fremovexattr(fd, "trusted.xattr-test"); +    if (ret < 0) { +        fprintf(stderr, "fremovexattr failed : %s\n", strerror(errno)); +        goto out; +    }  out: -        if (fd) -                close (fd); -        unlink (filename); +    if (fd) +        close(fd); +    unlink(filename); -        return ret; +    return ret;  }  int -path_based_fops (char *filename) +path_based_fops(char *filename)  { -        int         ret              = -1; -        int         fd               = 0; -        struct stat stbuf            = {0,}; -        char        newfilename[255] = {0,}; - -        fd = creat (filename, 0644); -        if (fd < 0) { -                fprintf (stderr, "creat failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = truncate (filename, 0); -        if (ret < 0) { -                fprintf (stderr, "truncate failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = stat (filename, &stbuf); -        if (ret < 0) { -                fprintf (stderr, "stat failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = chmod (filename, 0640); -        if (ret < 0) { -                fprintf (stderr, "chmod failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = chown (filename, 10001, 10001); -        if (ret < 0) { -                fprintf (stderr, "chown failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = setxattr (filename, "trusted.xattr-test", "working", 8, 0); -        if (ret < 0) { -                fprintf (stderr, "setxattr failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = listxattr (filename, NULL, 0); -        if (ret <= 0) { -                ret = -1; -                fprintf (stderr, "listxattr failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = getxattr (filename, "trusted.xattr-test", NULL, 0); -        if (ret <= 0) { -                ret = -1; -                fprintf (stderr, "getxattr failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = removexattr (filename, "trusted.xattr-test"); -        if (ret < 0) { -                fprintf (stderr, "removexattr failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = access (filename, R_OK|W_OK); -        if (ret < 0) { -                fprintf (stderr, "access failed: %s\n", strerror (errno)); -                goto out; -        } - -        strcpy (newfilename, filename); -        strcat(newfilename, "_new"); -        ret = rename (filename, newfilename); -        if (ret < 0) { -                fprintf (stderr, "rename failed: %s\n", strerror (errno)); -                goto out; -        } -        unlink (newfilename); +    int ret = -1; +    int fd = 0; +    struct stat stbuf = { +        0, +    }; +    char newfilename[255] = { +        0, +    }; + +    fd = creat(filename, 0644); +    if (fd < 0) { +        fprintf(stderr, "creat failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = truncate(filename, 0); +    if (ret < 0) { +        fprintf(stderr, "truncate failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = stat(filename, &stbuf); +    if (ret < 0) { +        fprintf(stderr, "stat failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = chmod(filename, 0640); +    if (ret < 0) { +        fprintf(stderr, "chmod failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = chown(filename, 10001, 10001); +    if (ret < 0) { +        fprintf(stderr, "chown failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = setxattr(filename, "trusted.xattr-test", "working", 8, 0); +    if (ret < 0) { +        fprintf(stderr, "setxattr failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = listxattr(filename, NULL, 0); +    if (ret <= 0) { +        ret = -1; +        fprintf(stderr, "listxattr failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = getxattr(filename, "trusted.xattr-test", NULL, 0); +    if (ret <= 0) { +        ret = -1; +        fprintf(stderr, "getxattr failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = removexattr(filename, "trusted.xattr-test"); +    if (ret < 0) { +        fprintf(stderr, "removexattr failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = access(filename, R_OK | W_OK); +    if (ret < 0) { +        fprintf(stderr, "access failed: %s\n", strerror(errno)); +        goto out; +    } + +    strcpy(newfilename, filename); +    strcat(newfilename, "_new"); +    ret = rename(filename, newfilename); +    if (ret < 0) { +        fprintf(stderr, "rename failed: %s\n", strerror(errno)); +        goto out; +    } +    unlink(newfilename);  out: -        if (fd) -                close (fd); +    if (fd) +        close(fd); -        unlink (filename); -        return ret; +    unlink(filename); +    return ret;  }  int -dup_fd_based_fops (char *filename) +dup_fd_based_fops(char *filename)  { -        int         fd        = 0; -        int         newfd     = 0; -        int         ret       = -1; -        struct stat stbuf     = {0,}; -        char        wstr[50]  = {0,}; -        char        rstr[50]  = {0,}; - -        fd = open (filename, O_RDWR|O_CREAT); -        if (fd < 0) { -                fd = 0; -                fprintf (stderr, "open failed : %s\n", strerror (errno)); -                goto out; -        } - -        newfd = dup (fd); -        if (newfd < 0) { -                ret = -1; -                fprintf (stderr, "dup failed: %s\n", strerror (errno)); -                goto out; -        } - -        close (fd); - -        strcpy (wstr, "This is my string\n"); -        ret = write (newfd, wstr, strlen(wstr)); -        if (ret <= 0) { -                ret = -1; -                fprintf (stderr, "write failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = lseek (newfd, 0, SEEK_SET); -        if (ret < 0) { -                fprintf (stderr, "lseek failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = read (newfd, rstr, strlen(wstr)); -        if (ret <= 0) { -                ret = -1; -                fprintf (stderr, "read failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = memcmp (rstr, wstr, strlen (wstr)); -        if (ret != 0) { -                ret = -1; -                fprintf (stderr, "read returning junk\n"); -                goto out; -        } - -        ret = ftruncate (newfd, 0); -        if (ret < 0) { -                fprintf (stderr, "ftruncate failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fstat (newfd, &stbuf); -        if (ret < 0) { -                fprintf (stderr, "fstat failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fchmod (newfd, 0640); -        if (ret < 0) { -                fprintf (stderr, "fchmod failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fchown (newfd, 10001, 10001); -        if (ret < 0) { -                fprintf (stderr, "fchown failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fsync (newfd); -        if (ret < 0) { -                fprintf (stderr, "fsync failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fsetxattr (newfd, "trusted.xattr-test", "working", 8, 0); -        if (ret < 0) { -                fprintf (stderr, "fsetxattr failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fdatasync (newfd); -        if (ret < 0) { -                fprintf (stderr, "fdatasync failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = flistxattr (newfd, NULL, 0); -        if (ret <= 0) { -                ret = -1; -                fprintf (stderr, "flistxattr failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fgetxattr (newfd, "trusted.xattr-test", NULL, 0); -        if (ret <= 0) { -                ret = -1; -                fprintf (stderr, "fgetxattr failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = fremovexattr (newfd, "trusted.xattr-test"); -        if (ret < 0) { -                fprintf (stderr, "fremovexattr failed : %s\n", strerror (errno)); -                goto out; -        } - -        ret = 0; +    int fd = 0; +    int newfd = 0; +    int ret = -1; +    struct stat stbuf = { +        0, +    }; +    char wstr[50] = { +        0, +    }; +    char rstr[50] = { +        0, +    }; + +    fd = open(filename, O_RDWR | O_CREAT); +    if (fd < 0) { +        fd = 0; +        fprintf(stderr, "open failed : %s\n", strerror(errno)); +        goto out; +    } + +    newfd = dup(fd); +    if (newfd < 0) { +        ret = -1; +        fprintf(stderr, "dup failed: %s\n", strerror(errno)); +        goto out; +    } + +    close(fd); + +    strcpy(wstr, "This is my string\n"); +    ret = write(newfd, wstr, strlen(wstr)); +    if (ret <= 0) { +        ret = -1; +        fprintf(stderr, "write failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = lseek(newfd, 0, SEEK_SET); +    if (ret < 0) { +        fprintf(stderr, "lseek failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = read(newfd, rstr, strlen(wstr)); +    if (ret <= 0) { +        ret = -1; +        fprintf(stderr, "read failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = memcmp(rstr, wstr, strlen(wstr)); +    if (ret != 0) { +        ret = -1; +        fprintf(stderr, "read returning junk\n"); +        goto out; +    } + +    ret = ftruncate(newfd, 0); +    if (ret < 0) { +        fprintf(stderr, "ftruncate failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fstat(newfd, &stbuf); +    if (ret < 0) { +        fprintf(stderr, "fstat failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fchmod(newfd, 0640); +    if (ret < 0) { +        fprintf(stderr, "fchmod failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fchown(newfd, 10001, 10001); +    if (ret < 0) { +        fprintf(stderr, "fchown failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fsync(newfd); +    if (ret < 0) { +        fprintf(stderr, "fsync failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fsetxattr(newfd, "trusted.xattr-test", "working", 8, 0); +    if (ret < 0) { +        fprintf(stderr, "fsetxattr failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fdatasync(newfd); +    if (ret < 0) { +        fprintf(stderr, "fdatasync failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = flistxattr(newfd, NULL, 0); +    if (ret <= 0) { +        ret = -1; +        fprintf(stderr, "flistxattr failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fgetxattr(newfd, "trusted.xattr-test", NULL, 0); +    if (ret <= 0) { +        ret = -1; +        fprintf(stderr, "fgetxattr failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = fremovexattr(newfd, "trusted.xattr-test"); +    if (ret < 0) { +        fprintf(stderr, "fremovexattr failed : %s\n", strerror(errno)); +        goto out; +    } + +    ret = 0;  out: -        if (newfd) -                close (newfd); -        ret = unlink (filename); -        if (ret < 0) -                fprintf (stderr, "unlink failed : %s\n", strerror (errno)); +    if (newfd) +        close(newfd); +    ret = unlink(filename); +    if (ret < 0) +        fprintf(stderr, "unlink failed : %s\n", strerror(errno)); -        return ret; +    return ret;  }  int -dir_based_fops (char *dirname) +dir_based_fops(char *dirname)  { -        int            ret           = -1; -        DIR           *dp            = NULL; -        char           buff[255]     = {0,}; -        struct dirent *dbuff         = {0,}; -        struct stat    stbuff        = {0,}; -        char           newdname[255] = {0,}; -        char          *cwd           = NULL; - -        ret = mkdir (dirname, 0755); -        if (ret < 0) { -                fprintf (stderr, "mkdir failed: %s\n", strerror (errno)); -                goto out; -        } - -        dp = opendir (dirname); -        if (dp == NULL) { -                fprintf (stderr, "opendir failed: %s\n", strerror (errno)); -                goto out; -        } - -        dbuff = readdir (dp); -        if (NULL == dbuff) { -                fprintf (stderr, "readdir failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = closedir (dp); -        if (ret < 0) { -                fprintf (stderr, "closedir failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = stat (dirname, &stbuff); -        if (ret < 0) { -                fprintf (stderr, "stat failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = chmod (dirname, 0744); -        if (ret < 0) { -                fprintf (stderr, "chmod failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = chown (dirname, 10001, 10001); -        if (ret < 0) { -                fprintf (stderr, "chmod failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = setxattr (dirname, "trusted.xattr-test", "working", 8, 0); -        if (ret < 0) { -                fprintf (stderr, "setxattr failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = listxattr (dirname, NULL, 0); -        if (ret <= 0) { -                ret = -1; -                fprintf (stderr, "listxattr failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = getxattr (dirname, "trusted.xattr-test", NULL, 0); -        if (ret <= 0) { -                ret = -1; -                fprintf (stderr, "getxattr failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = removexattr (dirname, "trusted.xattr-test"); -        if (ret < 0) { -                fprintf (stderr, "removexattr failed: %s\n", strerror (errno)); -                goto out; -        } - -        strcpy (newdname, dirname); -        strcat (newdname, "/../"); -        ret = chdir (newdname); -        if (ret < 0) { -                fprintf (stderr, "chdir failed: %s\n", strerror (errno)); -                goto out; -        } - -        cwd = getcwd (buff, 255); -        if (NULL == cwd) { -                fprintf (stderr, "getcwd failed: %s\n", strerror (errno)); -                goto out; -        } - -        strcpy (newdname, dirname); -        strcat (newdname, "new"); -        ret = rename (dirname, newdname); -        if (ret < 0) { -                fprintf (stderr, "rename failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = rmdir (newdname); -        if (ret < 0) { -                fprintf (stderr, "rmdir failed: %s\n", strerror (errno)); -                return ret; -        } +    int ret = -1; +    DIR *dp = NULL; +    char buff[255] = { +        0, +    }; +    struct dirent *dbuff = { +        0, +    }; +    struct stat stbuff = { +        0, +    }; +    char newdname[255] = { +        0, +    }; +    char *cwd = NULL; + +    ret = mkdir(dirname, 0755); +    if (ret < 0) { +        fprintf(stderr, "mkdir failed: %s\n", strerror(errno)); +        goto out; +    } + +    dp = opendir(dirname); +    if (dp == NULL) { +        fprintf(stderr, "opendir failed: %s\n", strerror(errno)); +        goto out; +    } + +    dbuff = readdir(dp); +    if (NULL == dbuff) { +        fprintf(stderr, "readdir failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = closedir(dp); +    if (ret < 0) { +        fprintf(stderr, "closedir failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = stat(dirname, &stbuff); +    if (ret < 0) { +        fprintf(stderr, "stat failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = chmod(dirname, 0744); +    if (ret < 0) { +        fprintf(stderr, "chmod failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = chown(dirname, 10001, 10001); +    if (ret < 0) { +        fprintf(stderr, "chmod failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = setxattr(dirname, "trusted.xattr-test", "working", 8, 0); +    if (ret < 0) { +        fprintf(stderr, "setxattr failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = listxattr(dirname, NULL, 0); +    if (ret <= 0) { +        ret = -1; +        fprintf(stderr, "listxattr failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = getxattr(dirname, "trusted.xattr-test", NULL, 0); +    if (ret <= 0) { +        ret = -1; +        fprintf(stderr, "getxattr failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = removexattr(dirname, "trusted.xattr-test"); +    if (ret < 0) { +        fprintf(stderr, "removexattr failed: %s\n", strerror(errno)); +        goto out; +    } + +    strcpy(newdname, dirname); +    strcat(newdname, "/../"); +    ret = chdir(newdname); +    if (ret < 0) { +        fprintf(stderr, "chdir failed: %s\n", strerror(errno)); +        goto out; +    } + +    cwd = getcwd(buff, 255); +    if (NULL == cwd) { +        fprintf(stderr, "getcwd failed: %s\n", strerror(errno)); +        goto out; +    } + +    strcpy(newdname, dirname); +    strcat(newdname, "new"); +    ret = rename(dirname, newdname); +    if (ret < 0) { +        fprintf(stderr, "rename failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = rmdir(newdname); +    if (ret < 0) { +        fprintf(stderr, "rmdir failed: %s\n", strerror(errno)); +        return ret; +    }  out: -        rmdir (dirname); -        return ret; +    rmdir(dirname); +    return ret;  }  int -link_based_fops (char *filename) +link_based_fops(char *filename)  { -        int         ret           = -1; -        int         fd            = 0; -        char        newname[255]  = {0,}; -        char        linkname[255] = {0,}; -        struct stat lstbuf        = {0,}; - -        fd = creat (filename, 0644); -        if (fd < 0) { -                fd = 0; -                fprintf (stderr, "creat failed: %s\n", strerror (errno)); -                goto out; -        } - -        strcpy (newname, filename); -        strcat (newname, "_hlink"); -        ret = link (filename, newname); -        if (ret < 0) { -                fprintf (stderr, "link failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = unlink (filename); -        if (ret < 0) { -                fprintf (stderr, "unlink failed: %s\n", strerror (errno)); -                goto out; -        } - -        strcpy (linkname, filename); -        strcat (linkname, "_slink"); -        ret = symlink (newname, linkname); -        if (ret < 0) { -                fprintf (stderr, "symlink failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = lstat (linkname, &lstbuf); -        if (ret < 0) { -                fprintf (stderr, "lstbuf failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = lchown (linkname, 10001, 10001); -        if (ret < 0) { -                fprintf (stderr, "lchown failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = lsetxattr (linkname, "trusted.lxattr-test", "working", 8, 0); -        if (ret < 0) { -                fprintf (stderr, "lsetxattr failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = llistxattr (linkname, NULL, 0); -        if (ret < 0) { -                ret = -1; -                fprintf (stderr, "llistxattr failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = lgetxattr (linkname, "trusted.lxattr-test", NULL, 0); -        if (ret < 0) { -                ret = -1; -                fprintf (stderr, "lgetxattr failed: %s\n", strerror (errno)); -                goto out; -        } - -        ret = lremovexattr (linkname, "trusted.lxattr-test"); -        if (ret < 0) { -                fprintf (stderr, "lremovexattr failed: %s\n", strerror (errno)); -                goto out; -        } - +    int ret = -1; +    int fd = 0; +    char newname[255] = { +        0, +    }; +    char linkname[255] = { +        0, +    }; +    struct stat lstbuf = { +        0, +    }; + +    fd = creat(filename, 0644); +    if (fd < 0) { +        fd = 0; +        fprintf(stderr, "creat failed: %s\n", strerror(errno)); +        goto out; +    } + +    strcpy(newname, filename); +    strcat(newname, "_hlink"); +    ret = link(filename, newname); +    if (ret < 0) { +        fprintf(stderr, "link failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = unlink(filename); +    if (ret < 0) { +        fprintf(stderr, "unlink failed: %s\n", strerror(errno)); +        goto out; +    } + +    strcpy(linkname, filename); +    strcat(linkname, "_slink"); +    ret = symlink(newname, linkname); +    if (ret < 0) { +        fprintf(stderr, "symlink failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = lstat(linkname, &lstbuf); +    if (ret < 0) { +        fprintf(stderr, "lstbuf failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = lchown(linkname, 10001, 10001); +    if (ret < 0) { +        fprintf(stderr, "lchown failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = lsetxattr(linkname, "trusted.lxattr-test", "working", 8, 0); +    if (ret < 0) { +        fprintf(stderr, "lsetxattr failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = llistxattr(linkname, NULL, 0); +    if (ret < 0) { +        ret = -1; +        fprintf(stderr, "llistxattr failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = lgetxattr(linkname, "trusted.lxattr-test", NULL, 0); +    if (ret < 0) { +        ret = -1; +        fprintf(stderr, "lgetxattr failed: %s\n", strerror(errno)); +        goto out; +    } + +    ret = lremovexattr(linkname, "trusted.lxattr-test"); +    if (ret < 0) { +        fprintf(stderr, "lremovexattr failed: %s\n", strerror(errno)); +        goto out; +    }  out: -        if (fd) -                close(fd); -        unlink (linkname); -        unlink (newname); +    if (fd) +        close(fd); +    unlink(linkname); +    unlink(newname);  }  int -test_open_modes (char *filename) +test_open_modes(char *filename)  { -        int ret = -1; - -        ret = generic_open_read_write (filename, O_CREAT|O_WRONLY); -        if (3 != ret) { -               fprintf (stderr, "flag O_CREAT|O_WRONLY failed: \n"); -               goto out; -        } - -        ret = generic_open_read_write (filename, O_CREAT|O_RDWR); -        if (ret != 0) { -               fprintf (stderr, "flag O_CREAT|O_RDWR failed\n"); -               goto out; -        } - -        ret = generic_open_read_write (filename, O_CREAT|O_RDONLY); -        if (ret != 0) { -                fprintf (stderr, "flag O_CREAT|O_RDONLY failed\n"); -                goto out; -        } - -        ret = creat (filename, 0644); -        close (ret); -        ret = generic_open_read_write (filename, O_WRONLY); -        if (3 != ret) { -               fprintf (stderr, "flag O_WRONLY failed\n"); -               goto out; -        } - -        ret = creat (filename, 0644); -        close (ret); -        ret = generic_open_read_write (filename, O_RDWR); -        if (0 != ret) { -               fprintf (stderr, "flag O_RDWR failed\n"); -               goto out; -        } - -        ret = creat (filename, 0644); -        close (ret); -        ret = generic_open_read_write (filename, O_RDONLY); -        if (0 != ret) { -               fprintf (stderr, "flag O_RDONLY failed\n"); -               goto out; -        } - -        ret = creat (filename, 0644); -        close (ret); -        ret = generic_open_read_write (filename, O_TRUNC|O_WRONLY); -        if (3 != ret) { -               fprintf (stderr, "flag O_TRUNC|O_WRONLY failed\n"); -               goto out; -        } +    int ret = -1; + +    ret = generic_open_read_write(filename, O_CREAT | O_WRONLY); +    if (3 != ret) { +        fprintf(stderr, "flag O_CREAT|O_WRONLY failed: \n"); +        goto out; +    } + +    ret = generic_open_read_write(filename, O_CREAT | O_RDWR); +    if (ret != 0) { +        fprintf(stderr, "flag O_CREAT|O_RDWR failed\n"); +        goto out; +    } + +    ret = generic_open_read_write(filename, O_CREAT | O_RDONLY); +    if (ret != 0) { +        fprintf(stderr, "flag O_CREAT|O_RDONLY failed\n"); +        goto out; +    } + +    ret = creat(filename, 0644); +    close(ret); +    ret = generic_open_read_write(filename, O_WRONLY); +    if (3 != ret) { +        fprintf(stderr, "flag O_WRONLY failed\n"); +        goto out; +    } + +    ret = creat(filename, 0644); +    close(ret); +    ret = generic_open_read_write(filename, O_RDWR); +    if (0 != ret) { +        fprintf(stderr, "flag O_RDWR failed\n"); +        goto out; +    } + +    ret = creat(filename, 0644); +    close(ret); +    ret = generic_open_read_write(filename, O_RDONLY); +    if (0 != ret) { +        fprintf(stderr, "flag O_RDONLY failed\n"); +        goto out; +    } + +    ret = creat(filename, 0644); +    close(ret); +    ret = generic_open_read_write(filename, O_TRUNC | O_WRONLY); +    if (3 != ret) { +        fprintf(stderr, "flag O_TRUNC|O_WRONLY failed\n"); +        goto out; +    }  #if 0 /* undefined behaviour, unable to reliably test */          ret = creat (filename, 0644); @@ -785,84 +833,88 @@ test_open_modes (char *filename)          }  #endif -        ret = generic_open_read_write (filename, O_CREAT|O_RDWR|O_SYNC); -        if (0 != ret) { -               fprintf (stderr, "flag O_CREAT|O_RDWR|O_SYNC failed\n"); -               goto out; -        } +    ret = generic_open_read_write(filename, O_CREAT | O_RDWR | O_SYNC); +    if (0 != ret) { +        fprintf(stderr, "flag O_CREAT|O_RDWR|O_SYNC failed\n"); +        goto out; +    } -        ret = creat (filename, 0644); -        close (ret); -        ret = generic_open_read_write (filename, O_CREAT|O_EXCL); -        if (0 != ret) { -                fprintf (stderr, "flag O_CREAT|O_EXCL failed\n"); -                goto out; -        } +    ret = creat(filename, 0644); +    close(ret); +    ret = generic_open_read_write(filename, O_CREAT | O_EXCL); +    if (0 != ret) { +        fprintf(stderr, "flag O_CREAT|O_EXCL failed\n"); +        goto out; +    }  out: -        return ret; +    return ret;  } -int generic_open_read_write (char *filename, int flag) +int +generic_open_read_write(char *filename, int flag)  { -        int  fd          = 0; -        int  ret         = -1; -        char wstring[50] = {0,}; -        char rstring[50] = {0,}; - -        fd = open (filename, flag); -        if (fd < 0) { -                if (flag == O_CREAT|O_EXCL && errno == EEXIST) { -                        unlink (filename); -                        return 0; -                } -                else { -                        fd = 0; -                        fprintf (stderr, "open failed: %s\n", strerror (errno)); -                        return 1; -                } -        } - -        strcpy (wstring, "My string to write\n"); -        ret = write (fd, wstring, strlen(wstring)); -        if (ret <= 0) { -                if (errno != EBADF) { -                        fprintf (stderr, "write failed: %s\n", strerror (errno)); -                        close (fd); -                        unlink(filename); -                        return 2; -                } -        } - -        ret = lseek (fd, 0, SEEK_SET); -        if (ret < 0) { -                close (fd); -                unlink(filename); -                return 4; -        } - -        ret = read (fd, rstring, strlen(wstring)); -        if (ret < 0) { -                close (fd); -                unlink (filename); -                return 3; -        } - -        /* Compare the rstring with wstring. But we do not want to return -         * error when the flag is either O_RDONLY, O_CREAT|O_RDONLY or -         * O_TRUNC|O_RDONLY. Because in that case we are not writing -         * anything to the file.*/ - -        ret = memcmp (wstring, rstring, strlen (wstring)); -        if (0 != ret  && !(flag == O_CREAT|O_RDONLY || flag == O_RDONLY ||\ -            flag == O_TRUNC|O_RDONLY)) { -                fprintf (stderr, "read is returning junk\n"); -                close (fd); -                unlink (filename); -                return 4; -        } - -        close (fd); -        unlink (filename); -        return 0; +    int fd = 0; +    int ret = -1; +    char wstring[50] = { +        0, +    }; +    char rstring[50] = { +        0, +    }; + +    fd = open(filename, flag); +    if (fd < 0) { +        if (flag == O_CREAT | O_EXCL && errno == EEXIST) { +            unlink(filename); +            return 0; +        } else { +            fd = 0; +            fprintf(stderr, "open failed: %s\n", strerror(errno)); +            return 1; +        } +    } + +    strcpy(wstring, "My string to write\n"); +    ret = write(fd, wstring, strlen(wstring)); +    if (ret <= 0) { +        if (errno != EBADF) { +            fprintf(stderr, "write failed: %s\n", strerror(errno)); +            close(fd); +            unlink(filename); +            return 2; +        } +    } + +    ret = lseek(fd, 0, SEEK_SET); +    if (ret < 0) { +        close(fd); +        unlink(filename); +        return 4; +    } + +    ret = read(fd, rstring, strlen(wstring)); +    if (ret < 0) { +        close(fd); +        unlink(filename); +        return 3; +    } + +    /* Compare the rstring with wstring. But we do not want to return +     * error when the flag is either O_RDONLY, O_CREAT|O_RDONLY or +     * O_TRUNC|O_RDONLY. Because in that case we are not writing +     * anything to the file.*/ + +    ret = memcmp(wstring, rstring, strlen(wstring)); +    if (0 != ret && !(flag == O_CREAT | O_RDONLY || flag == O_RDONLY || +                      flag == O_TRUNC | O_RDONLY)) { +        fprintf(stderr, "read is returning junk\n"); +        close(fd); +        unlink(filename); +        return 4; +    } + +    close(fd); +    unlink(filename); +    return 0;  }  | 
