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;
"%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);
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;
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);
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];
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);
{
memcached_return rc;
char buffer[HUGE_STRING_LEN];
- size_t send_length;
+ size_t send_length, sent_length;
rc= memcached_connect(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;
}
"%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);
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];
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++)
{
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
\r
memrm_SOURCES = memrm.c utilities.c\r
memrm_LDADD = $(LDADDS)\r
+\r
+memflush_SOURCES = memflush.c utilities.c\r
+memflush_LDADD = $(LDADDS)\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, memcat, v1.0\n");\r
exit(0);\r
{\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
{\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
--- /dev/null
+#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
{\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
{
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);