Fixed merge
author <brian@gir.local> <>
Mon, 24 Sep 2007 21:21:48 +0000 (23:21 +0200)
committer <brian@gir.local> <>
Mon, 24 Sep 2007 21:21:48 +0000 (23:21 +0200)
12 files changed:
lib/memcached_auto.c
lib/memcached_delete.c
lib/memcached_flush.c
lib/memcached_stats.c
lib/memcached_storage.c
lib/memcached_verbosity.c
src/Makefile.am
src/memcat.c
src/memcp.c
src/memflush.c [new file with mode: 0644]
src/memrm.c
src/memstat.c

index 7122dc90096e6db4659dfc2120d0e32660e6085a..acb554b149bd4dd220ce0eaf3899681503152f96 100644 (file)
@@ -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);
index d24c0f82a0b7d16ffff58e922a09a05f97817010..b50aaef0f9be5c7fdb4c459d0ee79b31f0c3f22d 100644 (file)
@@ -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);
index 8c51cdf1f85f8e9e44d3fa7a67fb673aac42aa52..58372c6a84813b7762ec853424d6c8d5cd964461 100644 (file)
@@ -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);
index d7f948faad31c99ec4999b110c987982e750367f..867147591c195116773d2a62ce752232846d0919 100644 (file)
@@ -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;
   }
 
