svn commit: r223510 - head/usr.sbin/mtest
John Baldwin
jhb at FreeBSD.org
Fri Jun 24 17:54:45 UTC 2011
Author: jhb
Date: Fri Jun 24 17:54:45 2011
New Revision: 223510
URL: http://svn.freebsd.org/changeset/base/223510
Log:
Don't die if either of INET or INET6 aren't in the running kernel.
Instead, report "protocol not supported" errors at runtime if a user
attempts to use a protocol that the kernel doesn't support.
Reviewed by: bz
MFC after: 1 week
Modified:
head/usr.sbin/mtest/mtest.c
Modified: head/usr.sbin/mtest/mtest.c
==============================================================================
--- head/usr.sbin/mtest/mtest.c Fri Jun 24 17:29:41 2011 (r223509)
+++ head/usr.sbin/mtest/mtest.c Fri Jun 24 17:54:45 2011 (r223510)
@@ -204,14 +204,16 @@ main(int argc, char **argv)
s6 = -1;
#ifdef INET
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if (s == -1)
+ if (s == -1 && errno != EPROTONOSUPPORT)
err(1, "can't open IPv4 socket");
#endif
#ifdef INET6
s6 = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
- if (s6 == -1)
+ if (s6 == -1 && errno != EPROTONOSUPPORT)
err(1, "can't open IPv6 socket");
#endif
+ if (s == -1 && s6 == -1)
+ errc(1, EPROTONOSUPPORT, "can't open socket");
if (argc < 2) {
if (isatty(STDIN_FILENO)) {
@@ -371,7 +373,7 @@ af2socklen(const int af)
}
static void
-process_cmd(char *cmd, int s, int s6 __unused, FILE *fp __unused)
+process_cmd(char *cmd, int s, int s6, FILE *fp __unused)
{
char str1[STR_SIZE];
char str2[STR_SIZE];
@@ -457,7 +459,10 @@ process_cmd(char *cmd, int s, int s6 __u
optval = (void *)&mr.mr;
optlen = sizeof(mr.mr);
}
- if (setsockopt(s, level, optname, optval,
+ if (s < 0) {
+ warnc(EPROTONOSUPPORT, "setsockopt %s",
+ toptname);
+ } else if (setsockopt(s, level, optname, optval,
optlen) == 0) {
printf("ok\n");
break;
@@ -496,7 +501,10 @@ process_cmd(char *cmd, int s, int s6 __u
optval = (void *)&mr.mr6;
optlen = sizeof(mr.mr6);
}
- if (setsockopt(s6, level, optname, optval,
+ if (s6 < 0) {
+ warnc(EPROTONOSUPPORT, "setsockopt %s",
+ toptname);
+ } else if (setsockopt(s6, level, optname, optval,
optlen) == 0) {
printf("ok\n");
break;
@@ -534,6 +542,10 @@ process_cmd(char *cmd, int s, int s6 __u
break;
}
af = su.sa.sa_family;
+ if (af2sock(af, s, s6) == -1) {
+ warnc(EPROTONOSUPPORT, "setsourcefilter");
+ break;
+ }
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_flags = AI_NUMERICHOST;
@@ -593,6 +605,10 @@ process_cmd(char *cmd, int s, int s6 __u
break;
}
af = su.sa.sa_family;
+ if (af2sock(af, s, s6) == -1) {
+ warnc(EPROTONOSUPPORT, "getsourcefilter");
+ break;
+ }
/* First determine our current filter mode. */
n = 0;
@@ -700,6 +716,10 @@ process_cmd(char *cmd, int s, int s6 __u
}
af = su.sa.sa_family;
+ if (af2sock(af, s, s6) == -1) {
+ warnc(EPROTONOSUPPORT, "getsourcefilter");
+ break;
+ }
nsrc = nreqsrc;
if (getsourcefilter(af2sock(af, s, s6), ifindex, &su.sa,
su.sa.sa_len, &fmode, &nsrc, &sources[0].ss) != 0) {
More information about the svn-src-all
mailing list