summaryrefslogtreecommitdiff
path: root/main/utils.c
diff options
context:
space:
mode:
authorCorey Farrell <git@cfware.com>2014-06-24 02:50:15 +0000
committerCorey Farrell <git@cfware.com>2014-06-24 02:50:15 +0000
commitdb6a8a63475d74d384425b7ac065600f7273a656 (patch)
tree111ef5f771719fc1db3da6a440bb9691f38e14ef /main/utils.c
parentd5ca5b7f8fc575b4f6f89b76fa8b6144093e20b3 (diff)
Move eid functions to utils.c, mark netsock.h deprecated
Move eid functions from netsock.c to utils.c. These functions were already published by utils.h. Flag netsock.h as deprecated and switch res_pjsip_session.h to use netsock2.h. The only code that still uses netsock.h is chan_iax2. ASTERISK-23920 #close Reported by: Corey Farrell Review: https://reviewboard.asterisk.org/r/3661/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@417167 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/utils.c')
-rw-r--r--main/utils.c107
1 files changed, 107 insertions, 0 deletions
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));
+}