callbootd.c revision 6751
16751Swpaul/* 26751Swpaul 36751SwpaulThis code is not copyright, and is placed in the public domain. Feel free to 46751Swpauluse and modify. Please send modifications and/or suggestions + bug fixes to 56751Swpaul 66751Swpaul Klas Heggemann <klas@nada.kth.se> 76751Swpaul 86751Swpaul $Id$ 96751Swpaul*/ 106751Swpaul 116751Swpaul 126751Swpaul#include "bootparam_prot.h" 136751Swpaul#include <rpc/rpc.h> 146751Swpaul#include <sys/types.h> 156751Swpaul#include <sys/socket.h> 166751Swpaul#include <netdb.h> 176751Swpaul 186751Swpaul 196751Swpaul/* #define bp_address_u bp_address */ 206751Swpaul#include <stdio.h> 216751Swpaul 226751Swpaulint broadcast; 236751Swpaul 246751Swpaulchar cln[MAX_MACHINE_NAME+1]; 256751Swpaulchar dmn[MAX_MACHINE_NAME+1]; 266751Swpaulchar path[MAX_PATH_LEN+1]; 276751Swpaulextern char *inet_ntoa(); 286751Swpaul 296751Swpauleachres_whoami(resultp, raddr) 306751Swpaulbp_whoami_res *resultp; 316751Swpaulstruct sockaddr_in *raddr; 326751Swpaul{ 336751Swpaul struct hostent *he; 346751Swpaul 356751Swpaul he = gethostbyaddr((char *)&raddr->sin_addr.s_addr,4,AF_INET); 366751Swpaul printf("%s answered:\n", he ? he->h_name : inet_ntoa(raddr->sin_addr)); 376751Swpaul printwhoami(resultp); 386751Swpaul printf("\n"); 396751Swpaul return(0); 406751Swpaul} 416751Swpaul 426751Swpauleachres_getfile(resultp, raddr) 436751Swpaulbp_getfile_res *resultp; 446751Swpaulstruct sockaddr_in *raddr; 456751Swpaul{ 466751Swpaul struct hostent *he; 476751Swpaul 486751Swpaul he = gethostbyaddr((char *)&raddr->sin_addr.s_addr,4,AF_INET); 496751Swpaul printf("%s answered:\n", he ? he->h_name : inet_ntoa(raddr->sin_addr)); 506751Swpaul printgetfile(resultp); 516751Swpaul printf("\n"); 526751Swpaul return(0); 536751Swpaul} 546751Swpaul 556751Swpaul 566751Swpaulmain(argc, argv) 576751Swpaulint argc; 586751Swpaulchar **argv; 596751Swpaul{ 606751Swpaul int stat; 616751Swpaul char *server; 626751Swpaul 636751Swpaul bp_whoami_arg whoami_arg; 646751Swpaul bp_whoami_res *whoami_res, stat_whoami_res; 656751Swpaul bp_getfile_arg getfile_arg; 666751Swpaul bp_getfile_res *getfile_res, stat_getfile_res; 676751Swpaul 686751Swpaul 696751Swpaul long the_inet_addr; 706751Swpaul CLIENT *clnt; 716751Swpaul enum clnt_stat clnt_stat; 726751Swpaul 736751Swpaul stat_whoami_res.client_name = cln; 746751Swpaul stat_whoami_res.domain_name = dmn; 756751Swpaul 766751Swpaul stat_getfile_res.server_name = cln; 776751Swpaul stat_getfile_res.server_path = path; 786751Swpaul 796751Swpaul if (argc < 3) { 806751Swpaul fprintf(stderr, 816751Swpaul "Usage: %s server procnum (IP-addr | host fileid)\n", argv[0]); 826751Swpaul exit(1); 836751Swpaul } 846751Swpaul 856751Swpaul 866751Swpaul server = argv[1]; 876751Swpaul if ( ! strcmp(server , "all") ) broadcast = 1; 886751Swpaul 896751Swpaul if ( ! broadcast ) { 906751Swpaul clnt = clnt_create(server,BOOTPARAMPROG, BOOTPARAMVERS, "udp"); 916751Swpaul } 926751Swpaul 936751Swpaul 946751Swpaul switch (argc) { 956751Swpaul case 3: 966751Swpaul whoami_arg.client_address.address_type = IP_ADDR_TYPE; 976751Swpaul the_inet_addr = inet_addr(argv[2]); 986751Swpaul if ( the_inet_addr == -1) { 996751Swpaul fprintf(stderr, "bogus addr %s\n", argv[2]); 1006751Swpaul exit(1); 1016751Swpaul } 1026751Swpaul bcopy(&the_inet_addr,&whoami_arg.client_address.bp_address_u.ip_addr,4); 1036751Swpaul 1046751Swpaul if (! broadcast ) { 1056751Swpaul whoami_res = bootparamproc_whoami_1(&whoami_arg, clnt); 1066751Swpaul printf("Whoami returning:\n"); 1076751Swpaul if (printwhoami(whoami_res)) { 1086751Swpaul fprintf(stderr, "Bad answer returned from server %s\n", server); 1096751Swpaul exit(1); 1106751Swpaul } else 1116751Swpaul exit(0); 1126751Swpaul } else { 1136751Swpaul clnt_stat=clnt_broadcast(BOOTPARAMPROG, BOOTPARAMVERS, 1146751Swpaul BOOTPARAMPROC_WHOAMI, 1156751Swpaul xdr_bp_whoami_arg, &whoami_arg, 1166751Swpaul xdr_bp_whoami_res, &stat_whoami_res, eachres_whoami); 1176751Swpaul exit(0); 1186751Swpaul } 1196751Swpaul 1206751Swpaul case 4: 1216751Swpaul 1226751Swpaul getfile_arg.client_name = argv[2]; 1236751Swpaul getfile_arg.file_id = argv[3]; 1246751Swpaul 1256751Swpaul if (! broadcast ) { 1266751Swpaul getfile_res = bootparamproc_getfile_1(&getfile_arg,clnt); 1276751Swpaul printf("getfile returning:\n"); 1286751Swpaul if (printgetfile(getfile_res)) { 1296751Swpaul fprintf(stderr, "Bad answer returned from server %s\n", server); 1306751Swpaul exit(1); 1316751Swpaul } else 1326751Swpaul exit(0); 1336751Swpaul } else { 1346751Swpaul clnt_stat=clnt_broadcast(BOOTPARAMPROG, BOOTPARAMVERS, 1356751Swpaul BOOTPARAMPROC_GETFILE, 1366751Swpaul xdr_bp_getfile_arg, &getfile_arg, 1376751Swpaul xdr_bp_getfile_res, &stat_getfile_res,eachres_getfile); 1386751Swpaul exit(0); 1396751Swpaul } 1406751Swpaul 1416751Swpaul default: 1426751Swpaul 1436751Swpaul fprintf(stderr, 1446751Swpaul "Usage: %s server procnum (IP-addr | host fileid)\n", argv[0]); 1456751Swpaul exit(1); 1466751Swpaul } 1476751Swpaul 1486751Swpaul} 1496751Swpaul 1506751Swpaul 1516751Swpaul 1526751Swpaulint printwhoami(res) 1536751Swpaulbp_whoami_res *res; 1546751Swpaul{ 1556751Swpaul if ( res) { 1566751Swpaul printf("client_name:\t%s\ndomain_name:\t%s\n", 1576751Swpaul res->client_name, res->domain_name); 1586751Swpaul printf("router:\t%d.%d.%d.%d\n", 1596751Swpaul 255 & res->router_address.bp_address_u.ip_addr.net, 1606751Swpaul 255 & res->router_address.bp_address_u.ip_addr.host, 1616751Swpaul 255 & res->router_address.bp_address_u.ip_addr.lh, 1626751Swpaul 255 & res->router_address.bp_address_u.ip_addr.impno); 1636751Swpaul return(0); 1646751Swpaul } else { 1656751Swpaul fprintf(stderr,"Null answer!!!\n"); 1666751Swpaul return(1); 1676751Swpaul } 1686751Swpaul } 1696751Swpaul 1706751Swpaul 1716751Swpaul 1726751Swpaul 1736751Swpaulint 1746751Swpaulprintgetfile(res) 1756751Swpaulbp_getfile_res *res; 1766751Swpaul{ 1776751Swpaul if (res) { 1786751Swpaul printf("server_name:\t%s\nserver_address:\t%s\npath:\t%s\n", 1796751Swpaul res->server_name, 1806751Swpaul inet_ntoa(res->server_address.bp_address_u.ip_addr), 1816751Swpaul res->server_path); 1826751Swpaul return(0); 1836751Swpaul } else { 1846751Swpaul fprintf(stderr,"Null answer!!!\n"); 1856751Swpaul return(1); 1866751Swpaul } 1876751Swpaul } 188