diff options
| author | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-07-08 14:35:03 -0400 |
|---|---|---|
| committer | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-07-08 14:35:03 -0400 |
| commit | baf68ff7464e296e655676335c7eb63d4d533395 (patch) | |
| tree | 91678d9e72048d5184c36d494e663ef5d6239f4d | |
| parent | 0ff29e814f5cceef35798c73a9ec4dd7fa390176 (diff) | |
- client for exercising the nis server
| -rw-r--r-- | tests/clients/yp.c | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/tests/clients/yp.c b/tests/clients/yp.c new file mode 100644 index 0000000..933f0ee --- /dev/null +++ b/tests/clients/yp.c @@ -0,0 +1,224 @@ +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <netinet/tcp.h> +#include <rpc/rpc.h> +#include <rpcsvc/yp.h> +#include <getopt.h> +#include <stdio.h> +#include <string.h> + +static int +master(CLIENT *client, FILE *output, int argc, char **argv) +{ + ypresp_master *ret; + ypreq_nokey nokey; + if (argc != 2) { + fprintf(stderr, "\"master\" requires 2 arguments\n"); + return 1; + } + memset(&nokey, 0, sizeof(nokey)); + nokey.domain = argv[0]; + nokey.map = argv[1]; + ret = ypproc_master_2(&nokey, client); + if ((ret != NULL) && (ret->stat == YP_TRUE)) { + fprintf(output, "%s\n", ret->peer); + return 0; + } + return 1; +} + +static int +order(CLIENT *client, FILE *output, int argc, char **argv) +{ + ypresp_order *ret; + ypreq_nokey nokey; + if (argc != 2) { + fprintf(stderr, "\"order\" requires 2 arguments\n"); + return 1; + } + memset(&nokey, 0, sizeof(nokey)); + nokey.domain = argv[0]; + nokey.map = argv[1]; + ret = ypproc_order_2(&nokey, client); + if ((ret != NULL) && (ret->stat == YP_TRUE)) { + fprintf(output, "%lu\n", (unsigned long) ret->ordernum); + return 0; + } + return 1; +} + +static int +domain(CLIENT *client, FILE *output, int argc, char **argv) +{ + bool_t *ret; + int i; + if (argc != 1) { + fprintf(stderr, "\"domain\" requires 1 argument\n"); + return 1; + } + ret = ypproc_domain_2(&argv[0], client); + if (ret != NULL) { + fprintf(output, *ret ? "TRUE\n" : "FALSE\n"); + return 0; + } + return 1; +} + +static int +cat(CLIENT *client, FILE *output, int argc, char **argv) +{ + ypresp_key_val *ret; + ypreq_key key; + int i; + if (argc != 2) { + fprintf(stderr, "\"cat\" requires 2 arguments\n"); + return 1; + } + memset(&key, 0, sizeof(key)); + key.domain = argv[0]; + key.map = argv[1]; + ret = ypproc_first_2(&key, client); + if ((ret != NULL) && (ret->stat == YP_TRUE)) { + while ((ret != NULL) && (ret->stat == YP_TRUE)) { + fprintf(output, "%.*s\t%.*s\n", + ret->key.keydat_len, + ret->key.keydat_val, + ret->val.valdat_len, + ret->val.valdat_val); + key.key = ret->key; + ret = ypproc_next_2(&key, client); + } + return 0; + } + return 1; +} + +static int +all(CLIENT *client, FILE *output, int argc, char **argv) +{ + ypresp_all *ret; + int i; + ypreq_nokey nokey; + if (argc != 2) { + fprintf(stderr, "\"all\" requires 2 arguments\n"); + return 1; + } + memset(&nokey, 0, sizeof(nokey)); + nokey.domain = argv[0]; + nokey.map = argv[1]; + ret = ypproc_all_2(&nokey, client); + if (ret != NULL) { + for (i = 0; ret[i].more; i++) { + if (ret[i].ypresp_all_u.val.stat == YP_TRUE) { + fprintf(output, "%.*s\t%.*s\n", + ret[i].ypresp_all_u.val.key.keydat_len, + ret[i].ypresp_all_u.val.key.keydat_val, + ret[i].ypresp_all_u.val.val.valdat_len, + ret[i].ypresp_all_u.val.val.valdat_val); + } + } + return 0; + } + return 1; +} + +static int +maplist(CLIENT *client, FILE *output, int argc, char **argv) +{ + ypresp_maplist *list; + ypmaplist *i; + if (argc != 1) { + fprintf(stderr, "\"maplist\" requires 1 argument\n"); + return 1; + } + list = ypproc_maplist_2(&argv[0], client); + if (list != NULL) { + for (i = list->maps; i != NULL; i = i->next) { + fprintf(output, "%s\n", i->map); + } + return 0; + } + return 1; +} + +static int +dispatch(CLIENT *client, FILE *output, int argc, char **argv) +{ + if (strcmp(argv[0], "all") == 0) { + return all(client, output, argc - 1, argv + 1); + } + if (strcmp(argv[0], "cat") == 0) { + return cat(client, output, argc - 1, argv + 1); + } + if (strcmp(argv[0], "domain") == 0) { + return domain(client, output, argc - 1, argv + 1); + } + if (strcmp(argv[0], "order") == 0) { + return order(client, output, argc - 1, argv + 1); + } + if (strcmp(argv[0], "master") == 0) { + return master(client, output, argc - 1, argv + 1); + } + if (strcmp(argv[0], "maplist") == 0) { + return maplist(client, output, argc - 1, argv + 1); + } + return 1; +} + +int +main(int argc, char **argv) +{ + int c, connected = 0, sock, port = 0, timeout = 60, ret; + FILE *output; + CLIENT *client; + struct sockaddr_in server; + struct timeval tv; + while ((c = getopt(argc, argv, "cp:t:")) != -1) { + switch (c) { + case 'c': + connected = 1; + break; + case 'p': + port = atoi(optarg); + break; + case 't': + timeout = atoi(optarg); + break; + default: + printf("Usage: %s [-c] [-p port] [-t udp-timeout] " + "command [args ...]\n", + argv[0]); + return 1; + break; + } + } + output = popen("env LANG=C sort", "w"); + if (output == NULL) { + perror("popen"); + return 1; + } + get_myaddress(&server); + server.sin_port = htons(port); + memset(&timeout, 0, sizeof(timeout)); + tv.tv_sec = timeout; + sock = RPC_ANYSOCK; + client = connected ? clnttcp_create(&server, YPPROG, YPVERS, &sock, + 0, 0) : + clntudp_create(&server, YPPROG, YPVERS, tv, + &sock); + if (client == NULL) { + fprintf(stderr, "error setting up RPC client\n"); + return -1; + } + if (argc == optind) { + fprintf(stderr, "%s: no command specified\n", argv[0]); + printf("Usage: %s [-c] [-p port] [-t udp-timeout] " + "command [args ...]\n", + argv[0]); + return 1; + } + ret = dispatch(client, output, argc - optind, argv + optind); + fclose(output); + return ret; +} |
