~cyphermox/ubuntu/precise/dnsmasq/dbus

« back to all changes in this revision

Viewing changes to src/dnsmasq.c

  • Committer: Bazaar Package Importer
  • Author(s): Simon Kelley
  • Date: 2005-09-03 20:02:32 UTC
  • mfrom: (0.2.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20050903200232-76u3kbiz1hm4ok3u
Tags: 2.24-1
 * New upstream. (closes: #330422)
 * Fix typo and clean up dnsmasq.conf (closes: #326057) (closes: #304446)
 * Add build support for I18N and gettext.
 * Fixed manpage typos. (closes: #336413)
 * Create a dnsmasq-unique userid for the daemon to run as. (closes: #338353)

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
 
15
15
#include "dnsmasq.h"
16
16
 
 
17
static char *compile_opts = 
 
18
#ifndef HAVE_IPV6
 
19
"no-"
 
20
#endif
 
21
"IPv6 "
 
22
#ifndef HAVE_GETOPT_LONG
 
23
"no-"
 
24
#endif
 
25
"GNU-getopt "
 
26
#ifdef HAVE_BROKEN_RTC
 
27
"no-RTC "
 
28
#endif
 
29
#ifndef HAVE_ISC_READER
 
30
"no-"
 
31
#endif
 
32
"ISC-leasefile "
 
33
#ifndef HAVE_DBUS
 
34
"no-"
 
35
#endif
 
36
"DBus "
 
37
#ifdef NO_GETTEXT
 
38
"no-"
 
39
#endif
 
40
"i18n";
 
41
 
17
42
static volatile int sigterm, sighup, sigusr1, sigalarm, num_kids, in_child;
18
43
 
19
44
static int set_dns_listeners(struct daemon *daemon, fd_set *set, int maxfd);
26
51
  int first_loop = 1;
27
52
  int bind_fallback = 0;
28
53
  time_t now, last = 0;
29
 
  struct irec *interfaces;
30
54
  struct sigaction sigact;
31
55
  sigset_t sigmask;
32
56
  struct iname *if_tmp;
33
57
 
 
58
#ifndef NO_GETTEXT
 
59
  setlocale(LC_ALL, "");
 
60
  bindtextdomain("dnsmasq", LOCALEDIR); 
 
61
  textdomain("dnsmasq");
 
62
#endif
 
63
 
34
64
  sighup = 1; /* init cache the first time through */
35
65
  sigusr1 = 0; /* but don't dump */
36
66
  sigterm = 0; /* or die */
64
94
  sigaddset(&sigact.sa_mask, SIGCHLD);
65
95
  sigprocmask(SIG_BLOCK, &sigact.sa_mask, &sigmask); 
66
96
 
67
 
  daemon = read_opts(argc, argv);
 
97
  daemon = read_opts(argc, argv, compile_opts);
68
98
  
69
99
  if (daemon->edns_pktsz < PACKETSZ)
70
100
    daemon->edns_pktsz = PACKETSZ;
79
109
    }
80
110
#ifndef HAVE_ISC_READER
81
111
  else if (!daemon->dhcp)
82
 
    die("ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h", NULL);
 
112
    die(_("ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h"), NULL);
83
113
#endif
84
114
  
85
 
  if (!enumerate_interfaces(daemon, &interfaces, NULL, NULL))
86
 
    die("failed to find list of interfaces: %s", NULL);
 
115
  if (!enumerate_interfaces(daemon, &daemon->interfaces, NULL, NULL))
 
116
    die(_("failed to find list of interfaces: %s"), NULL);
87
117
 
88
118
  if (!(daemon->options & OPT_NOWILD) && 
89
119
      !(daemon->listeners = create_wildcard_listeners(daemon->port)))
94
124
    
95
125
  if (daemon->options & OPT_NOWILD) 
96
126
    {
97
 
      daemon->listeners = create_bound_listeners(interfaces, daemon->port);
 
127
      daemon->listeners = create_bound_listeners(daemon->interfaces, daemon->port);
98
128
 
99
129
      for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next)
100
130
        if (if_tmp->name && !if_tmp->used)
101
 
          die("unknown interface %s", if_tmp->name);
 
131
          die(_("unknown interface %s"), if_tmp->name);
102
132
  
103
133
      for (if_tmp = daemon->if_addrs; if_tmp; if_tmp = if_tmp->next)
104
134
        if (!if_tmp->used)
105
135
          {
106
 
            char *addrbuff = daemon->namebuff;
107
 
#ifdef HAVE_IPV6
108
 
            if (if_tmp->addr.sa.sa_family == AF_INET)
109
 
              inet_ntop(AF_INET, &if_tmp->addr.in.sin_addr,
110
 
                        addrbuff, ADDRSTRLEN);
111
 
            else
112
 
              inet_ntop(AF_INET6, &if_tmp->addr.in6.sin6_addr,
113
 
                        addrbuff, ADDRSTRLEN);
114
 
#else
115
 
            strcpy(addrbuff, inet_ntoa(if_tmp->addr.in.sin_addr));
116
 
#endif
117
 
            die("no interface with address %s", addrbuff);
 
136
            prettyprint_addr(&if_tmp->addr, daemon->namebuff);
 
137
            die(_("no interface with address %s"), daemon->namebuff);
118
138
          }
119
139
    }
120
140
  
123
143
 
124
144
#ifdef HAVE_BROKEN_RTC
125
145
  if ((daemon->uptime_fd = open(UPTIME, O_RDONLY)) == -1)
126
 
    die("cannot open " UPTIME ":%s", NULL);
 
146
    die(_("cannot open %s:%s"), UPTIME);
127
147
#endif
128
148
 
129
149
  now = dnsmasq_time(daemon->uptime_fd);
137
157
        if (!tmp->isloop)
138
158
          c++;
139
159
      if (c != 1)
140
 
        die("must set exactly one interface on broken systems without IP_RECVIF", NULL);
 
160
        die(_("must set exactly one interface on broken systems without IP_RECVIF"), NULL);
141
161
#endif
142
162
      dhcp_init(daemon);
143
163
      lease_init(daemon, now);
144
164
    }
145
165
 
 
166
  if (daemon->options & OPT_DBUS)
 
167
#ifdef HAVE_DBUS
 
168
    {
 
169
      char *err;
 
170
      daemon->dbus = NULL;
 
171
      daemon->watches = NULL;
 
172
      if ((err = dbus_init(daemon)))
 
173
        die(_("DBus error: %s"), err);
 
174
    }
 
175
#else
 
176
  if (daemon->options & OPT_DBUS)
 
177
    die(_("DBus not available: set HAVE_DBUS in src/config.h"), NULL);
 
178
#endif
 
179
  
146
180
  /* If query_port is set then create a socket now, before dumping root
147
181
     for use to access nameservers without more specific source addresses.
148
182
     This allows query_port to be a low port */
173
207
  if (!(daemon->options & OPT_DEBUG))
174
208
    {
175
209
      FILE *pidfile;
176
 
      struct serverfd *serverfdp;
177
 
      struct listener *listener;
178
210
      struct passwd *ent_pw;
179
 
      int i;
180
 
        
 
211
      fd_set test_set;
 
212
      int maxfd, i;
 
213
        
 
214
      FD_ZERO(&test_set);
 
215
      maxfd = set_dns_listeners(daemon, &test_set, -1);
 
216
#ifdef HAVE_DBUS
 
217
      maxfd = set_dbus_listeners(daemon, maxfd, &test_set, &test_set, &test_set);
 
218
#endif
 
219
      
181
220
      /* The following code "daemonizes" the process. 
182
221
         See Stevens section 12.4 */
183
 
 
 
222
      
184
223
#ifndef NO_FORK
185
224
      if (!(daemon->options & OPT_NO_FORK))
186
225
        {
208
247
 
209
248
      for (i=0; i<64; i++)
210
249
        {
211
 
          for (listener = daemon->listeners; listener; listener = listener->next)
212
 
            if (listener->fd == i || listener->tcpfd == i)
213
 
              break;
214
 
          if (listener)
215
 
            continue;
216
 
 
217
250
#ifdef HAVE_BROKEN_RTC    
218
251
          if (i == daemon->uptime_fd)
219
252
            continue;
220
253
#endif
221
 
 
 
254
          
222
255
          if (daemon->dhcp && 
223
256
              (i == daemon->lease_fd || 
224
257
               i == daemon->dhcpfd || 
225
258
               i == daemon->dhcp_raw_fd ||
226
259
               i == daemon->dhcp_icmp_fd))
227
260
            continue;
228
 
          
229
 
          for (serverfdp = daemon->sfds; serverfdp; serverfdp = serverfdp->next)
230
 
            if (serverfdp->fd == i)
231
 
              break;
232
 
          if (serverfdp)
 
261
 
 
262
          if (i <= maxfd && FD_ISSET(i, &test_set))
233
263
            continue;
234
264
 
235
265
          close(i);
257
287
          DNSMASQ_LOG_FAC(daemon->options & OPT_DEBUG));
258
288
  
259
289
  if (daemon->cachesize != 0)
260
 
    syslog(LOG_INFO, "started, version %s cachesize %d", VERSION, daemon->cachesize);
 
290
    syslog(LOG_INFO, _("started, version %s cachesize %d"), VERSION, daemon->cachesize);
261
291
  else
262
 
    syslog(LOG_INFO, "started, version %s cache disabled", VERSION);
263
 
  
 
292
    syslog(LOG_INFO, _("started, version %s cache disabled"), VERSION);
 
293
 
 
294
  syslog(LOG_INFO, _("compile time options: %s"), compile_opts);
 
295
 
 
296
#ifdef HAVE_DBUS
 
297
  if (daemon->options & OPT_DBUS)
 
298
    {
 
299
      if (daemon->dbus)
 
300
        syslog(LOG_INFO, _("DBus support enabled: connected to system bus"));
 
301
      else
 
302
        syslog(LOG_INFO, _("DBus support enabled: bus connection pending"));
 
303
    }
 
304
#endif
 
305
 
264
306
  if (bind_fallback)
265
 
    syslog(LOG_WARNING, "setting --bind-interfaces option because of OS limitations");
 
307
    syslog(LOG_WARNING, _("setting --bind-interfaces option because of OS limitations"));
266
308
  
267
309
  if (!(daemon->options & OPT_NOWILD)) 
268
310
    for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next)
269
311
      if (if_tmp->name && !if_tmp->used)
270
 
        syslog(LOG_WARNING, "warning: interface %s does not currently exist", if_tmp->name);
 
312
        syslog(LOG_WARNING, _("warning: interface %s does not currently exist"), if_tmp->name);
271
313
  
272
314
  if (daemon->dhcp)
273
315
    {
284
326
          strcpy(daemon->dhcp_buff, inet_ntoa(dhcp_tmp->start));
285
327
          syslog(LOG_INFO, 
286
328
                 (dhcp_tmp->flags & CONTEXT_STATIC) ? 
287
 
                 "DHCP, static leases only on %.0s%s, lease time %s" :
288
 
                 "DHCP, IP range %s -- %s, lease time %s",
 
329
                 _("DHCP, static leases only on %.0s%s, lease time %s") :
 
330
                 _("DHCP, IP range %s -- %s, lease time %s"),
289
331
                 daemon->dhcp_buff, inet_ntoa(dhcp_tmp->end), daemon->dhcp_buff2);
290
332
        }
291
333
 
296
338
      if (daemon->min_leasetime < 60)
297
339
        daemon->min_leasetime = 60;
298
340
      prettyprint_time(daemon->dhcp_buff2, daemon->min_leasetime);
299
 
      syslog(LOG_INFO, "DHCP, %s will be written every %s", daemon->lease_file, daemon->dhcp_buff2);
 
341
      syslog(LOG_INFO, _("DHCP, %s will be written every %s"), daemon->lease_file, daemon->dhcp_buff2);
300
342
#endif
301
343
    }
302
344
 
303
345
  if (!(daemon->options & OPT_DEBUG) && (getuid() == 0 || geteuid() == 0))
304
 
    syslog(LOG_WARNING, "running as root");
 
346
    syslog(LOG_WARNING, _("running as root"));
305
347
  
306
 
  check_servers(daemon, interfaces);
 
348
  check_servers(daemon);
307
349
  
308
350
  while (sigterm == 0)
309
351
    {
310
 
      fd_set rset;
 
352
      fd_set rset, wset, eset;
311
353
      
312
354
      if (sighup)
313
355
        {
314
 
          cache_reload(daemon->options, daemon->namebuff, daemon->domain_suffix, daemon->addn_hosts);
315
 
          if (daemon->dhcp)
316
 
            {
317
 
              if (daemon->options & OPT_ETHERS)
318
 
                dhcp_read_ethers(daemon);
319
 
              dhcp_update_configs(daemon->dhcp_conf);
320
 
              lease_update_from_configs(daemon->dhcp_conf, daemon->domain_suffix); 
321
 
              lease_update_file(0, now); 
322
 
              lease_update_dns(daemon);
323
 
            }
 
356
          clear_cache_and_reload(daemon, now);
324
357
          if (daemon->resolv_files && (daemon->options & OPT_NO_POLL))
325
358
            {
326
359
              reload_servers(daemon->resolv_files->name, daemon);
327
 
              check_servers(daemon, interfaces);
 
360
              check_servers(daemon);
328
361
            }
329
362
          sighup = 0;
330
363
        }
348
381
        }
349
382
      
350
383
      FD_ZERO(&rset);
 
384
      FD_ZERO(&wset);
 
385
      FD_ZERO(&eset);
351
386
      
352
387
      if (!first_loop)
353
388
        {
354
 
          int maxfd = set_dns_listeners(daemon, &rset, 0);
355
 
                  
 
389
          int maxfd = set_dns_listeners(daemon, &rset, -1);
 
390
#ifdef HAVE_DBUS
 
391
          maxfd = set_dbus_listeners(daemon, maxfd, &rset, &wset, &eset);
 
392
#endif
356
393
          if (daemon->dhcp)
357
394
            {
358
395
              FD_SET(daemon->dhcpfd, &rset);
360
397
                maxfd = daemon->dhcpfd;
361
398
            }
362
399
 
 
400
          /* Whilst polling for the dbus, wake every quarter second */
363
401
#ifdef HAVE_PSELECT
364
 
          if (pselect(maxfd+1, &rset, NULL, NULL, NULL, &sigmask) < 0)
365
 
            FD_ZERO(&rset); /* rset otherwise undefined after error */ 
 
402
          {
 
403
            struct timespec *tp = NULL;
 
404
#ifdef HAVE_DBUS
 
405
            struct timespec t;
 
406
            if ((daemon->options & OPT_DBUS) && !daemon->dbus)
 
407
              {
 
408
                tp = &t;
 
409
                tp->tv_sec = 0;
 
410
                tp->tv_nsec = 250000000;
 
411
              }
 
412
#endif
 
413
            if (pselect(maxfd+1, &rset, &wset, &eset, tp, &sigmask) < 0)
 
414
            {
 
415
              /* otherwise undefined after error */ 
 
416
              FD_ZERO(&rset); FD_ZERO(&wset); FD_ZERO(&eset);
 
417
            }
 
418
          }
366
419
#else
367
420
          {
368
421
            sigset_t save_mask;
 
422
            struct timeval *tp = NULL;
 
423
#ifdef HAVE_DBUS
 
424
            struct timeval t;
 
425
            if ((daemon->options & OPT_DBUS) && !daemon->dbus)
 
426
              {
 
427
                tp = &t;
 
428
                tp->tv_sec = 0;
 
429
                tp->tv_usec = 250000;
 
430
              }
 
431
#endif
369
432
            sigprocmask(SIG_SETMASK, &sigmask, &save_mask);
370
 
            if (select(maxfd+1, &rset, NULL, NULL, NULL) < 0)
371
 
              FD_ZERO(&rset); /* rset otherwise undefined after error */ 
 
433
            if (select(maxfd+1, &rset, &wset, &eset, tp) < 0)
 
434
              {
 
435
                /* otherwise undefined after error */ 
 
436
                FD_ZERO(&rset); FD_ZERO(&wset); FD_ZERO(&eset);
 
437
              }
372
438
            sigprocmask(SIG_SETMASK, &save_mask, NULL);
 
439
            
373
440
          }
374
441
#endif
375
442
        }
376
 
 
 
443
      
377
444
      first_loop = 0;
378
445
      now = dnsmasq_time(daemon->uptime_fd);
379
446
 
380
447
      /* Check for changes to resolv files once per second max. */
381
 
      if (last == 0 || difftime(now, last) > 1.0)
 
448
      /* Don't go silent for long periods if the clock goes backwards. */
 
449
      if (last == 0 || difftime(now, last) > 1.0 || difftime(now, last) < 1.0)
382
450
        {
383
451
          last = now;
384
452
 
400
468
                  if (stat(res->name, &statbuf) == -1)
401
469
                    {
402
470
                      if (!res->logged)
403
 
                        syslog(LOG_WARNING, "failed to access %s: %m", res->name);
 
471
                        syslog(LOG_WARNING, _("failed to access %s: %m"), res->name);
404
472
                      res->logged = 1;
405
473
                    }
406
474
                  else
407
475
                    {
408
476
                      res->logged = 0;
409
477
                      if (statbuf.st_mtime != res->mtime)
410
 
                        {
 
478
                        {
411
479
                          res->mtime = statbuf.st_mtime;
412
 
                          if (difftime(statbuf.st_mtime, last_change) > 0.0)
 
480
                          if (difftime(res->mtime, last_change) > 0.0)
413
481
                            {
414
 
                              last_change = statbuf.st_mtime;
 
482
                              last_change = res->mtime;
415
483
                              latest = res;
416
484
                            }
417
485
                        }
422
490
              if (latest)
423
491
                {
424
492
                  reload_servers(latest->name, daemon);
425
 
                  check_servers(daemon, interfaces);
 
493
                  check_servers(daemon);
426
494
                }
427
495
            }
428
496
        }
429
 
                
 
497
      
 
498
#ifdef HAVE_DBUS
 
499
      /* if we didn't create a DBus connection, retry now. */ 
 
500
      if ((daemon->options & OPT_DBUS) && !daemon->dbus)
 
501
        {
 
502
          char *err;
 
503
          if ((err = dbus_init(daemon)))
 
504
            syslog(LOG_WARNING, _("DBus error: %s"), err);
 
505
          if (daemon->dbus)
 
506
            syslog(LOG_INFO, _("connected to system DBus"));
 
507
        }
 
508
      check_dbus_listeners(daemon, &rset, &wset, &eset);
 
509
#endif
 
510
 
430
511
      check_dns_listeners(daemon, &rset, now);
431
512
      
432
513
      if (daemon->dhcp && FD_ISSET(daemon->dhcpfd, &rset))
433
514
        dhcp_packet(daemon, now);
434
515
    }
435
516
  
436
 
  syslog(LOG_INFO, "exiting on receipt of SIGTERM");
437
 
 
 
517
  syslog(LOG_INFO, _("exiting on receipt of SIGTERM"));
 
518
  
438
519
  if (daemon->dhcp)
439
520
    { 
440
521
#ifdef HAVE_BROKEN_RTC
471
552
    }
472
553
}
473
554
 
 
555
 
 
556
void clear_cache_and_reload(struct daemon *daemon, time_t now)
 
557
{
 
558
  cache_reload(daemon->options, daemon->namebuff, daemon->domain_suffix, daemon->addn_hosts);
 
559
  if (daemon->dhcp)
 
560
    {
 
561
      if (daemon->options & OPT_ETHERS)
 
562
        dhcp_read_ethers(daemon);
 
563
      dhcp_update_configs(daemon->dhcp_conf);
 
564
      lease_update_from_configs(daemon); 
 
565
      lease_update_file(0, now); 
 
566
      lease_update_dns(daemon);
 
567
    }
 
568
}
 
569
 
474
570
static int set_dns_listeners(struct daemon *daemon, fd_set *set, int maxfd)
475
571
{
476
572
  struct serverfd *serverfdp;
542
638
#endif
543
639
               else
544
640
                 {
545
 
                   char *buff;
 
641
                   unsigned char *buff;
546
642
                   struct server *s; 
547
643
                   int flags;
548
644
                   
651
747
      struct timeval tv;
652
748
      fd_set rset;
653
749
      struct sockaddr_in faddr;
654
 
      int maxfd, len = sizeof(faddr);
 
750
      int maxfd; 
 
751
      socklen_t len = sizeof(faddr);
655
752
      
656
753
      tv.tv_usec = 250000;
657
754
      tv.tv_sec = 0;