/**Get local IP address. * * @deprecated * Use su_getlocalinfo() instead. */ int su_getlocalip(su_sockaddr_t *sa) { su_localinfo_t *li = NULL, hints[1] = {{ 0 }}; hints->li_family = sa->su_sa.sa_family ? sa->su_sa.sa_family : AF_INET; if (su_getlocalinfo(hints, &li) == 0) { memcpy(sa, li->li_addr, li->li_addrlen); su_freelocalinfo(li); return 0; } else return -1; }
int main(int argc, char *argv[]) { char buffer[SU_ADDRSIZE]; su_localinfo_t hints[1] = {{ LI_CANONNAME }}; su_localinfo_t *li, *res = NULL; int error; int ifindex = 0; if (argv[1] && strcmp(argv[1], "--help") == 0) usage(0); for (;;) { switch(getopt(argc, argv, "iImdn46gslh")) { case 'I': ifindex = 1; break; case 'i': hints->li_flags |= LI_IFNAME; ifindex = 1; break; case 'm': hints->li_flags |= LI_V4MAPPED; break; case '4': hints->li_family = AF_INET; break; #if SU_HAVE_IN6 case '6': hints->li_family = AF_INET6; break; #endif case 'd': hints->li_flags |= LI_NAMEREQD; break; case 'n': hints->li_flags |= LI_NUMERIC; break; case 'g': hints->li_scope |= LI_SCOPE_GLOBAL; break; case 's': hints->li_scope |= LI_SCOPE_SITE; break; case 'l': hints->li_scope |= LI_SCOPE_LINK; break; case 'h': hints->li_scope |= LI_SCOPE_HOST; break; case -1: goto main; default: usage(1); } } main: if (optind < argc) hints->li_canonname = argv[optind++]; if (optind < argc) usage(1); su_init(); if ((error = su_getlocalinfo(hints, &res)) == 0) { for (li = res; li; li = li->li_next) { if (li->li_flags & LI_NUMERIC) { fputs(li->li_canonname, stdout); } else { su_inet_ntop(li->li_family, SU_ADDR(li->li_addr), buffer, sizeof(buffer)); printf("%s maddr=[%s]", li->li_canonname, buffer); } if (li->li_scope & LI_SCOPE_GLOBAL) fputs(" scope=global", stdout); else if (li->li_scope & LI_SCOPE_SITE) fputs(" scope=site", stdout); else if (li->li_scope & LI_SCOPE_LINK) fputs(" scope=link", stdout); else if (li->li_scope & LI_SCOPE_HOST) fputs(" scope=host", stdout); if (ifindex) { if (li->li_ifname) printf(" if[%d]=%s", li->li_index, li->li_ifname); else printf(" if[%d]", li->li_index); } puts(""); } su_freelocalinfo(res); } else { fprintf(stderr, "localinfo: %s\n", su_gli_strerror(error)); error = 1; } su_deinit(); return error; }
static int test_sockaddr(void) { su_localinfo_t hints[1] = {{ LI_CANONNAME }}; su_localinfo_t *li, *res = NULL; int s; su_sockaddr_t su[1], a[1], b[1]; BEGIN(); hints->li_family = AF_INET; TEST(su_getlocalinfo(hints, &res), 0); for (li = res; li; li = li->li_next) { if (li->li_addrlen != res->li_addrlen || memcmp(li->li_addr, res->li_addr, li->li_addrlen) != 0) TEST_1(su_cmp_sockaddr(li->li_addr, res->li_addr) != 0); else TEST_1(su_cmp_sockaddr(li->li_addr, res->li_addr) == 0); } memset(su, 0, sizeof su); TEST(su_getlocalip(su), 0); if (res->li_family == AF_INET) TEST(su_cmp_sockaddr(res->li_addr, su), 0); TEST_1(su_gli_strerror(ELI_NOERROR)); TEST_1(su_gli_strerror(ELI_NOADDRESS)); TEST_1(su_gli_strerror(ELI_FAMILY)); TEST_1(su_gli_strerror(ELI_MEMORY)); TEST_1(su_gli_strerror(ELI_RESOLVER)); TEST_1(su_gli_strerror(ELI_SYSTEM)); TEST_1(su_gli_strerror(-100)); li = su_copylocalinfo(res); TEST_1(li); su_freelocalinfo(li); s = su_socket(res->li_family, SOCK_DGRAM, 0); TEST_1(s != -1); TEST(su_setblocking(s, 0), 0); TEST(su_setblocking(s, 1), 0); TEST(su_close(s), 0); su_freelocalinfo(res), res = NULL; #if SU_HAVE_IN6 hints->li_family = AF_INET6; hints->li_flags &= ~LI_CANONNAME; hints->li_flags |= LI_V4MAPPED; TEST(su_getlocalinfo(hints, &res), 0); for (li = res; li; li = li->li_next) TEST(li->li_family, AF_INET6); su_freelocalinfo(res), res = NULL; #endif hints->li_flags |= LI_NUMERIC; TEST(su_getlocalinfo(hints, &res), 0); su_freelocalinfo(res), res = NULL; res = NULL; hints->li_flags |= LI_NAMEREQD; su_getlocalinfo(hints, &res); su_freelocalinfo(res), res = NULL; memset(a, 0, sizeof *a); memset(b, 0, sizeof *b); TEST_1(su_match_sockaddr(a, b)); b->su_family = AF_INET; TEST_1(su_match_sockaddr(a, b)); a->su_port = htons(12); TEST_1(!su_match_sockaddr(a, b)); b->su_port = htons(12); TEST_1(su_match_sockaddr(a, b)); a->su_sin.sin_addr.s_addr = htonl(0x7f000001); TEST_1(su_match_sockaddr(a, b)); a->su_family = AF_INET; TEST_1(!su_match_sockaddr(a, b)); b->su_sin.sin_addr.s_addr = htonl(0x7f000001); TEST_1(su_match_sockaddr(a, b)); a->su_sin.sin_addr.s_addr = 0; TEST_1(su_match_sockaddr(a, b)); #if SU_HAVE_IN6 a->su_family = AF_INET6; TEST_1(!su_match_sockaddr(a, b)); b->su_family = AF_INET6; TEST_1(su_match_sockaddr(a, b)); b->su_sin6.sin6_addr.s6_addr[15] = 1; TEST_1(su_match_sockaddr(a, b)); TEST_1(!su_match_sockaddr(b, a)); a->su_sin6.sin6_addr.s6_addr[15] = 2; TEST_1(!su_match_sockaddr(a, b)); a->su_family = 0; TEST_1(su_match_sockaddr(a, b)); TEST_1(!su_match_sockaddr(b, a)); #endif END(); }