1*57718be8SEnji Cooper /* $NetBSD: t_rpc.c,v 1.3 2013/02/28 15:56:53 christos Exp $ */ 2*57718be8SEnji Cooper 3*57718be8SEnji Cooper #include <sys/cdefs.h> 4*57718be8SEnji Cooper __RCSID("$NetBSD: t_rpc.c,v 1.3 2013/02/28 15:56:53 christos Exp $"); 5*57718be8SEnji Cooper 6*57718be8SEnji Cooper #include <sys/types.h> 7*57718be8SEnji Cooper #include <sys/socket.h> 8*57718be8SEnji Cooper #include <rpc/rpc.h> 9*57718be8SEnji Cooper #include <stdlib.h> 10*57718be8SEnji Cooper #include <err.h> 11*57718be8SEnji Cooper #include <netdb.h> 12*57718be8SEnji Cooper #include <stdio.h> 13*57718be8SEnji Cooper #include <unistd.h> 14*57718be8SEnji Cooper 15*57718be8SEnji Cooper 16*57718be8SEnji Cooper #ifndef TEST 17*57718be8SEnji Cooper #include <atf-c.h> 18*57718be8SEnji Cooper 19*57718be8SEnji Cooper #define ERRX(ev, msg, ...) ATF_REQUIRE_MSG(0, msg, __VA_ARGS__) 20*57718be8SEnji Cooper 21*57718be8SEnji Cooper #define SKIPX(ev, msg, ...) do { \ 22*57718be8SEnji Cooper atf_tc_skip(msg, __VA_ARGS__); \ 23*57718be8SEnji Cooper return; \ 24*57718be8SEnji Cooper } while(/*CONSTCOND*/0) 25*57718be8SEnji Cooper 26*57718be8SEnji Cooper #else 27*57718be8SEnji Cooper #define ERRX(ev, msg, ...) errx(ev, msg, __VA_ARGS__) 28*57718be8SEnji Cooper #define SKIPX(ev, msg, ...) errx(ev, msg, __VA_ARGS__) 29*57718be8SEnji Cooper #endif 30*57718be8SEnji Cooper 31*57718be8SEnji Cooper 32*57718be8SEnji Cooper #define RPCBPROC_NULL 0 33*57718be8SEnji Cooper 34*57718be8SEnji Cooper static int 35*57718be8SEnji Cooper reply(caddr_t replyp, struct netbuf * raddrp, struct netconfig * nconf) 36*57718be8SEnji Cooper { 37*57718be8SEnji Cooper char host[NI_MAXHOST]; 38*57718be8SEnji Cooper struct sockaddr *sock = raddrp->buf; 39*57718be8SEnji Cooper int error; 40*57718be8SEnji Cooper 41*57718be8SEnji Cooper 42*57718be8SEnji Cooper error = getnameinfo(sock, sock->sa_len, host, sizeof(host), NULL, 0, 0); 43*57718be8SEnji Cooper if (error) 44*57718be8SEnji Cooper warnx("Cannot resolve address (%s)", gai_strerror(error)); 45*57718be8SEnji Cooper else 46*57718be8SEnji Cooper printf("response from: %s\n", host); 47*57718be8SEnji Cooper return 0; 48*57718be8SEnji Cooper } 49*57718be8SEnji Cooper 50*57718be8SEnji Cooper extern bool __rpc_control(int, void *); 51*57718be8SEnji Cooper 52*57718be8SEnji Cooper static void 53*57718be8SEnji Cooper onehost(const char *host, const char *transp) 54*57718be8SEnji Cooper { 55*57718be8SEnji Cooper CLIENT *clnt; 56*57718be8SEnji Cooper struct netbuf addr; 57*57718be8SEnji Cooper struct timeval tv; 58*57718be8SEnji Cooper 59*57718be8SEnji Cooper /* 60*57718be8SEnji Cooper * Magic! 61*57718be8SEnji Cooper */ 62*57718be8SEnji Cooper tv.tv_sec = 0; 63*57718be8SEnji Cooper tv.tv_usec = 500000; 64*57718be8SEnji Cooper #define CLCR_SET_RPCB_TIMEOUT 2 65*57718be8SEnji Cooper __rpc_control(CLCR_SET_RPCB_TIMEOUT, &tv); 66*57718be8SEnji Cooper 67*57718be8SEnji Cooper if ((clnt = clnt_create(host, RPCBPROG, RPCBVERS, transp)) == NULL) 68*57718be8SEnji Cooper SKIPX(EXIT_FAILURE, "clnt_create (%s)", clnt_spcreateerror("")); 69*57718be8SEnji Cooper 70*57718be8SEnji Cooper tv.tv_sec = 1; 71*57718be8SEnji Cooper tv.tv_usec = 0; 72*57718be8SEnji Cooper if (clnt_call(clnt, RPCBPROC_NULL, xdr_void, NULL, xdr_void, NULL, tv) 73*57718be8SEnji Cooper != RPC_SUCCESS) 74*57718be8SEnji Cooper ERRX(EXIT_FAILURE, "clnt_call (%s)", clnt_sperror(clnt, "")); 75*57718be8SEnji Cooper clnt_control(clnt, CLGET_SVC_ADDR, (char *) &addr); 76*57718be8SEnji Cooper reply(NULL, &addr, NULL); 77*57718be8SEnji Cooper } 78*57718be8SEnji Cooper 79*57718be8SEnji Cooper #ifdef TEST 80*57718be8SEnji Cooper static void 81*57718be8SEnji Cooper allhosts(void) 82*57718be8SEnji Cooper { 83*57718be8SEnji Cooper enum clnt_stat clnt_stat; 84*57718be8SEnji Cooper 85*57718be8SEnji Cooper clnt_stat = rpc_broadcast(RPCBPROG, RPCBVERS, RPCBPROC_NULL, 86*57718be8SEnji Cooper (xdrproc_t)xdr_void, NULL, (xdrproc_t)xdr_void, 87*57718be8SEnji Cooper NULL, (resultproc_t)reply, transp); 88*57718be8SEnji Cooper if (clnt_stat != RPC_SUCCESS && clnt_stat != RPC_TIMEDOUT) 89*57718be8SEnji Cooper ERRX(EXIT_FAILURE, "%s", clnt_sperrno(clnt_stat)); 90*57718be8SEnji Cooper } 91*57718be8SEnji Cooper 92*57718be8SEnji Cooper int 93*57718be8SEnji Cooper main(int argc, char *argv[]) 94*57718be8SEnji Cooper { 95*57718be8SEnji Cooper int ch; 96*57718be8SEnji Cooper const char *transp = "udp"; 97*57718be8SEnji Cooper 98*57718be8SEnji Cooper 99*57718be8SEnji Cooper while ((ch = getopt(argc, argv, "ut")) != -1) 100*57718be8SEnji Cooper switch (ch) { 101*57718be8SEnji Cooper case 't': 102*57718be8SEnji Cooper transp = "tcp"; 103*57718be8SEnji Cooper break; 104*57718be8SEnji Cooper case 'u': 105*57718be8SEnji Cooper transp = "udp"; 106*57718be8SEnji Cooper break; 107*57718be8SEnji Cooper default: 108*57718be8SEnji Cooper fprintf(stderr, "Usage: %s -[t|u] [<hostname>...]\n", 109*57718be8SEnji Cooper getprogname()); 110*57718be8SEnji Cooper return EXIT_FAILURE; 111*57718be8SEnji Cooper } 112*57718be8SEnji Cooper 113*57718be8SEnji Cooper if (argc == optind) 114*57718be8SEnji Cooper allhosts(); 115*57718be8SEnji Cooper else 116*57718be8SEnji Cooper for (; optind < argc; optind++) 117*57718be8SEnji Cooper onehost(argv[optind], transp); 118*57718be8SEnji Cooper 119*57718be8SEnji Cooper return EXIT_SUCCESS; 120*57718be8SEnji Cooper } 121*57718be8SEnji Cooper 122*57718be8SEnji Cooper #else 123*57718be8SEnji Cooper 124*57718be8SEnji Cooper ATF_TC(get_svc_addr_tcp); 125*57718be8SEnji Cooper ATF_TC_HEAD(get_svc_addr_tcp, tc) 126*57718be8SEnji Cooper { 127*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Checks CLGET_SVC_ADDR for tcp"); 128*57718be8SEnji Cooper 129*57718be8SEnji Cooper } 130*57718be8SEnji Cooper 131*57718be8SEnji Cooper ATF_TC_BODY(get_svc_addr_tcp, tc) 132*57718be8SEnji Cooper { 133*57718be8SEnji Cooper onehost("localhost", "tcp"); 134*57718be8SEnji Cooper 135*57718be8SEnji Cooper } 136*57718be8SEnji Cooper 137*57718be8SEnji Cooper ATF_TC(get_svc_addr_udp); 138*57718be8SEnji Cooper ATF_TC_HEAD(get_svc_addr_udp, tc) 139*57718be8SEnji Cooper { 140*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Checks CLGET_SVC_ADDR for udp"); 141*57718be8SEnji Cooper } 142*57718be8SEnji Cooper 143*57718be8SEnji Cooper ATF_TC_BODY(get_svc_addr_udp, tc) 144*57718be8SEnji Cooper { 145*57718be8SEnji Cooper onehost("localhost", "udp"); 146*57718be8SEnji Cooper 147*57718be8SEnji Cooper } 148*57718be8SEnji Cooper 149*57718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 150*57718be8SEnji Cooper { 151*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, get_svc_addr_udp); 152*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, get_svc_addr_tcp); 153*57718be8SEnji Cooper 154*57718be8SEnji Cooper return atf_no_error(); 155*57718be8SEnji Cooper } 156*57718be8SEnji Cooper 157*57718be8SEnji Cooper #endif 158