X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=clients%2Futilities.c;h=52f46b40562fc55b1bcc5b4b79ea1944de643cd8;hb=3fca91c00a13fa7d6650bfe65aabf074fa5579b5;hp=9ad6edcf90789310dea7d3c4da3abcc8dbb45ac1;hpb=17e0b84e30fe82f6a2a995484a502179c73906ea;p=m6w6%2Flibmemcached diff --git a/clients/utilities.c b/clients/utilities.c index 9ad6edcf..52f46b40 100644 --- a/clients/utilities.c +++ b/clients/utilities.c @@ -1,4 +1,15 @@ -#include "libmemcached/common.h" +/* LibMemcached + * Copyright (C) 2006-2009 Brian Aker + * All rights reserved. + * + * Use and distribution licensed under the BSD license. See + * the COPYING file in the parent directory for full text. + * + * Summary: + * + */ +#include "config.h" + #include #include #include @@ -7,7 +18,7 @@ long int timedif(struct timeval a, struct timeval b) { - register int us, s; + long us, s; us = (int)(a.tv_usec - b.tv_usec); us /= 1000; @@ -18,7 +29,7 @@ long int timedif(struct timeval a, struct timeval b) void version_command(const char *command_name) { - printf("%s v%u.%u\n", command_name, 1, 0); + printf("%s v%u.%u\n", command_name, 1U, 0U); exit(0); } @@ -28,7 +39,7 @@ static const char *lookup_help(memcached_options option) { case OPT_SERVERS: return("List which servers you wish to connect to."); case OPT_VERSION: return("Display the version of the application and then exit."); - case OPT_HELP: return("Diplay this message 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_DEBUG: return("Provide output only useful for debugging."); case OPT_FLAG: return("Provide flag information for storage operation."); @@ -47,6 +58,10 @@ 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_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); }; @@ -60,16 +75,16 @@ void help_command(const char *command_name, const char *description, { unsigned int x; - printf("%s v%u.%u\n\n", command_name, 1, 0); + printf("%s v%u.%u\n\n", command_name, 1U, 0U); printf("\t%s\n\n", description); printf("Current options. A '=' means the option takes a value.\n\n"); - for (x= 0; long_options[x].name; x++) + for (x= 0; long_options[x].name; x++) { const char *help_message; - printf("\t --%s%c\n", long_options[x].name, - long_options[x].has_arg ? '=' : ' '); + printf("\t --%s%c\n", long_options[x].name, + long_options[x].has_arg ? '=' : ' '); if ((help_message= lookup_help(long_options[x].val))) printf("\t\t%s\n", help_message); } @@ -81,7 +96,7 @@ void help_command(const char *command_name, const char *description, void process_hash_option(memcached_st *memc, char *opt_hash) { uint64_t set; - memcached_return rc; + memcached_return_t rc; if (opt_hash == NULL) return; @@ -111,3 +126,106 @@ void process_hash_option(memcached_st *memc, char *opt_hash) } } +#ifdef LIBMEMCACHED_WITH_SASL_SUPPORT +static char *username; +static char *passwd; + +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* x; + + if (!conn || ! psecret || id != SASL_CB_PASS) + return SASL_BADPARAM; + + if (passwd == NULL) + { + *psecret= NULL; + return SASL_OK; + } + + size_t len= strlen(passwd); + x = realloc(x, sizeof(sasl_secret_t) + len); + if (!x) + return SASL_NOMEM; + + x->len = len; + strcpy((void *)x->data, passwd); + + *psecret = x; + return SASL_OK; +} + +/* callbacks we support */ +static sasl_callback_t sasl_callbacks[] = { + { + SASL_CB_USER, &get_username, NULL + }, { + SASL_CB_AUTHNAME, &get_username, NULL + }, { + SASL_CB_PASS, &get_password, NULL + }, { + SASL_CB_LIST_END, NULL, NULL + } +}; +#endif + +bool initialize_sasl(memcached_st *memc, char *user, char *password) +{ +#ifdef LIBMEMCACHED_WITH_SASL_SUPPORT + if (user != NULL && password != NULL) + { + username= user; + passwd= password; + + 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; + (void)user; + (void)password; +#endif + + return true; +} + +void shutdown_sasl(void) +{ +#ifdef LIBMEMCACHED_WITH_SASL_SUPPORT + if (username != NULL || passwd != NULL) + sasl_done(); +#endif +} + +void initialize_sockets(void) +{ + /* Define the function for all platforms to avoid #ifdefs in each program */ +#ifdef WIN32 + WSADATA wsaData; + if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0) + { + fprintf(stderr, "Socket Initialization Error. Program aborted\n"); + exit(EXIT_FAILURE); + } +#endif +}