155
162
switch (ifa->ifa_addr->sa_family) {
157
164
sin = (struct sockaddr_in *)ifa->ifa_addr;
158
len = snprintf(cp, ailen - (*addrinfo - cp),
159
"%s%s/", cp == *addrinfo ? "" : " ",
160
inet_ntoa(sin->sin_addr));
161
if (len <= 0 || len >= ailen - (*addrinfo - cp)) {
162
warningx(U_("load_interfaces: overflow detected"));
165
if (inet_ntop(AF_INET, &sin->sin_addr, addrstr, sizeof(addrstr)) == NULL)
167
167
sin = (struct sockaddr_in *)ifa->ifa_netmask;
168
if (inet_ntop(AF_INET, &sin->sin_addr, maskstr, sizeof(maskstr)) == NULL)
168
171
len = snprintf(cp, ailen - (*addrinfo - cp),
169
"%s", inet_ntoa(sin->sin_addr));
172
"%s%s/%s", cp == *addrinfo ? "" : " ", addrstr, maskstr);
170
173
if (len <= 0 || len >= ailen - (*addrinfo - cp)) {
171
warningx(U_("load_interfaces: overflow detected"));
174
sudo_warnx(U_("internal error, %s overflow"), __func__);
176
179
#ifdef HAVE_STRUCT_IN6_ADDR
178
181
sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
179
inet_ntop(AF_INET6, &sin6->sin6_addr, addrbuf, sizeof(addrbuf));
180
len = snprintf(cp, ailen - (*addrinfo - cp),
181
"%s%s/", cp == *addrinfo ? "" : " ", addrbuf);
182
if (len <= 0 || len >= ailen - (*addrinfo - cp)) {
183
warningx(U_("load_interfaces: overflow detected"));
182
if (inet_ntop(AF_INET6, &sin6->sin6_addr, addrstr, sizeof(addrstr)) == NULL)
188
184
sin6 = (struct sockaddr_in6 *)ifa->ifa_netmask;
189
inet_ntop(AF_INET6, &sin6->sin6_addr, addrbuf, sizeof(addrbuf));
190
len = snprintf(cp, ailen - (*addrinfo - cp), "%s", addrbuf);
185
if (inet_ntop(AF_INET6, &sin6->sin6_addr, maskstr, sizeof(maskstr)) == NULL)
188
len = snprintf(cp, ailen - (*addrinfo - cp),
189
"%s%s/%s", cp == *addrinfo ? "" : " ", addrstr, maskstr);
191
190
if (len <= 0 || len >= ailen - (*addrinfo - cp)) {
192
warningx(U_("load_interfaces: overflow detected"));
191
sudo_warnx(U_("internal error, %s overflow"), __func__);
217
216
get_net_ifs(char **addrinfo)
218
char ifr_tmpbuf[sizeof(struct ifreq)];
219
struct ifreq *ifr, *ifr_tmp = (struct ifreq *)ifr_tmpbuf;
219
220
struct ifconf *ifconf;
220
struct ifreq *ifr, ifr_tmp;
221
221
struct sockaddr_in *sin;
222
222
int ailen, i, len, n, sock, num_interfaces = 0;
223
223
size_t buflen = sizeof(struct ifconf) + BUFSIZ;
224
224
char *cp, *previfname = "", *ifconf_buf = NULL;
225
char addrstr[INET_ADDRSTRLEN], maskstr[INET_ADDRSTRLEN];
226
227
struct strioctl strioctl;
227
228
#endif /* _ISC */
289
290
#ifdef SIOCGIFFLAGS
290
memset(&ifr_tmp, 0, sizeof(ifr_tmp));
291
strncpy(ifr_tmp.ifr_name, ifr->ifr_name, sizeof(ifr_tmp.ifr_name) - 1);
292
if (ioctl(sock, SIOCGIFFLAGS, (caddr_t) &ifr_tmp) < 0)
291
memset(ifr_tmp, 0, sizeof(*ifr_tmp));
292
strncpy(ifr_tmp->ifr_name, ifr->ifr_name, sizeof(ifr_tmp->ifr_name) - 1);
293
if (ioctl(sock, SIOCGIFFLAGS, (caddr_t) ifr_tmp) < 0)
295
memcpy(ifr_tmp, ifr, sizeof(*ifr_tmp));
296
297
/* Skip interfaces marked "down" and "loopback". */
297
if (!ISSET(ifr_tmp.ifr_flags, IFF_UP) ||
298
ISSET(ifr_tmp.ifr_flags, IFF_LOOPBACK))
298
if (!ISSET(ifr_tmp->ifr_flags, IFF_UP) ||
299
ISSET(ifr_tmp->ifr_flags, IFF_LOOPBACK))
302
/* Get the netmask. */
303
memset(ifr_tmp, 0, sizeof(*ifr_tmp));
304
strncpy(ifr_tmp->ifr_name, ifr->ifr_name, sizeof(ifr_tmp->ifr_name) - 1);
305
sin = (struct sockaddr_in *) &ifr_tmp->ifr_addr;
307
STRSET(SIOCGIFNETMASK, (caddr_t) ifr_tmp, sizeof(*ifr_tmp));
308
if (ioctl(sock, I_STR, (caddr_t) &strioctl) < 0)
310
if (ioctl(sock, SIOCGIFNETMASK, (caddr_t) ifr_tmp) < 0)
312
sin->sin_addr.s_addr = htonl(IN_CLASSC_NET);
314
/* Convert the addr and mask to string form. */
301
315
sin = (struct sockaddr_in *) &ifr->ifr_addr;
316
if (inet_ntop(AF_INET, &sin->sin_addr, addrstr, sizeof(addrstr)) == NULL)
318
sin = (struct sockaddr_in *) &ifr_tmp->ifr_addr;
319
if (inet_ntop(AF_INET, &sin->sin_addr, maskstr, sizeof(maskstr)) == NULL)
302
322
len = snprintf(cp, ailen - (*addrinfo - cp),
303
"%s%s/", cp == *addrinfo ? "" : " ",
304
inet_ntoa(sin->sin_addr));
323
"%s%s/%s", cp == *addrinfo ? "" : " ", addrstr, maskstr);
305
324
if (len <= 0 || len >= ailen - (*addrinfo - cp)) {
306
warningx(U_("load_interfaces: overflow detected"));
325
sudo_warnx(U_("internal error, %s overflow"), __func__);
311
330
/* Stash the name of the interface we saved. */
312
331
previfname = ifr->ifr_name;
314
/* Get the netmask. */
315
memset(&ifr_tmp, 0, sizeof(ifr_tmp));
316
strncpy(ifr_tmp.ifr_name, ifr->ifr_name, sizeof(ifr_tmp.ifr_name) - 1);
318
STRSET(SIOCGIFNETMASK, (caddr_t) &ifr_tmp, sizeof(ifr_tmp));
319
if (ioctl(sock, I_STR, (caddr_t) &strioctl) < 0) {
321
if (ioctl(sock, SIOCGIFNETMASK, (caddr_t) &ifr_tmp) < 0) {
323
sin = (struct sockaddr_in *) &ifr_tmp.ifr_addr;
324
sin->sin_addr.s_addr = htonl(IN_CLASSC_NET);
326
sin = (struct sockaddr_in *) &ifr_tmp.ifr_addr;
327
len = snprintf(cp, ailen - (*addrinfo - cp),
328
"%s", inet_ntoa(sin->sin_addr));
329
if (len <= 0 || len >= ailen - (*addrinfo - cp)) {
330
warningx(U_("load_interfaces: overflow detected"));
334
332
num_interfaces++;
336
sudo_efree(ifconf_buf);
339
337
(void) close(sock);
341
339
debug_return_int(num_interfaces);