Lines Matching refs:iter

132 getbuf4(isc_interfaceiter_t *iter) {
135 iter->bufsize = IFCONF_BUFSIZE_INITIAL;
138 iter->buf = isc_mem_get(iter->mctx, iter->bufsize);
139 if (iter->buf == NULL)
142 memset(&iter->ifc.ifc_len, 0, sizeof(iter->ifc.ifc_len));
143 iter->ifc.ifc_len = iter->bufsize;
144 iter->ifc.ifc_buf = iter->buf;
150 if (isc_ioctl(iter->socket, SIOCGIFCONF, (char *)&iter->ifc)
176 if (iter->ifc.ifc_len + 2 * sizeof(struct ifreq)
177 < iter->bufsize)
180 if (iter->bufsize >= IFCONF_BUFSIZE_MAX) {
191 isc_mem_put(iter->mctx, iter->buf, iter->bufsize);
193 iter->bufsize *= 2;
198 isc_mem_put(iter->mctx, iter->buf, iter->bufsize);
199 iter->buf = NULL;
205 getbuf6(isc_interfaceiter_t *iter) {
209 iter->bufsize6 = IFCONF_BUFSIZE_INITIAL;
212 iter->buf6 = isc_mem_get(iter->mctx, iter->bufsize6);
213 if (iter->buf6 == NULL)
216 memset(&iter->lifc, 0, sizeof(iter->lifc));
218 iter->lifc.lifc_family = AF_INET6;
221 iter->lifc.lifc_flags = 0;
223 iter->lifc.lifc_len = iter->bufsize6;
224 iter->lifc.lifc_buf = iter->buf6;
230 if (isc_ioctl(iter->socket6, SIOCGLIFCONF, (char *)&iter->lifc)
277 if (iter->lifc.lifc_len + 2 * sizeof(struct LIFREQ)
278 < iter->bufsize6)
281 if (iter->bufsize6 >= IFCONF_BUFSIZE_MAX) {
293 isc_mem_put(iter->mctx, iter->buf6, iter->bufsize6);
295 iter->bufsize6 *= 2;
298 if (iter->lifc.lifc_len != 0)
299 iter->mode = 6;
303 isc_mem_put(iter->mctx, iter->buf6, iter->bufsize6);
304 iter->buf6 = NULL;
311 isc_interfaceiter_t *iter;
319 iter = isc_mem_get(mctx, sizeof(*iter));
320 if (iter == NULL)
323 iter->mctx = mctx;
324 iter->mode = 4;
325 iter->buf = NULL;
326 iter->pos = (unsigned int) -1;
328 iter->buf6 = NULL;
329 iter->pos6 = (unsigned int) -1;
330 iter->result6 = ISC_R_NOMORE;
331 iter->socket6 = -1;
332 iter->first6 = ISC_FALSE;
348 if ((iter->socket6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
360 result = iter->result6 = getbuf6(iter);
365 if ((iter->socket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
377 result = getbuf4(iter);
386 iter->clua_context = -1;
387 iter->clua_done = ISC_TRUE;
390 iter->proc = fopen("/proc/net/if_inet6", "r");
391 iter->valid = ISC_R_FAILURE;
393 iter->result = ISC_R_FAILURE;
395 iter->magic = IFITER_MAGIC;
396 *iterp = iter;
400 if (iter->buf != NULL)
401 isc_mem_put(mctx, iter->buf, iter->bufsize);
402 (void) close(iter->socket);
406 if (iter->buf6 != NULL)
407 isc_mem_put(mctx, iter->buf6, iter->bufsize6);
409 if (iter->socket6 != -1)
410 (void) close(iter->socket6);
414 isc_mem_put(mctx, iter, sizeof(*iter));
426 internal_current_clusteralias(isc_interfaceiter_t *iter) {
428 if (clua_getaliasinfo(&iter->clua_sa, &ci) != CLUA_SUCCESS)
430 memset(&iter->current, 0, sizeof(iter->current));
431 iter->current.af = iter->clua_sa.sa_family;
432 memset(iter->current.name, 0, sizeof(iter->current.name));
433 sprintf(iter->current.name, "clua%d", ci.aliasid);
434 iter->current.flags = INTERFACE_F_UP;
435 get_inaddr(&iter->current.address, &ci.addr);
436 get_inaddr(&iter->current.netmask, &ci.netmask);
442 * Get information about the current interface to iter->current.
450 internal_current4(isc_interfaceiter_t *iter) {
462 REQUIRE(VALID_IFITER(iter));
464 if (iter->ifc.ifc_len == 0 ||
465 iter->pos == (unsigned int)iter->ifc.ifc_len) {
467 return (linux_if_inet6_current(iter));
473 INSIST( iter->pos < (unsigned int) iter->ifc.ifc_len);
475 ifrp = (void *)((char *) iter->ifc.ifc_req + iter->pos);
488 memset(&iter->current, 0, sizeof(iter->current));
489 iter->current.af = family;
491 INSIST(sizeof(ifreq.ifr_name) <= sizeof(iter->current.name));
492 memset(iter->current.name, 0, sizeof(iter->current.name));
493 memcpy(iter->current.name, ifreq.ifr_name, sizeof(ifreq.ifr_name));
495 get_addr(family, &iter->current.address,
503 if (iter->current.address.type.in.s_addr == htonl(INADDR_ANY))
507 if (memcmp(&iter->current.address.type.in6, &in6addr_any,
517 iter->current.flags = 0;
524 if (isc_ioctl(iter->socket, SIOCGIFFLAGS, (char *) &ifreq) < 0) {
533 iter->current.flags |= INTERFACE_F_UP;
537 iter->current.flags |= INTERFACE_F_POINTTOPOINT;
541 iter->current.flags |= INTERFACE_F_LOOPBACK;
544 iter->current.flags |= INTERFACE_F_BROADCAST;
548 iter->current.flags |= INTERFACE_F_MULTICAST;
556 memcpy(lifreq.lifr_name, iter->current.name, sizeof(lifreq.lifr_name));
557 memcpy(&lifreq.lifr_addr, &iter->current.address.type.in6,
558 sizeof(iter->current.address.type.in6));
560 if (isc_ioctl(iter->socket, SIOCGLIFADDR, &lifreq) < 0) {
569 isc_netaddr_format(&iter->current.address, sabuf, sizeof(sabuf));
584 iter->current.netmask.family = family;
593 iter->current.netmask.type.in6.s6_addr[i] = (~0 << bits) & 0xff;
596 iter->current.ifindex = if_nametoindex(iter->current.name);
607 if ((iter->current.flags & INTERFACE_F_POINTTOPOINT) != 0) {
613 if (isc_ioctl(iter->socket, SIOCGIFDSTADDR, (char *)&ifreq)
625 get_addr(family, &iter->current.dstaddress,
630 if ((iter->current.flags & INTERFACE_F_BROADCAST) != 0) {
636 if (isc_ioctl(iter->socket, SIOCGIFBRDADDR, (char *)&ifreq)
648 get_addr(family, &iter->current.broadcast,
662 if (isc_ioctl(iter->socket, SIOCGIFNETMASK, (char *)&ifreq) < 0) {
672 get_addr(family, &iter->current.netmask,
675 iter->current.ifindex = if_nametoindex(iter->current.name);
682 internal_current6(isc_interfaceiter_t *iter) {
689 REQUIRE(VALID_IFITER(iter));
690 if (iter->result6 != ISC_R_SUCCESS)
691 return (iter->result6);
692 REQUIRE(iter->pos6 < (unsigned int) iter->lifc.lifc_len);
694 ifrp = (void *)((char *)iter->lifc.lifc_req + iter->pos6);
707 memset(&iter->current, 0, sizeof(iter->current));
708 iter->current.af = family;
710 INSIST(sizeof(lifreq.lifr_name) <= sizeof(iter->current.name));
711 memset(iter->current.name, 0, sizeof(iter->current.name));
712 memcpy(iter->current.name, lifreq.lifr_name, sizeof(lifreq.lifr_name));
714 get_addr(family, &iter->current.address,
717 if (isc_netaddr_islinklocal(&iter->current.address))
718 isc_netaddr_setzone(&iter->current.address,
726 if (iter->current.address.type.in.s_addr == htonl(INADDR_ANY))
730 if (memcmp(&iter->current.address.type.in6, &in6addr_any,
740 iter->current.flags = 0;
743 fd = iter->socket6;
745 fd = iter->socket;
761 iter->current.flags |= INTERFACE_F_UP;
765 iter->current.flags |= INTERFACE_F_POINTTOPOINT;
769 iter->current.flags |= INTERFACE_F_LOOPBACK;
772 iter->current.flags |= INTERFACE_F_BROADCAST;
777 iter->current.flags |= INTERFACE_F_MULTICAST;
785 if ((iter->current.flags & INTERFACE_F_POINTTOPOINT) != 0) {
803 get_addr(family, &iter->current.dstaddress,
810 if ((iter->current.flags & INTERFACE_F_BROADCAST) != 0) {
816 if (isc_ioctl(iter->socket, SIOCGLIFBRDADDR, (char *)&lifreq)
828 get_addr(family, &iter->current.broadcast,
849 iter->current.netmask.family = family;
853 iter->current.netmask.type.in6.s6_addr[i / 8] =
857 iter->current.ifindex = if_nametoindex(iter->current.name);
878 get_addr(family, &iter->current.netmask,
882 iter->current.ifindex = if_nametoindex(iter->current.name);
889 internal_current(isc_interfaceiter_t *iter) {
891 if (iter->mode == 6) {
892 iter->result6 = internal_current6(iter);
893 if (iter->result6 != ISC_R_NOMORE)
894 return (iter->result6);
898 if (!iter->clua_done)
899 return(internal_current_clusteralias(iter));
901 return (internal_current4(iter));
912 internal_next4(isc_interfaceiter_t *iter) {
917 if (iter->pos < (unsigned int) iter->ifc.ifc_len) {
919 ifrp = (struct ifreq *)((char *) iter->ifc.ifc_req + iter->pos);
922 iter->pos += sizeof(ifrp->ifr_name) +
926 iter->pos += sizeof(struct ifreq);
929 INSIST(iter->pos == (unsigned int) iter->ifc.ifc_len);
931 return (linux_if_inet6_next(iter));
941 internal_next6(isc_interfaceiter_t *iter) {
946 if (iter->result6 != ISC_R_SUCCESS && iter->result6 != ISC_R_IGNORE)
947 return (iter->result6);
949 REQUIRE(iter->pos6 < (unsigned int) iter->lifc.lifc_len);
952 ifrp = (struct LIFREQ *)((char *) iter->lifc.lifc_req + iter->pos6);
955 iter->pos6 += sizeof(ifrp->lifr_name) + ifrp->lifr_addr.sa_len;
958 iter->pos6 += sizeof(struct LIFREQ);
960 if (iter->pos6 >= (unsigned int) iter->lifc.lifc_len)
968 internal_next(isc_interfaceiter_t *iter) {
973 if (iter->mode == 6) {
974 iter->result6 = internal_next6(iter);
975 if (iter->result6 != ISC_R_NOMORE)
976 return (iter->result6);
977 if (iter->first6) {
978 iter->first6 = ISC_FALSE;
984 if (!iter->clua_done) {
985 clua_result = clua_getaliasaddress(&iter->clua_sa,
986 &iter->clua_context);
988 iter->clua_done = ISC_TRUE;
992 return (internal_next4(iter));
996 internal_destroy(isc_interfaceiter_t *iter) {
997 (void) close(iter->socket);
999 if (iter->socket6 != -1)
1000 (void) close(iter->socket6);
1001 if (iter->buf6 != NULL) {
1002 isc_mem_put(iter->mctx, iter->buf6, iter->bufsize6);
1006 if (iter->proc != NULL)
1007 fclose(iter->proc);
1012 void internal_first(isc_interfaceiter_t *iter) {
1016 iter->pos = 0;
1018 iter->pos6 = 0;
1019 if (iter->result6 == ISC_R_NOMORE)
1020 iter->result6 = ISC_R_SUCCESS;
1021 iter->first6 = ISC_TRUE;
1024 iter->clua_context = 0;
1025 clua_result = clua_getaliasaddress(&iter->clua_sa,
1026 &iter->clua_context);
1027 iter->clua_done = ISC_TF(clua_result != CLUA_SUCCESS);
1030 linux_if_inet6_first(iter);