|
version 1.1.1.1, 2012/02/21 16:23:02
|
version 1.1.1.3, 2013/07/22 10:46:12
|
|
Line 1
|
Line 1
|
| /* |
/* |
| * Copyright (c) 2010 Todd C. Miller <Todd.Miller@courtesan.com> | * Copyright (c) 2010-2012 Todd C. Miller <Todd.Miller@courtesan.com> |
| * |
* |
| * Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
| * purpose with or without fee is hereby granted, provided that the above |
* purpose with or without fee is hereby granted, provided that the above |
|
Line 18
|
Line 18
|
| |
|
| #include <sys/types.h> |
#include <sys/types.h> |
| #include <sys/socket.h> |
#include <sys/socket.h> |
| #include <sys/param.h> |
|
| #include <stdio.h> |
#include <stdio.h> |
| #ifdef STDC_HEADERS |
#ifdef STDC_HEADERS |
| # include <stdlib.h> |
# include <stdlib.h> |
|
Line 52
|
Line 51
|
| # define INADDR_NONE ((unsigned int)-1) |
# define INADDR_NONE ((unsigned int)-1) |
| #endif |
#endif |
| |
|
| |
static struct interface *interfaces; |
| |
|
| /* |
/* |
| * Parse a space-delimited list of IP address/netmask pairs and |
* Parse a space-delimited list of IP address/netmask pairs and |
| * store in a list of interface structures. |
* store in a list of interface structures. |
|
Line 61 set_interfaces(const char *ai)
|
Line 62 set_interfaces(const char *ai)
|
| { |
{ |
| char *addrinfo, *addr, *mask; |
char *addrinfo, *addr, *mask; |
| struct interface *ifp; |
struct interface *ifp; |
| |
debug_decl(set_interfaces, SUDO_DEBUG_NETIF) |
| |
|
| addrinfo = estrdup(ai); |
addrinfo = estrdup(ai); |
| for (addr = strtok(addrinfo, " \t"); addr != NULL; addr = strtok(NULL, " \t")) { |
for (addr = strtok(addrinfo, " \t"); addr != NULL; addr = strtok(NULL, " \t")) { |
|
Line 70 set_interfaces(const char *ai)
|
Line 72 set_interfaces(const char *ai)
|
| *mask++ = '\0'; |
*mask++ = '\0'; |
| |
|
| /* Parse addr and store in list. */ |
/* Parse addr and store in list. */ |
| ifp = emalloc(sizeof(*ifp)); | ifp = ecalloc(1, sizeof(*ifp)); |
| if (strchr(addr, ':')) { |
if (strchr(addr, ':')) { |
| /* IPv6 */ |
/* IPv6 */ |
| #ifdef HAVE_IN6_ADDR | #ifdef HAVE_STRUCT_IN6_ADDR |
| ifp->family = AF_INET6; |
ifp->family = AF_INET6; |
| if (inet_pton(AF_INET6, addr, &ifp->addr.ip6) != 1 || |
if (inet_pton(AF_INET6, addr, &ifp->addr.ip6) != 1 || |
| inet_pton(AF_INET6, mask, &ifp->netmask.ip6) != 1) |
inet_pton(AF_INET6, mask, &ifp->netmask.ip6) != 1) |
|
Line 97 set_interfaces(const char *ai)
|
Line 99 set_interfaces(const char *ai)
|
| interfaces = ifp; |
interfaces = ifp; |
| } |
} |
| efree(addrinfo); |
efree(addrinfo); |
| |
debug_return; |
| } |
} |
| |
|
| |
struct interface * |
| |
get_interfaces(void) |
| |
{ |
| |
return interfaces; |
| |
} |
| |
|
| void |
void |
| dump_interfaces(const char *ai) |
dump_interfaces(const char *ai) |
| { |
{ |
| char *cp, *addrinfo; |
char *cp, *addrinfo; |
| |
debug_decl(set_interfaces, SUDO_DEBUG_NETIF) |
| |
|
| addrinfo = estrdup(ai); |
addrinfo = estrdup(ai); |
| |
|
|
Line 111 dump_interfaces(const char *ai)
|
Line 121 dump_interfaces(const char *ai)
|
| sudo_printf(SUDO_CONV_INFO_MSG, "\t%s\n", cp); |
sudo_printf(SUDO_CONV_INFO_MSG, "\t%s\n", cp); |
| |
|
| efree(addrinfo); |
efree(addrinfo); |
| |
debug_return; |
| } |
} |