X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=clients%2Futilities.cc;h=bae9407642ee56e23508d1e427c4d5b3c7d2d8b9;hb=168937e6c8d09d126458a4b698ce46f6e9560cf2;hp=8be59abb4e9cc12f12e29935ab7c2c3fe9ecc490;hpb=b77f874c7d7ff386d01eeedb44c14d3003354bae;p=awesomized%2Flibmemcached diff --git a/clients/utilities.cc b/clients/utilities.cc index 8be59abb..bae94076 100644 --- a/clients/utilities.cc +++ b/clients/utilities.cc @@ -8,12 +8,19 @@ * Summary: * */ -#include "config.h" +#include #include + #include +#include +#include #include #include +#include +#include +#include +#include long int timedif(struct timeval a, struct timeval b) @@ -30,9 +37,41 @@ long int timedif(struct timeval a, struct timeval b) void version_command(const char *command_name) { printf("%s v%u.%u\n", command_name, 1U, 0U); - exit(0); + exit(EXIT_SUCCESS); +} + +void close_stdio(void) +{ + int fd; + if ((fd = open("/dev/null", O_RDWR, 0)) < 0) + { + return; + } + else + { + if (dup2(fd, STDIN_FILENO) < 0) + { + return; + } + + if (dup2(fd, STDOUT_FILENO) < 0) + { + return; + } + + if (dup2(fd, STDERR_FILENO) < 0) + { + return; + } + + if (fd > STDERR_FILENO) + { + close(fd); + } + } } + static const char *lookup_help(memcached_options option) { switch (option) @@ -41,6 +80,7 @@ static const char *lookup_help(memcached_options option) case OPT_VERSION: return("Display the version of the application and then exit."); case OPT_HELP: return("Display this message and then exit."); case OPT_VERBOSE: return("Give more details on the progression of the application."); + case OPT_QUIET: return("stderr and stdin will be closed at application startup."); case OPT_DEBUG: return("Provide output only useful for debugging."); case OPT_FLAG: return("Provide flag information for storage operation."); case OPT_EXPIRE: return("Set the expire option for the object."); @@ -58,14 +98,17 @@ static const char *lookup_help(memcached_options option) case OPT_BINARY: return("Switch to binary protocol."); case OPT_ANALYZE: return("Analyze the provided servers."); case OPT_UDP: return("Use UDP protocol when communicating with server."); + case OPT_BUFFER: return("Enable request buffering."); 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"; case OPT_STAT_ARGS: return "Argument for statistics"; - default: WATCHPOINT_ASSERT(0); + case OPT_SERVER_VERSION: return "Memcached daemon software version"; + default: + break; }; - WATCHPOINT_ASSERT(0); + assert(0); return "forgot to document this function :)"; } @@ -91,7 +134,7 @@ void help_command(const char *command_name, const char *description, } printf("\n"); - exit(0); + exit(EXIT_SUCCESS); } void process_hash_option(memcached_st *memc, char *opt_hash) @@ -104,129 +147,36 @@ void process_hash_option(memcached_st *memc, char *opt_hash) set= MEMCACHED_HASH_DEFAULT; /* Just here to solve warning */ if (!strcasecmp(opt_hash, "CRC")) + { set= MEMCACHED_HASH_CRC; + } else if (!strcasecmp(opt_hash, "FNV1_64")) + { set= MEMCACHED_HASH_FNV1_64; + } else if (!strcasecmp(opt_hash, "FNV1A_64")) + { set= MEMCACHED_HASH_FNV1A_64; + } else if (!strcasecmp(opt_hash, "FNV1_32")) + { set= MEMCACHED_HASH_FNV1_32; + } else if (!strcasecmp(opt_hash, "FNV1A_32")) + { set= MEMCACHED_HASH_FNV1A_32; + } else { fprintf(stderr, "hash: type not recognized %s\n", opt_hash); - exit(1); + exit(EXIT_FAILURE); } rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, set); if (rc != MEMCACHED_SUCCESS) { fprintf(stderr, "hash: memcache error %s\n", memcached_strerror(memc, rc)); - exit(1); - } -} - - -static char *username; -static char *passwd; - -#if defined(LIBMEMCACHED_WITH_SASL_SUPPORT) && LIBMEMCACHED_WITH_SASL_SUPPORT - -static int get_username(void *context, int id, const char **result, unsigned int *len) -{ - (void)context; - if (!result || (id != SASL_CB_USER && id != SASL_CB_AUTHNAME)) - return SASL_BADPARAM; - - *result= username; - if (len) - { - *len= (username == NULL) ? 0 : (unsigned int)strlen(username); - } - - return SASL_OK; -} - -static int get_password(sasl_conn_t *conn, void *context, int id, - sasl_secret_t **psecret) -{ - (void)context; - static sasl_secret_t* ptr; - - if (!conn || ! psecret || id != SASL_CB_PASS) - return SASL_BADPARAM; - - if (passwd == NULL) - { - *psecret= NULL; - return SASL_OK; - } - - size_t len= strlen(passwd); - ptr= (sasl_secret_t *)malloc(sizeof(sasl_secret_t) + len +1); - if (not ptr) - return SASL_NOMEM; - - ptr->len= len; - memcpy(ptr->data, passwd, len); - ptr->data[len]= 0; - - *psecret= ptr; - return SASL_OK; -} - -typedef int (*local_sasl_fn)(void); - -/* callbacks we support */ -static sasl_callback_t sasl_callbacks[] = { - { SASL_CB_USER, (local_sasl_fn)get_username, NULL }, - { SASL_CB_AUTHNAME, (local_sasl_fn)get_username, NULL }, - { SASL_CB_PASS, (local_sasl_fn)get_password, NULL }, - { SASL_CB_LIST_END, NULL, NULL } -}; - -#endif - -bool initialize_sasl(memcached_st *memc, char *user, char *password) -{ - if (LIBMEMCACHED_WITH_SASL_SUPPORT == 0) - { - return false; - } - - if (memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, (uint64_t)true) == 0) - { - return false; - } - - if (user != NULL && password != NULL) - { - username= user; - passwd= password; - -#if defined(LIBMEMCACHED_WITH_SASL_SUPPORT) && LIBMEMCACHED_WITH_SASL_SUPPORT - if (sasl_client_init(NULL) != SASL_OK) - { - fprintf(stderr, "Failed to initialize sasl library!\n"); - return false; - } - memcached_set_sasl_callbacks(memc, sasl_callbacks); -#else - (void)memc; -#endif - } - - return true; -} - -void shutdown_sasl(void) -{ - if (username or passwd) - { -#if defined(LIBMEMCACHED_WITH_SASL_SUPPORT) && LIBMEMCACHED_WITH_SASL_SUPPORT - sasl_done(); -#endif + exit(EXIT_FAILURE); } }