summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-07-08 14:35:03 -0400
committerNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-07-08 14:35:03 -0400
commitbaf68ff7464e296e655676335c7eb63d4d533395 (patch)
tree91678d9e72048d5184c36d494e663ef5d6239f4d
parent0ff29e814f5cceef35798c73a9ec4dd7fa390176 (diff)
- client for exercising the nis server
-rw-r--r--tests/clients/yp.c224
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;
+}