Directory structure changed based on IGDv2 Architecture Design document.
[igd2-for-linux:wanipconnection2.git] / linuxigd2 / src / util.c
1 #include <string.h>
2 #include <stdio.h>
3 #include <stdarg.h>
4 #include <syslog.h>
5 #include <arpa/inet.h>
6 #include <linux/sockios.h>
7 #include <net/if.h>
8 #include <netinet/in.h>
9 #include <sys/ioctl.h>
10 #include <sys/socket.h>
11 #include "globals.h"
12
13
14 static int get_sockfd(void)
15 {
16    static int sockfd = -1;
17
18    if (sockfd == -1)
19    {
20       if ((sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_RAW)) == -1)
21       {
22          perror("user: socket creating failed");
23          return (-1);
24       }
25    }
26    return sockfd;
27 }
28
29 int GetIpAddressStr(char *address, char *ifname)
30 {
31    struct ifreq ifr;
32    struct sockaddr_in *saddr;
33    int fd;
34    int succeeded = 0;
35
36    fd = get_sockfd();
37    if (fd >= 0 )
38    {
39       strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
40       ifr.ifr_addr.sa_family = AF_INET;
41       if (ioctl(fd, SIOCGIFADDR, &ifr) == 0)
42       {
43          saddr = (struct sockaddr_in *)&ifr.ifr_addr;
44          strcpy(address,inet_ntoa(saddr->sin_addr));
45          succeeded = 1;
46       }
47       else
48       {
49          syslog(LOG_ERR, "Failure obtaining ip address of interface %s", ifname);
50          succeeded = 0;
51       }
52    }
53    return succeeded;
54 }
55
56 void trace(int debuglevel, const char *format, ...)
57 {
58   va_list ap;
59   va_start(ap,format);
60   if (g_vars.debug>=debuglevel) {
61     vsyslog(LOG_DEBUG,format,ap);
62   }
63   va_end(ap);
64 }