On Mon, Jun 20, 2011 at 06:30:11PM +0200, Mike Belopuhov wrote:
> Now that we support SO_RTABLE on the socket level, it makes
> sense to cleanup the tree. OK?
>
The if (getsockopt() && errno != ENOPROTOOPT) constructs are in my opinion
evil but the sa_family == AF_INET check is not much better but I guess you
should have a closer look at tcpbench:
if (ptb->Vflag) {
if (setsockopt(sock, SOL_SOCKET, SO_RTABLE,
&ptb->Vflag, sizeof(ptb->Vflag)) == -1 &&
errno != ENOPROTOOPT)
err(1, "setsockopt SO_RTABLE");
} else if (ptb->Vflag)
warnx("rtable only supported on AF_INET");
That does not make sense.
The other changes are OK claudio@
> Index: sbin/ping/ping.c
> ===================================================================
> RCS file: /home/cvs/src/sbin/ping/ping.c,v
> retrieving revision 1.88
> diff -u -p -r1.88 ping.c
> --- sbin/ping/ping.c 3 Jul 2010 04:44:51 -0000 1.88
> +++ sbin/ping/ping.c 20 Jun 2011 15:31:59 -0000
> @@ -312,7 +312,7 @@ main(int argc, char *argv[])
> errx(1, "rtable value is %s: %s",
> errstr, optarg);
>
> - if (setsockopt(s, IPPROTO_IP, SO_RTABLE, &rtableid,
> + if (setsockopt(s, SOL_SOCKET, SO_RTABLE, &rtableid,
> sizeof(rtableid)) == -1)
> err(1, "setsockopt SO_RTABLE");
> break;
> Index: usr.bin/nc/netcat.c
> ===================================================================
> RCS file: /home/cvs/src/usr.bin/nc/netcat.c,v
> retrieving revision 1.100
> diff -u -p -r1.100 netcat.c
> --- usr.bin/nc/netcat.c 9 Jan 2011 22:16:46 -0000 1.100
> +++ usr.bin/nc/netcat.c 20 Jun 2011 15:50:35 -0000
> @@ -552,7 +552,7 @@ remote_connect(const char *host, const c
> continue;
>
> if (rtableid) {
> - if (setsockopt(s, IPPROTO_IP, SO_RTABLE, &rtableid,
> + if (setsockopt(s, SOL_SOCKET, SO_RTABLE, &rtableid,
> sizeof(rtableid)) == -1)
> err(1, "setsockopt SO_RTABLE");
> }
> Index: usr.bin/tcpbench/tcpbench.c
> ===================================================================
> RCS file: /home/cvs/src/usr.bin/tcpbench/tcpbench.c,v
> retrieving revision 1.21
> diff -u -p -r1.21 tcpbench.c
> --- usr.bin/tcpbench/tcpbench.c 16 Mar 2011 08:06:10 -0000 1.21
> +++ usr.bin/tcpbench/tcpbench.c 20 Jun 2011 15:53:59 -0000
> @@ -719,9 +719,10 @@ server_init(struct addrinfo *aitop, stru
> warn("socket");
> continue;
> }
> - if (ptb->Vflag && ai->ai_family == AF_INET) {
> - if (setsockopt(sock, IPPROTO_IP, SO_RTABLE,
> - &ptb->Vflag, sizeof(ptb->Vflag)) == -1)
> + if (ptb->Vflag) {
> + if (setsockopt(sock, SOL_SOCKET, SO_RTABLE,
> + &ptb->Vflag, sizeof(ptb->Vflag)) == -1 &&
> + errno != ENOPROTOOPT)
> err(1, "setsockopt SO_RTABLE");
> } else if (ptb->Vflag)
> warnx("rtable only supported on AF_INET");
> @@ -817,9 +818,10 @@ client_init(struct addrinfo *aitop, int
> warn("socket");
> continue;
> }
> - if (ptb->Vflag && ai->ai_family == AF_INET) {
> - if (setsockopt(sock, IPPROTO_IP, SO_RTABLE,
> - &ptb->Vflag, sizeof(ptb->Vflag)) == -1)
> + if (ptb->Vflag) {
> + if (setsockopt(sock, SOL_SOCKET, SO_RTABLE,
> + &ptb->Vflag, sizeof(ptb->Vflag)) == -1 &&
> + errno != ENOPROTOOPT)
> err(1, "setsockopt SO_RTABLE");
> } else if (ptb->Vflag)
> warnx("rtable only supported on AF_INET");
> Index: usr.bin/telnet/commands.c
> ===================================================================
> RCS file: /home/cvs/src/usr.bin/telnet/commands.c,v
> retrieving revision 1.52
> diff -u -p -r1.52 commands.c
> --- usr.bin/telnet/commands.c 3 Jul 2010 04:44:51 -0000 1.52
> +++ usr.bin/telnet/commands.c 20 Jun 2011 16:00:02 -0000
> @@ -2397,7 +2397,7 @@ tn(argc, argv)
> continue;
>
> if (rtableid) {
> - if (setsockopt(net, IPPROTO_IP, SO_RTABLE, &rtableid,
> + if (setsockopt(net, SOL_SOCKET, SO_RTABLE, &rtableid,
> sizeof(rtableid)) == -1)
> perror("setsockopt (SO_RTABLE)");
> }
> Index: usr.sbin/dhcrelay/dhcrelay.c
> ===================================================================
> RCS file: /home/cvs/src/usr.sbin/dhcrelay/dhcrelay.c,v
> retrieving revision 1.34
> diff -u -p -r1.34 dhcrelay.c
> --- usr.sbin/dhcrelay/dhcrelay.c 3 Jul 2010 04:44:52 -0000 1.34
> +++ usr.sbin/dhcrelay/dhcrelay.c 20 Jun 2011 16:05:40 -0000
> @@ -176,7 +176,7 @@ main(int argc, char *argv[])
> if (setsockopt(sp->fd, SOL_SOCKET, SO_REUSEPORT,
> &opt, sizeof(opt)) == -1)
> error("setsockopt: %m");
> - if (setsockopt(sp->fd, IPPROTO_IP, SO_RTABLE, &rdomain,
> + if (setsockopt(sp->fd, SOL_SOCKET, SO_RTABLE, &rdomain,
> sizeof(rdomain)) == -1)
> error("setsockopt: %m");
> if (bind(sp->fd, (struct sockaddr *)&laddr, sizeof laddr) == -1)
> @@ -197,7 +197,7 @@ main(int argc, char *argv[])
> if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEPORT,
> &opt, sizeof(opt)) == -1)
> error("setsockopt: %m");
> - if (setsockopt(server_fd, IPPROTO_IP, SO_RTABLE, &rdomain,
> + if (setsockopt(server_fd, SOL_SOCKET, SO_RTABLE, &rdomain,
> sizeof(rdomain)) == -1)
> error("setsockopt: %m");
> if (bind(server_fd, (struct sockaddr *)&laddr,
> Index: usr.sbin/ftp-proxy/ftp-proxy.c
> ===================================================================
> RCS file: /home/cvs/src/usr.sbin/ftp-proxy/ftp-proxy.c,v
> retrieving revision 1.22
> diff -u -p -r1.22 ftp-proxy.c
> --- usr.sbin/ftp-proxy/ftp-proxy.c 28 Apr 2011 00:17:28 -0000 1.22
> +++ usr.sbin/ftp-proxy/ftp-proxy.c 4 May 2011 11:59:55 -0000
> @@ -428,9 +428,8 @@ handle_connection(const int listen_fd, s
> goto fail;
> }
> len = sizeof(s->client_rd);
> - if (client_sa->sa_family == AF_INET &&
> - getsockopt(s->client_fd, IPPROTO_IP, SO_RTABLE, &s->client_rd,
> - &len)) {
> + if (getsockopt(s->client_fd, SOL_SOCKET, SO_RTABLE, &s->client_rd,
> + &len) && errno != ENOPROTOOPT) {
> logmsg(LOG_CRIT, "#%d getsockopt failed: %s", s->id,
> strerror(errno));
> goto fail;
> Index: usr.sbin/ospfd/interface.c
> ===================================================================
> RCS file: /home/cvs/src/usr.sbin/ospfd/interface.c,v
> retrieving revision 1.72
> diff -u -p -r1.72 interface.c
> --- usr.sbin/ospfd/interface.c 9 May 2011 12:24:41 -0000 1.72
> +++ usr.sbin/ospfd/interface.c 20 Jun 2011 16:06:12 -0000
> @@ -257,7 +257,7 @@ if_init(struct ospfd_conf *xconf, struct
> rdomain = 0;
> else {
> rdomain = ifr.ifr_rdomainid;
> - if (setsockopt(iface->fd, IPPROTO_IP, SO_RTABLE,
> + if (setsockopt(iface->fd, SOL_SOCKET, SO_RTABLE,
> &rdomain, sizeof(rdomain)) == -1)
> fatal("failed to set rdomain");
> }
> Index: usr.sbin/ripd/interface.c
> ===================================================================
> RCS file: /home/cvs/src/usr.sbin/ripd/interface.c,v
> retrieving revision 1.9
> diff -u -p -r1.9 interface.c
> --- usr.sbin/ripd/interface.c 3 Jul 2010 04:44:52 -0000 1.9
> +++ usr.sbin/ripd/interface.c 20 Jun 2011 16:07:31 -0000
> @@ -83,7 +83,7 @@ if_init(struct ripd_conf *xconf, struct
> rdomain = 0;
> else {
> rdomain = ifr.ifr_rdomainid;
> - if (setsockopt(iface->fd, IPPROTO_IP, SO_RTABLE, &rdomain,
> + if (setsockopt(iface->fd, SOL_SOCKET, SO_RTABLE, &rdomain,
> sizeof(rdomain)) == -1)
> fatal("failed to set rdomain");
> }
> Index: usr.sbin/traceroute/traceroute.c
> ===================================================================
> RCS file: /home/cvs/src/usr.sbin/traceroute/traceroute.c,v
> retrieving revision 1.76
> diff -u -p -r1.76 traceroute.c
> --- usr.sbin/traceroute/traceroute.c 23 Apr 2011 10:00:13 -0000 1.76
> +++ usr.sbin/traceroute/traceroute.c 20 Jun 2011 16:08:07 -0000
> @@ -442,10 +442,10 @@ main(int argc, char *argv[])
> if (errstr)
> errx(1, "rtable value is %s: %s",
> errstr, optarg);
> - if (setsockopt(sndsock, IPPROTO_IP, SO_RTABLE,
> + if (setsockopt(sndsock, SOL_SOCKET, SO_RTABLE,
> &rtableid, sizeof(rtableid)) == -1)
> err(1, "setsockopt SO_RTABLE");
> - if (setsockopt(s, IPPROTO_IP, SO_RTABLE,
> + if (setsockopt(s, SOL_SOCKET, SO_RTABLE,
> &rtableid, sizeof(rtableid)) == -1)
> err(1, "setsockopt SO_RTABLE");
> break;
>
--
:wq Claudio