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