diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2009-06-18 11:11:54 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2009-06-18 11:11:54 +0000 |
commit | ae9bfde712697205ac8809edc431cb7c0bdd484f (patch) | |
tree | 6f05932e39f7b1bfb44452bb09aecaa2826e4f0b /example | |
parent | bc53eddb2f76be3e134aa5ed1814254aa289f898 (diff) | |
download | android_external_fuse-ae9bfde712697205ac8809edc431cb7c0bdd484f.tar.gz android_external_fuse-ae9bfde712697205ac8809edc431cb7c0bdd484f.tar.bz2 android_external_fuse-ae9bfde712697205ac8809edc431cb7c0bdd484f.zip |
CUSE patches from Tejun Heo
Diffstat (limited to 'example')
-rw-r--r-- | example/Makefile.am | 2 | ||||
-rw-r--r-- | example/fioc.h | 19 | ||||
-rw-r--r-- | example/fioclient.c | 98 |
3 files changed, 95 insertions, 24 deletions
diff --git a/example/Makefile.am b/example/Makefile.am index 1aa5774..718b30a 100644 --- a/example/Makefile.am +++ b/example/Makefile.am @@ -3,7 +3,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/include -D_FILE_OFFSET_BITS=64 -D_REENTRANT noinst_HEADERS = fioc.h noinst_PROGRAMS = fusexmp fusexmp_fh null hello hello_ll fioc fioclient \ - fsel fselclient + fsel fselclient cusexmp LDADD = ../lib/libfuse.la @libfuse_libs@ fusexmp_fh_LDADD = ../lib/libfuse.la ../lib/libulockmgr.la @libfuse_libs@ diff --git a/example/fioc.h b/example/fioc.h index c1d9cdf..ec1a39d 100644 --- a/example/fioc.h +++ b/example/fioc.h @@ -12,6 +12,21 @@ #include <sys/ioctl.h> enum { - FIOC_GET_SIZE = _IOR('E', 0, size_t), - FIOC_SET_SIZE = _IOW('E', 1, size_t), + FIOC_GET_SIZE = _IOR('E', 0, size_t), + FIOC_SET_SIZE = _IOW('E', 1, size_t), + + /* + * The following two ioctls don't follow usual encoding rules + * and transfer variable amount of data. + */ + FIOC_READ = _IO('E', 2), + FIOC_WRITE = _IO('E', 3), +}; + +struct fioc_rw_arg { + off_t offset; + void *buf; + size_t size; + size_t prev_size; /* out param for previous total size */ + size_t new_size; /* out param for new total size */ }; diff --git a/example/fioclient.c b/example/fioclient.c index 3ab63b2..c056186 100644 --- a/example/fioclient.c +++ b/example/fioclient.c @@ -20,19 +20,56 @@ #include "fioc.h" const char *usage = -"Usage: fioclient FIOC_FILE [SIZE]\n" +"Usage: fioclient FIOC_FILE COMMAND\n" "\n" -" get size if SIZE is omitted, set size otherwise\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" "\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 size; - int fd; + size_t param[2] = { }; + size_t size, prev_size = 0, new_size = 0; + char cmd; + int fd, i, rc; - if (argc < 2) { + if (argc < 3) goto usage; - } fd = open(argv[1], O_RDWR); if (fd < 0) { @@ -40,27 +77,46 @@ int main(int argc, char **argv) return 1; } - if (argc == 2) { - if (ioctl(fd, FIOC_GET_SIZE, &size)) { - perror("ioctl"); - return 1; - } - printf("%zu\n", size); - } else { - char *endp; + cmd = tolower(argv[2][0]); + argc -= 3; + argv += 3; - size = strtoul(argv[2], &endp, 0); - if (endp == argv[2] || *endp != '\0') + for (i = 0; i < argc; i++) { + char *endp; + param[i] = strtoul(argv[i], &endp, 0); + if (endp == argv[i] || *endp != '\0') goto usage; + } - if (ioctl(fd, FIOC_SET_SIZE, &size)) { - perror("ioctl"); - return 1; + 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; + } } + return 0; + + case 'r': + case 'w': + rc = do_rw(fd, cmd == 'r', param[0], param[1], + &prev_size, &new_size); + if (rc < 0) + return 1; + fprintf(stderr, "transferred %d bytes (%zu -> %zu)\n", + rc, prev_size, new_size); + return 0; } - return 0; -usage: + usage: fprintf(stderr, usage); return 1; } |