186d7f5d3SJohn Marino /*
286d7f5d3SJohn Marino
386d7f5d3SJohn Marino This code is not copyright, and is placed in the public domain. Feel free to
486d7f5d3SJohn Marino use and modify. Please send modifications and/or suggestions + bug fixes to
586d7f5d3SJohn Marino
686d7f5d3SJohn Marino Klas Heggemann <klas@nada.kth.se>
786d7f5d3SJohn Marino
886d7f5d3SJohn Marino */
986d7f5d3SJohn Marino
1086d7f5d3SJohn Marino /*
1186d7f5d3SJohn Marino * $FreeBSD: src/usr.sbin/bootparamd/callbootd/callbootd.c,v 1.8 1999/08/28 01:15:40 peter Exp $
1286d7f5d3SJohn Marino * $DragonFly: src/usr.sbin/bootparamd/callbootd/callbootd.c,v 1.5 2007/11/25 01:28:24 swildner Exp $
1386d7f5d3SJohn Marino */
1486d7f5d3SJohn Marino #include "bootparam_prot.h"
1586d7f5d3SJohn Marino #include <rpc/rpc.h>
1686d7f5d3SJohn Marino #include <sys/types.h>
1786d7f5d3SJohn Marino #include <sys/socket.h>
1886d7f5d3SJohn Marino #include <netinet/in.h>
1986d7f5d3SJohn Marino #include <arpa/inet.h>
2086d7f5d3SJohn Marino #include <err.h>
2186d7f5d3SJohn Marino #include <netdb.h>
2286d7f5d3SJohn Marino
2386d7f5d3SJohn Marino
2486d7f5d3SJohn Marino /* #define bp_address_u bp_address */
2586d7f5d3SJohn Marino #include <stdio.h>
2686d7f5d3SJohn Marino #include <stdlib.h>
2786d7f5d3SJohn Marino #include <string.h>
2886d7f5d3SJohn Marino
2986d7f5d3SJohn Marino int broadcast;
3086d7f5d3SJohn Marino
3186d7f5d3SJohn Marino char cln[MAX_MACHINE_NAME+1];
3286d7f5d3SJohn Marino char dmn[MAX_MACHINE_NAME+1];
3386d7f5d3SJohn Marino char path[MAX_PATH_LEN+1];
3486d7f5d3SJohn Marino extern char *inet_ntoa();
3586d7f5d3SJohn Marino static void usage(void);
3686d7f5d3SJohn Marino int printgetfile(bp_getfile_res *);
3786d7f5d3SJohn Marino int printwhoami(bp_whoami_res *);
3886d7f5d3SJohn Marino
3986d7f5d3SJohn Marino int
eachres_whoami(bp_whoami_res * resultp,struct sockaddr_in * raddr)4086d7f5d3SJohn Marino eachres_whoami(bp_whoami_res *resultp, struct sockaddr_in *raddr)
4186d7f5d3SJohn Marino {
4286d7f5d3SJohn Marino struct hostent *he;
4386d7f5d3SJohn Marino
4486d7f5d3SJohn Marino he = gethostbyaddr(&raddr->sin_addr.s_addr,4,AF_INET);
4586d7f5d3SJohn Marino printf("%s answered:\n", he ? he->h_name : inet_ntoa(raddr->sin_addr));
4686d7f5d3SJohn Marino printwhoami(resultp);
4786d7f5d3SJohn Marino printf("\n");
4886d7f5d3SJohn Marino return(0);
4986d7f5d3SJohn Marino }
5086d7f5d3SJohn Marino
5186d7f5d3SJohn Marino bool_t
eachres_getfile(bp_getfile_res * resultp,struct sockaddr_in * raddr)5286d7f5d3SJohn Marino eachres_getfile(bp_getfile_res *resultp, struct sockaddr_in *raddr)
5386d7f5d3SJohn Marino {
5486d7f5d3SJohn Marino struct hostent *he;
5586d7f5d3SJohn Marino
5686d7f5d3SJohn Marino he = gethostbyaddr(&raddr->sin_addr.s_addr,4,AF_INET);
5786d7f5d3SJohn Marino printf("%s answered:\n", he ? he->h_name : inet_ntoa(raddr->sin_addr));
5886d7f5d3SJohn Marino printgetfile(resultp);
5986d7f5d3SJohn Marino printf("\n");
6086d7f5d3SJohn Marino return(0);
6186d7f5d3SJohn Marino }
6286d7f5d3SJohn Marino
6386d7f5d3SJohn Marino
6486d7f5d3SJohn Marino int
main(int argc,char ** argv)6586d7f5d3SJohn Marino main(int argc, char **argv)
6686d7f5d3SJohn Marino {
6786d7f5d3SJohn Marino char *server;
6886d7f5d3SJohn Marino
6986d7f5d3SJohn Marino bp_whoami_arg whoami_arg;
7086d7f5d3SJohn Marino bp_whoami_res *whoami_res, stat_whoami_res;
7186d7f5d3SJohn Marino bp_getfile_arg getfile_arg;
7286d7f5d3SJohn Marino bp_getfile_res *getfile_res, stat_getfile_res;
7386d7f5d3SJohn Marino
7486d7f5d3SJohn Marino
7586d7f5d3SJohn Marino long the_inet_addr;
7686d7f5d3SJohn Marino CLIENT *clnt;
7786d7f5d3SJohn Marino enum clnt_stat clnt_stat;
7886d7f5d3SJohn Marino
7986d7f5d3SJohn Marino stat_whoami_res.client_name = cln;
8086d7f5d3SJohn Marino stat_whoami_res.domain_name = dmn;
8186d7f5d3SJohn Marino
8286d7f5d3SJohn Marino stat_getfile_res.server_name = cln;
8386d7f5d3SJohn Marino stat_getfile_res.server_path = path;
8486d7f5d3SJohn Marino
8586d7f5d3SJohn Marino if (argc < 3)
8686d7f5d3SJohn Marino usage();
8786d7f5d3SJohn Marino
8886d7f5d3SJohn Marino server = argv[1];
8986d7f5d3SJohn Marino if ( ! strcmp(server , "all") ) broadcast = 1;
9086d7f5d3SJohn Marino
9186d7f5d3SJohn Marino if ( ! broadcast ) {
9286d7f5d3SJohn Marino clnt = clnt_create(server,BOOTPARAMPROG, BOOTPARAMVERS, "udp");
9386d7f5d3SJohn Marino }
9486d7f5d3SJohn Marino
9586d7f5d3SJohn Marino if ( clnt == NULL )
9686d7f5d3SJohn Marino errx(1, "could not contact bootparam server on host %s", server);
9786d7f5d3SJohn Marino
9886d7f5d3SJohn Marino switch (argc) {
9986d7f5d3SJohn Marino case 3:
10086d7f5d3SJohn Marino whoami_arg.client_address.address_type = IP_ADDR_TYPE;
10186d7f5d3SJohn Marino the_inet_addr = inet_addr(argv[2]);
10286d7f5d3SJohn Marino if ( the_inet_addr == -1)
10386d7f5d3SJohn Marino errx(2, "bogus addr %s", argv[2]);
10486d7f5d3SJohn Marino bcopy(&the_inet_addr,&whoami_arg.client_address.bp_address_u.ip_addr,4);
10586d7f5d3SJohn Marino
10686d7f5d3SJohn Marino if (! broadcast ) {
10786d7f5d3SJohn Marino whoami_res = bootparamproc_whoami_1(&whoami_arg, clnt);
10886d7f5d3SJohn Marino printf("Whoami returning:\n");
10986d7f5d3SJohn Marino if (printwhoami(whoami_res)) {
11086d7f5d3SJohn Marino errx(1, "bad answer returned from server %s", server);
11186d7f5d3SJohn Marino } else
11286d7f5d3SJohn Marino exit(0);
11386d7f5d3SJohn Marino } else {
11486d7f5d3SJohn Marino clnt_stat=clnt_broadcast(BOOTPARAMPROG, BOOTPARAMVERS,
11586d7f5d3SJohn Marino BOOTPARAMPROC_WHOAMI,
11686d7f5d3SJohn Marino (xdrproc_t)xdr_bp_whoami_arg, &whoami_arg,
11786d7f5d3SJohn Marino (xdrproc_t)xdr_bp_whoami_res, &stat_whoami_res,
11886d7f5d3SJohn Marino (resultproc_t)eachres_whoami);
11986d7f5d3SJohn Marino exit(0);
12086d7f5d3SJohn Marino }
12186d7f5d3SJohn Marino
12286d7f5d3SJohn Marino case 4:
12386d7f5d3SJohn Marino
12486d7f5d3SJohn Marino getfile_arg.client_name = argv[2];
12586d7f5d3SJohn Marino getfile_arg.file_id = argv[3];
12686d7f5d3SJohn Marino
12786d7f5d3SJohn Marino if (! broadcast ) {
12886d7f5d3SJohn Marino getfile_res = bootparamproc_getfile_1(&getfile_arg,clnt);
12986d7f5d3SJohn Marino printf("getfile returning:\n");
13086d7f5d3SJohn Marino if (printgetfile(getfile_res)) {
13186d7f5d3SJohn Marino errx(1, "bad answer returned from server %s", server);
13286d7f5d3SJohn Marino } else
13386d7f5d3SJohn Marino exit(0);
13486d7f5d3SJohn Marino } else {
13586d7f5d3SJohn Marino clnt_stat=clnt_broadcast(BOOTPARAMPROG, BOOTPARAMVERS,
13686d7f5d3SJohn Marino BOOTPARAMPROC_GETFILE,
13786d7f5d3SJohn Marino (xdrproc_t)xdr_bp_getfile_arg, &getfile_arg,
13886d7f5d3SJohn Marino (xdrproc_t)xdr_bp_getfile_res, &stat_getfile_res,
13986d7f5d3SJohn Marino (resultproc_t)eachres_getfile);
14086d7f5d3SJohn Marino exit(0);
14186d7f5d3SJohn Marino }
14286d7f5d3SJohn Marino
14386d7f5d3SJohn Marino default:
14486d7f5d3SJohn Marino
14586d7f5d3SJohn Marino usage();
14686d7f5d3SJohn Marino }
14786d7f5d3SJohn Marino
14886d7f5d3SJohn Marino }
14986d7f5d3SJohn Marino
15086d7f5d3SJohn Marino
15186d7f5d3SJohn Marino static void
usage(void)15286d7f5d3SJohn Marino usage(void)
15386d7f5d3SJohn Marino {
15486d7f5d3SJohn Marino fprintf(stderr,
15586d7f5d3SJohn Marino "usage: callbootd server procnum (IP-addr | host fileid)\n");
15686d7f5d3SJohn Marino exit(1);
15786d7f5d3SJohn Marino }
15886d7f5d3SJohn Marino
15986d7f5d3SJohn Marino int
printwhoami(bp_whoami_res * res)16086d7f5d3SJohn Marino printwhoami(bp_whoami_res *res)
16186d7f5d3SJohn Marino {
16286d7f5d3SJohn Marino if ( res) {
16386d7f5d3SJohn Marino printf("client_name:\t%s\ndomain_name:\t%s\n",
16486d7f5d3SJohn Marino res->client_name, res->domain_name);
16586d7f5d3SJohn Marino printf("router:\t%d.%d.%d.%d\n",
16686d7f5d3SJohn Marino 255 & res->router_address.bp_address_u.ip_addr.net,
16786d7f5d3SJohn Marino 255 & res->router_address.bp_address_u.ip_addr.host,
16886d7f5d3SJohn Marino 255 & res->router_address.bp_address_u.ip_addr.lh,
16986d7f5d3SJohn Marino 255 & res->router_address.bp_address_u.ip_addr.impno);
17086d7f5d3SJohn Marino return(0);
17186d7f5d3SJohn Marino } else {
17286d7f5d3SJohn Marino warnx("null answer!!!");
17386d7f5d3SJohn Marino return(1);
17486d7f5d3SJohn Marino }
17586d7f5d3SJohn Marino }
17686d7f5d3SJohn Marino
17786d7f5d3SJohn Marino
17886d7f5d3SJohn Marino
17986d7f5d3SJohn Marino
18086d7f5d3SJohn Marino int
printgetfile(bp_getfile_res * res)18186d7f5d3SJohn Marino printgetfile(bp_getfile_res *res)
18286d7f5d3SJohn Marino {
18386d7f5d3SJohn Marino if (res) {
18486d7f5d3SJohn Marino printf("server_name:\t%s\nserver_address:\t%s\npath:\t%s\n",
18586d7f5d3SJohn Marino res->server_name,
18686d7f5d3SJohn Marino inet_ntoa(*(struct in_addr *)&res->server_address.bp_address_u.ip_addr),
18786d7f5d3SJohn Marino res->server_path);
18886d7f5d3SJohn Marino return(0);
18986d7f5d3SJohn Marino } else {
19086d7f5d3SJohn Marino warnx("null answer!!!");
19186d7f5d3SJohn Marino return(1);
19286d7f5d3SJohn Marino }
19386d7f5d3SJohn Marino }
194