yc-cnt.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. #include "yrmcds.h"
  2. #include <errno.h>
  3. #include <fcntl.h>
  4. #include <inttypes.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <unistd.h>
  9. static const char USAGE[] =
  10. "Usage: yc-cnt [-s SERVER] [-p PORT] [-h] SUBCOMMAND\n"
  11. "\n"
  12. "Subcommands:\n"
  13. " noop\n"
  14. " get NAME\n"
  15. " acquire RESOURCES MAXIMUM\n"
  16. " release RESOURCES\n"
  17. " stats\n"
  18. " dump\n";
  19. static const char DEFAULT_SERVER[] = "localhost";
  20. static const uint16_t DEFAULT_PORT = 11215;
  21. static void recv_or_die(yrmcds_cnt* c, yrmcds_cnt_response* r, uint32_t serial) {
  22. yrmcds_error e;
  23. while( 1 ) {
  24. e = yrmcds_cnt_recv(c, r);
  25. if( e != YRMCDS_OK ) {
  26. fprintf(stderr, "yc-cnt: failed to recv: %s\n",
  27. yrmcds_strerror(e));
  28. yrmcds_cnt_close(c);
  29. exit(1);
  30. }
  31. if( r->serial == serial )
  32. break;
  33. }
  34. }
  35. static void cmd_noop(yrmcds_cnt* c) {
  36. yrmcds_error e;
  37. uint32_t serial;
  38. e = yrmcds_cnt_noop(c, &serial);
  39. if( e != YRMCDS_OK ) {
  40. fprintf(stderr, "yc-cnt: failed to send noop: %s\n",
  41. yrmcds_strerror(e));
  42. yrmcds_cnt_close(c);
  43. exit(1);
  44. }
  45. yrmcds_cnt_response r;
  46. recv_or_die(c, &r, serial);
  47. if( r.status == YRMCDS_STATUS_OK ) {
  48. puts("OK");
  49. } else {
  50. printf("ERROR: %02x %.*s\n", r.status, (int)r.body_length, r.body);
  51. yrmcds_cnt_close(c);
  52. exit(2);
  53. }
  54. }
  55. static void cmd_get(yrmcds_cnt* c,
  56. const char* name, size_t name_len) {
  57. yrmcds_error e;
  58. uint32_t serial;
  59. e = yrmcds_cnt_get(c, name, name_len, &serial);
  60. if( e != YRMCDS_OK ) {
  61. fprintf(stderr, "yc-cnt: failed to send get: %s\n",
  62. yrmcds_strerror(e));
  63. yrmcds_cnt_close(c);
  64. exit(1);
  65. }
  66. yrmcds_cnt_response r;
  67. recv_or_die(c, &r, serial);
  68. if( r.status == YRMCDS_STATUS_OK ) {
  69. printf("%" PRIu32 "\n", r.current_consumption);
  70. } else {
  71. printf("ERROR: %02x %.*s\n", r.status, (int)r.body_length, r.body);
  72. yrmcds_cnt_close(c);
  73. exit(2);
  74. }
  75. }
  76. static void cmd_acquire(yrmcds_cnt* c,
  77. const char* name, size_t name_len,
  78. uint32_t resouces, uint32_t initial) {
  79. yrmcds_error e;
  80. uint32_t serial;
  81. e = yrmcds_cnt_acquire(c, name, name_len, resouces, initial, &serial);
  82. if( e != YRMCDS_OK ) {
  83. fprintf(stderr, "yc-cnt: failed to send acquire: %s\n",
  84. yrmcds_strerror(e));
  85. yrmcds_cnt_close(c);
  86. exit(1);
  87. }
  88. yrmcds_cnt_response r;
  89. recv_or_die(c, &r, serial);
  90. if( r.status == YRMCDS_STATUS_OK ) {
  91. printf("%" PRIu32 "\n", r.resources);
  92. } else {
  93. printf("ERROR: %02x %.*s\n", r.status, (int)r.body_length, r.body);
  94. yrmcds_cnt_close(c);
  95. exit(2);
  96. }
  97. }
  98. static void cmd_release(yrmcds_cnt* c,
  99. const char* name, size_t name_len,
  100. uint32_t resouces) {
  101. yrmcds_error e;
  102. uint32_t serial;
  103. e = yrmcds_cnt_release(c, name, name_len, resouces, &serial);
  104. if( e != YRMCDS_OK ) {
  105. fprintf(stderr, "yc-cnt: failed to send release: %s\n",
  106. yrmcds_strerror(e));
  107. yrmcds_cnt_close(c);
  108. exit(1);
  109. }
  110. yrmcds_cnt_response r;
  111. recv_or_die(c, &r, serial);
  112. if( r.status == YRMCDS_STATUS_OK ) {
  113. puts("OK");
  114. } else {
  115. printf("ERROR: %02x %.*s\n", r.status, (int)r.body_length, r.body);
  116. yrmcds_cnt_close(c);
  117. exit(2);
  118. }
  119. }
  120. static void cmd_stats(yrmcds_cnt* c) {
  121. yrmcds_error e;
  122. uint32_t serial;
  123. e = yrmcds_cnt_stats(c, &serial);
  124. if( e != YRMCDS_OK ) {
  125. fprintf(stderr, "yc-cnt: failed to send stats: %s\n",
  126. yrmcds_strerror(e));
  127. yrmcds_cnt_close(c);
  128. exit(1);
  129. }
  130. yrmcds_cnt_response r;
  131. recv_or_die(c, &r, serial);
  132. if( r.status == YRMCDS_STATUS_OK ) {
  133. size_t i;
  134. for( i = 0; i < r.stats->count; ++i ) {
  135. yrmcds_cnt_stat* stat = &r.stats->records[i];
  136. printf("%.*s %.*s\n", (int)stat->name_length, stat->name,
  137. (int)stat->value_length, stat->value);
  138. }
  139. } else {
  140. printf("ERROR: %02x %.*s\n", r.status, (int)r.body_length, r.body);
  141. yrmcds_cnt_close(c);
  142. exit(2);
  143. }
  144. }
  145. static void cmd_dump(yrmcds_cnt* c) {
  146. yrmcds_error e;
  147. uint32_t serial;
  148. e = yrmcds_cnt_dump(c, &serial);
  149. if( e != YRMCDS_OK ) {
  150. fprintf(stderr, "yc-cnt: failed to send stats: %s\n",
  151. yrmcds_strerror(e));
  152. yrmcds_cnt_close(c);
  153. exit(1);
  154. }
  155. for(;;) {
  156. yrmcds_cnt_response r;
  157. recv_or_die(c, &r, serial);
  158. if( r.status != YRMCDS_STATUS_OK ) {
  159. printf("ERROR: %02x %.*s\n", r.status, (int)r.body_length, r.body);
  160. yrmcds_cnt_close(c);
  161. exit(2);
  162. }
  163. if( r.body_length == 0 )
  164. break;
  165. printf("%" PRIu32 " %" PRIu32 " %.*s\n",
  166. r.current_consumption, r.max_consumption,
  167. (int)r.name_length, r.name);
  168. }
  169. }
  170. void usage() {
  171. fprintf(stderr, "%s", USAGE);
  172. exit(1);
  173. }
  174. //int main(int argc, char** argv) {
  175. // const char* server = DEFAULT_SERVER;
  176. // uint16_t port = DEFAULT_PORT;
  177. //
  178. // while( 1 ) {
  179. // int n;
  180. // int c = getopt(argc, argv, "s:p:h");
  181. // if( c == -1 ) break;
  182. // switch( c ) {
  183. // case 's':
  184. // server = optarg;
  185. // break;
  186. // case 'p':
  187. // n = atoi(optarg);
  188. // if( n <= 0 || n > 65535 ) {
  189. // fprintf(stderr, "yc-cnt: invalid TCP port.\n");
  190. // return 1;
  191. // }
  192. // port = (uint16_t)n;
  193. // break;
  194. // case 'h':
  195. // usage();
  196. // default:
  197. // return 1;
  198. // }
  199. // }
  200. //
  201. // if( optind == argc )
  202. // usage();
  203. //
  204. // argc -= optind;
  205. // argv += optind;
  206. //
  207. // yrmcds_cnt c;
  208. // yrmcds_error e = yrmcds_cnt_connect(&c, server, port);
  209. // if( e != YRMCDS_OK ) {
  210. // fprintf(stderr, "yc-cnt: failed to connect to '%s:%d': %s\n",
  211. // server, port, yrmcds_strerror(e));
  212. // exit(1);
  213. // }
  214. // yrmcds_cnt_set_timeout(&c, 1);
  215. //
  216. // if( strcmp(argv[0], "noop") == 0 ) {
  217. // if( argc != 1 ) {
  218. // fprintf(stderr, "yc-cnt: invalid number of arguments.\n");
  219. // goto EXIT;
  220. // }
  221. // cmd_noop(&c);
  222. // } else if( strcmp(argv[0], "get") == 0 ) {
  223. // if( argc != 2 ) {
  224. // fprintf(stderr, "yc-cnt: invalid number of arguments.\n");
  225. // goto EXIT;
  226. // }
  227. // cmd_get(&c, argv[1], strlen(argv[1]));
  228. // } else if( strcmp(argv[0], "acquire") == 0 ){
  229. // if( argc != 4 ) {
  230. // fprintf(stderr, "yc-cnt: invalid number of arguments.\n");
  231. // goto EXIT;
  232. // }
  233. // uint32_t resources, initial;
  234. // if( sscanf(argv[2], "%" PRIu32, &resources) != 1 ) {
  235. // fprintf(stderr, "yc-cnt: RESOURCES must be a unsigned 4-byte integer.\n");
  236. // goto EXIT;
  237. // }
  238. // if( sscanf(argv[3], "%" PRIu32, &initial) != 1 ) {
  239. // fprintf(stderr, "yc-cnt: MAXIMUM must be a unsigned 4-byte integer.\n");
  240. // goto EXIT;
  241. // }
  242. // cmd_acquire(&c, argv[1], strlen(argv[1]), resources, initial);
  243. // } else if( strcmp(argv[0], "release") == 0 ){
  244. // if( argc != 3 ) {
  245. // fprintf(stderr, "yc-cnt: invalid number of arguments.\n");
  246. // goto EXIT;
  247. // }
  248. // uint32_t resources;
  249. // if( sscanf(argv[2], "%" PRIu32, &resources) != 1 ) {
  250. // fprintf(stderr, "yc-cnt: RESOURCES must be a unsigned 4-byte integer.\n");
  251. // goto EXIT;
  252. // }
  253. // cmd_release(&c, argv[1], strlen(argv[1]), resources);
  254. // } else if( strcmp(argv[0], "stats") == 0 ) {
  255. // if( argc != 1 ) {
  256. // fprintf(stderr, "yc-cnt: invalid number of arguments.\n");
  257. // goto EXIT;
  258. // }
  259. // cmd_stats(&c);
  260. // } else if( strcmp(argv[0], "dump") == 0 ) {
  261. // if( argc != 1 ) {
  262. // fprintf(stderr, "yc-cnt: invalid number of arguments.\n");
  263. // goto EXIT;
  264. // }
  265. // cmd_dump(&c);
  266. // } else {
  267. // fprintf(stderr, "yc-cnt: unknown command: %s\n", argv[0]);
  268. // goto EXIT;
  269. // }
  270. //
  271. // yrmcds_cnt_close(&c);
  272. // return 0;
  273. //
  274. //EXIT:
  275. // yrmcds_cnt_close(&c);
  276. // exit(1);
  277. //}