summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/clients/yp.c103
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;