diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-30 02:49:40 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-30 02:49:40 +0000 |
commit | c96f16e8103783f6b98d9f844ea3a7f2195e4834 (patch) | |
tree | 479bef5e7eb5d4f04ba171931c8b47335734e161 /debian/vendor-h2o/deps/libyrmcds/yc.c | |
parent | Merging upstream version 1.9.4. (diff) | |
download | dnsdist-debian/1.9.4-1.tar.xz dnsdist-debian/1.9.4-1.zip |
Adding debian version 1.9.4-1.debian/1.9.4-1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'debian/vendor-h2o/deps/libyrmcds/yc.c')
-rw-r--r-- | debian/vendor-h2o/deps/libyrmcds/yc.c | 1099 |
1 files changed, 0 insertions, 1099 deletions
diff --git a/debian/vendor-h2o/deps/libyrmcds/yc.c b/debian/vendor-h2o/deps/libyrmcds/yc.c deleted file mode 100644 index 78d3df4..0000000 --- a/debian/vendor-h2o/deps/libyrmcds/yc.c +++ /dev/null @@ -1,1099 +0,0 @@ -// (C) 2013-2015 Cybozu. - -#include "yrmcds.h" - -#include <errno.h> -#include <fcntl.h> -#include <inttypes.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -static const uint16_t DEFAULT_PORT = 11211; -static const char DEFAULT_SERVER[] = "localhost"; -static const size_t DEFAULT_COMPRESS = 16384; -static int debug = 0; -static int quiet = 0; - -static void version() { - printf("yc with libyrmcds " LIBYRMCDS_VERSION "\n"); -} - -static void usage() { - printf("Usage: yc " - "[-h] [-v] [-d] [-t] [-s SERVER] [-p PORT] [-c COMPRESS] COMMAND ...\n\n" - "Options:\n" - " -h print help and exit.\n" - " -v print version information.\n" - " -d turn on debug messages.\n" - " -t turn on text protocol mode.\n" - " -q Use quiet commands, if possible.\n" - " -s connect to SERVER. Default: localhost\n" - " -p TCP port number. Default: 11211\n" - " -c compression threshold. Default: 16384\n\n" - "Commands:\n" - " noop\n" - " ping the server.\n" - " get KEY\n" - " get an object.\n" - " getk KEY\n" - " get an object with key.\n" - " gat KEY EXPIRE\n" - " get and touch an object.\n" - " gatk KEY EXPIRE\n" - " get and touch an object with key.\n" - " lag KEY\n" - " lock and get an object.\n" - " lagk KEY\n" - " lock and get an object with key.\n" - " touch KEY EXPIRE\n" - " touch an object.\n" - " set KEY FILE [EXPIRE [FLAGS [CAS]]]\n" - " store FILE data. If FILE is \"-\", stdin is used.\n" - " replace KEY FILE [EXPIRE [FLAGS [CAS]]]\n" - " update an existing object. FILE is the same as set.\n" - " add KEY FILE [EXPIRE [FLAGS [CAS]]]\n" - " create a new object. FILE is the same as set.\n" - " rau KEY FILE [EXPIRE [FLAGS]]\n" - " replace a locked object then unlock it.\n" - " Since this command always fails, do not use this.\n" - " incr KEY VALUE [INITIAL [EXPIRE]]\n" - " increments an exiting object's value by VALUE.\n" - " If INITIAL is given, new object is created when KEY\n" - " is not found. EXPIRE is used only when an object is\n" - " created.\n" - " decr KEY VALUE [INITIAL [EXPIRE]]\n" - " decrements an exiting object's value by VALUE.\n" - " If INITIAL is given, new object is created when KEY\n" - " is not found. EXPIRE is used only when an object is\n" - " created.\n" - " append KEY FILE\n" - " append FILE data FILE is the same as set.\n" - " prepend KEY FILE\n" - " prepend FILE data FILE is the same as set.\n" - " delete KEY\n" - " delete an object.\n" - " lock KEY\n" - " locks an object.\n" - " unlock KEY\n" - " this command always fails. Do not use this.\n" - " unlockall\n" - " this command has no effect.\n" - " flush [DELAY]\n" - " flush all unlocked items immediately or after DELAY seconds.\n" - " stat [settings|items|sizes]\n" - " obtain general or specified statistics.\n" - " keys [PREFIX]\n" - " dump keys matching PREFIX.\n" - " version\n" - " shows the server version.\n" - " quit\n" - " just quits. Not much interesting.\n" - ); -} - -static void print_response(const yrmcds_response* r) { - fprintf(stderr, "dump response:\n" - " serial: %u\n" - " length: %lu\n" - " status: 0x%04x\n" - " command: 0x%02x\n" - " cas: %" PRIu64 "\n" - " flags: 0x%08x\n" - " value: %" PRIu64 "\n", - r->serial, (unsigned long)r->length, r->status, r->command, - r->cas_unique, r->flags, r->value); - if( r->key_len ) - fprintf(stderr, " key: %.*s (%lu bytes)\n", - (int)r->key_len, r->key, (unsigned long)r->key_len); - if( r->data_len ) - fprintf(stderr, " data: %.*s (%lu bytes)\n", - (int)r->data_len, r->data, (unsigned long)r->data_len); -} - -static void write_data(const yrmcds_response* r) { - const char* p = r->data; - size_t to_write = r->data_len; - while( to_write > 0 ) { - ssize_t n = write(STDOUT_FILENO, p, to_write); - if( n == -1 ) return; - p += n; - to_write -= (size_t)n; - } - // writing a newline breaks data equality... - //char nl = '\n'; - //write(STDOUT_FILENO, &nl, 1); -} - -static size_t read_data(const char* filename, char** pdata) { - int fd; - if( strcmp(filename, "-") == 0 ) { - fd = STDIN_FILENO; - } else { - fd = open(filename, O_RDONLY); - if( fd == -1 ) return 0; - } - - size_t data_len = 0; - size_t capacity = 1 << 20; - *pdata = (char*)malloc(capacity); - if( *pdata == NULL ) return 0; - while( 1 ) { - if( (capacity - data_len) < (1 << 20) ) { - char* new_data = (char*)realloc(*pdata, capacity * 2); - if( new_data == NULL ) { - free(*pdata); - *pdata = NULL; - return 0; - } - *pdata = new_data; - capacity *= 2; - } - ssize_t n = read(fd, *pdata + data_len, 1 << 20); - if( n == -1 ) { - free(*pdata); - *pdata = NULL; - return 0; - } - if( n == 0 ) break; - data_len += (size_t)n; - } - - if( fd != STDIN_FILENO ) - close(fd); - return data_len; -} - - -#define CHECK_ERROR(e) \ - if( e != 0 ) { \ - if( e == YRMCDS_SYSTEM_ERROR ) { \ - fprintf(stderr, "system error: %s\n", strerror(errno)); \ - } else { \ - fprintf(stderr, "yrmcds error: %s\n", yrmcds_strerror(e)); \ - } \ - return 2; \ - } - -#define CHECK_RESPONSE(r) \ - if( r->status != YRMCDS_STATUS_OK ) { \ - fprintf(stderr, "Command failed: 0x%04x %.*s\n", \ - r->status, (int)r->data_len, r->data); \ - return 3; \ - } - -int cmd_noop(int argc, char** argv, yrmcds* s) { - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - printf("OK\n"); - return 0; -} - -int cmd_get(int argc, char** argv, yrmcds* s) { - if( argc != 1 ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_get(s, argv[0], strlen(argv[0]), quiet, &serial); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - write_data(r); - return 0; -} - -int cmd_getk(int argc, char** argv, yrmcds* s) { - if( argc != 1 ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_getk(s, argv[0], strlen(argv[0]), quiet, &serial); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - write_data(r); - return 0; -} - -int cmd_gat(int argc, char** argv, yrmcds* s) { - if( argc != 2 ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - const char* key = argv[0]; - uint32_t expire = (uint32_t)strtoull(argv[1], NULL, 0); - - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_get_touch(s, key, strlen(key), expire, quiet, &serial); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - write_data(r); - return 0; -} - -int cmd_gatk(int argc, char** argv, yrmcds* s) { - if( argc != 2 ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - const char* key = argv[0]; - uint32_t expire = (uint32_t)strtoull(argv[1], NULL, 0); - - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_getk_touch(s, key, strlen(key), expire, quiet, &serial); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - write_data(r); - return 0; -} - -int cmd_lag(int argc, char** argv, yrmcds* s) { - if( argc != 1 ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_lock_get(s, argv[0], strlen(argv[0]), quiet, &serial); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - write_data(r); - fprintf(stderr, "Press enter to unlock.\n"); - getchar(); - return 0; -} - -int cmd_lagk(int argc, char** argv, yrmcds* s) { - if( argc != 1 ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_lock_getk(s, argv[0], strlen(argv[0]), quiet, &serial); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - write_data(r); - fprintf(stderr, "Press enter to unlock.\n"); - getchar(); - return 0; -} - -int cmd_touch(int argc, char** argv, yrmcds* s) { - if( argc != 2 ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - const char* key = argv[0]; - uint32_t expire = (uint32_t)strtoull(argv[1], NULL, 0); - - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_touch(s, key, strlen(key), expire, quiet, &serial); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - return 0; -} - -int cmd_set(int argc, char** argv, yrmcds* s) { - if( argc < 2 || 5 < argc ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - const char* key = argv[0]; - char* data = NULL; - size_t data_len = read_data(argv[1], &data); - if( data == NULL ) { - fprintf(stderr, "Failed to read data.\n"); - return 2; - } - uint32_t expire = 0; - uint32_t flags = 0; - uint64_t cas = 0; - - if( argc > 2 ) - expire = (uint32_t)strtoull(argv[2], NULL, 0); - if( argc > 3 ) - flags = (uint32_t)strtoull(argv[3], NULL, 0); - if( argc > 4 ) - cas = (uint64_t)strtoull(argv[4], NULL, 0); - - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_set(s, key, strlen(key), data, data_len, - flags, expire, cas, quiet, &serial); - free(data); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - return 0; -} - -int cmd_replace(int argc, char** argv, yrmcds* s) { - if( argc < 2 || 5 < argc ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - const char* key = argv[0]; - char* data = NULL; - size_t data_len = read_data(argv[1], &data); - if( data == NULL ) { - fprintf(stderr, "Failed to read data.\n"); - return 2; - } - uint32_t expire = 0; - uint32_t flags = 0; - uint64_t cas = 0; - - if( argc > 2 ) - expire = (uint32_t)strtoull(argv[2], NULL, 0); - if( argc > 3 ) - flags = (uint32_t)strtoull(argv[3], NULL, 0); - if( argc > 4 ) - cas = (uint64_t)strtoull(argv[4], NULL, 0); - - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_replace(s, key, strlen(key), data, data_len, - flags, expire, cas, quiet, &serial); - free(data); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - return 0; -} - -int cmd_add(int argc, char** argv, yrmcds* s) { - if( argc < 2 || 5 < argc ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - const char* key = argv[0]; - char* data = NULL; - size_t data_len = read_data(argv[1], &data); - if( data == NULL ) { - fprintf(stderr, "Failed to read data.\n"); - return 2; - } - uint32_t expire = 0; - uint32_t flags = 0; - uint64_t cas = 0; - - if( argc > 2 ) - expire = (uint32_t)strtoull(argv[2], NULL, 0); - if( argc > 3 ) - flags = (uint32_t)strtoull(argv[3], NULL, 0); - if( argc > 4 ) - cas = (uint64_t)strtoull(argv[4], NULL, 0); - - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_add(s, key, strlen(key), data, data_len, - flags, expire, cas, quiet, &serial); - free(data); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - return 0; -} - -int cmd_rau(int argc, char** argv, yrmcds* s) { - if( argc < 2 || 4 < argc ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - const char* key = argv[0]; - char* data = NULL; - size_t data_len = read_data(argv[1], &data); - if( data == NULL ) { - fprintf(stderr, "Failed to read data.\n"); - return 2; - } - uint32_t expire = 0; - uint32_t flags = 0; - - if( argc > 2 ) - expire = (uint32_t)strtoull(argv[2], NULL, 0); - if( argc > 3 ) - flags = (uint32_t)strtoull(argv[3], NULL, 0); - - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_replace_unlock(s, key, strlen(key), data, data_len, - flags, expire, quiet, &serial); - free(data); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - return 0; -} - -int cmd_incr(int argc, char** argv, yrmcds* s) { - if( argc < 2 || 4 < argc ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - const char* key = argv[0]; - uint64_t value = (uint64_t)strtoull(argv[1], NULL, 0); - uint64_t initial = 0; - uint32_t expire = ~(uint32_t)0; - - if( argc > 2 ) { - initial = (uint64_t)strtoull(argv[2], NULL, 0); - expire = 0; - } - if( argc > 3 ) - expire = (uint32_t)strtoull(argv[3], NULL, 0); - - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e; - if( argc == 2 ) { - e = yrmcds_incr(s, key, strlen(key), value, quiet, &serial); - } else { - e = yrmcds_incr2(s, key, strlen(key), value, initial, expire, - quiet, &serial); - } - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - printf("%" PRIu64 "\n", r->value); - return 0; -} - -int cmd_decr(int argc, char** argv, yrmcds* s) { - if( argc < 2 || 4 < argc ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - const char* key = argv[0]; - uint64_t value = (uint64_t)strtoull(argv[1], NULL, 0); - uint64_t initial = 0; - uint32_t expire = ~(uint32_t)0; - - if( argc > 2 ) { - initial = (uint64_t)strtoull(argv[2], NULL, 0); - expire = 0; - } - if( argc > 3 ) - expire = (uint32_t)strtoull(argv[3], NULL, 0); - - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e; - if( argc == 2 ) { - e = yrmcds_decr(s, key, strlen(key), value, quiet, &serial); - } else { - e = yrmcds_decr2(s, key, strlen(key), value, initial, expire, - quiet, &serial); - } - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - printf("%" PRIu64 "\n", r->value); - return 0; -} - -int cmd_append(int argc, char** argv, yrmcds* s) { - if( argc != 2 ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - const char* key = argv[0]; - char* data = NULL; - size_t data_len = read_data(argv[1], &data); - if( data == NULL ) { - fprintf(stderr, "Failed to read data.\n"); - return 2; - } - - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_append(s, key, strlen(key), - data, data_len, quiet, &serial); - free(data); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - return 0; -} - -int cmd_prepend(int argc, char** argv, yrmcds* s) { - if( argc != 2 ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - const char* key = argv[0]; - char* data = NULL; - size_t data_len = read_data(argv[1], &data); - if( data == NULL ) { - fprintf(stderr, "Failed to read data.\n"); - return 2; - } - - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_prepend(s, key, strlen(key), - data, data_len, quiet, &serial); - free(data); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - return 0; -} - -int cmd_delete(int argc, char** argv, yrmcds* s) { - if( argc != 1 ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_remove(s, argv[0], strlen(argv[0]), quiet, &serial); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - write_data(r); - return 0; -} - -int cmd_lock(int argc, char** argv, yrmcds* s) { - if( argc != 1 ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_lock(s, argv[0], strlen(argv[0]), quiet, &serial); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - fprintf(stderr, "Press enter to unlock.\n"); - getchar(); - return 0; -} - -int cmd_unlock(int argc, char** argv, yrmcds* s) { - if( argc != 1 ) { - fprintf(stderr, "Wrong number of arguments.\n"); - return 1; - } - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_unlock(s, argv[0], strlen(argv[0]), quiet, &serial); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - return 0; -} - -int cmd_unlockall(int argc, char** argv, yrmcds* s) { - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_unlockall(s, quiet, &serial); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - return 0; -} - -int cmd_flush(int argc, char** argv, yrmcds* s) { - uint32_t delay = 0; - if( argc == 1 ) - delay = (uint32_t)strtoull(argv[0], NULL, 0); - - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_flush(s, delay, quiet, &serial); - CHECK_ERROR(e); - if( quiet ) { - e = yrmcds_noop(s, &serial); - CHECK_ERROR(e); - } - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial == serial ) - break; - } - return 0; -} - -int cmd_stat(int argc, char** argv, yrmcds* s) { - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e; - if( argc > 0 ) { - if( strcmp(argv[0], "settings") == 0 ) { - e = yrmcds_stat_settings(s, &serial); - } else if( strcmp(argv[0], "items") == 0 ) { - e = yrmcds_stat_items(s, &serial); - } else if( strcmp(argv[0], "sizes") == 0 ) { - e = yrmcds_stat_sizes(s, &serial); - } else { - fprintf(stderr, "No such statistics.\n"); - return 1; - } - } else { - e = yrmcds_stat_general(s, &serial); - } - CHECK_ERROR(e); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->key_len == 0 ) - break; - if( r->data_len == 0 ) - continue; - printf("%.*s: %.*s\n", (int)r->key_len, r->key, - (int)r->data_len, r->data); - } - return 0; -} - -int cmd_keys(int argc, char** argv, yrmcds* s) { - const char* prefix = NULL; - size_t prefix_len = 0; - if( argc == 1 ) { - prefix = argv[0]; - prefix_len = strlen(prefix); - } - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_keys(s, prefix, prefix_len, &serial); - CHECK_ERROR(e); - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - while( 1 ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - if( r->serial != serial ) - continue; - if( r->key_len == 0 ) - break; - printf("%.*s\n", (int)r->key_len, r->key); - } - return 0; -} - -int cmd_version(int argc, char** argv, yrmcds* s) { - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_version(s, &serial); - CHECK_ERROR(e); - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - printf("%.*s\n", (int)r->data_len, r->data); - return 0; -} - -int cmd_quit(int argc, char** argv, yrmcds* s) { - yrmcds_response r[1]; - uint32_t serial; - yrmcds_error e = yrmcds_quit(s, quiet, &serial); - CHECK_ERROR(e); - if( debug ) - fprintf(stderr, "request serial = %u\n", serial); - if( ! quiet ) { - e = yrmcds_recv(s, r); - CHECK_ERROR(e); - if( debug ) - print_response(r); - CHECK_RESPONSE(r); - } - return 0; -} - -int main(int argc, char** argv) { - const char* server = DEFAULT_SERVER; - uint16_t port = DEFAULT_PORT; - size_t compression = DEFAULT_COMPRESS; - int text_mode = 0; - - while( 1 ) { - int n; - int c = getopt(argc, argv, "s:p:c:dtqvh"); - if( c == -1 ) break; - switch( c ) { - case 's': - server = optarg; - break; - case 'p': - n = atoi(optarg); - if( n <= 0 || n > 65535 ) { - fprintf(stderr, "Invalid TCP port.\n"); - return 1; - } - port = (uint16_t)n; - break; - case 'c': - n = atoi(optarg); - if( n <= 0 ) { - fprintf(stderr, "Invalid compression thoreshold.\n"); - return 1; - } - compression = (size_t)n; - break; - case 'd': - debug = 1; - break; - case 't': - text_mode = 1; - break; - case 'q': - quiet = 1; - break; - case 'v': - version(); - return 0; - case 'h': - usage(); - return 0; - default: - return 1; - } - } - - if( optind == argc ) { - usage(); - return 0; - } - - const char* cmd = argv[optind]; - argc -= optind + 1; - argv += optind + 1; - - yrmcds s[1]; - yrmcds_error e = yrmcds_connect(s, server, port); - CHECK_ERROR(e); - if( text_mode ) { - e = yrmcds_text_mode(s); - CHECK_ERROR(e); - } - e = yrmcds_set_compression(s, compression); - if( e != 0 && e != YRMCDS_NOT_IMPLEMENTED ) { - yrmcds_close(s); - CHECK_ERROR(e); - } - - int ret = 1; -#define do_cmd(name) \ - if( strcmp(cmd, #name) == 0 ) { \ - ret = cmd_##name(argc, argv, s); \ - goto OUT; \ - } - - do_cmd(noop); - do_cmd(get); - do_cmd(getk); - do_cmd(gat); - do_cmd(gatk); - do_cmd(lag); - do_cmd(lagk); - do_cmd(touch); - do_cmd(set); - do_cmd(replace); - do_cmd(add); - do_cmd(rau); - do_cmd(incr); - do_cmd(decr); - do_cmd(append); - do_cmd(prepend); - do_cmd(delete); - do_cmd(lock); - do_cmd(unlock); - do_cmd(unlockall); - do_cmd(flush); - do_cmd(stat); - do_cmd(keys); - do_cmd(version); - do_cmd(quit); - - fprintf(stderr, "No such command: %s\n", cmd); - - OUT: - yrmcds_close(s); - return ret; -} |