~shakaran/ubuntu/quantal/connman/bug-pattern-update

« back to all changes in this revision

Viewing changes to src/resolver.c

  • Committer: Bazaar Package Importer
  • Author(s): Mathieu Trudel
  • Date: 2010-02-12 10:08:03 UTC
  • mfrom: (1.1.8 upstream) (0.1.5 sid)
  • Revision ID: james.westby@ubuntu.com-20100212100803-s8iaj8g1dmgwm2uz
Tags: 0.48+dfsg-2
* Ubuntu/Debian sync upload
* Re-add missing changes from 0.45+dfsg that made it only in Ubuntu:
  - ship development parts in a connman-dev package (Closes: 546616)
    - add debian/connman-dev.install
    - update debian/control
* Update long descriptions for connman and connman-dev
  - update debian/control
* Add missing Depends on libglib2.0-dev, libdbus-1-dev for connman-dev
  - update debian/control
* Don't run bootstrap twice during build.
  - update debian/rules
* Remove old configure option: enable-ppp, with-pppd, enable-novatel,
  enable-huawei and enable-modemmgr are no longer recognized.
  - update debian/rules

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
 
33
33
#include "connman.h"
34
34
 
 
35
#define RESOLVER_FLAG_PUBLIC (1 << 0)
 
36
 
35
37
struct entry_data {
36
38
        struct connman_resolver *resolver;
37
39
        char *interface;
38
40
        char *domain;
39
41
        char *server;
 
42
        unsigned int flags;
40
43
};
41
44
 
42
45
static GSList *entry_list = NULL;
52
55
 
53
56
                entry_list = g_slist_remove(entry_list, entry);
54
57
 
55
 
                if (resolver->remove)
 
58
                if (resolver && resolver->remove)
56
59
                        resolver->remove(entry->interface, entry->domain,
57
60
                                                                entry->server);
58
61
 
133
136
        remove_entries(matches);
134
137
}
135
138
 
136
 
/**
137
 
 * connman_resolver_append:
138
 
 * @interface: network interface
139
 
 * @domain: domain limitation
140
 
 * @server: server address
141
 
 *
142
 
 * Append resolver server address to current list
143
 
 */
144
 
int connman_resolver_append(const char *interface, const char *domain,
145
 
                                                        const char *server)
 
139
static int append_resolver(const char *interface, const char *domain,
 
140
                                        const char *server, unsigned int flags)
146
141
{
147
142
        struct entry_data *entry;
148
143
        GSList *list;
149
144
 
150
 
        DBG("interface %s domain %s server %s", interface, domain, server);
 
145
        DBG("interface %s domain %s server %s flags %d",
 
146
                                        interface, domain, server, flags);
151
147
 
152
148
        if (server == NULL)
153
149
                return -EINVAL;
159
155
        entry->interface = g_strdup(interface);
160
156
        entry->domain = g_strdup(domain);
161
157
        entry->server = g_strdup(server);
 
158
        entry->flags = flags;
162
159
 
163
160
        entry_list = g_slist_append(entry_list, entry);
164
161
 
178
175
}
179
176
 
180
177
/**
 
178
 * connman_resolver_append:
 
179
 * @interface: network interface
 
180
 * @domain: domain limitation
 
181
 * @server: server address
 
182
 *
 
183
 * Append resolver server address to current list
 
184
 */
 
185
int connman_resolver_append(const char *interface, const char *domain,
 
186
                                                        const char *server)
 
187
{
 
188
        DBG("interface %s domain %s server %s", interface, domain, server);
 
189
 
 
190
        return append_resolver(interface, domain, server, 0);
 
191
}
 
192
 
 
193
/**
 
194
 * connman_resolver_remove:
 
195
 * @interface: network interface
 
196
 * @domain: domain limitation
 
197
 * @server: server address
 
198
 *
 
199
 * Remover resolver server address from current list
 
200
 */
 
201
int connman_resolver_remove(const char *interface, const char *domain,
 
202
                                                        const char *server)
 
