3 This code is not copyright, and is placed in the public domain. Feel free to
4 use and modify. Please send modifications and/or suggestions + bug fixes to
6 Klas Heggemann <klas@nada.kth.se>
11 * $FreeBSD: src/usr.sbin/bootparamd/callbootd/callbootd.c,v 1.8 1999/08/28 01:15:40 peter Exp $
12 * $DragonFly: src/usr.sbin/bootparamd/callbootd/callbootd.c,v 1.5 2007/11/25 01:28:24 swildner Exp $
14 #include "bootparam_prot.h"
16 #include <sys/types.h>
17 #include <sys/socket.h>
18 #include <netinet/in.h>
19 #include <arpa/inet.h>
24 /* #define bp_address_u bp_address */
31 char cln
[MAX_MACHINE_NAME
+1];
32 char dmn
[MAX_MACHINE_NAME
+1];
33 char path
[MAX_PATH_LEN
+1];
34 extern char *inet_ntoa();
35 static void usage(void);
36 int printgetfile(bp_getfile_res
*);
37 int printwhoami(bp_whoami_res
*);
40 eachres_whoami(bp_whoami_res
*resultp
, struct sockaddr_in
*raddr
)
44 he
= gethostbyaddr((char *)&raddr
->sin_addr
.s_addr
,4,AF_INET
);
45 printf("%s answered:\n", he
? he
->h_name
: inet_ntoa(raddr
->sin_addr
));
51 eachres_getfile(bp_getfile_res
*resultp
, struct sockaddr_in
*raddr
)
55 he
= gethostbyaddr((char *)&raddr
->sin_addr
.s_addr
,4,AF_INET
);
56 printf("%s answered:\n", he
? he
->h_name
: inet_ntoa(raddr
->sin_addr
));
57 printgetfile(resultp
);
64 main(int argc
, char **argv
)
68 bp_whoami_arg whoami_arg
;
69 bp_whoami_res
*whoami_res
, stat_whoami_res
;
70 bp_getfile_arg getfile_arg
;
71 bp_getfile_res
*getfile_res
, stat_getfile_res
;
76 enum clnt_stat clnt_stat
;
78 stat_whoami_res
.client_name
= cln
;
79 stat_whoami_res
.domain_name
= dmn
;
81 stat_getfile_res
.server_name
= cln
;
82 stat_getfile_res
.server_path
= path
;
88 if ( ! strcmp(server
, "all") ) broadcast
= 1;
91 clnt
= clnt_create(server
,BOOTPARAMPROG
, BOOTPARAMVERS
, "udp");
95 errx(1, "could not contact bootparam server on host %s", server
);
99 whoami_arg
.client_address
.address_type
= IP_ADDR_TYPE
;
100 the_inet_addr
= inet_addr(argv
[2]);
101 if ( the_inet_addr
== -1)
102 errx(2, "bogus addr %s", argv
[2]);
103 bcopy(&the_inet_addr
,&whoami_arg
.client_address
.bp_address_u
.ip_addr
,4);
106 whoami_res
= bootparamproc_whoami_1(&whoami_arg
, clnt
);
107 printf("Whoami returning:\n");
108 if (printwhoami(whoami_res
)) {
109 errx(1, "bad answer returned from server %s", server
);
113 clnt_stat
=clnt_broadcast(BOOTPARAMPROG
, BOOTPARAMVERS
,
114 BOOTPARAMPROC_WHOAMI
,
115 xdr_bp_whoami_arg
, &whoami_arg
,
116 xdr_bp_whoami_res
, &stat_whoami_res
, eachres_whoami
);
122 getfile_arg
.client_name
= argv
[2];
123 getfile_arg
.file_id
= argv
[3];
126 getfile_res
= bootparamproc_getfile_1(&getfile_arg
,clnt
);
127 printf("getfile returning:\n");
128 if (printgetfile(getfile_res
)) {
129 errx(1, "bad answer returned from server %s", server
);
133 clnt_stat
=clnt_broadcast(BOOTPARAMPROG
, BOOTPARAMVERS
,
134 BOOTPARAMPROC_GETFILE
,
135 xdr_bp_getfile_arg
, &getfile_arg
,
136 xdr_bp_getfile_res
, &stat_getfile_res
,eachres_getfile
);
152 "usage: callbootd server procnum (IP-addr | host fileid)\n");
157 printwhoami(bp_whoami_res
*res
)
160 printf("client_name:\t%s\ndomain_name:\t%s\n",
161 res
->client_name
, res
->domain_name
);
162 printf("router:\t%d.%d.%d.%d\n",
163 255 & res
->router_address
.bp_address_u
.ip_addr
.net
,
164 255 & res
->router_address
.bp_address_u
.ip_addr
.host
,
165 255 & res
->router_address
.bp_address_u
.ip_addr
.lh
,
166 255 & res
->router_address
.bp_address_u
.ip_addr
.impno
);
169 warnx("null answer!!!");
178 printgetfile(bp_getfile_res
*res
)
181 printf("server_name:\t%s\nserver_address:\t%s\npath:\t%s\n",
183 inet_ntoa(*(struct in_addr
*)&res
->server_address
.bp_address_u
.ip_addr
),
187 warnx("null answer!!!");