AddAnyPortMapping - initial implementation
[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 <upnp/upnp.h>
12 #include "globals.h"
13
14
15 static int get_sockfd(void)
16 {
17     static int sockfd = -1;
18
19     if (sockfd == -1)
20     {
21         if ((sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_RAW)) == -1)
22         {
23             perror("user: socket creating failed");
24             return (-1);
25         }
26     }
27     return sockfd;
28 }
29
30 int GetIpAddressStr(char *address, char *ifname)
31 {
32     struct ifreq ifr;
33     struct sockaddr_in *saddr;
34     int fd;
35     int succeeded = 0;
36
37     fd = get_sockfd();
38     if (fd >= 0 )
39     {
40         strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
41         ifr.ifr_addr.sa_family = AF_INET;
42         if (ioctl(fd, SIOCGIFADDR, &ifr) == 0)
43         {
44             saddr = (struct sockaddr_in *)&ifr.ifr_addr;
45             strcpy(address,inet_ntoa(saddr->sin_addr));
46             succeeded = 1;
47         }
48         else
49         {
50             syslog(LOG_ERR, "Failure obtaining ip address of interface %s", ifname);
51             succeeded = 0;
52         }
53     }
54     return succeeded;
55 }
56
57 // check if IP of control point is same as ICAddress
58 // return 0 if not, something else if match
59 int ControlPointIP_equals_InternalClientIP(char *ICAddress)
60 {
61     return 0;
62 }
63
64 void trace(int debuglevel, const char *format, ...)
65 {
66     va_list ap;
67     va_start(ap,format);
68     if (g_vars.debug>=debuglevel)
69     {
70         vsyslog(LOG_DEBUG,format,ap);
71     }
72     va_end(ap);
73 }
74
75 // check if parameter has a wild card
76 int checkForWildCard(const char *str) 
77 {
78     int retVal = 0;
79
80     if (strchr(str, '*') != NULL)
81         retVal = 1;
82
83     return retVal;
84 }
85
86 // add error data to event structure
87 void addErrorData(struct Upnp_Action_Request *ca_event, int errorCode, char* message) 
88
89     ca_event->ErrCode = errorCode;
90     strcpy(ca_event->ErrStr, message);
91     ca_event->ActionResult = NULL;
92 }
93
94 /*
95  * Returns true if value is "yes", "true" or "1".
96  * TODO: uppercase yes/true?
97  */
98 int resolveBoolean(char *value)
99 {
100     if ( strcmp(value, "yes") == 0 ||
101          strcmp(value, "true") == 0 ||
102          strcmp(value, "1") == 0 )
103     {
104         return 1;
105     }
106
107     return 0;
108 }
109