fix typo in pt.po headers
[debian/iodine.git] / src / util.c
1 /*
2  * Copyright (c) 2006-2014 Erik Ekman <yarrick@kryo.se>,
3  * 2006-2009 Bjorn Andersson <flex@kryo.se>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17
18 #include <stdio.h>
19 #include "common.h"
20
21 char *
22 get_resolvconf_addr()
23 {
24         static char addr[16];
25         char *rv;
26 #ifndef WINDOWS32
27         char buf[80];
28         FILE *fp;
29 #ifdef ANDROID
30         fp = popen("getprop net.dns1", "r");
31         if (fp == NULL)
32                 err(1, "getprop net.dns1 failed");
33         if (fgets(buf, sizeof(buf), fp) == NULL)
34                 err(1, "read getprop net.dns1 failed");
35         if (sscanf(buf, "%15s", addr) == 1)
36                 rv = addr;
37         pclose(fp);
38 #else
39
40         rv = NULL;
41
42         if ((fp = fopen("/etc/resolv.conf", "r")) == NULL)
43                 err(1, "/etc/resolv.conf");
44
45         while (feof(fp) == 0) {
46                 fgets(buf, sizeof(buf), fp);
47
48                 if (sscanf(buf, "nameserver %15s", addr) == 1) {
49                         rv = addr;
50                         break;
51                 }
52         }
53
54         fclose(fp);
55 #endif
56 #else /* !WINDOWS32 */
57         FIXED_INFO  *fixed_info;
58         ULONG       buflen;
59         DWORD       ret;
60
61         rv = NULL;
62         fixed_info = malloc(sizeof(FIXED_INFO));
63         buflen = sizeof(FIXED_INFO);
64
65         if (GetNetworkParams(fixed_info, &buflen) == ERROR_BUFFER_OVERFLOW) {
66                 /* official ugly api workaround */
67                 free(fixed_info);
68                 fixed_info = malloc(buflen);
69         }
70
71         ret = GetNetworkParams(fixed_info, &buflen);
72         if (ret == NO_ERROR) {
73                 strncpy(addr, fixed_info->DnsServerList.IpAddress.String, sizeof(addr));
74                 addr[15] = 0;
75                 rv = addr;
76         }
77         free(fixed_info);
78 #endif
79         return rv;
80 }
81
82 #ifdef OPENBSD
83 void
84 socket_setrtable(int fd, int rtable)
85 {
86 #ifdef SO_RTABLE
87         if (setsockopt (fd, IPPROTO_IP, SO_RTABLE, &rtable, sizeof(rtable)) == -1)
88                 err(1, "Failed to set routing table %d", rtable);
89 #else
90         fprintf(stderr, "Routing domain support was not available at compile time.\n");
91 #endif
92 }
93 #endif