index 484341c842c286ad2dd8fd106cc5ebfe328f70e7..21dc0934595781f541ffc82b1fbbc8605bca68f5 100644 (file)
@@ -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);
index 201e8bef8f372d82d94cc996a80c4231e086751a..25876d4fbc2551a4cee49f8810d57981c3a9459a 100644 (file)
@@ -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++)
   {
index 57386faee3b6cf2fd54a2e010f1add5f35cac5ea..5648e11f489dbc34922036e5d0df28344ac77340 100644 (file)
@@ -1,7 +1,7 @@
 INCLUDES = -I$(top_builddir)/include -Wall\r
 LDADDS = ../lib/libmemcached.la\r
 \r
-bin_PROGRAMS = memcat memcp memstat memrm\r
+bin_PROGRAMS = memcat memcp memstat memrm memflush\r
 \r
 noinst_includes= client_options.h utilities.h\r
 \r
@@ -16,3 +16,6 @@ memstat_LDADD = $(LDADDS)
 \r
 memrm_SOURCES = memrm.c utilities.c\r
 memrm_LDADD = $(LDADDS)\r
+\r
+memflush_SOURCES = memflush.c utilities.c\r
+memflush_LDADD = $(LDADDS)\r
index 1e7f5bf7821131aa1c63c371dc46c6caa53d7332..924b16d871e59dd0a971da35f6324b8ebe9955e5 100644 (file)
@@ -90,6 +90,12 @@ void options_parse(int argc, char *argv[])
     {\r
     case 0:\r
       break;\r
+    case OPT_VERBOSE: /* --verbose or -v */\r
+      opt_verbose = OPT_VERBOSE;\r
+      break;\r
+    case OPT_DEBUG: /* --debug or -d */\r
+      opt_verbose = OPT_DEBUG;\r
+      break;\r
     case OPT_VERSION: /* --version or -V */\r
       printf("memcache tools, memcat, v1.0\n");\r
       exit(0);\r
index ec9a2fafb12a2b1bf88389cb4c6d6585c7ef5b32..d85fd44d40de298e8f346aa70c4dbb6b4ab91bcb 100644 (file)
@@ -62,8 +62,8 @@ int main(int argc, char *argv[])
     {\r
       static char *opstr[] = { "set", "add", "replace" };\r
       printf("op: %s\nsource file: %s\nlength: %zu\n"\r
-            "key: %s\nflags: %x\n expires: %llu\n",\r
-            opstr[opt_method], argv[optind], (size_t)sbuf.st_size,\r
+            "key: %s\nflags: %x\nexpires: %llu\n",\r
+            opstr[opt_method - OPT_SET], argv[optind], (size_t)sbuf.st_size,\r
             ptr, opt_flags, (unsigned long long)opt_expires);\r
     }\r
 \r
@@ -140,6 +140,12 @@ void options_parse(int argc, char *argv[])
     {\r
     case 0:\r
       break;\r
+    case OPT_VERBOSE: /* --verbose or -v */\r
+      opt_verbose = OPT_VERBOSE;\r
+      break;\r
+    case OPT_DEBUG: /* --debug or -d */\r
+      opt_verbose = OPT_DEBUG;\r
+      break;\r
     case OPT_VERSION: /* --version or -V */\r
       printf("memcache tools, memcp, v1.0\n");\r
       exit(0);\r
diff --git a/src/memflush.c b/src/memflush.c
new file mode 100644 (file)
index 0000000..95e3e98
--- /dev/null
@@ -0,0 +1,92 @@
+#include <stdio.h>\r
+#include <unistd.h>\r
+#include <getopt.h>\r
+#include <memcached.h>\r
+#include "client_options.h"\r
+#include "utilities.h"\r
+\r
+static int opt_verbose= 0;\r
+static time_t opt_expire= 0;\r
+static char *opt_servers= NULL;\r
+\r
+/* Prototypes */\r
+void options_parse(int argc, char *argv[]);\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+  memcached_st *memc;\r
+  memcached_return rc;\r
+\r
+  options_parse(argc, argv);\r
+\r
+  memc= memcached_init(NULL);\r
+\r
+  if (opt_servers)\r
+    parse_opt_servers(memc, opt_servers);\r
+  \r
+  rc = memcached_flush(memc, opt_expire);\r
+  if (rc != MEMCACHED_SUCCESS) \r
+  {\r
+    fprintf(stderr, "memflush: memcache error %s\n", \r
+           memcached_strerror(memc, rc));\r
+  }\r
+\r
+  memcached_deinit(memc);\r
+\r
+  free(opt_servers);\r
+\r
+  return 0;\r
+}\r
+\r
+\r
+void options_parse(int argc, char *argv[])\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
+    {"expire", required_argument, NULL, OPT_EXPIRE},\r
+    {0, 0, 0, 0},\r
+  };\r
+  int option_index= 0;\r
+  int option_rv;\r
+\r
+  while (1) \r
+  {\r
+    option_rv= getopt_long(argc, argv, "Vhvds:", long_options, &option_index);\r
+    if (option_rv == -1) break;\r
+    switch (option_rv)\r
+    {\r
+    case 0:\r
+      break;\r
+    case OPT_VERBOSE: /* --verbose or -v */\r
+      opt_verbose = OPT_VERBOSE;\r
+      break;\r
+    case OPT_DEBUG: /* --debug or -d */\r
+      opt_verbose = OPT_DEBUG;\r
+      break;\r
+    case OPT_VERSION: /* --version or -V */\r
+      printf("memcache tools, memflush, v1.0\n");\r
+      exit(0);\r
+      break;\r
+    case OPT_HELP: /* --help or -h */\r
+      printf("useful help messages go here\n");\r
+      exit(0);\r
+      break;\r
+    case OPT_SERVERS: /* --servers or -s */\r
+      opt_servers= strdup(optarg);\r
+      break;\r
+    case OPT_EXPIRE: /* --expire */\r
+      opt_expire= (time_t)strtoll(optarg, (char **)NULL, 10);\r
+      break;\r
+    case '?':\r
+      /* getopt_long already printed an error message. */\r
+      exit(1);\r
+    default:\r
+      abort();\r
+    }\r
+  }\r
+}\r
index 3e468a3d875d6619621386bc2a9d5c1505c5717c..1fa9f409b08703cc93741e43e4fad826a143b87b 100644 (file)
@@ -72,6 +72,12 @@ void options_parse(int argc, char *argv[])
     {\r
     case 0:\r
       break;\r
+    case OPT_VERBOSE: /* --verbose or -v */\r
+      opt_verbose = OPT_VERBOSE;\r
+      break;\r
+    case OPT_DEBUG: /* --debug or -d */\r
+      opt_verbose = OPT_DEBUG;\r
+      break;\r
     case OPT_VERSION: /* --version or -V */\r
       printf("memcache tools, memrm, v1.0\n");\r
       exit(0);\r
index e7810200db7736f721f7380e57a8c6ed0dc14704..a01c35baada79964e2275d4cec7fe94e99e2e1c3 100644 (file)
@@ -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);