#include <stdio.h>\r
+#include <unistd.h>\r
+#include <getopt.h>\r
#include <sys/types.h>\r
#include <sys/stat.h>\r
#include <sys/types.h>\r
-#include <sys/mman.h>\r
#include <fcntl.h>\r
+#include <errno.h>\r
\r
#include <memcached.h>\r
+#include "client_options.h"\r
+\r
+/* Prototypes */\r
+void options_parse(int argc, char *argv[]);\r
+\r
+static int opt_verbose= 0;\r
+static char *opt_servers= NULL;\r
+static int opt_method= 0;\r
+uint16_t opt_flags= 0;\r
+time_t opt_expires= 0;\r
\r
int main(int argc, char *argv[])\r
{\r
memcached_st *memc;\r
char *string;\r
- unsigned int x;\r
size_t string_length;\r
- uint16_t flags;\r
memcached_return rc;\r
-\r
- if (argc < 3)\r
- return 0;\r
+ options_parse(argc, argv);\r
\r
memc= memcached_init(NULL);\r
+ if (opt_servers)\r
+ parse_opt_servers(memc, opt_servers);\r
+ else\r
+ parse_opt_servers(memc, argv[--argc]);\r
\r
- /* Get the server name */\r
+ while (optind < argc) \r
{\r
+ struct stat sbuf;\r
+ int fd;\r
char *ptr;\r
- char *hostname;\r
- size_t hostname_length;\r
- unsigned int port;\r
+ ssize_t read_length;\r
+ char *file_buffer_ptr;\r
\r
- ptr= index(argv[argc-1], ':');\r
-\r
- if (ptr)\r
+ fd= open(argv[optind], O_RDONLY);\r
+ if (fd < 0) \r
{\r
- hostname_length= ptr - argv[argc-1];\r
- hostname= (char *)malloc(hostname_length+1);\r
- memset(hostname, 0, hostname_length+1);\r
- memcpy(hostname, argv[argc-1], hostname_length);\r
-\r
- ptr++;\r
+ fprintf(stderr, "memcp: %s: %s\n", argv[optind], strerror(errno));\r
+ optind++;\r
+ continue;\r
+ }\r
\r
- port= strtol(ptr, (char **)NULL, 10);\r
+ (void)fstat(fd, &sbuf);\r
\r
- memcached_server_add(memc, hostname, port);\r
- free(hostname);\r
- }\r
+ ptr= rindex(argv[optind], '/');\r
+ if (ptr)\r
+ ptr++;\r
else\r
+ ptr= argv[optind];\r
+\r
+ if (opt_verbose) \r
{\r
- memcached_server_add(memc, argv[argc -1], 0);\r
+ static char *opstr[] = { "set", "add", "replace" };\r
+ printf("op: %s\nsource file: %s\nlength: %zu\n"\r
+ "key: %s\nflags: %u\n expires: %llu\n",\r
+ opstr[opt_method], argv[optind], sbuf.st_size,\r
+ ptr, opt_flags, opt_expires);\r
}\r
- }\r
\r
- for (x= 1; x < argc-1; x++)\r
- {\r
- char *mptr;\r
- struct stat sbuf;\r
- int fd;\r
- char *ptr;\r
-\r
- fd= open(argv[x], O_RDONLY);\r
-\r
- if (fd == -1)\r
+ if ((file_buffer_ptr= (char *)malloc(sizeof(char) * sbuf.st_size)) == NULL)\r
{\r
- fprintf(stderr, "Failed opening %s\n", argv[x]);\r
+ fprintf(stderr, "malloc: %s\n", strerror(errno)); \r
exit(1);\r
}\r
\r
- (void)fstat(fd, &sbuf);\r
- mptr= mmap(NULL, sbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);\r
-\r
- ptr= rindex(argv[x], '/');\r
- if (ptr)\r
+ if ((read_length= read(fd, file_buffer_ptr, sbuf.st_size)) == -1)\r
{\r
- ptr++;\r
+ fprintf(stderr, "read: %s\n", strerror(errno)); \r
+ exit(1);\r
}\r
+ assert(read_length == sbuf.st_size);\r
+\r
+ if (opt_method == OPT_ADD)\r
+ rc= memcached_add(memc, ptr, strlen(ptr),\r
+ file_buffer_ptr, sbuf.st_size,\r
+ opt_expires, opt_flags);\r
+ else if (opt_method == OPT_REPLACE)\r
+ rc= memcached_replace(memc, ptr, strlen(ptr),\r
+ file_buffer_ptr, sbuf.st_size,\r
+ opt_expires, opt_flags);\r
else\r
- {\r
- ptr= argv[x];\r
- }\r
- \r
- rc= memcached_set(memc, ptr, strlen(ptr),\r
- mptr, sbuf.st_size,\r
- (time_t)0, (uint16_t)0);\r
+ rc= memcached_set(memc, ptr, strlen(ptr),\r
+ file_buffer_ptr, sbuf.st_size,\r
+ opt_expires, opt_flags);\r
+\r
+ if (rc != MEMCACHED_SUCCESS)\r
+ fprintf(stderr, "memcp: %s: memcache error %s\n", \r
+ ptr, memcached_strerror(memc, rc));\r
\r
- munmap(mptr, sbuf.st_size);\r
+ WATCHPOINT;\r
+ free(file_buffer_ptr);\r
close(fd);\r
+ optind++;\r
}\r
\r
memcached_deinit(memc);\r
\r
+ cleanup();\r
+\r
return 0;\r
};\r
+\r
+void options_parse(int argc, char *argv[])\r
+{\r
+ int option_index= 0;\r
+ int option_rv;\r
+\r
+ static struct option long_options[] =\r
+ {\r
+ {"version", no_argument, NULL, OPT_VERSION},\r
+ {"help", no_argument, NULL, OPT_HELP},\r
+ {"verbose", no_argument, &opt_verbose, OPT_VERBOSE},\r
+ {"debug", no_argument, &opt_verbose, OPT_DEBUG},\r
+ {"servers", required_argument, NULL, OPT_SERVERS},\r
+ {"flag", required_argument, NULL, OPT_FLAG},\r
+ {"expire", required_argument, NULL, OPT_EXPIRE},\r
+ {"set", no_argument, NULL, OPT_SET},\r
+ {"add", no_argument, NULL, OPT_ADD},\r
+ {"replace", no_argument, NULL, OPT_REPLACE},\r
+ {0, 0, 0, 0},\r
+ };\r
+\r
+ while (1) \r
+ {\r
+ option_rv= getopt_long(argc, argv, "Vhvds:", long_options, &option_index);\r
+\r
+ if (option_rv == -1) break;\r
+\r
+ switch (option_rv) {\r
+ case 0:\r
+ break;\r
+ case OPT_VERSION: /* --version or -V */\r
+ printf("memcache tools, memcp, v1.0\n");\r
+ exit(0);\r
+ case OPT_HELP: /* --help or -h */\r
+ printf("useful help messages go here\n");\r
+ exit(0);\r
+ case OPT_SERVERS: /* --servers or -s */\r
+ opt_servers= strdup_cleanup(optarg);\r
+ break;\r
+ case OPT_FLAG: /* --flag */\r
+ opt_flags= (uint16_t)strtol(optarg, (char **)NULL, 10);\r
+ break;\r
+ case OPT_EXPIRE: /* --expire */\r
+ opt_expires= (time_t)strtol(optarg, (char **)NULL, 10);\r
+ break;\r
+ case OPT_SET:\r
+ opt_method= OPT_SET;\r
+ break;\r
+ case OPT_REPLACE:\r
+ opt_method= OPT_REPLACE;\r
+ break;\r
+ case OPT_ADD:\r
+ opt_method= OPT_ADD;\r
+ break;\r
+ case '?':\r
+ /* getopt_long already printed an error message. */\r
+ exit(1);\r
+ default:\r
+ abort();\r
+ }\r
+ }\r
+}\r