203
{
 
204
        GSList *list, *matches = NULL;
 
205
 
 
206
        DBG("interface %s domain %s server %s", interface, domain, server);
 
207
 
 
208
        if (server == NULL)
 
209
                return -EINVAL;
 
210
 
 
211
        for (list = entry_list; list; list = list->next) {
 
212
                struct entry_data *entry = list->data;
 
213
 
 
214
                if (interface != NULL &&
 
215
                                g_strcmp0(entry->interface, interface) != 0)
 
216
                        continue;
 
217
 
 
218
                if (domain != NULL && g_strcmp0(entry->domain, domain) != 0)
 
219
                        continue;
 
220
 
 
221
                if (g_strcmp0(entry->server, server) != 0)
 
222
                        continue;
 
223
 
 
224
                matches = g_slist_append(matches, entry);
 
225
        }
 
226
 
 
227
        if (matches == NULL)
 
228
                return -ENOENT;
 
229
 
 
230
        remove_entries(matches);
 
231
 
 
232
        return 0;
 
233
}
 
234
 
 
235
/**
181
236
 * connman_resolver_remove_all:
182
237
 * @interface: network interface
183
238
 *
189
244
 
190
245
        DBG("interface %s", interface);
191
246
 
 
247
        if (interface == NULL)
 
248
                return -EINVAL;
 
249
 
192
250
        for (list = entry_list; list; list = list->next) {
193
251
                struct entry_data *entry = list->data;
194
252
 
195
 
                if (g_str_equal(entry->interface, interface) == FALSE)
 
253
                if (g_strcmp0(entry->interface, interface) != 0)
196
254
                        continue;
197
255
 
198
256
                matches = g_slist_append(matches, entry);
199
257
        }
200
258
 
 
259
        if (matches == NULL)
 
260
                return -ENOENT;
 
261
 
201
262
        remove_entries(matches);
202
263
 
203
264
        return 0;
204
265
}
205
266
 
 
267
/**
 
268
 * connman_resolver_append_public_server:
 
269
 * @server: server address
 
270
 *
 
271
 * Append public resolver server address to current list
 
272
 */
 
273
int connman_resolver_append_public_server(const char *server)
 
274
{
 
275
        DBG("server %s", server);
 
276
 
 
277
        return append_resolver(NULL, NULL, server, RESOLVER_FLAG_PUBLIC);
 
278
}
 
279
 
 
280
/**
 
281
 * connman_resolver_remove_public_server:
 
282
 * @server: server address
 
283
 *
 
284
 * Remove public resolver server address to current list
 
285
 */
 
286
int connman_resolver_remove_public_server(const char *server)
 
287
{
 
288
        DBG("server %s", server);
 
289
 
 
290
        return connman_resolver_remove(NULL, NULL, server);
 
291
}
 
292
 
206
293
static int selftest_append(const char *interface, const char *domain,
207
294
                                                        const char *server)
208
295
{
235
322
        connman_resolver_append("eth0", "moblin.org", "192.168.42.1");
236
323
        connman_resolver_append("wlan0", "lwn.net", "192.168.0.2");
237
324
 
 
325
        connman_resolver_append_public_server("8.8.8.8");
 
326
 
 
327
        connman_resolver_remove_public_server("8.8.8.8");
 
328
 
238
329
        connman_resolver_remove_all("wlan0");
239
330
 
240
331
        connman_resolver_unregister(&selftest_resolver);
247
338
{
248
339
        char *cmd;
249
340
        int fd, len, err;
 
341
        mode_t old_umask;
250
342
 
251
343
        DBG("interface %s server %s", interface, server);
252
344
 
 
345
        if (interface == NULL)
 
346
                return -ENOENT;
 
347
 
 
348
        old_umask = umask(022);
 
349
 
253
350
        fd = open("/etc/resolv.conf", O_RDWR | O_CREAT,
254
351
                                        S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
255
 
        if (fd < 0)
256
 
                return -errno;
257
 
 
258
 
        err = ftruncate(fd, 0);
 
352
        if (fd < 0) {
 
353
                err = -errno;
 
354
                goto done;
 
355
        }
 
356
 
 
357
        if (ftruncate(fd, 0) < 0) {
 
358
                err = -errno;
 
359
                goto failed;
 
360
        }
 
361
 
 
362
        err = 0;
259
363
 
260
364
        cmd = g_strdup_printf("# Generated by Connection Manager\n"
 
365
                                                "options edns0\n"
261
366
                                                "nameserver %s\n", server);
262
367
 
263
368
        len = write(fd, cmd, strlen(cmd));
 
369
        if (len < 0)
 
370
                err = -errno;
264
371
 
265
372
        g_free(cmd);
266
373
 
 
374
failed:
267
375
        close(fd);
268
376
 
269
 
        return 0;
 
377
done:
 
378
        umask(old_umask);
 
379
 
 
380
        return err;
270
381
}
271
382
 
272
383
static int resolvfile_remove(const char *interface, const char *domain,