rrenumd.c (68905) | rrenumd.c (78064) |
---|---|
1/* $KAME$ */ | 1/* $KAME: rrenumd.c,v 1.20 2000/11/08 02:40:53 itojun Exp $ */ |
2 3/* 4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: --- 13 unchanged lines hidden (view full) --- 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 * | 2 3/* 4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: --- 13 unchanged lines hidden (view full) --- 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 * |
31 * $FreeBSD: head/usr.sbin/rrenumd/rrenumd.c 68905 2000-11-19 13:30:36Z kris $ | 31 * $FreeBSD: head/usr.sbin/rrenumd/rrenumd.c 78064 2001-06-11 12:39:29Z ume $ |
32 */ 33 34#include <sys/param.h> 35#include <sys/socket.h> 36#include <sys/uio.h> 37#include <sys/time.h> 38 39#include <string.h> --- 19 unchanged lines hidden (view full) --- 59#include <unistd.h> 60#include <syslog.h> 61 62#include "rrenumd.h" 63 64#define LL_ALLROUTERS "ff02::2" 65#define SL_ALLROUTERS "ff05::2" 66 | 32 */ 33 34#include <sys/param.h> 35#include <sys/socket.h> 36#include <sys/uio.h> 37#include <sys/time.h> 38 39#include <string.h> --- 19 unchanged lines hidden (view full) --- 59#include <unistd.h> 60#include <syslog.h> 61 62#include "rrenumd.h" 63 64#define LL_ALLROUTERS "ff02::2" 65#define SL_ALLROUTERS "ff05::2" 66 |
67#define RR_MCHLIM_DEFAULT 64 68 |
|
67#ifndef IN6_IS_SCOPE_LINKLOCAL 68#define IN6_IS_SCOPE_LINKLOCAL(a) \ 69 ((IN6_IS_ADDR_LINKLOCAL(a)) || \ 70 (IN6_IS_ADDR_MC_LINKLOCAL(a))) 71#endif /* IN6_IS_SCOPE_LINKLOCAL */ 72 73struct flags { 74 u_long debug : 1; --- 13 unchanged lines hidden (view full) --- 88struct sockaddr_in6 from; 89struct sockaddr_in6 sin6_ll_allrouters; 90 91int s4, s6; 92int with_v4dest, with_v6dest; 93struct in6_addr prefix; /* ADHOC */ 94int prefixlen = 64; /* ADHOC */ 95 | 69#ifndef IN6_IS_SCOPE_LINKLOCAL 70#define IN6_IS_SCOPE_LINKLOCAL(a) \ 71 ((IN6_IS_ADDR_LINKLOCAL(a)) || \ 72 (IN6_IS_ADDR_MC_LINKLOCAL(a))) 73#endif /* IN6_IS_SCOPE_LINKLOCAL */ 74 75struct flags { 76 u_long debug : 1; --- 13 unchanged lines hidden (view full) --- 90struct sockaddr_in6 from; 91struct sockaddr_in6 sin6_ll_allrouters; 92 93int s4, s6; 94int with_v4dest, with_v6dest; 95struct in6_addr prefix; /* ADHOC */ 96int prefixlen = 64; /* ADHOC */ 97 |
96extern int parse(FILE **fp); | 98extern int parse __P((FILE **)); |
97 | 99 |
100static void show_usage __P((void)); 101static void init_sin6 __P((struct sockaddr_in6 *, const char *)); 102#if 0 103static void join_multi __P((const char *)); 104#endif 105static void init_globals __P((void)); 106static void config __P((FILE **)); 107#ifdef IPSEC_POLICY_IPSEC 108static void sock6_open __P((struct flags *, char *)); 109static void sock4_open __P((struct flags *, char *)); 110#else 111static void sock6_open __P((struct flags *)); 112static void sock4_open __P((struct flags *)); 113#endif 114static void rrenum_output __P((struct payload_list *, struct dst_list *)); 115static void rrenum_snd_eachdst __P((struct payload_list *)); 116#if 0 117static void rrenum_snd_fullsequence __P((void)); 118#endif 119static void rrenum_input __P((int)); 120int main __P((int, char *[])); 121 122 |
|
98/* Print usage. Don't call this after daemonized. */ 99static void 100show_usage() 101{ 102 fprintf(stderr, "usage: rrenumd [-c conf_file|-s] [-df" 103#ifdef IPSEC 104#ifdef IPSEC_POLICY_IPSEC 105 "] [-P policy" 106#else /* IPSEC_POLICY_IPSEC */ 107 "AE" 108#endif /* IPSEC_POLICY_IPSEC */ 109#endif /* IPSEC */ 110 "]\n"); 111 exit(1); 112} 113 | 123/* Print usage. Don't call this after daemonized. */ 124static void 125show_usage() 126{ 127 fprintf(stderr, "usage: rrenumd [-c conf_file|-s] [-df" 128#ifdef IPSEC 129#ifdef IPSEC_POLICY_IPSEC 130 "] [-P policy" 131#else /* IPSEC_POLICY_IPSEC */ 132 "AE" 133#endif /* IPSEC_POLICY_IPSEC */ 134#endif /* IPSEC */ 135 "]\n"); 136 exit(1); 137} 138 |
114void | 139static void |
115init_sin6(struct sockaddr_in6 *sin6, const char *addr_ascii) 116{ 117 memset(sin6, 0, sizeof(*sin6)); 118 sin6->sin6_len = sizeof(*sin6); 119 sin6->sin6_family = AF_INET6; 120 if (inet_pton(AF_INET6, addr_ascii, &sin6->sin6_addr) != 1) 121 ; /* XXX do something */ 122} 123 124#if 0 /* XXX: not necessary ?? */ | 140init_sin6(struct sockaddr_in6 *sin6, const char *addr_ascii) 141{ 142 memset(sin6, 0, sizeof(*sin6)); 143 sin6->sin6_len = sizeof(*sin6); 144 sin6->sin6_family = AF_INET6; 145 if (inet_pton(AF_INET6, addr_ascii, &sin6->sin6_addr) != 1) 146 ; /* XXX do something */ 147} 148 149#if 0 /* XXX: not necessary ?? */ |
125void | 150static void |
126join_multi(const char *addrname) 127{ 128 struct ipv6_mreq mreq; 129 130 if (inet_pton(AF_INET6, addrname, &mreq.ipv6mr_multiaddr.s6_addr) 131 != 1) { 132 syslog(LOG_ERR, "<%s> inet_pton failed(library bug?)", 133 __FUNCTION__); --- 12 unchanged lines hidden (view full) --- 146 syslog(LOG_ERR, "<%s> IPV6_JOIN_GROUP on %s: %s", 147 __FUNCTION__, ifname, strerror(errno)); 148 exit(1); 149 } 150 } 151} 152#endif 153 | 151join_multi(const char *addrname) 152{ 153 struct ipv6_mreq mreq; 154 155 if (inet_pton(AF_INET6, addrname, &mreq.ipv6mr_multiaddr.s6_addr) 156 != 1) { 157 syslog(LOG_ERR, "<%s> inet_pton failed(library bug?)", 158 __FUNCTION__); --- 12 unchanged lines hidden (view full) --- 171 syslog(LOG_ERR, "<%s> IPV6_JOIN_GROUP on %s: %s", 172 __FUNCTION__, ifname, strerror(errno)); 173 exit(1); 174 } 175 } 176} 177#endif 178 |
154void | 179static void |
155init_globals() 156{ 157 static struct iovec rcviov; 158 static u_char rprdata[4500]; /* maximal MTU of connected links */ 159 static u_char *rcvcmsgbuf = NULL; 160 static u_char *sndcmsgbuf = NULL; 161 int sndcmsglen, rcvcmsglen; 162 --- 25 unchanged lines hidden (view full) --- 188 (sndcmsgbuf = (u_char *)malloc(sndcmsglen)) == NULL) { 189 syslog(LOG_ERR, "<%s>: malloc failed", __FUNCTION__); 190 exit(1); 191 } 192 sndmhdr.msg_control = (caddr_t)sndcmsgbuf; 193 sndmhdr.msg_controllen = sndcmsglen; 194} 195 | 180init_globals() 181{ 182 static struct iovec rcviov; 183 static u_char rprdata[4500]; /* maximal MTU of connected links */ 184 static u_char *rcvcmsgbuf = NULL; 185 static u_char *sndcmsgbuf = NULL; 186 int sndcmsglen, rcvcmsglen; 187 --- 25 unchanged lines hidden (view full) --- 213 (sndcmsgbuf = (u_char *)malloc(sndcmsglen)) == NULL) { 214 syslog(LOG_ERR, "<%s>: malloc failed", __FUNCTION__); 215 exit(1); 216 } 217 sndmhdr.msg_control = (caddr_t)sndcmsgbuf; 218 sndmhdr.msg_controllen = sndcmsglen; 219} 220 |
196void | 221static void |
197config(FILE **fpp) 198{ 199 struct payload_list *pl; 200 struct iovec *iov; 201 struct icmp6_router_renum *irr; 202 struct rr_pco_match *rpm; 203 204 if (parse(fpp) < 0) { --- 26 unchanged lines hidden (view full) --- 231 rpm->rpm_ordinal = 0; 232 iov->iov_base = (caddr_t)irr; 233 iov->iov_len = sizeof(struct icmp6_router_renum) 234 + sizeof(struct rr_pco_match) 235 + sizeof(struct rr_pco_use); 236 } 237} 238 | 222config(FILE **fpp) 223{ 224 struct payload_list *pl; 225 struct iovec *iov; 226 struct icmp6_router_renum *irr; 227 struct rr_pco_match *rpm; 228 229 if (parse(fpp) < 0) { --- 26 unchanged lines hidden (view full) --- 256 rpm->rpm_ordinal = 0; 257 iov->iov_base = (caddr_t)irr; 258 iov->iov_len = sizeof(struct icmp6_router_renum) 259 + sizeof(struct rr_pco_match) 260 + sizeof(struct rr_pco_use); 261 } 262} 263 |
239void | 264static void |
240sock6_open(struct flags *flags 241#ifdef IPSEC_POLICY_IPSEC 242 , char *policy 243#endif /* IPSEC_POLICY_IPSEC */ 244 ) 245{ 246 struct icmp6_filter filt; 247 int on; --- 44 unchanged lines hidden (view full) --- 292 if (flags->policy) { 293 char *buf; 294 buf = ipsec_set_policy(policy, strlen(policy)); 295 if (buf == NULL) 296 errx(1, "%s", ipsec_strerror()); 297 /* XXX should handle in/out bound policy. */ 298 if (setsockopt(s6, IPPROTO_IPV6, IPV6_IPSEC_POLICY, 299 buf, ipsec_get_policylen(buf)) < 0) | 265sock6_open(struct flags *flags 266#ifdef IPSEC_POLICY_IPSEC 267 , char *policy 268#endif /* IPSEC_POLICY_IPSEC */ 269 ) 270{ 271 struct icmp6_filter filt; 272 int on; --- 44 unchanged lines hidden (view full) --- 317 if (flags->policy) { 318 char *buf; 319 buf = ipsec_set_policy(policy, strlen(policy)); 320 if (buf == NULL) 321 errx(1, "%s", ipsec_strerror()); 322 /* XXX should handle in/out bound policy. */ 323 if (setsockopt(s6, IPPROTO_IPV6, IPV6_IPSEC_POLICY, 324 buf, ipsec_get_policylen(buf)) < 0) |
300 err(1, NULL); | 325 err(1, "setsockopt(IPV6_IPSEC_POLICY)"); |
301 free(buf); 302 } 303#else /* IPSEC_POLICY_IPSEC */ 304 if (flags->auth) { 305 optval = IPSEC_LEVEL_REQUIRE; 306 if (setsockopt(s6, IPPROTO_IPV6, IPV6_AUTH_TRANS_LEVEL, 307 &optval, sizeof(optval)) == -1) { 308 syslog(LOG_ERR, "<%s> IPV6_AUTH_TRANS_LEVEL: %s", --- 11 unchanged lines hidden (view full) --- 320 } 321 } 322#endif /* IPSEC_POLICY_IPSEC */ 323#endif /* IPSEC */ 324 325 return; 326} 327 | 326 free(buf); 327 } 328#else /* IPSEC_POLICY_IPSEC */ 329 if (flags->auth) { 330 optval = IPSEC_LEVEL_REQUIRE; 331 if (setsockopt(s6, IPPROTO_IPV6, IPV6_AUTH_TRANS_LEVEL, 332 &optval, sizeof(optval)) == -1) { 333 syslog(LOG_ERR, "<%s> IPV6_AUTH_TRANS_LEVEL: %s", --- 11 unchanged lines hidden (view full) --- 345 } 346 } 347#endif /* IPSEC_POLICY_IPSEC */ 348#endif /* IPSEC */ 349 350 return; 351} 352 |
328void | 353static void |
329sock4_open(struct flags *flags 330#ifdef IPSEC_POLICY_IPSEC 331 , char *policy 332#endif /* IPSEC_POLICY_IPSEC */ 333 ) 334{ 335#ifdef IPSEC 336#ifndef IPSEC_POLICY_IPSEC --- 21 unchanged lines hidden (view full) --- 358 if (flags->policy) { 359 char *buf; 360 buf = ipsec_set_policy(policy, strlen(policy)); 361 if (buf == NULL) 362 errx(1, "%s", ipsec_strerror()); 363 /* XXX should handle in/out bound policy. */ 364 if (setsockopt(s4, IPPROTO_IP, IP_IPSEC_POLICY, 365 buf, ipsec_get_policylen(buf)) < 0) | 354sock4_open(struct flags *flags 355#ifdef IPSEC_POLICY_IPSEC 356 , char *policy 357#endif /* IPSEC_POLICY_IPSEC */ 358 ) 359{ 360#ifdef IPSEC 361#ifndef IPSEC_POLICY_IPSEC --- 21 unchanged lines hidden (view full) --- 383 if (flags->policy) { 384 char *buf; 385 buf = ipsec_set_policy(policy, strlen(policy)); 386 if (buf == NULL) 387 errx(1, "%s", ipsec_strerror()); 388 /* XXX should handle in/out bound policy. */ 389 if (setsockopt(s4, IPPROTO_IP, IP_IPSEC_POLICY, 390 buf, ipsec_get_policylen(buf)) < 0) |
366 err(1, NULL); | 391 err(1, "setsockopt(IP_IPSEC_POLICY)"); |
367 free(buf); 368 } 369#else /* IPSEC_POLICY_IPSEC */ 370 if (flags->auth) { 371 optval = IPSEC_LEVEL_REQUIRE; 372 if (setsockopt(s4, IPPROTO_IP, IP_AUTH_TRANS_LEVEL, 373 &optval, sizeof(optval)) == -1) { 374 syslog(LOG_ERR, "<%s> IP_AUTH_TRANS_LEVEL: %s", --- 11 unchanged lines hidden (view full) --- 386 } 387 } 388#endif /* IPSEC_POLICY_IPSEC */ 389#endif /* IPSEC */ 390 391 return; 392} 393 | 392 free(buf); 393 } 394#else /* IPSEC_POLICY_IPSEC */ 395 if (flags->auth) { 396 optval = IPSEC_LEVEL_REQUIRE; 397 if (setsockopt(s4, IPPROTO_IP, IP_AUTH_TRANS_LEVEL, 398 &optval, sizeof(optval)) == -1) { 399 syslog(LOG_ERR, "<%s> IP_AUTH_TRANS_LEVEL: %s", --- 11 unchanged lines hidden (view full) --- 411 } 412 } 413#endif /* IPSEC_POLICY_IPSEC */ 414#endif /* IPSEC */ 415 416 return; 417} 418 |
394void | 419static void |
395rrenum_output(struct payload_list *pl, struct dst_list *dl) 396{ 397 int i, msglen = 0; 398 struct cmsghdr *cm; 399 struct in6_pktinfo *pi; 400 struct sockaddr_in6 *sin6 = NULL; 401 402 sndmhdr.msg_name = (caddr_t)dl->dl_dst; 403 if (dl->dl_dst->sa_family == AF_INET6) 404 sin6 = (struct sockaddr_in6 *)dl->dl_dst; 405 406 if (sin6 != NULL && | 420rrenum_output(struct payload_list *pl, struct dst_list *dl) 421{ 422 int i, msglen = 0; 423 struct cmsghdr *cm; 424 struct in6_pktinfo *pi; 425 struct sockaddr_in6 *sin6 = NULL; 426 427 sndmhdr.msg_name = (caddr_t)dl->dl_dst; 428 if (dl->dl_dst->sa_family == AF_INET6) 429 sin6 = (struct sockaddr_in6 *)dl->dl_dst; 430 431 if (sin6 != NULL && |
407 IN6_IS_SCOPE_LINKLOCAL(&sin6->sin6_addr)) { 408 int hoplimit = 255; | 432 IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) { 433 int hoplimit = RR_MCHLIM_DEFAULT; |
409 410 cm = CMSG_FIRSTHDR(&sndmhdr); 411 /* specify the outgoing interface */ 412 cm->cmsg_level = IPPROTO_IPV6; 413 cm->cmsg_type = IPV6_PKTINFO; 414 cm->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo)); 415 pi = (struct in6_pktinfo *)CMSG_DATA(cm); 416 memset(&pi->ipi6_addr, 0, sizeof(pi->ipi6_addr)); /*XXX*/ --- 16 unchanged lines hidden (view full) --- 433 sndmhdr.msg_iov = &pl->pl_sndiov; 434 i = sendmsg(dl->dl_dst->sa_family == AF_INET ? s4 : s6, &sndmhdr, 0); 435 436 if (i < 0 || i != sndmhdr.msg_iov->iov_len) 437 syslog(LOG_ERR, "<%s> sendmsg: %s", __FUNCTION__, 438 strerror(errno)); 439} 440 | 434 435 cm = CMSG_FIRSTHDR(&sndmhdr); 436 /* specify the outgoing interface */ 437 cm->cmsg_level = IPPROTO_IPV6; 438 cm->cmsg_type = IPV6_PKTINFO; 439 cm->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo)); 440 pi = (struct in6_pktinfo *)CMSG_DATA(cm); 441 memset(&pi->ipi6_addr, 0, sizeof(pi->ipi6_addr)); /*XXX*/ --- 16 unchanged lines hidden (view full) --- 458 sndmhdr.msg_iov = &pl->pl_sndiov; 459 i = sendmsg(dl->dl_dst->sa_family == AF_INET ? s4 : s6, &sndmhdr, 0); 460 461 if (i < 0 || i != sndmhdr.msg_iov->iov_len) 462 syslog(LOG_ERR, "<%s> sendmsg: %s", __FUNCTION__, 463 strerror(errno)); 464} 465 |
441void | 466static void |
442rrenum_snd_eachdst(struct payload_list *pl) 443{ 444 struct dst_list *dl; 445 446 for (dl = dl_head; dl; dl = dl->dl_next) { 447 rrenum_output(pl, dl); 448 } 449} 450 | 467rrenum_snd_eachdst(struct payload_list *pl) 468{ 469 struct dst_list *dl; 470 471 for (dl = dl_head; dl; dl = dl->dl_next) { 472 rrenum_output(pl, dl); 473 } 474} 475 |
451void | 476#if 0 477static void |
452rrenum_snd_fullsequence() 453{ 454 struct payload_list *pl; 455 456 for (pl = pl_head; pl; pl = pl->pl_next) { 457 rrenum_snd_eachdst(pl); 458 } 459} | 478rrenum_snd_fullsequence() 479{ 480 struct payload_list *pl; 481 482 for (pl = pl_head; pl; pl = pl->pl_next) { 483 rrenum_snd_eachdst(pl); 484 } 485} |
486#endif |
|
460 | 487 |
461void | 488static void |
462rrenum_input(int s) 463{ 464 int i; 465 struct icmp6_router_renum *rr; 466 467 /* get message */ 468 if ((i = recvmsg(s, &rcvmhdr, 0)) < 0) { 469 syslog(LOG_ERR, "<%s> recvmsg: %s", __FUNCTION__, --- 128 unchanged lines hidden (view full) --- 598 if (with_v4dest) { 599 FD_SET(s4, &fdset); 600 if (s4 > maxfd) 601 maxfd = s4; 602 } 603 604 /* ADHOC: timeout each 30seconds */ 605 memset(&timeout, 0, sizeof(timeout)); | 489rrenum_input(int s) 490{ 491 int i; 492 struct icmp6_router_renum *rr; 493 494 /* get message */ 495 if ((i = recvmsg(s, &rcvmhdr, 0)) < 0) { 496 syslog(LOG_ERR, "<%s> recvmsg: %s", __FUNCTION__, --- 128 unchanged lines hidden (view full) --- 625 if (with_v4dest) { 626 FD_SET(s4, &fdset); 627 if (s4 > maxfd) 628 maxfd = s4; 629 } 630 631 /* ADHOC: timeout each 30seconds */ 632 memset(&timeout, 0, sizeof(timeout)); |
606 timeout.tv_sec = 30; | |
607 | 633 |
608 /* init temporal payload_list and send_counter*/ | 634 /* init temporary payload_list and send_counter*/ |
609 pl = pl_head; 610 send_counter = retry + 1; 611 while (1) { 612 struct fd_set select_fd = fdset; /* reinitialize */ 613 614 if ((i = select(maxfd + 1, &select_fd, NULL, NULL, 615 &timeout)) < 0){ 616 syslog(LOG_ERR, "<%s> select: %s", 617 __FUNCTION__, strerror(errno)); 618 continue; 619 } 620 if (i == 0) { /* timeout */ 621 if (pl == NULL) 622 exit(0); 623 rrenum_snd_eachdst(pl); 624 send_counter--; | 635 pl = pl_head; 636 send_counter = retry + 1; 637 while (1) { 638 struct fd_set select_fd = fdset; /* reinitialize */ 639 640 if ((i = select(maxfd + 1, &select_fd, NULL, NULL, 641 &timeout)) < 0){ 642 syslog(LOG_ERR, "<%s> select: %s", 643 __FUNCTION__, strerror(errno)); 644 continue; 645 } 646 if (i == 0) { /* timeout */ 647 if (pl == NULL) 648 exit(0); 649 rrenum_snd_eachdst(pl); 650 send_counter--; |
651 timeout.tv_sec = 30; |
|
625 if (send_counter == 0) { | 652 if (send_counter == 0) { |
653 timeout.tv_sec = 0; |
|
626 pl = pl->pl_next; 627 send_counter = retry + 1; 628 } 629 } 630 if (FD_ISSET(s4, &select_fd)) 631 rrenum_input(s4); 632 if (FD_ISSET(s6, &select_fd)) 633 rrenum_input(s6); 634 } 635} | 654 pl = pl->pl_next; 655 send_counter = retry + 1; 656 } 657 } 658 if (FD_ISSET(s4, &select_fd)) 659 rrenum_input(s4); 660 if (FD_ISSET(s6, &select_fd)) 661 rrenum_input(s6); 662 } 663} |