157718be8SEnji Cooper /* $NetBSD: t_rpc.c,v 1.3 2013/02/28 15:56:53 christos Exp $ */ 257718be8SEnji Cooper 357718be8SEnji Cooper #include <sys/cdefs.h> 457718be8SEnji Cooper __RCSID("$NetBSD: t_rpc.c,v 1.3 2013/02/28 15:56:53 christos Exp $"); 557718be8SEnji Cooper 657718be8SEnji Cooper #include <sys/types.h> 757718be8SEnji Cooper #include <sys/socket.h> 857718be8SEnji Cooper #include <rpc/rpc.h> 957718be8SEnji Cooper #include <stdlib.h> 1057718be8SEnji Cooper #include <err.h> 1157718be8SEnji Cooper #include <netdb.h> 1257718be8SEnji Cooper #include <stdio.h> 1357718be8SEnji Cooper #include <unistd.h> 1457718be8SEnji Cooper 1557718be8SEnji Cooper 1657718be8SEnji Cooper #ifndef TEST 1757718be8SEnji Cooper #include <atf-c.h> 1857718be8SEnji Cooper 1957718be8SEnji Cooper #define ERRX(ev, msg, ...) ATF_REQUIRE_MSG(0, msg, __VA_ARGS__) 2057718be8SEnji Cooper 2157718be8SEnji Cooper #define SKIPX(ev, msg, ...) do { \ 2257718be8SEnji Cooper atf_tc_skip(msg, __VA_ARGS__); \ 2357718be8SEnji Cooper return; \ 2457718be8SEnji Cooper } while(/*CONSTCOND*/0) 2557718be8SEnji Cooper 2657718be8SEnji Cooper #else 2757718be8SEnji Cooper #define ERRX(ev, msg, ...) errx(ev, msg, __VA_ARGS__) 2857718be8SEnji Cooper #define SKIPX(ev, msg, ...) errx(ev, msg, __VA_ARGS__) 2957718be8SEnji Cooper #endif 3057718be8SEnji Cooper 3157718be8SEnji Cooper 3257718be8SEnji Cooper #define RPCBPROC_NULL 0 3357718be8SEnji Cooper 3457718be8SEnji Cooper static int 3557718be8SEnji Cooper reply(caddr_t replyp, struct netbuf * raddrp, struct netconfig * nconf) 3657718be8SEnji Cooper { 3757718be8SEnji Cooper char host[NI_MAXHOST]; 3857718be8SEnji Cooper struct sockaddr *sock = raddrp->buf; 3957718be8SEnji Cooper int error; 4057718be8SEnji Cooper 4157718be8SEnji Cooper 4257718be8SEnji Cooper error = getnameinfo(sock, sock->sa_len, host, sizeof(host), NULL, 0, 0); 4357718be8SEnji Cooper if (error) 4457718be8SEnji Cooper warnx("Cannot resolve address (%s)", gai_strerror(error)); 4557718be8SEnji Cooper else 4657718be8SEnji Cooper printf("response from: %s\n", host); 4757718be8SEnji Cooper return 0; 4857718be8SEnji Cooper } 4957718be8SEnji Cooper 50*3fe8969aSEnji Cooper #ifdef __FreeBSD__ 51*3fe8969aSEnji Cooper #define __rpc_control rpc_control 52*3fe8969aSEnji Cooper #endif 53*3fe8969aSEnji Cooper 5457718be8SEnji Cooper extern bool __rpc_control(int, void *); 5557718be8SEnji Cooper 5657718be8SEnji Cooper static void 5757718be8SEnji Cooper onehost(const char *host, const char *transp) 5857718be8SEnji Cooper { 5957718be8SEnji Cooper CLIENT *clnt; 6057718be8SEnji Cooper struct netbuf addr; 6157718be8SEnji Cooper struct timeval tv; 6257718be8SEnji Cooper 6357718be8SEnji Cooper /* 6457718be8SEnji Cooper * Magic! 6557718be8SEnji Cooper */ 6657718be8SEnji Cooper tv.tv_sec = 0; 6757718be8SEnji Cooper tv.tv_usec = 500000; 6857718be8SEnji Cooper #define CLCR_SET_RPCB_TIMEOUT 2 6957718be8SEnji Cooper __rpc_control(CLCR_SET_RPCB_TIMEOUT, &tv); 7057718be8SEnji Cooper 7157718be8SEnji Cooper if ((clnt = clnt_create(host, RPCBPROG, RPCBVERS, transp)) == NULL) 7257718be8SEnji Cooper SKIPX(EXIT_FAILURE, "clnt_create (%s)", clnt_spcreateerror("")); 7357718be8SEnji Cooper 7457718be8SEnji Cooper tv.tv_sec = 1; 7557718be8SEnji Cooper tv.tv_usec = 0; 7657718be8SEnji Cooper if (clnt_call(clnt, RPCBPROC_NULL, xdr_void, NULL, xdr_void, NULL, tv) 7757718be8SEnji Cooper != RPC_SUCCESS) 7857718be8SEnji Cooper ERRX(EXIT_FAILURE, "clnt_call (%s)", clnt_sperror(clnt, "")); 7957718be8SEnji Cooper clnt_control(clnt, CLGET_SVC_ADDR, (char *) &addr); 8057718be8SEnji Cooper reply(NULL, &addr, NULL); 8157718be8SEnji Cooper } 8257718be8SEnji Cooper 8357718be8SEnji Cooper #ifdef TEST 8457718be8SEnji Cooper static void 8557718be8SEnji Cooper allhosts(void) 8657718be8SEnji Cooper { 8757718be8SEnji Cooper enum clnt_stat clnt_stat; 8857718be8SEnji Cooper 8957718be8SEnji Cooper clnt_stat = rpc_broadcast(RPCBPROG, RPCBVERS, RPCBPROC_NULL, 9057718be8SEnji Cooper (xdrproc_t)xdr_void, NULL, (xdrproc_t)xdr_void, 9157718be8SEnji Cooper NULL, (resultproc_t)reply, transp); 9257718be8SEnji Cooper if (clnt_stat != RPC_SUCCESS && clnt_stat != RPC_TIMEDOUT) 9357718be8SEnji Cooper ERRX(EXIT_FAILURE, "%s", clnt_sperrno(clnt_stat)); 9457718be8SEnji Cooper } 9557718be8SEnji Cooper 9657718be8SEnji Cooper int 9757718be8SEnji Cooper main(int argc, char *argv[]) 9857718be8SEnji Cooper { 9957718be8SEnji Cooper int ch; 10057718be8SEnji Cooper const char *transp = "udp"; 10157718be8SEnji Cooper 10257718be8SEnji Cooper 10357718be8SEnji Cooper while ((ch = getopt(argc, argv, "ut")) != -1) 10457718be8SEnji Cooper switch (ch) { 10557718be8SEnji Cooper case 't': 10657718be8SEnji Cooper transp = "tcp"; 10757718be8SEnji Cooper break; 10857718be8SEnji Cooper case 'u': 10957718be8SEnji Cooper transp = "udp"; 11057718be8SEnji Cooper break; 11157718be8SEnji Cooper default: 11257718be8SEnji Cooper fprintf(stderr, "Usage: %s -[t|u] [<hostname>...]\n", 11357718be8SEnji Cooper getprogname()); 11457718be8SEnji Cooper return EXIT_FAILURE; 11557718be8SEnji Cooper } 11657718be8SEnji Cooper 11757718be8SEnji Cooper if (argc == optind) 11857718be8SEnji Cooper allhosts(); 11957718be8SEnji Cooper else 12057718be8SEnji Cooper for (; optind < argc; optind++) 12157718be8SEnji Cooper onehost(argv[optind], transp); 12257718be8SEnji Cooper 12357718be8SEnji Cooper return EXIT_SUCCESS; 12457718be8SEnji Cooper } 12557718be8SEnji Cooper 12657718be8SEnji Cooper #else 12757718be8SEnji Cooper 12857718be8SEnji Cooper ATF_TC(get_svc_addr_tcp); 12957718be8SEnji Cooper ATF_TC_HEAD(get_svc_addr_tcp, tc) 13057718be8SEnji Cooper { 13157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Checks CLGET_SVC_ADDR for tcp"); 13257718be8SEnji Cooper 13357718be8SEnji Cooper } 13457718be8SEnji Cooper 13557718be8SEnji Cooper ATF_TC_BODY(get_svc_addr_tcp, tc) 13657718be8SEnji Cooper { 13757718be8SEnji Cooper onehost("localhost", "tcp"); 13857718be8SEnji Cooper 13957718be8SEnji Cooper } 14057718be8SEnji Cooper 14157718be8SEnji Cooper ATF_TC(get_svc_addr_udp); 14257718be8SEnji Cooper ATF_TC_HEAD(get_svc_addr_udp, tc) 14357718be8SEnji Cooper { 14457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Checks CLGET_SVC_ADDR for udp"); 14557718be8SEnji Cooper } 14657718be8SEnji Cooper 14757718be8SEnji Cooper ATF_TC_BODY(get_svc_addr_udp, tc) 14857718be8SEnji Cooper { 14957718be8SEnji Cooper onehost("localhost", "udp"); 15057718be8SEnji Cooper 15157718be8SEnji Cooper } 15257718be8SEnji Cooper 15357718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 15457718be8SEnji Cooper { 15557718be8SEnji Cooper ATF_TP_ADD_TC(tp, get_svc_addr_udp); 15657718be8SEnji Cooper ATF_TP_ADD_TC(tp, get_svc_addr_tcp); 15757718be8SEnji Cooper 15857718be8SEnji Cooper return atf_no_error(); 15957718be8SEnji Cooper } 16057718be8SEnji Cooper 16157718be8SEnji Cooper #endif 162