diff options
Diffstat (limited to 'ripd')
| -rw-r--r-- | ripd/ChangeLog | 5 | ||||
| -rw-r--r-- | ripd/ripd.c | 113 | 
2 files changed, 61 insertions, 57 deletions
diff --git a/ripd/ChangeLog b/ripd/ChangeLog index 5d2c1644..ebd93255 100644 --- a/ripd/ChangeLog +++ b/ripd/ChangeLog @@ -1,3 +1,8 @@ +2005-06-03 Paul Jakma <paul.jakma@sun.com> + +	* ripd.c: (rip_create_socket) move it up so rip_send_packet +	  can use it too. +  2005-06-01 Paul Jakma <paul.jakma@sun.com>  	* rip_interface.c: Fix authentication, no-auth impossible to specify diff --git a/ripd/ripd.c b/ripd/ripd.c index 4723ebe0..c40e2ace 100644 --- a/ripd/ripd.c +++ b/ripd/ripd.c @@ -1319,6 +1319,62 @@ rip_response_process (struct rip_packet *packet, int size,      }  } +/* Make socket for RIP protocol. */ +int  +rip_create_socket () +{ +  int ret; +  int sock; +  struct sockaddr_in addr; +  struct servent *sp; + +  memset (&addr, 0, sizeof (struct sockaddr_in)); + +  /* Set RIP port. */ +  sp = getservbyname ("router", "udp"); +  if (sp)  +    addr.sin_port = sp->s_port; +  else  +    addr.sin_port = htons (RIP_PORT_DEFAULT); + +  /* Address shoud be any address. */ +  addr.sin_family = AF_INET; +  addr.sin_addr.s_addr = INADDR_ANY; + +  /* Make datagram socket. */ +  sock = socket (AF_INET, SOCK_DGRAM, 0); +  if (sock < 0)  +    { +      zlog_err("Cannot create UDP socket: %s", safe_strerror(errno)); +      exit (1); +    } + +  sockopt_broadcast (sock); +  sockopt_reuseaddr (sock); +  sockopt_reuseport (sock); +  setsockopt_so_recvbuf (sock, RIP_UDP_RCV_BUF); +#ifdef RIP_RECVMSG +  setsockopt_pktinfo (sock); +#endif /* RIP_RECVMSG */ + +  if (ripd_privs.change (ZPRIVS_RAISE)) +      zlog_err ("rip_create_socket: could not raise privs"); +  ret = bind (sock, (struct sockaddr *) & addr, sizeof (addr)); +  if (ret < 0) +    { +      int save_errno = errno; +      if (ripd_privs.change (ZPRIVS_LOWER)) +        zlog_err ("rip_create_socket: could not lower privs"); +      zlog_err("cannot bind to port %d: %s", +	       (int)ntohs(addr.sin_port), safe_strerror(save_errno)); +      return ret; +    } +  if (ripd_privs.change (ZPRIVS_LOWER)) +      zlog_err ("rip_create_socket: could not lower privs"); +       +  return sock; +} +  /* RIP packet send to destination address, on interface denoted by   * by connected argument. NULL to argument denotes destination should be   * should be RIP multicast group @@ -2004,63 +2060,6 @@ rip_read (struct thread *t)    return len;  } -/* Make socket for RIP protocol. */ -int  -rip_create_socket () -{ -  int ret; -  int sock; -  struct sockaddr_in addr; -  struct servent *sp; - -  memset (&addr, 0, sizeof (struct sockaddr_in)); - -  /* Set RIP port. */ -  sp = getservbyname ("router", "udp"); -  if (sp)  -    addr.sin_port = sp->s_port; -  else  -    addr.sin_port = htons (RIP_PORT_DEFAULT); - -  /* Address shoud be any address. */ -  addr.sin_family = AF_INET; -  addr.sin_addr.s_addr = INADDR_ANY; - -  /* Make datagram socket. */ -  sock = socket (AF_INET, SOCK_DGRAM, 0); -  if (sock < 0)  -    { -      zlog_err("Cannot create UDP socket: %s", safe_strerror(errno)); -      exit (1); -    } - -  sockopt_broadcast (sock); -  sockopt_reuseaddr (sock); -  sockopt_reuseport (sock); -  setsockopt_so_recvbuf (sock, RIP_UDP_RCV_BUF); -#ifdef RIP_RECVMSG -  setsockopt_pktinfo (sock); -#endif /* RIP_RECVMSG */ - -  if (ripd_privs.change (ZPRIVS_RAISE)) -      zlog_err ("rip_create_socket: could not raise privs"); -  ret = bind (sock, (struct sockaddr *) & addr, sizeof (addr)); -  if (ret < 0) -    { -      int save_errno = errno; -      if (ripd_privs.change (ZPRIVS_LOWER)) -        zlog_err ("rip_create_socket: could not lower privs"); -      zlog_err("cannot bind to port %d: %s", -	       (int)ntohs(addr.sin_port), safe_strerror(save_errno)); -      return ret; -    } -  if (ripd_privs.change (ZPRIVS_LOWER)) -      zlog_err ("rip_create_socket: could not lower privs"); -       -  return sock; -} - -  /* Write routing table entry to the stream and return next index of     the routing table entry in the stream. */  int  | 
