diff options
author | Nikolaus Rath <Nikolaus@rath.org> | 2016-05-13 13:12:14 -0700 |
---|---|---|
committer | Nikolaus Rath <Nikolaus@rath.org> | 2016-05-13 13:12:40 -0700 |
commit | 34e3ee9ba9024026e6701617c5bc37f9df1159cb (patch) | |
tree | daf73025a6c090dc208d190176bd1e3061fb4f24 /example | |
parent | 2aa1f6b1381611a3f73c7a1db61a629aa2e28324 (diff) |
Fix ioctl example
Fixes issue #39.
Diffstat (limited to 'example')
-rwxr-xr-x | example/fioclient.c | 102 |
1 files changed, 19 insertions, 83 deletions
diff --git a/example/fioclient.c b/example/fioclient.c index a7c0dbe..704f24b 100755 --- a/example/fioclient.c +++ b/example/fioclient.c @@ -34,56 +34,20 @@ #include "fioc.h" const char *usage = -"Usage: fioclient FIOC_FILE COMMAND\n" +"Usage: fioclient FIOC_FILE [size]\n" "\n" -"COMMANDS\n" -" s [SIZE] : get size if SIZE is omitted, set size otherwise\n" -" r SIZE [OFF] : read SIZE bytes @ OFF (dfl 0) and output to stdout\n" -" w SIZE [OFF] : write SIZE bytes @ OFF (dfl 0) from stdin\n" +"Get size if <size> is omitted, set size otherwise\n" "\n"; -static int do_rw(int fd, int is_read, size_t size, off_t offset, - size_t *prev_size, size_t *new_size) -{ - struct fioc_rw_arg arg = { .offset = offset }; - ssize_t ret; - - arg.buf = calloc(1, size); - if (!arg.buf) { - fprintf(stderr, "failed to allocated %zu bytes\n", size); - return -1; - } - - if (is_read) { - arg.size = size; - ret = ioctl(fd, FIOC_READ, &arg); - if (ret >= 0) - fwrite(arg.buf, 1, ret, stdout); - } else { - arg.size = fread(arg.buf, 1, size, stdin); - fprintf(stderr, "Writing %zu bytes\n", arg.size); - ret = ioctl(fd, FIOC_WRITE, &arg); - } - - if (ret >= 0) { - *prev_size = arg.prev_size; - *new_size = arg.new_size; - } else - perror("ioctl"); - - free(arg.buf); - return ret; -} - int main(int argc, char **argv) { - size_t param[2] = { }; - size_t size, prev_size = 0, new_size = 0; - char cmd; - int fd, i, rc; + size_t size; + int fd; - if (argc < 3) - goto usage; + if (argc < 2) { + fprintf(stderr, "%s", usage); + return 1; + } fd = open(argv[1], O_RDWR); if (fd < 0) { @@ -91,46 +55,18 @@ int main(int argc, char **argv) return 1; } - cmd = tolower(argv[2][0]); - argc -= 3; - argv += 3; - - for (i = 0; i < argc; i++) { - char *endp; - param[i] = strtoul(argv[i], &endp, 0); - if (endp == argv[i] || *endp != '\0') - goto usage; - } - - switch (cmd) { - case 's': - if (!argc) { - if (ioctl(fd, FIOC_GET_SIZE, &size)) { - perror("ioctl"); - return 1; - } - printf("%zu\n", size); - } else { - size = param[0]; - if (ioctl(fd, FIOC_SET_SIZE, &size)) { - perror("ioctl"); - return 1; - } + if (argc == 2) { + if (ioctl(fd, FIOC_GET_SIZE, &size)) { + perror("ioctl"); + return 1; } - return 0; - - case 'r': - case 'w': - rc = do_rw(fd, cmd == 'r', param[0], param[1], - &prev_size, &new_size); - if (rc < 0) + printf("%zu\n", size); + } else { + size = strtoul(argv[2], NULL, 0); + if (ioctl(fd, FIOC_SET_SIZE, &size)) { + perror("ioctl"); return 1; - fprintf(stderr, "transferred %d bytes (%zu -> %zu)\n", - rc, prev_size, new_size); - return 0; + } } - - usage: - fprintf(stderr, "%s", usage); - return 1; + return 0; } |