add 'save to file' ability to memcat
authorMarko Kevac <marko@kevac.org>
Mon, 24 May 2010 09:08:06 +0000 (13:08 +0400)
committerMarko Kevac <marko@kevac.org>
Mon, 24 May 2010 09:08:06 +0000 (13:08 +0400)
clients/client_options.h
clients/memcat.c
clients/utilities.c

index 9293b9cacafba3b252d41f9de1a2e914b9b4e622..b01117073b5faa40bfcf70721b3c3b69a0b06982 100644 (file)
@@ -37,7 +37,8 @@ typedef enum {
   OPT_BINARY,
   OPT_UDP,
   OPT_USERNAME,
-  OPT_PASSWD
+  OPT_PASSWD,
+  OPT_FILE= 'f'
 } memcached_options;
 
 #endif /* CLIENT_OPTIONS */
index 3ae82e460188ef0ef76a20369db04af2aa408f83..a25bc12c9f5c6f3fa60d6ad96a0b59c524b005bc 100644 (file)
@@ -33,6 +33,7 @@ static char *opt_servers= NULL;
 static char *opt_hash= NULL;
 static char *opt_username;
 static char *opt_passwd;
+static char *opt_file;
 
 int main(int argc, char *argv[])
 {
@@ -93,7 +94,33 @@ int main(int argc, char *argv[])
         if (opt_verbose)
           printf("key: %s\nflags: %x\nlength: %zu\nvalue: ",
                  argv[optind], flags, string_length);
-        printf("%.*s\n", (int)string_length, string);
+        if (opt_file) {
+            FILE *fp;
+            size_t written = 0;
+
+            fp = fopen(opt_file, "w");
+            if (!fp) {
+                perror("fopen");
+                return_code= -1;
+                break;
+            }
+
+            written = fwrite(string, 1, string_length, fp);
+            if (written != string_length) {
+                fprintf(stderr, "error writing file (written %d, should be %d)\n", written, string_length);
+                return_code= -1;
+                break;
+            }
+
+            if (fclose(fp)) {
+                fprintf(stderr, "error closing file\n");
+                return_code= -1;
+                break;
+            }
+        }
+        else {
+            printf("%.*s\n", (int)string_length, string);
+        }
         free(string);
       }
     }
@@ -151,6 +178,7 @@ void options_parse(int argc, char *argv[])
       {(OPTIONSTRING)"binary", no_argument, NULL, OPT_BINARY},
       {(OPTIONSTRING)"username", required_argument, NULL, OPT_USERNAME},
       {(OPTIONSTRING)"password", required_argument, NULL, OPT_PASSWD},
+      {(OPTIONSTRING)"file", required_argument, NULL, OPT_FILE},
       {0, 0, 0, 0},
     };
 
@@ -189,6 +217,9 @@ void options_parse(int argc, char *argv[])
     case OPT_PASSWD:
       opt_passwd= optarg;
       break;
+    case OPT_FILE:
+      opt_file= optarg;
+      break;
     case '?':
       /* getopt_long already printed an error message. */
       exit(1);
index e21df20dca1782c554e54a240eb36c1573e27bd7..6353ff6b97e8b0894195c4b44353bb451613a044 100644 (file)
@@ -60,6 +60,7 @@ static const char *lookup_help(memcached_options option)
   case OPT_UDP: return("Use UDP protocol when communicating with server.");
   case OPT_USERNAME: return "Username to use for SASL authentication";
   case OPT_PASSWD: return "Password to use for SASL authentication";
+  case OPT_FILE: return "Path to file in which to save result";
   default: WATCHPOINT_ASSERT(0);
   };