* Copyright (c) 1983, 1986 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
* This file include significant work done at Cornell University
* by Bill Nesheim. That work included by permission.
"@(#) Copyright (c) 1983, 1986 Regents of the University of California.\n\
static char sccsid
[] = "@(#)query.c 1.4 (Berkeley) 2/14/86";
#define WTIME 5 /* Time to wait for responses */
char packet
[MAXPACKETSIZE
];
struct sockaddr_ns myaddr
= {AF_NS
};
struct ns_addr
ns_addr();
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
);
static struct sockaddr_ns router
= {AF_NS
};
static struct ns_addr zero_addr
;
static short allones
[] = {-1, -1, -1};
register struct rip
*msg
= (struct rip
*)packet
;
router
.sns_addr
= ns_addr(host
);
router
.sns_addr
.x_port
= htons(IDPPORT_RIF
);
if (ns_hosteq(zero_addr
, router
.sns_addr
)) {
router
.sns_addr
.x_host
= *(union ns_host
*) allones
;
msg
->rip_cmd
= htons(RIPCMD_REQUEST
);
msg
->rip_nets
[0].rip_dst
= *(union ns_net
*) allones
;
msg
->rip_nets
[0].rip_metric
= htons(HOPCNT_INFINITY
);
specific
= ns_addr(*argv
);
msg
->rip_nets
[0].rip_dst
= specific
.x_net
;
specific
.x_host
= zero_addr
.x_host
;
specific
.x_port
= zero_addr
.x_port
;
printf("Net asked for was %s\n", ns_ntoa(specific
));
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
;
static struct ns_addr work
;
if (htons(msg
->rip_cmd
) != RIPCMD_RESPONSE
)
printf("from %s\n", ns_ntoa(from
->sns_addr
));
size
-= sizeof (struct idp
);
if (size
< sizeof (struct netinfo
))
printf("\t%d, metric %d\n", ntohl(net
.long_e
),
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");