From d227f2a06b136be62333f220b80226c0ec1a472f Mon Sep 17 00:00:00 2001 From: Marko Kevac Date: Mon, 24 May 2010 13:08:06 +0400 Subject: [PATCH] add 'save to file' ability to memcat --- clients/client_options.h | 3 ++- clients/memcat.c | 33 ++++++++++++++++++++++++++++++++- clients/utilities.c | 1 + 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/clients/client_options.h b/clients/client_options.h index 9293b9ca..b0111707 100644 --- a/clients/client_options.h +++ b/clients/client_options.h @@ -37,7 +37,8 @@ typedef enum { OPT_BINARY, OPT_UDP, OPT_USERNAME, - OPT_PASSWD + OPT_PASSWD, + OPT_FILE= 'f' } memcached_options; #endif /* CLIENT_OPTIONS */ diff --git a/clients/memcat.c b/clients/memcat.c index 3ae82e46..a25bc12c 100644 --- a/clients/memcat.c +++ b/clients/memcat.c @@ -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); diff --git a/clients/utilities.c b/clients/utilities.c index e21df20d..6353ff6b 100644 --- a/clients/utilities.c +++ b/clients/utilities.c @@ -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); }; -- 2.30.2