xref: /dflybsd-src/usr.sbin/bootparamd/callbootd/callbootd.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
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