diff options
-rw-r--r-- | include/asterisk/netsock.h | 2 | ||||
-rw-r--r-- | include/asterisk/res_pjsip_session.h | 2 | ||||
-rw-r--r-- | main/netsock.c | 103 | ||||
-rw-r--r-- | main/utils.c | 107 |
4 files changed, 110 insertions, 104 deletions
diff --git a/include/asterisk/netsock.h b/include/asterisk/netsock.h index f85bd381a..bd80072f5 100644 --- a/include/asterisk/netsock.h +++ b/include/asterisk/netsock.h @@ -19,6 +19,8 @@ /*! \file * \brief Network socket handling + * + * \deprecated Use netsock2.h instead */ #ifndef _ASTERISK_NETSOCK_H diff --git a/include/asterisk/res_pjsip_session.h b/include/asterisk/res_pjsip_session.h index 5a07137dc..01c63db66 100644 --- a/include/asterisk/res_pjsip_session.h +++ b/include/asterisk/res_pjsip_session.h @@ -25,7 +25,7 @@ /* Needed for AST_MAX_EXTENSION constant */ #include "asterisk/channel.h" /* Needed for ast_sockaddr struct */ -#include "asterisk/netsock.h" +#include "asterisk/netsock2.h" /* Needed for ast_sdp_srtp struct */ #include "asterisk/sdp_srtp.h" diff --git a/main/netsock.c b/main/netsock.c index cf4c792af..c11f14a89 100644 --- a/main/netsock.c +++ b/main/netsock.c @@ -201,106 +201,3 @@ void ast_netsock_unref(struct ast_netsock *ns) { ASTOBJ_UNREF(ns, ast_netsock_destroy); } - -char *ast_eid_to_str(char *s, int maxlen, struct ast_eid *eid) -{ - int x; - char *os = s; - if (maxlen < 18) { - if (s && (maxlen > 0)) - *s = '\0'; - } else { - for (x = 0; x < 5; x++) { - sprintf(s, "%02x:", (unsigned)eid->eid[x]); - s += 3; - } - sprintf(s, "%02x", (unsigned)eid->eid[5]); - } - return os; -} - -void ast_set_default_eid(struct ast_eid *eid) -{ -#if defined(SIOCGIFHWADDR) && defined(HAVE_STRUCT_IFREQ_IFR_IFRU_IFRU_HWADDR) - int s, x = 0; - char eid_str[20]; - struct ifreq ifr; - static const unsigned int MAXIF = 10; - - s = socket(AF_INET, SOCK_STREAM, 0); - if (s < 0) - return; - for (x = 0; x < MAXIF; x++) { - static const char *prefixes[] = { "eth", "em" }; - unsigned int i; - - for (i = 0; i < ARRAY_LEN(prefixes); i++) { - memset(&ifr, 0, sizeof(ifr)); - snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s%d", prefixes[i], x); - if (!ioctl(s, SIOCGIFHWADDR, &ifr)) { - break; - } - } - - if (i == ARRAY_LEN(prefixes)) { - /* Try pciX#[1..N] */ - for (i = 0; i < MAXIF; i++) { - memset(&ifr, 0, sizeof(ifr)); - snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "pci%d#%u", x, i); - if (!ioctl(s, SIOCGIFHWADDR, &ifr)) { - break; - } - } - if (i == MAXIF) { - continue; - } - } - - memcpy(eid, ((unsigned char *)&ifr.ifr_hwaddr) + 2, sizeof(*eid)); - ast_debug(1, "Seeding global EID '%s' from '%s' using 'siocgifhwaddr'\n", ast_eid_to_str(eid_str, sizeof(eid_str), eid), ifr.ifr_name); - close(s); - return; - } - close(s); -#else -#if defined(ifa_broadaddr) && !defined(SOLARIS) - char eid_str[20]; - struct ifaddrs *ifap; - - if (getifaddrs(&ifap) == 0) { - struct ifaddrs *p; - for (p = ifap; p; p = p->ifa_next) { - if ((p->ifa_addr->sa_family == AF_LINK) && !(p->ifa_flags & IFF_LOOPBACK) && (p->ifa_flags & IFF_RUNNING)) { - struct sockaddr_dl* sdp = (struct sockaddr_dl*) p->ifa_addr; - memcpy(&(eid->eid), sdp->sdl_data + sdp->sdl_nlen, 6); - ast_debug(1, "Seeding global EID '%s' from '%s' using 'getifaddrs'\n", ast_eid_to_str(eid_str, sizeof(eid_str), eid), p->ifa_name); - freeifaddrs(ifap); - return; - } - } - freeifaddrs(ifap); - } -#endif -#endif - ast_debug(1, "No ethernet interface found for seeding global EID. You will have to set it manually.\n"); -} - -int ast_str_to_eid(struct ast_eid *eid, const char *s) -{ - unsigned int eid_int[6]; - int x; - - if (sscanf(s, "%2x:%2x:%2x:%2x:%2x:%2x", &eid_int[0], &eid_int[1], &eid_int[2], - &eid_int[3], &eid_int[4], &eid_int[5]) != 6) - return -1; - - for (x = 0; x < 6; x++) - eid->eid[x] = eid_int[x]; - - return 0; -} - -int ast_eid_cmp(const struct ast_eid *eid1, const struct ast_eid *eid2) -{ - return memcmp(eid1, eid2, sizeof(*eid1)); -} diff --git a/main/utils.c b/main/utils.c index bb8559d8c..467f9f13c 100644 --- a/main/utils.c +++ b/main/utils.c @@ -2548,3 +2548,110 @@ void __ast_assert_failed(int condition, const char *condition_str, const char *f ast_do_crash(); } #endif /* defined(AST_DEVMODE) */ + +char *ast_eid_to_str(char *s, int maxlen, struct ast_eid *eid) +{ + int x; + char *os = s; + if (maxlen < 18) { + if (s && (maxlen > 0)) { + *s = '\0'; + } + } else { + for (x = 0; x < 5; x++) { + sprintf(s, "%02x:", (unsigned)eid->eid[x]); + s += 3; + } + sprintf(s, "%02x", (unsigned)eid->eid[5]); + } + return os; +} + +void ast_set_default_eid(struct ast_eid *eid) +{ +#if defined(SIOCGIFHWADDR) && defined(HAVE_STRUCT_IFREQ_IFR_IFRU_IFRU_HWADDR) + int s, x = 0; + char eid_str[20]; + struct ifreq ifr; + static const unsigned int MAXIF = 10; + + s = socket(AF_INET, SOCK_STREAM, 0); + if (s < 0) { + return; + } + for (x = 0; x < MAXIF; x++) { + static const char *prefixes[] = { "eth", "em" }; + unsigned int i; + + for (i = 0; i < ARRAY_LEN(prefixes); i++) { + memset(&ifr, 0, sizeof(ifr)); + snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s%d", prefixes[i], x); + if (!ioctl(s, SIOCGIFHWADDR, &ifr)) { + break; + } + } + + if (i == ARRAY_LEN(prefixes)) { + /* Try pciX#[1..N] */ + for (i = 0; i < MAXIF; i++) { + memset(&ifr, 0, sizeof(ifr)); + snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "pci%d#%u", x, i); + if (!ioctl(s, SIOCGIFHWADDR, &ifr)) { + break; + } + } + if (i == MAXIF) { + continue; + } + } + + memcpy(eid, ((unsigned char *)&ifr.ifr_hwaddr) + 2, sizeof(*eid)); + ast_debug(1, "Seeding global EID '%s' from '%s' using 'siocgifhwaddr'\n", ast_eid_to_str(eid_str, sizeof(eid_str), eid), ifr.ifr_name); + close(s); + return; + } + close(s); +#else +#if defined(ifa_broadaddr) && !defined(SOLARIS) + char eid_str[20]; + struct ifaddrs *ifap; + + if (getifaddrs(&ifap) == 0) { + struct ifaddrs *p; + for (p = ifap; p; p = p->ifa_next) { + if ((p->ifa_addr->sa_family == AF_LINK) && !(p->ifa_flags & IFF_LOOPBACK) && (p->ifa_flags & IFF_RUNNING)) { + struct sockaddr_dl* sdp = (struct sockaddr_dl*) p->ifa_addr; + memcpy(&(eid->eid), sdp->sdl_data + sdp->sdl_nlen, 6); + ast_debug(1, "Seeding global EID '%s' from '%s' using 'getifaddrs'\n", ast_eid_to_str(eid_str, sizeof(eid_str), eid), p->ifa_name); + freeifaddrs(ifap); + return; + } + } + freeifaddrs(ifap); + } +#endif +#endif + ast_debug(1, "No ethernet interface found for seeding global EID. You will have to set it manually.\n"); +} + +int ast_str_to_eid(struct ast_eid *eid, const char *s) +{ + unsigned int eid_int[6]; + int x; + + if (sscanf(s, "%2x:%2x:%2x:%2x:%2x:%2x", &eid_int[0], &eid_int[1], &eid_int[2], + &eid_int[3], &eid_int[4], &eid_int[5]) != 6) { + return -1; + } + + for (x = 0; x < 6; x++) { + eid->eid[x] = eid_int[x]; + } + + return 0; +} + +int ast_eid_cmp(const struct ast_eid *eid1, const struct ast_eid *eid2) +{ + return memcmp(eid1, eid2, sizeof(*eid1)); +} |