diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-03-09 13:19:48 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-03-09 13:20:02 +0000 |
commit | 58daab21cd043e1dc37024a7f99b396788372918 (patch) | |
tree | 96771e43bb69f7c1c2b0b4f7374cb74d7866d0cb /web/server/h2o/libh2o/deps/libyrmcds/yc-cnt.c | |
parent | Releasing debian version 1.43.2-1. (diff) | |
download | netdata-58daab21cd043e1dc37024a7f99b396788372918.tar.xz netdata-58daab21cd043e1dc37024a7f99b396788372918.zip |
Merging upstream version 1.44.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'web/server/h2o/libh2o/deps/libyrmcds/yc-cnt.c')
-rw-r--r-- | web/server/h2o/libh2o/deps/libyrmcds/yc-cnt.c | 306 |
1 files changed, 306 insertions, 0 deletions
diff --git a/web/server/h2o/libh2o/deps/libyrmcds/yc-cnt.c b/web/server/h2o/libh2o/deps/libyrmcds/yc-cnt.c new file mode 100644 index 000000000..f25178c2b --- /dev/null +++ b/web/server/h2o/libh2o/deps/libyrmcds/yc-cnt.c @@ -0,0 +1,306 @@ +#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 char USAGE[] = + "Usage: yc-cnt [-s SERVER] [-p PORT] [-h] SUBCOMMAND\n" + "\n" + "Subcommands:\n" + " noop\n" + " get NAME\n" + " acquire RESOURCES MAXIMUM\n" + " release RESOURCES\n" + " stats\n" + " dump\n"; + +static const char DEFAULT_SERVER[] = "localhost"; +static const uint16_t DEFAULT_PORT = 11215; + +static void recv_or_die(yrmcds_cnt* c, yrmcds_cnt_response* r, uint32_t serial) { + yrmcds_error e; + while( 1 ) { + e = yrmcds_cnt_recv(c, r); + if( e != YRMCDS_OK ) { + fprintf(stderr, "yc-cnt: failed to recv: %s\n", + yrmcds_strerror(e)); + yrmcds_cnt_close(c); + exit(1); + } + if( r->serial == serial ) + break; + } +} + +static void cmd_noop(yrmcds_cnt* c) { + yrmcds_error e; + uint32_t serial; + + e = yrmcds_cnt_noop(c, &serial); + if( e != YRMCDS_OK ) { + fprintf(stderr, "yc-cnt: failed to send noop: %s\n", + yrmcds_strerror(e)); + yrmcds_cnt_close(c); + exit(1); + } + + yrmcds_cnt_response r; + recv_or_die(c, &r, serial); + + if( r.status == YRMCDS_STATUS_OK ) { + puts("OK"); + } else { + printf("ERROR: %02x %.*s\n", r.status, (int)r.body_length, r.body); + yrmcds_cnt_close(c); + exit(2); + } +} + +static void cmd_get(yrmcds_cnt* c, + const char* name, size_t name_len) { + yrmcds_error e; + uint32_t serial; + + e = yrmcds_cnt_get(c, name, name_len, &serial); + if( e != YRMCDS_OK ) { + fprintf(stderr, "yc-cnt: failed to send get: %s\n", + yrmcds_strerror(e)); + yrmcds_cnt_close(c); + exit(1); + } + + yrmcds_cnt_response r; + recv_or_die(c, &r, serial); + + if( r.status == YRMCDS_STATUS_OK ) { + printf("%" PRIu32 "\n", r.current_consumption); + } else { + printf("ERROR: %02x %.*s\n", r.status, (int)r.body_length, r.body); + yrmcds_cnt_close(c); + exit(2); + } +} + +static void cmd_acquire(yrmcds_cnt* c, + const char* name, size_t name_len, + uint32_t resouces, uint32_t initial) { + yrmcds_error e; + uint32_t serial; + + e = yrmcds_cnt_acquire(c, name, name_len, resouces, initial, &serial); + if( e != YRMCDS_OK ) { + fprintf(stderr, "yc-cnt: failed to send acquire: %s\n", + yrmcds_strerror(e)); + yrmcds_cnt_close(c); + exit(1); + } + + yrmcds_cnt_response r; + recv_or_die(c, &r, serial); + + if( r.status == YRMCDS_STATUS_OK ) { + printf("%" PRIu32 "\n", r.resources); + } else { + printf("ERROR: %02x %.*s\n", r.status, (int)r.body_length, r.body); + yrmcds_cnt_close(c); + exit(2); + } +} + +static void cmd_release(yrmcds_cnt* c, + const char* name, size_t name_len, + uint32_t resouces) { + yrmcds_error e; + uint32_t serial; + + e = yrmcds_cnt_release(c, name, name_len, resouces, &serial); + if( e != YRMCDS_OK ) { + fprintf(stderr, "yc-cnt: failed to send release: %s\n", + yrmcds_strerror(e)); + yrmcds_cnt_close(c); + exit(1); + } + + yrmcds_cnt_response r; + recv_or_die(c, &r, serial); + + if( r.status == YRMCDS_STATUS_OK ) { + puts("OK"); + } else { + printf("ERROR: %02x %.*s\n", r.status, (int)r.body_length, r.body); + yrmcds_cnt_close(c); + exit(2); + } +} + +static void cmd_stats(yrmcds_cnt* c) { + yrmcds_error e; + uint32_t serial; + + e = yrmcds_cnt_stats(c, &serial); + if( e != YRMCDS_OK ) { + fprintf(stderr, "yc-cnt: failed to send stats: %s\n", + yrmcds_strerror(e)); + yrmcds_cnt_close(c); + exit(1); + } + + yrmcds_cnt_response r; + recv_or_die(c, &r, serial); + + if( r.status == YRMCDS_STATUS_OK ) { + size_t i; + for( i = 0; i < r.stats->count; ++i ) { + yrmcds_cnt_stat* stat = &r.stats->records[i]; + printf("%.*s %.*s\n", (int)stat->name_length, stat->name, + (int)stat->value_length, stat->value); + } + } else { + printf("ERROR: %02x %.*s\n", r.status, (int)r.body_length, r.body); + yrmcds_cnt_close(c); + exit(2); + } +} + +static void cmd_dump(yrmcds_cnt* c) { + yrmcds_error e; + uint32_t serial; + + e = yrmcds_cnt_dump(c, &serial); + if( e != YRMCDS_OK ) { + fprintf(stderr, "yc-cnt: failed to send stats: %s\n", + yrmcds_strerror(e)); + yrmcds_cnt_close(c); + exit(1); + } + + for(;;) { + yrmcds_cnt_response r; + recv_or_die(c, &r, serial); + + if( r.status != YRMCDS_STATUS_OK ) { + printf("ERROR: %02x %.*s\n", r.status, (int)r.body_length, r.body); + yrmcds_cnt_close(c); + exit(2); + } + if( r.body_length == 0 ) + break; + printf("%" PRIu32 " %" PRIu32 " %.*s\n", + r.current_consumption, r.max_consumption, + (int)r.name_length, r.name); + } +} + +void usage() { + fprintf(stderr, "%s", USAGE); + exit(1); +} + +int main(int argc, char** argv) { + const char* server = DEFAULT_SERVER; + uint16_t port = DEFAULT_PORT; + + while( 1 ) { + int n; + int c = getopt(argc, argv, "s:p:h"); + if( c == -1 ) break; + switch( c ) { + case 's': + server = optarg; + break; + case 'p': + n = atoi(optarg); + if( n <= 0 || n > 65535 ) { + fprintf(stderr, "yc-cnt: invalid TCP port.\n"); + return 1; + } + port = (uint16_t)n; + break; + case 'h': + usage(); + default: + return 1; + } + } + + if( optind == argc ) + usage(); + + argc -= optind; + argv += optind; + + yrmcds_cnt c; + yrmcds_error e = yrmcds_cnt_connect(&c, server, port); + if( e != YRMCDS_OK ) { + fprintf(stderr, "yc-cnt: failed to connect to '%s:%d': %s\n", + server, port, yrmcds_strerror(e)); + exit(1); + } + yrmcds_cnt_set_timeout(&c, 1); + + if( strcmp(argv[0], "noop") == 0 ) { + if( argc != 1 ) { + fprintf(stderr, "yc-cnt: invalid number of arguments.\n"); + goto EXIT; + } + cmd_noop(&c); + } else if( strcmp(argv[0], "get") == 0 ) { + if( argc != 2 ) { + fprintf(stderr, "yc-cnt: invalid number of arguments.\n"); + goto EXIT; + } + cmd_get(&c, argv[1], strlen(argv[1])); + } else if( strcmp(argv[0], "acquire") == 0 ){ + if( argc != 4 ) { + fprintf(stderr, "yc-cnt: invalid number of arguments.\n"); + goto EXIT; + } + uint32_t resources, initial; + if( sscanf(argv[2], "%" PRIu32, &resources) != 1 ) { + fprintf(stderr, "yc-cnt: RESOURCES must be a unsigned 4-byte integer.\n"); + goto EXIT; + } + if( sscanf(argv[3], "%" PRIu32, &initial) != 1 ) { + fprintf(stderr, "yc-cnt: MAXIMUM must be a unsigned 4-byte integer.\n"); + goto EXIT; + } + cmd_acquire(&c, argv[1], strlen(argv[1]), resources, initial); + } else if( strcmp(argv[0], "release") == 0 ){ + if( argc != 3 ) { + fprintf(stderr, "yc-cnt: invalid number of arguments.\n"); + goto EXIT; + } + uint32_t resources; + if( sscanf(argv[2], "%" PRIu32, &resources) != 1 ) { + fprintf(stderr, "yc-cnt: RESOURCES must be a unsigned 4-byte integer.\n"); + goto EXIT; + } + cmd_release(&c, argv[1], strlen(argv[1]), resources); + } else if( strcmp(argv[0], "stats") == 0 ) { + if( argc != 1 ) { + fprintf(stderr, "yc-cnt: invalid number of arguments.\n"); + goto EXIT; + } + cmd_stats(&c); + } else if( strcmp(argv[0], "dump") == 0 ) { + if( argc != 1 ) { + fprintf(stderr, "yc-cnt: invalid number of arguments.\n"); + goto EXIT; + } + cmd_dump(&c); + } else { + fprintf(stderr, "yc-cnt: unknown command: %s\n", argv[0]); + goto EXIT; + } + + yrmcds_cnt_close(&c); + return 0; + +EXIT: + yrmcds_cnt_close(&c); + exit(1); +} |