X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=inline;f=src%2Fmemcp.c;h=bba346b973f047856fb1eff95df45e0f8ff177c9;hb=ca065f55235fd9979ede818963780f417d70c64e;hp=fc396ff1b09c4b4163bc3040802ccd8d42b8f5bb;hpb=634d51bb8d523b73f5a2507e913cd3ebee4c6cd7;p=m6w6%2Flibmemcached diff --git a/src/memcp.c b/src/memcp.c index fc396ff1..bba346b9 100644 --- a/src/memcp.c +++ b/src/memcp.c @@ -4,7 +4,6 @@ #include #include #include -#include #include #include @@ -14,9 +13,9 @@ /* Prototypes */ void options_parse(int argc, char *argv[]); -static int opt_verbose; -static char *opt_servers; -static int opt_replace; +static int opt_verbose= 0; +static char *opt_servers= NULL; +static int opt_method= 0; uint16_t opt_flags= 0; time_t opt_expires= 0; @@ -26,34 +25,31 @@ int main(int argc, char *argv[]) char *string; size_t string_length; memcached_return rc; - options_parse(argc, argv); memc= memcached_init(NULL); - parse_opt_servers(memc, opt_servers); + if (opt_servers) + parse_opt_servers(memc, opt_servers); + else + parse_opt_servers(memc, argv[--argc]); - while (optind <= argc) + while (optind < argc) { - char *mptr; struct stat sbuf; int fd; char *ptr; + ssize_t read_length; + char *file_buffer_ptr; fd= open(argv[optind], O_RDONLY); - if (fd < 0) { + if (fd < 0) + { fprintf(stderr, "memcp: %s: %s\n", argv[optind], strerror(errno)); optind++; continue; } (void)fstat(fd, &sbuf); - mptr= mmap(NULL, sbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); - if (mptr == MAP_FAILED) { - fprintf(stderr, "memcp: %s: %s\n", argv[optind], strerror(errno)); - close(fd); - optind++; - continue; - } ptr= rindex(argv[optind], '/'); if (ptr) @@ -61,41 +57,55 @@ int main(int argc, char *argv[]) else ptr= argv[optind]; - if (opt_verbose) { + if (opt_verbose) + { static char *opstr[] = { "set", "add", "replace" }; - printf("op: %s\nsource file: %s\nlength: %d\n" - "key: %s\nflags: %d\n expires: %ld\n", - opstr[opt_replace], argv[optind], sbuf.st_size, + printf("op: %s\nsource file: %s\nlength: %zu\n" + "key: %s\nflags: %u\n expires: %llu\n", + opstr[opt_method], argv[optind], sbuf.st_size, ptr, opt_flags, opt_expires); } - if (opt_replace == 0) - rc= memcached_set(memc, ptr, strlen(ptr), - mptr, sbuf.st_size, - opt_expires, opt_flags); - else if (opt_replace == 1) + if ((file_buffer_ptr= (char *)malloc(sizeof(char) * sbuf.st_size)) == NULL) + { + fprintf(stderr, "malloc: %s\n", strerror(errno)); + exit(1); + } + + if ((read_length= read(fd, file_buffer_ptr, sbuf.st_size)) == -1) + { + fprintf(stderr, "read: %s\n", strerror(errno)); + exit(1); + } + assert(read_length == sbuf.st_size); + + if (opt_method == OPT_ADD) rc= memcached_add(memc, ptr, strlen(ptr), - mptr, sbuf.st_size, + file_buffer_ptr, sbuf.st_size, opt_expires, opt_flags); - else if (opt_replace == 2) + else if (opt_method == OPT_REPLACE) rc= memcached_replace(memc, ptr, strlen(ptr), - mptr, sbuf.st_size, + file_buffer_ptr, sbuf.st_size, opt_expires, opt_flags); else - abort(); + rc= memcached_set(memc, ptr, strlen(ptr), + file_buffer_ptr, sbuf.st_size, + opt_expires, opt_flags); - if (rc != MEMCACHED_SUCCESS) { + if (rc != MEMCACHED_SUCCESS) fprintf(stderr, "memcp: %s: memcache error %s\n", ptr, memcached_strerror(memc, rc)); - } - munmap(mptr, sbuf.st_size); + WATCHPOINT; + free(file_buffer_ptr); close(fd); optind++; } memcached_deinit(memc); + cleanup(); + return 0; }; @@ -113,9 +123,9 @@ void options_parse(int argc, char *argv[]) {"servers", required_argument, NULL, OPT_SERVERS}, {"flag", required_argument, NULL, OPT_FLAG}, {"expire", required_argument, NULL, OPT_EXPIRE}, - {"set", no_argument, &opt_replace, OPT_SET}, - {"add", no_argument, &opt_replace, OPT_ADD}, - {"replace", no_argument, &opt_replace, OPT_REPLACE}, + {"set", no_argument, NULL, OPT_SET}, + {"add", no_argument, NULL, OPT_ADD}, + {"replace", no_argument, NULL, OPT_REPLACE}, {0, 0, 0, 0}, }; @@ -135,7 +145,7 @@ void options_parse(int argc, char *argv[]) printf("useful help messages go here\n"); exit(0); case OPT_SERVERS: /* --servers or -s */ - opt_servers= optarg; + opt_servers= strdup_cleanup(optarg); break; case OPT_FLAG: /* --flag */ opt_flags= (uint16_t)strtol(optarg, (char **)NULL, 10); @@ -143,6 +153,15 @@ void options_parse(int argc, char *argv[]) case OPT_EXPIRE: /* --expire */ opt_expires= (time_t)strtol(optarg, (char **)NULL, 10); break; + case OPT_SET: + opt_method= OPT_SET; + break; + case OPT_REPLACE: + opt_method= OPT_REPLACE; + break; + case OPT_ADD: + opt_method= OPT_ADD; + break; case '?': /* getopt_long already printed an error message. */ exit(1);