diff options
| -rw-r--r-- | tests/clients/yp.c | 103 |
1 files changed, 89 insertions, 14 deletions
diff --git a/tests/clients/yp.c b/tests/clients/yp.c index 05148ee..e2303d2 100644 --- a/tests/clients/yp.c +++ b/tests/clients/yp.c @@ -8,6 +8,11 @@ #include <getopt.h> #include <stdio.h> #include <string.h> +#include <time.h> +#include <unistd.h> + +static struct sockaddr_in server; +static int connected; static int master(CLIENT *client, FILE *output, int argc, char **argv) @@ -92,34 +97,105 @@ cat(CLIENT *client, FILE *output, int argc, char **argv) } return 1; } - +static int +readjunk(char *fd, char *data, int size) +{ + return read(* (int *) fd, data, size); +} +static int +writejunk(char *fd, char *data, int size) +{ + return write(* (int *) fd, data, size); +} static int all(CLIENT *client, FILE *output, int argc, char **argv) { ypresp_all *ret; - int i; + int i, sock; ypreq_nokey nokey; + struct rpc_msg req, rep; + struct ypresp_all resp; + XDR s; if (argc != 2) { fprintf(stderr, "\"all\" requires 2 arguments\n"); return 1; } + if (!connected) { + fprintf(stderr, "\"all\" can only be used with -c\n"); + return 1; + } + + sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == -1) { + fprintf(stderr, "error setting up RPC client\n"); + return 1; + } + if (connect(sock, (struct sockaddr *) &server, sizeof(server)) != 0) { + fprintf(stderr, "error setting up RPC client\n"); + return 1; + } + + memset(&s, 0, sizeof(s)); + xdrrec_create(&s, 0, 0, (char *) &sock, &readjunk, &writejunk); + s.x_op = XDR_ENCODE; + + memset(&req, 0, sizeof(req)); + req.rm_xid = time(NULL) % 0x1000; + req.rm_direction = CALL; + req.rm_call.cb_rpcvers = 2; + req.rm_call.cb_prog = YPPROG; + req.rm_call.cb_vers = YPVERS; + req.rm_call.cb_proc = YPPROC_ALL; + 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); + + if (!xdr_callmsg(&s, &req)) { + fprintf(stderr, "error setting up RPC client\n"); + return 1; + } + if (!xdr_ypreq_nokey(&s, &nokey)) { + fprintf(stderr, "error setting up RPC client\n"); + return 1; + } + xdrrec_endofrecord(&s, TRUE); + xdr_destroy(&s); + + memset(&s, 0, sizeof(s)); + xdrrec_create(&s, 0, 0, (char *) &sock, &readjunk, &writejunk); + s.x_op = XDR_DECODE; + xdrrec_skiprecord(&s); + + do { + memset(&rep, 0, sizeof(rep)); + rep.rm_reply.rp_acpt.ar_results.where = (char*) &resp; + rep.rm_reply.rp_acpt.ar_results.proc = (xdrproc_t) &xdr_ypresp_all; + memset(&resp, 0, sizeof(resp)); + if (!xdr_replymsg(&s, &rep)) { + break; + } + } while ((rep.rm_direction != REPLY) || (rep.rm_xid != req.rm_xid)); + if ((rep.rm_reply.rp_stat == MSG_ACCEPTED) && + (rep.rm_reply.rp_acpt.ar_stat == SUCCESS)) { + while (resp.ypresp_all_u.val.stat == YP_TRUE) { + fprintf(output, "%.*s\t%.*s\n", + resp.ypresp_all_u.val.key.keydat_len, + resp.ypresp_all_u.val.key.keydat_val, + resp.ypresp_all_u.val.val.valdat_len, + resp.ypresp_all_u.val.val.valdat_val); + if (!resp.more) { + break; } + memset(&resp, 0, sizeof(resp)); + xdr_ypresp_all(&s, &resp); } + xdr_destroy(&s); return 0; + } else { + xdr_destroy(&s); + return 1; } - return 1; } static int @@ -190,10 +266,9 @@ usage(const char *argv0) int main(int argc, char **argv) { - int c, connected = 0, sock, port = 0, timeout = 60, ret; + int c, sock, port = 0, timeout = 60, ret; FILE *output; CLIENT *client; - struct sockaddr_in server; struct timeval tv; struct addrinfo *hostaddr, hints; const char *host = NULL; |
