* Copyright (c) 1983 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
"@(#) Copyright (c) 1983 Regents of the University of California.\n\
static char sccsid
[] = "@(#)query.c 5.2 (Berkeley) %G%";
#define xnnet(p) (*(long *)&(p))
#define WTIME 5 /* Time to wait for responses */
char packet
[MAXPACKETSIZE
];
struct sockaddr_ns myaddr
= {AF_NS
};
int fromlen
= sizeof(from
);
printf("usage: query hosts...\n");
s
= getsocket(SOCK_DGRAM
, 0);
* Listen for returning packets;
* may be more than one packet per host.
bzero(¬ime
, sizeof(notime
));
signal(SIGALRM
, timeout
);
select(20, &bits
, 0, 0, ¬ime
) > 0) {
cc
= recvfrom(s
, &response
, sizeof (response
), 0,
rip_input(&from
, response
.data
, cc
);
struct sockaddr_ns router
;
register struct rip
*msg
= (struct rip
*)packet
;
bzero((char *)&router
, sizeof (router
));
router
.sns_family
= AF_NS
;
router
.sns_addr
.x_port
= htons(IDPPORT_RIF
);
sscanf(host
, "%ld:%hx,%hx,%hx",
&mynet
,work
+0, work
+1, work
+2);
router
.sns_addr
.x_host
= *(union ns_host
*)work
;
xnnet(router
.sns_addr
.x_net
) = htonl(mynet
);
msg
->rip_cmd
= htons(RIPCMD_REQUEST
);
xnnet(msg
->rip_nets
[0]) = -1;
msg
->rip_nets
[0].rip_metric
= htons(HOPCNT_INFINITY
);
u_long wanted
= xnnet(msg
->rip_nets
[0]) = htonl(atoi(*argv
));
printf("Net asked for was %d\n", ntohl(wanted
));
if (sendto(s
, packet
, sizeof (struct rip
), 0,
&router
, sizeof(router
)) < 0)
* Handle an incoming routing packet.
rip_input(from
, msg
, size
)
struct sockaddr_ns
*from
;
register struct rip
*msg
;
if (htons(msg
->rip_cmd
) != RIPCMD_RESPONSE
)
printf("from %d:%x,%x,%x\n",
ntohl(xnnet(from
->sns_addr
.x_net
)),
from
->sns_addr
.x_host
.s_host
[0],
from
->sns_addr
.x_host
.s_host
[1],
from
->sns_addr
.x_host
.s_host
[2]);
size
-= sizeof (struct idp
);
if (size
< sizeof (struct netinfo
))
printf("\t%d, metric %d\n", ntohl(xnnet(n
->rip_dst
[0])),
size
-= sizeof (struct netinfo
), n
++;
struct sockaddr_ns
*sns
= &myaddr
;
int domain
= sns
->sns_family
;
while ((s
= socket(domain
, type
, proto
)) < 0 && retry
) {
while (bind(s
, sns
, sizeof (*sns
), 0) < 0 && retry
) {
if (setsockopt(s
, 0, SO_HEADERS_ON_INPUT
, &on
, sizeof(on
))) {
perror("setsockopt SEE HEADERS");
if (setsockopt(s
, 0, SO_DEFAULT_HEADERS
, &idp
, sizeof(idp
))) {
perror("setsockopt SET HEADERS");
if (setsockopt(s
, SOL_SOCKET
, SO_BROADCAST
, &on
, sizeof (on
)) < 0) {
perror("setsockopt SO_BROADCAST");