callbootd.c revision 116598
1252995Sdteske/* 2252995Sdteske 3252995SdteskeThis code is not copyright, and is placed in the public domain. Feel free to 4252995Sdteskeuse and modify. Please send modifications and/or suggestions + bug fixes to 5252995Sdteske 6252995Sdteske Klas Heggemann <klas@nada.kth.se> 7252995Sdteske 8252995Sdteske*/ 9252995Sdteske 10252995Sdteske#ifndef lint 11252995Sdteskestatic const char rcsid[] = 12252995Sdteske "$FreeBSD: head/usr.sbin/bootparamd/callbootd/callbootd.c 116598 2003-06-20 04:54:27Z jmg $"; 13252995Sdteske#endif /* not lint */ 14252995Sdteske 15252995Sdteske#include "bootparam_prot.h" 16252995Sdteske#include <rpc/rpc.h> 17252995Sdteske#include <sys/types.h> 18252995Sdteske#include <sys/socket.h> 19252995Sdteske#include <netinet/in.h> 20252995Sdteske#include <arpa/inet.h> 21252995Sdteske#include <err.h> 22252995Sdteske#include <netdb.h> 23252995Sdteske#include <stdlib.h> 24252995Sdteske 25252995Sdteske 26252995Sdteske/* #define bp_address_u bp_address */ 27252995Sdteske#include <stdio.h> 28252995Sdteske#include <string.h> 29252995Sdteske 30252995Sdteskeint broadcast; 31252995Sdteske 32252995Sdteskechar cln[MAX_MACHINE_NAME+1]; 33252995Sdteskechar dmn[MAX_MACHINE_NAME+1]; 34252995Sdteskechar path[MAX_PATH_LEN+1]; 35252995Sdteskeextern char *inet_ntoa(); 36252995Sdteskestatic void usage __P((void)); 37252995Sdteskeint printgetfile __P((bp_getfile_res *)); 38252995Sdteskeint printwhoami __P((bp_whoami_res *)); 39252995Sdteske 40263791Sdteskebool_t 41263791Sdteskeeachres_whoami(resultp, raddr) 42252995Sdteskebp_whoami_res *resultp; 43252995Sdteskestruct sockaddr_in *raddr; 44252995Sdteske{ 45252995Sdteske struct hostent *he; 46252995Sdteske 47252995Sdteske he = gethostbyaddr((char *)&raddr->sin_addr.s_addr,4,AF_INET); 48252995Sdteske printf("%s answered:\n", he ? he->h_name : inet_ntoa(raddr->sin_addr)); 49252995Sdteske printwhoami(resultp); 50252995Sdteske printf("\n"); 51252995Sdteske return(0); 52252995Sdteske} 53252995Sdteske 54252995Sdteskebool_t 55252995Sdteskeeachres_getfile(resultp, raddr) 56252995Sdteskebp_getfile_res *resultp; 57252995Sdteskestruct sockaddr_in *raddr; 58252995Sdteske{ 59252995Sdteske struct hostent *he; 60252995Sdteske 61252995Sdteske he = gethostbyaddr((char *)&raddr->sin_addr.s_addr,4,AF_INET); 62252995Sdteske printf("%s answered:\n", he ? he->h_name : inet_ntoa(raddr->sin_addr)); 63252995Sdteske printgetfile(resultp); 64252995Sdteske printf("\n"); 65252995Sdteske return(0); 66252995Sdteske} 67252995Sdteske 68252995Sdteske 69252995Sdteskeint 70252995Sdteskemain(argc, argv) 71252995Sdteskeint argc; 72252995Sdteskechar **argv; 73252995Sdteske{ 74252995Sdteske char *server; 75252995Sdteske 76252995Sdteske bp_whoami_arg whoami_arg; 77252995Sdteske bp_whoami_res *whoami_res, stat_whoami_res; 78252995Sdteske bp_getfile_arg getfile_arg; 79252995Sdteske bp_getfile_res *getfile_res, stat_getfile_res; 80252995Sdteske 81252995Sdteske 82252995Sdteske long the_inet_addr; 83252995Sdteske CLIENT *clnt; 84252995Sdteske enum clnt_stat clnt_stat; 85252995Sdteske 86252995Sdteske stat_whoami_res.client_name = cln; 87252995Sdteske stat_whoami_res.domain_name = dmn; 88252995Sdteske 89252995Sdteske stat_getfile_res.server_name = cln; 90252995Sdteske stat_getfile_res.server_path = path; 91252995Sdteske 92252995Sdteske if (argc < 3) 93252995Sdteske usage(); 94252995Sdteske 95252995Sdteske server = argv[1]; 96252995Sdteske if ( ! strcmp(server , "all") ) broadcast = 1; 97252995Sdteske 98252995Sdteske if ( ! broadcast ) { 99252995Sdteske clnt = clnt_create(server,BOOTPARAMPROG, BOOTPARAMVERS, "udp"); 100252995Sdteske if ( clnt == NULL ) 101252995Sdteske errx(1, "could not contact bootparam server on host %s", server); 102252995Sdteske } 103252995Sdteske 104252995Sdteske switch (argc) { 105252995Sdteske case 3: 106252995Sdteske whoami_arg.client_address.address_type = IP_ADDR_TYPE; 107252995Sdteske the_inet_addr = inet_addr(argv[2]); 108252995Sdteske if ( the_inet_addr == -1) 109252995Sdteske errx(2, "bogus addr %s", argv[2]); 110252995Sdteske bcopy(&the_inet_addr,&whoami_arg.client_address.bp_address_u.ip_addr,4); 111252995Sdteske 112252995Sdteske if (! broadcast ) { 113252995Sdteske whoami_res = bootparamproc_whoami_1(&whoami_arg, clnt); 114252995Sdteske printf("Whoami returning:\n"); 115252995Sdteske if (printwhoami(whoami_res)) { 116252995Sdteske errx(1, "bad answer returned from server %s", server); 117252995Sdteske } else 118252995Sdteske exit(0); 119252995Sdteske } else { 120252995Sdteske clnt_stat=clnt_broadcast(BOOTPARAMPROG, BOOTPARAMVERS, 121252995Sdteske BOOTPARAMPROC_WHOAMI, 122252995Sdteske (xdrproc_t)xdr_bp_whoami_arg, 123252995Sdteske (char *)&whoami_arg, 124252995Sdteske (xdrproc_t)xdr_bp_whoami_res, 125252995Sdteske (char *)&stat_whoami_res, 126252995Sdteske (resultproc_t)eachres_whoami); 127252995Sdteske exit(0); 128252995Sdteske } 129 130 case 4: 131 132 getfile_arg.client_name = argv[2]; 133 getfile_arg.file_id = argv[3]; 134 135 if (! broadcast ) { 136 getfile_res = bootparamproc_getfile_1(&getfile_arg,clnt); 137 printf("getfile returning:\n"); 138 if (printgetfile(getfile_res)) { 139 errx(1, "bad answer returned from server %s", server); 140 } else 141 exit(0); 142 } else { 143 clnt_stat=clnt_broadcast(BOOTPARAMPROG, BOOTPARAMVERS, 144 BOOTPARAMPROC_GETFILE, 145 (xdrproc_t)xdr_bp_getfile_arg, 146 (char *)&getfile_arg, 147 (xdrproc_t)xdr_bp_getfile_res, 148 (char *)&stat_getfile_res, 149 (resultproc_t)eachres_getfile); 150 exit(0); 151 } 152 153 default: 154 155 usage(); 156 } 157 158} 159 160 161static void 162usage() 163{ 164 fprintf(stderr, 165 "usage: callbootd server procnum (IP-addr | host fileid)\n"); 166 exit(1); 167} 168 169int 170printwhoami(res) 171bp_whoami_res *res; 172{ 173 if ( res) { 174 printf("client_name:\t%s\ndomain_name:\t%s\n", 175 res->client_name, res->domain_name); 176 printf("router:\t%d.%d.%d.%d\n", 177 255 & res->router_address.bp_address_u.ip_addr.net, 178 255 & res->router_address.bp_address_u.ip_addr.host, 179 255 & res->router_address.bp_address_u.ip_addr.lh, 180 255 & res->router_address.bp_address_u.ip_addr.impno); 181 return(0); 182 } else { 183 warnx("null answer!!!"); 184 return(1); 185 } 186 } 187 188 189 190 191int 192printgetfile(res) 193bp_getfile_res *res; 194{ 195 if (res) { 196 printf("server_name:\t%s\nserver_address:\t%s\npath:\t%s\n", 197 res->server_name, 198 inet_ntoa(*(struct in_addr *)&res->server_address.bp_address_u.ip_addr), 199 res->server_path); 200 return(0); 201 } else { 202 warnx("null answer!!!"); 203 return(1); 204 } 205 } 206