From: Date: Mon, 24 Sep 2007 21:21:48 +0000 (+0200) Subject: Fixed merge X-Git-Tag: 0.2~8 X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;h=f4ff3ba0a9f212ac1323fc056d61fefd3782093c;hp=5672a07389f0e0ea5dc4858c02ac3f3bc7ecf3f7;p=awesomized%2Flibmemcached Fixed merge --- diff --git a/lib/memcached_auto.c b/lib/memcached_auto.c index 7122dc90..acb554b1 100644 --- a/lib/memcached_auto.c +++ b/lib/memcached_auto.c @@ -6,7 +6,7 @@ static memcached_return memcached_auto(memcached_st *ptr, unsigned int offset, unsigned int *value) { - size_t send_length; + size_t send_length, sent_length; memcached_return rc; char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE]; unsigned int server_key; @@ -22,8 +22,11 @@ static memcached_return memcached_auto(memcached_st *ptr, "%s %.*s %u\r\n", verb, (int)key_length, key, offset); + if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE) + return MEMCACHED_WRITE_FAILURE; + sent_length= write(ptr->hosts[server_key].fd, buffer, send_length); - if ((write(ptr->hosts[server_key].fd, buffer, send_length) == -1)) + if (sent_length == -1 || sent_length != send_length) return MEMCACHED_WRITE_FAILURE; memset(buffer, 0, MEMCACHED_DEFAULT_COMMAND_SIZE); diff --git a/lib/memcached_delete.c b/lib/memcached_delete.c index d24c0f82..b50aaef0 100644 --- a/lib/memcached_delete.c +++ b/lib/memcached_delete.c @@ -3,7 +3,7 @@ memcached_return memcached_delete(memcached_st *ptr, char *key, size_t key_length, time_t expiration) { - size_t send_length; + size_t send_length, sent_length; memcached_return rc; char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE]; unsigned int server_key; @@ -23,7 +23,12 @@ memcached_return memcached_delete(memcached_st *ptr, char *key, size_t key_lengt send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, "delete %.*s\r\n", (int)key_length, key); - if ((write(ptr->hosts[server_key].fd, buffer, send_length) == -1)) + if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE) + return MEMCACHED_WRITE_FAILURE; + + sent_length= write(ptr->hosts[server_key].fd, buffer, send_length); + + if (sent_length == -1 || sent_length != send_length) return MEMCACHED_WRITE_FAILURE; return memcached_response(ptr, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, server_key); diff --git a/lib/memcached_flush.c b/lib/memcached_flush.c index 8c51cdf1..58372c6a 100644 --- a/lib/memcached_flush.c +++ b/lib/memcached_flush.c @@ -3,7 +3,7 @@ memcached_return memcached_flush(memcached_st *ptr, time_t expiration) { unsigned int x; - size_t send_length; + size_t send_length, sent_length; memcached_return rc; char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE]; @@ -20,7 +20,13 @@ memcached_return memcached_flush(memcached_st *ptr, time_t expiration) else send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, "flush_all\r\n"); - if ((write(ptr->hosts[x].fd, buffer, send_length) == -1)) + + if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE) + return MEMCACHED_WRITE_FAILURE; + + sent_length= write(ptr->hosts[x].fd, buffer, send_length); + + if (sent_length == -1 || sent_length != send_length) return MEMCACHED_WRITE_FAILURE; rc= memcached_response(ptr, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, x); diff --git a/lib/memcached_stats.c b/lib/memcached_stats.c index d7f948fa..86714759 100644 --- a/lib/memcached_stats.c +++ b/lib/memcached_stats.c @@ -122,7 +122,7 @@ static memcached_return memcached_stats_fetch(memcached_st *ptr, { memcached_return rc; char buffer[HUGE_STRING_LEN]; - size_t send_length; + size_t send_length, sent_length; rc= memcached_connect(ptr); @@ -136,10 +136,21 @@ static memcached_return memcached_stats_fetch(memcached_st *ptr, send_length= snprintf(buffer, HUGE_STRING_LEN, "stats\r\n"); - if ((write(ptr->hosts[server_key].fd, buffer, send_length) == -1)) + if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE) + return MEMCACHED_WRITE_FAILURE; + + sent_length= write(ptr->hosts[server_key].fd, buffer, send_length); + + if (sent_length == -1) { - fprintf(stderr, "failed on stats\n"); + fprintf(stderr, "error %s: write: %m\n", __FUNCTION__); + return MEMCACHED_WRITE_FAILURE; + } + if (sent_length != send_length) + { + fprintf(stderr, "error %s: short write %d %d: %m\n", + __FUNCTION__, sent_length, send_length); return MEMCACHED_WRITE_FAILURE; } diff --git a/lib/memcached_storage.c b/lib/memcached_storage.c index 484341c8..21dc0934 100644 --- a/lib/memcached_storage.c +++ b/lib/memcached_storage.c @@ -35,6 +35,8 @@ static memcached_return memcached_send(memcached_st *ptr, "%s %.*s %x %llu %zu\r\n", verb, (int)key_length, key, flags, (unsigned long long)expiration, value_length); + if (write_length >= MEMCACHED_DEFAULT_COMMAND_SIZE) + return MEMCACHED_WRITE_FAILURE; if ((sent_length= write(ptr->hosts[server_key].fd, buffer, write_length)) == -1) return MEMCACHED_WRITE_FAILURE; assert(write_length == sent_length); diff --git a/lib/memcached_verbosity.c b/lib/memcached_verbosity.c index 201e8bef..25876d4f 100644 --- a/lib/memcached_verbosity.c +++ b/lib/memcached_verbosity.c @@ -3,7 +3,7 @@ memcached_return memcached_verbosity(memcached_st *ptr, unsigned int verbosity) { unsigned int x; - size_t send_length; + size_t send_length, sent_length; memcached_return rc; char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE]; @@ -14,6 +14,8 @@ memcached_return memcached_verbosity(memcached_st *ptr, unsigned int verbosity) send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, "verbosity %u\r\n", verbosity); + if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE) + return MEMCACHED_WRITE_FAILURE; for (x= 0; x < ptr->number_of_hosts; x++) { diff --git a/src/Makefile.am b/src/Makefile.am index 57386fae..5648e11f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,7 @@ INCLUDES = -I$(top_builddir)/include -Wall LDADDS = ../lib/libmemcached.la -bin_PROGRAMS = memcat memcp memstat memrm +bin_PROGRAMS = memcat memcp memstat memrm memflush noinst_includes= client_options.h utilities.h @@ -16,3 +16,6 @@ memstat_LDADD = $(LDADDS) memrm_SOURCES = memrm.c utilities.c memrm_LDADD = $(LDADDS) + +memflush_SOURCES = memflush.c utilities.c +memflush_LDADD = $(LDADDS) diff --git a/src/memcat.c b/src/memcat.c index 1e7f5bf7..924b16d8 100644 --- a/src/memcat.c +++ b/src/memcat.c @@ -90,6 +90,12 @@ void options_parse(int argc, char *argv[]) { case 0: break; + case OPT_VERBOSE: /* --verbose or -v */ + opt_verbose = OPT_VERBOSE; + break; + case OPT_DEBUG: /* --debug or -d */ + opt_verbose = OPT_DEBUG; + break; case OPT_VERSION: /* --version or -V */ printf("memcache tools, memcat, v1.0\n"); exit(0); diff --git a/src/memcp.c b/src/memcp.c index ec9a2faf..d85fd44d 100644 --- a/src/memcp.c +++ b/src/memcp.c @@ -62,8 +62,8 @@ int main(int argc, char *argv[]) { static char *opstr[] = { "set", "add", "replace" }; printf("op: %s\nsource file: %s\nlength: %zu\n" - "key: %s\nflags: %x\n expires: %llu\n", - opstr[opt_method], argv[optind], (size_t)sbuf.st_size, + "key: %s\nflags: %x\nexpires: %llu\n", + opstr[opt_method - OPT_SET], argv[optind], (size_t)sbuf.st_size, ptr, opt_flags, (unsigned long long)opt_expires); } @@ -140,6 +140,12 @@ void options_parse(int argc, char *argv[]) { case 0: break; + case OPT_VERBOSE: /* --verbose or -v */ + opt_verbose = OPT_VERBOSE; + break; + case OPT_DEBUG: /* --debug or -d */ + opt_verbose = OPT_DEBUG; + break; case OPT_VERSION: /* --version or -V */ printf("memcache tools, memcp, v1.0\n"); exit(0); diff --git a/src/memflush.c b/src/memflush.c new file mode 100644 index 00000000..95e3e986 --- /dev/null +++ b/src/memflush.c @@ -0,0 +1,92 @@ +#include +#include +#include +#include +#include "client_options.h" +#include "utilities.h" + +static int opt_verbose= 0; +static time_t opt_expire= 0; +static char *opt_servers= NULL; + +/* Prototypes */ +void options_parse(int argc, char *argv[]); + +int main(int argc, char *argv[]) +{ + memcached_st *memc; + memcached_return rc; + + options_parse(argc, argv); + + memc= memcached_init(NULL); + + if (opt_servers) + parse_opt_servers(memc, opt_servers); + + rc = memcached_flush(memc, opt_expire); + if (rc != MEMCACHED_SUCCESS) + { + fprintf(stderr, "memflush: memcache error %s\n", + memcached_strerror(memc, rc)); + } + + memcached_deinit(memc); + + free(opt_servers); + + return 0; +} + + +void options_parse(int argc, char *argv[]) +{ + static struct option long_options[]= + { + {"version", no_argument, NULL, OPT_VERSION}, + {"help", no_argument, NULL, OPT_HELP}, + {"verbose", no_argument, &opt_verbose, OPT_VERBOSE}, + {"debug", no_argument, &opt_verbose, OPT_DEBUG}, + {"servers", required_argument, NULL, OPT_SERVERS}, + {"expire", required_argument, NULL, OPT_EXPIRE}, + {0, 0, 0, 0}, + }; + int option_index= 0; + int option_rv; + + while (1) + { + option_rv= getopt_long(argc, argv, "Vhvds:", long_options, &option_index); + if (option_rv == -1) break; + switch (option_rv) + { + case 0: + break; + case OPT_VERBOSE: /* --verbose or -v */ + opt_verbose = OPT_VERBOSE; + break; + case OPT_DEBUG: /* --debug or -d */ + opt_verbose = OPT_DEBUG; + break; + case OPT_VERSION: /* --version or -V */ + printf("memcache tools, memflush, v1.0\n"); + exit(0); + break; + case OPT_HELP: /* --help or -h */ + printf("useful help messages go here\n"); + exit(0); + break; + case OPT_SERVERS: /* --servers or -s */ + opt_servers= strdup(optarg); + break; + case OPT_EXPIRE: /* --expire */ + opt_expire= (time_t)strtoll(optarg, (char **)NULL, 10); + break; + case '?': + /* getopt_long already printed an error message. */ + exit(1); + default: + abort(); + } + } +} diff --git a/src/memrm.c b/src/memrm.c index 3e468a3d..1fa9f409 100644 --- a/src/memrm.c +++ b/src/memrm.c @@ -72,6 +72,12 @@ void options_parse(int argc, char *argv[]) { case 0: break; + case OPT_VERBOSE: /* --verbose or -v */ + opt_verbose = OPT_VERBOSE; + break; + case OPT_DEBUG: /* --debug or -d */ + opt_verbose = OPT_DEBUG; + break; case OPT_VERSION: /* --version or -V */ printf("memcache tools, memrm, v1.0\n"); exit(0); diff --git a/src/memstat.c b/src/memstat.c index e7810200..a01c35ba 100644 --- a/src/memstat.c +++ b/src/memstat.c @@ -56,6 +56,12 @@ void options_parse(int argc, char *argv[]) { case 0: break; + case OPT_VERBOSE: /* --verbose or -v */ + opt_verbose = OPT_VERBOSE; + break; + case OPT_DEBUG: /* --debug or -d */ + opt_verbose = OPT_DEBUG; + break; case OPT_VERSION: /* --version or -V */ printf("memcache tools, memcat, v1.0\n"); exit(0);