]> git.meshlink.io Git - catta/blob - avahi-autoipd/main.c
add new option --force-bind
[catta] / avahi-autoipd / main.c
1 /* $Id$ */
2
3 /***
4   This file is part of avahi.
5  
6   avahi is free software; you can redistribute it and/or modify it
7   under the terms of the GNU Lesser General Public License as
8   published by the Free Software Foundation; either version 2.1 of the
9   License, or (at your option) any later version.
10  
11   avahi is distributed in the hope that it will be useful, but WITHOUT
12   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13   or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
14   Public License for more details.
15  
16   You should have received a copy of the GNU Lesser General Public
17   License along with avahi; if not, write to the Free Software
18   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19   USA.
20 ***/
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <stdlib.h>
27 #include <unistd.h>
28 #include <sys/socket.h>
29 #include <netpacket/packet.h>
30 #include <net/ethernet.h>
31 #include <fcntl.h>
32 #include <time.h>
33 #include <assert.h>
34 #include <errno.h>
35 #include <string.h>
36 #include <inttypes.h>
37 #include <sys/types.h>
38 #include <arpa/inet.h>
39 #include <sys/ioctl.h>
40 #include <poll.h>
41 #include <net/if.h>
42 #include <stdio.h>
43 #include <getopt.h>
44 #include <signal.h>
45 #include <sys/wait.h>
46
47 #include <avahi-common/malloc.h>
48 #include <avahi-common/timeval.h>
49
50 #include <avahi-daemon/setproctitle.h>
51
52 #include <libdaemon/dfork.h>
53 #include <libdaemon/dsignal.h>
54 #include <libdaemon/dlog.h>
55 #include <libdaemon/dpid.h>
56 #include <libdaemon/dexec.h>
57
58 #include "main.h"
59 #include "iface.h"
60
61 #ifndef __linux__
62 #error "avahi-autoipd is only available on Linux for now"
63 #endif
64
65 /* An implementation of RFC 3927 */
66
67 /* Constants from the RFC */
68 #define PROBE_WAIT 1
69 #define PROBE_NUM 3
70 #define PROBE_MIN 1
71 #define PROBE_MAX 2
72 #define ANNOUNCE_WAIT 2
73 #define ANNOUNCE_NUM 2
74 #define ANNOUNCE_INTERVAL 2
75 #define MAX_CONFLICTS 10
76 #define RATE_LIMIT_INTERVAL 60
77 #define DEFEND_INTERVAL 10
78
79 #define IPV4LL_NETWORK 0xA9FE0000L
80 #define IPV4LL_NETMASK 0xFFFF0000L
81 #define IPV4LL_HOSTMASK 0x0000FFFFL
82
83 #define ETHER_ADDRLEN 6
84 #define ARP_PACKET_SIZE (8+4+4+2*ETHER_ADDRLEN)
85
86 typedef enum ArpOperation {
87     ARP_REQUEST = 1,
88     ARP_RESPONSE = 2
89 } ArpOperation;
90
91 typedef struct ArpPacketInfo {
92     ArpOperation operation;
93
94     uint32_t sender_ip_address, target_ip_address;
95     uint8_t sender_hw_address[ETHER_ADDRLEN], target_hw_address[ETHER_ADDRLEN];
96 } ArpPacketInfo;
97
98 static State state = STATE_START;
99 static int n_iteration = 0;
100 static int n_conflict = 0;
101
102 static char *interface_name = NULL;
103 static char *pid_file_name = NULL;
104 static uint32_t start_address = 0;
105 static char *argv0 = NULL;
106 static int daemonize = 0;
107 static int wait_for_address = 0;
108 static int use_syslog = 0;
109 static int debug = 0;
110 static int modify_proc_title = 1;
111 static int force_bind = 0;
112
113 static enum {
114     DAEMON_RUN,
115     DAEMON_KILL,
116     DAEMON_REFRESH,
117     DAEMON_VERSION,
118     DAEMON_HELP,
119     DAEMON_CHECK
120 } command = DAEMON_RUN;
121
122 typedef enum CalloutEvent {
123     CALLOUT_BIND,
124     CALLOUT_CONFLICT,
125     CALLOUT_UNBIND,
126     CALLOUT_STOP,
127     CALLOUT_MAX
128 } CalloutEvent;
129
130 #define RANDOM_DEVICE "/dev/urandom"
131
132 #define DEBUG(x) do {\
133 if (debug) { \
134     x; \
135 } \
136 } while (0)
137
138 static void init_rand_seed(void) {
139     int fd;
140     unsigned seed = 0;
141
142     /* Try to initialize seed from /dev/urandom, to make it a little
143      * less predictable, and to make sure that multiple machines
144      * booted at the same time choose different random seeds.  */
145     if ((fd = open(RANDOM_DEVICE, O_RDONLY)) >= 0) {
146         read(fd, &seed, sizeof(seed));
147         close(fd);
148     }
149
150     /* If the initialization failed by some reason, we add the time to the seed */
151     seed ^= (unsigned) time(NULL);
152
153     srand(seed);
154 }
155
156 static uint32_t pick_addr(uint32_t old_addr) {
157     uint32_t addr;
158
159     do {
160         unsigned r = (unsigned) rand();
161
162         /* Reduce to 16 bits */
163         while (r > 0xFFFF)
164             r = (r >> 16) ^ (r & 0xFFFF);
165         
166         addr = htonl(IPV4LL_NETWORK | (uint32_t) r);
167
168     } while (addr == old_addr);
169
170     return addr;
171 }
172
173 static void* packet_new(const ArpPacketInfo *info, size_t *packet_len) {
174     uint8_t *r;
175
176     assert(info);
177     assert(packet_len);
178     assert(info->operation == ARP_REQUEST || info->operation == ARP_RESPONSE);
179
180     *packet_len = ARP_PACKET_SIZE;
181     r = avahi_new0(uint8_t, *packet_len);
182     
183     r[1] = 1; /* HTYPE */
184     r[2] = 8; /* PTYPE */
185     r[4] = ETHER_ADDRLEN; /* HLEN */
186     r[5] = 4; /* PLEN */
187     r[7] = (uint8_t) info->operation;
188
189     memcpy(r+8, info->sender_hw_address, ETHER_ADDRLEN);
190     memcpy(r+14, &info->sender_ip_address, 4);
191     memcpy(r+18, info->target_hw_address, ETHER_ADDRLEN);
192     memcpy(r+24, &info->target_ip_address, 4);
193
194     return r;
195 }
196
197 static void *packet_new_probe(uint32_t ip_address, const uint8_t*hw_address, size_t *packet_len) {
198     ArpPacketInfo info;
199     
200     memset(&info, 0, sizeof(info));
201     info.operation = ARP_REQUEST;
202     memcpy(info.sender_hw_address, hw_address, ETHER_ADDRLEN);
203     info.target_ip_address = ip_address;
204
205     return packet_new(&info, packet_len);
206 }
207
208 static void *packet_new_announcement(uint32_t ip_address, const uint8_t* hw_address, size_t *packet_len) {
209     ArpPacketInfo info;
210
211     memset(&info, 0, sizeof(info));
212     info.operation = ARP_REQUEST;
213     memcpy(info.sender_hw_address, hw_address, ETHER_ADDRLEN);
214     info.target_ip_address = ip_address;
215     info.sender_ip_address = ip_address;
216
217     return packet_new(&info, packet_len);
218 }
219
220 static int packet_parse(const void *data, size_t packet_len, ArpPacketInfo *info) {
221     const uint8_t *p = data;
222     
223     assert(data);
224
225     if (packet_len < ARP_PACKET_SIZE)
226         return -1;
227
228     /* Check HTYPE and PTYPE */
229     if (p[0] != 0 || p[1] != 1 || p[2] != 8 || p[3] != 0)
230         return -1;
231
232     /* Check HLEN, PLEN, OPERATION */
233     if (p[4] != ETHER_ADDRLEN || p[5] != 4 || p[6] != 0 || (p[7] != 1 && p[7] != 2))
234         return -1;
235     
236     info->operation = p[7];
237     memcpy(info->sender_hw_address, p+8, ETHER_ADDRLEN);
238     memcpy(&info->sender_ip_address, p+14, 4);
239     memcpy(info->target_hw_address, p+18, ETHER_ADDRLEN);
240     memcpy(&info->target_ip_address, p+24, 4);
241
242     return 0;
243 }
244
245 static void set_state(State st, int reset_counter, uint32_t address) {
246     const char* const state_table[] = {
247         [STATE_START] = "START",
248         [STATE_WAITING_PROBE] = "WAITING_PROBE",
249         [STATE_PROBING] = "PROBING",
250         [STATE_WAITING_ANNOUNCE] = "WAITING_ANNOUNCE", 
251         [STATE_ANNOUNCING] = "ANNOUNCING",
252         [STATE_RUNNING] = "RUNNING",
253         [STATE_SLEEPING] = "SLEEPING"
254     };
255     char buf[64];
256     
257     assert(st < STATE_MAX);
258
259     if (st == state && !reset_counter) {
260         n_iteration++;
261         DEBUG(daemon_log(LOG_DEBUG, "State iteration %s-%i", state_table[state], n_iteration));
262     } else {
263         DEBUG(daemon_log(LOG_DEBUG, "State transition %s-%i -> %s-0", state_table[state], n_iteration, state_table[st]));
264         state = st;
265         n_iteration = 0;
266     }
267
268     if (modify_proc_title) {
269         if (state == STATE_SLEEPING) 
270             avahi_set_proc_title("%s: sleeping", argv0);
271         else if (state == STATE_ANNOUNCING)
272             avahi_set_proc_title("%s: announcing %s", argv0, inet_ntop(AF_INET, &address, buf, sizeof(buf)));
273         else if (state == STATE_RUNNING)
274             avahi_set_proc_title("%s: bound %s", argv0, inet_ntop(AF_INET, &address, buf, sizeof(buf)));
275         else
276             avahi_set_proc_title("%s: probing %s", argv0, inet_ntop(AF_INET, &address, buf, sizeof(buf)));
277     }
278 }
279
280 static int interface_up(int iface) {
281     int fd = -1;
282     struct ifreq ifreq;
283
284     if ((fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
285         daemon_log(LOG_ERR, "socket() failed: %s", strerror(errno));
286         goto fail;
287     }
288
289     memset(&ifreq, 0, sizeof(ifreq));
290     if (!if_indextoname(iface, ifreq.ifr_name)) {
291         daemon_log(LOG_ERR, "if_indextoname() failed: %s", strerror(errno));
292         goto fail;
293     }
294     
295     if (ioctl(fd, SIOCGIFFLAGS, &ifreq) < 0) {
296         daemon_log(LOG_ERR, "SIOCGIFFLAGS failed: %s", strerror(errno));
297         goto fail;
298     }
299
300     ifreq.ifr_flags |= IFF_UP;
301
302     if (ioctl(fd, SIOCSIFFLAGS, &ifreq) < 0) {
303         daemon_log(LOG_ERR, "SIOCSIFFLAGS failed: %s", strerror(errno));
304         goto fail;
305     }
306
307     close(fd);
308
309     return 0;
310     
311 fail:
312     if (fd >= 0)
313         close(fd);
314     
315     return -1;
316 }
317
318 static int do_callout(CalloutEvent event, int iface, uint32_t addr) {
319     char buf[64], ifname[IFNAMSIZ];
320     const char * const event_table[CALLOUT_MAX] = {
321         [CALLOUT_BIND] = "BIND",
322         [CALLOUT_CONFLICT] = "CONFLICT",
323         [CALLOUT_UNBIND] = "UNBIND",
324         [CALLOUT_STOP] = "STOP"
325     };
326
327     daemon_log(LOG_INFO, "Callout %s, address %s on interface %s",
328                event_table[event],
329                inet_ntop(AF_INET, &addr, buf, sizeof(buf)),
330                if_indextoname(iface, ifname));
331     
332     return 0;
333 }
334
335 static int open_socket(int iface, uint8_t *hw_address) {
336     int fd = -1;
337     struct sockaddr_ll sa;
338     socklen_t sa_len;
339
340     if (interface_up(iface) < 0)
341         goto fail;
342     
343     if ((fd = socket(PF_PACKET, SOCK_DGRAM, 0)) < 0) {
344         daemon_log(LOG_ERR, "socket() failed: %s", strerror(errno));
345         goto fail;
346     }
347
348     memset(&sa, 0, sizeof(sa));
349     sa.sll_family = AF_PACKET;
350     sa.sll_protocol = htons(ETH_P_ARP);
351     sa.sll_ifindex = iface;
352     
353     if (bind(fd, (struct sockaddr*) &sa, sizeof(sa)) < 0) {
354         daemon_log(LOG_ERR, "bind() failed: %s", strerror(errno));
355         goto fail;
356     }
357     
358     sa_len = sizeof(sa);
359     if (getsockname(fd, (struct sockaddr*) &sa, &sa_len) < 0) {
360         daemon_log(LOG_ERR, "getsockname() failed: %s", strerror(errno));
361         goto fail;
362     }
363     
364     if (sa.sll_halen != ETHER_ADDRLEN) {
365         daemon_log(LOG_ERR, "getsockname() returned invalid hardware address.");
366         goto fail;
367     }
368
369     memcpy(hw_address, sa.sll_addr, ETHER_ADDRLEN);
370
371     return fd;
372     
373 fail:
374     if (fd >= 0)
375         close(fd);
376
377     return -1;
378 }
379
380 static int send_packet(int fd, int iface, void *packet, size_t packet_len) {
381     struct sockaddr_ll sa;
382     
383     assert(fd >= 0);
384     assert(packet);
385     assert(packet_len > 0);
386
387     memset(&sa, 0, sizeof(sa));
388     sa.sll_family = AF_PACKET;
389     sa.sll_protocol = htons(ETH_P_ARP);
390     sa.sll_ifindex = iface;
391     sa.sll_halen = ETHER_ADDRLEN;
392     memset(sa.sll_addr, 0xFF, ETHER_ADDRLEN);
393
394     if (sendto(fd, packet, packet_len, 0, (struct sockaddr*) &sa, sizeof(sa)) < 0) {
395         daemon_log(LOG_ERR, "sendto() failed: %s", strerror(errno));
396         return -1;
397     }
398
399     return 0;
400 }
401
402 static int recv_packet(int fd, void **packet, size_t *packet_len) {
403     int s;
404     struct sockaddr_ll sa;
405     socklen_t sa_len;
406     ssize_t r;
407     
408     assert(fd >= 0);
409     assert(packet);
410     assert(packet_len);
411
412     *packet = NULL;
413
414     if (ioctl(fd, FIONREAD, &s) < 0) {
415         daemon_log(LOG_ERR, "FIONREAD failed: %s", strerror(errno));
416         goto fail;
417     }
418
419     if (s <= 0)
420         s = 4096;
421
422     *packet = avahi_new(uint8_t, s);
423
424     sa_len = sizeof(sa);
425     if ((r = recvfrom(fd, *packet, s, 0, (struct sockaddr*) &sa, &sa_len)) < 0) {
426         daemon_log(LOG_ERR, "recvfrom() failed: %s", strerror(errno));
427         goto fail;
428     }
429     
430     *packet_len = (size_t) r;
431     
432     return 0;
433     
434 fail:
435     if (*packet) {
436         avahi_free(*packet);
437         *packet = NULL;
438     }
439
440     return -1;
441 }
442  
443 int is_ll_address(uint32_t addr) {
444     return (ntohl(addr) & IPV4LL_NETMASK) == IPV4LL_NETWORK;
445 }
446
447 static struct timeval *elapse_time(struct timeval *tv, unsigned msec, unsigned jitter) {
448     assert(tv);
449
450     gettimeofday(tv, NULL);
451
452     if (msec)
453         avahi_timeval_add(tv, (AvahiUsec) msec*1000);
454
455     if (jitter)
456         avahi_timeval_add(tv, (AvahiUsec) (jitter*1000.0*rand()/(RAND_MAX+1.0)));
457         
458     return tv;
459 }
460
461 static int loop(int iface, uint32_t addr) {
462     enum {
463         FD_ARP,
464         FD_IFACE,
465         FD_SIGNAL,
466         FD_MAX,
467     };
468
469     int fd = -1, ret = -1;
470     struct timeval next_wakeup;
471     int next_wakeup_valid = 0;
472     char buf[64];
473     void *in_packet = NULL;
474     size_t in_packet_len;
475     void *out_packet = NULL;
476     size_t out_packet_len;
477     uint8_t hw_address[ETHER_ADDRLEN];
478     struct pollfd pollfds[FD_MAX];
479     int iface_fd;
480     Event event = EVENT_NULL;
481     int retval_sent = !daemonize;
482     State st;
483
484     daemon_signal_init(SIGINT, SIGTERM, SIGCHLD, SIGHUP,0);
485
486     if ((fd = open_socket(iface, hw_address)) < 0)
487         goto fail;
488
489     if ((iface_fd = iface_init(iface)) < 0)
490         goto fail;
491
492     if (force_bind)
493         st = STATE_START;
494     else if (iface_get_initial_state(&st) < 0)
495         goto fail;
496
497     if (addr && !is_ll_address(addr)) {
498         daemon_log(LOG_WARNING, "Requested address %s is not from IPv4LL range 169.254/16, ignoring.", inet_ntop(AF_INET, &addr, buf, sizeof(buf)));
499         addr = 0;
500     }
501
502     if (!addr) {
503         int i;
504         uint32_t a = 1;
505
506         for (i = 0; i < ETHER_ADDRLEN; i++)
507             a += hw_address[i]*i;
508
509         addr = htonl(IPV4LL_NETWORK | (uint32_t) a);
510     }
511
512     set_state(st, 1, addr);
513     
514     daemon_log(LOG_INFO, "Starting with address %s", inet_ntop(AF_INET, &addr, buf, sizeof(buf)));
515
516     if (state == STATE_SLEEPING)
517         daemon_log(LOG_INFO, "Routable address already assigned, sleeping.");
518
519     if (!retval_sent && (!wait_for_address || state == STATE_SLEEPING)) {
520         daemon_retval_send(0);
521         retval_sent = 1;
522     }
523
524     memset(pollfds, 0, sizeof(pollfds));
525     pollfds[FD_ARP].fd = fd;
526     pollfds[FD_ARP].events = POLLIN;
527     pollfds[FD_IFACE].fd = iface_fd;
528     pollfds[FD_IFACE].events = POLLIN;
529     pollfds[FD_SIGNAL].fd = daemon_signal_fd();
530     pollfds[FD_SIGNAL].events = POLLIN;
531     
532     for (;;) {
533         int r, timeout;
534         AvahiUsec usec;
535
536         if (state == STATE_START) {
537
538             /* First, wait a random time */
539             set_state(STATE_WAITING_PROBE, 1, addr);
540
541             elapse_time(&next_wakeup, 0, PROBE_WAIT*1000);
542             next_wakeup_valid = 1;
543
544         } else if ((state == STATE_WAITING_PROBE && event == EVENT_TIMEOUT) ||
545                    (state == STATE_PROBING && event == EVENT_TIMEOUT && n_iteration < PROBE_NUM-2)) {
546
547             /* Send a probe */
548             out_packet = packet_new_probe(addr, hw_address, &out_packet_len);
549             set_state(STATE_PROBING, 0, addr);
550
551             elapse_time(&next_wakeup, PROBE_MIN*1000, (PROBE_MAX-PROBE_MIN)*1000);
552             next_wakeup_valid = 1;
553             
554         } else if (state == STATE_PROBING && event == EVENT_TIMEOUT && n_iteration >= PROBE_NUM-2) {
555
556             /* Send the last probe */
557             out_packet = packet_new_probe(addr, hw_address, &out_packet_len);
558             set_state(STATE_WAITING_ANNOUNCE, 1, addr);
559
560             elapse_time(&next_wakeup, ANNOUNCE_WAIT*1000, 0);
561             next_wakeup_valid = 1;
562             
563         } else if ((state == STATE_WAITING_ANNOUNCE && event == EVENT_TIMEOUT) ||
564                    (state == STATE_ANNOUNCING && event == EVENT_TIMEOUT && n_iteration < ANNOUNCE_NUM-1)) {
565
566             /* Send announcement packet */
567             out_packet = packet_new_announcement(addr, hw_address, &out_packet_len);
568             set_state(STATE_ANNOUNCING, 0, addr);
569
570             elapse_time(&next_wakeup, ANNOUNCE_INTERVAL*1000, 0);
571             next_wakeup_valid = 1;
572             
573             if (n_iteration == 0) {
574                 do_callout(CALLOUT_BIND, iface, addr);
575                 n_conflict = 0;
576
577                 if (!retval_sent) {
578                     daemon_retval_send(0);
579                     retval_sent = 1;
580                 }
581             }
582
583         } else if ((state == STATE_ANNOUNCING && event == EVENT_TIMEOUT && n_iteration >= ANNOUNCE_NUM-1)) {
584
585             daemon_log(LOG_INFO, "Successfully claimed IP address %s", inet_ntop(AF_INET, &addr, buf, sizeof(buf)));
586             set_state(STATE_RUNNING, 0, addr);
587
588             next_wakeup_valid = 0;
589             
590         } else if (event == EVENT_PACKET) {
591             ArpPacketInfo info;
592
593             assert(in_packet);
594             
595             if (packet_parse(in_packet, in_packet_len, &info) < 0)
596                 daemon_log(LOG_WARNING, "Failed to parse incoming ARP packet.");
597             else {
598                 int conflict = 0;
599
600                 if (info.sender_ip_address == addr) {
601                     /* Normal conflict */
602                     conflict = 1;
603                     daemon_log(LOG_INFO, "Recieved conflicting normal ARP packet.");
604                 } else if (state == STATE_WAITING_PROBE || state == STATE_PROBING || state == STATE_WAITING_ANNOUNCE) {
605                     /* Probe conflict */
606                     conflict = info.target_ip_address == addr && memcmp(hw_address, info.sender_hw_address, ETHER_ADDRLEN);
607                     daemon_log(LOG_INFO, "Recieved conflicting probe ARP packet.");
608                 }
609
610                 if (conflict) {
611                     
612                     if (state == STATE_RUNNING || state == STATE_ANNOUNCING)
613                         do_callout(CALLOUT_CONFLICT, iface, addr);
614                     
615                     /* Pick a new address */
616                     addr = pick_addr(addr);
617
618                     daemon_log(LOG_INFO, "Trying address %s", inet_ntop(AF_INET, &addr, buf, sizeof(buf)));
619
620                     n_conflict++;
621
622                     set_state(STATE_WAITING_PROBE, 1, addr);
623                     
624                     if (n_conflict >= MAX_CONFLICTS) {
625                         daemon_log(LOG_WARNING, "Got too many conflicts, rate limiting new probes.");
626                         elapse_time(&next_wakeup, RATE_LIMIT_INTERVAL*1000, PROBE_WAIT*1000);
627                     } else
628                         elapse_time(&next_wakeup, 0, PROBE_WAIT*1000);
629
630                     next_wakeup_valid = 1;
631                 } else
632                     DEBUG(daemon_log(LOG_DEBUG, "Ignoring irrelevant ARP packet."));
633             }
634             
635         } else if (event == EVENT_ROUTABLE_ADDR_CONFIGURED) {
636
637             daemon_log(LOG_INFO, "A routable address has been configured.");
638
639             if (state == STATE_RUNNING || state == STATE_ANNOUNCING)
640                 do_callout(CALLOUT_UNBIND, iface, addr);
641
642             if (!retval_sent) {
643                 daemon_retval_send(0);
644                 retval_sent = 1;
645             }
646             
647             set_state(STATE_SLEEPING, 1, addr);
648             next_wakeup_valid = 0;
649             
650         } else if (event == EVENT_ROUTABLE_ADDR_UNCONFIGURED && state == STATE_SLEEPING && !force_bind) {
651
652             daemon_log(LOG_INFO, "No longer a routable address configured, restarting probe process.");
653
654             set_state(STATE_WAITING_PROBE, 1, addr);
655
656             elapse_time(&next_wakeup, 0, PROBE_WAIT*1000);
657             next_wakeup_valid = 1;
658
659         } else if (event == EVENT_REFRESH_REQUEST && state == STATE_RUNNING && !force_bind) {
660
661             /* The user requested a reannouncing of the address by a SIGHUP */
662             daemon_log(LOG_INFO, "Reannouncing address.");
663             
664             /* Send announcement packet */
665             out_packet = packet_new_announcement(addr, hw_address, &out_packet_len);
666             set_state(STATE_ANNOUNCING, 1, addr);
667
668             elapse_time(&next_wakeup, ANNOUNCE_INTERVAL*1000, 0);
669             next_wakeup_valid = 1;
670         }
671         
672         if (out_packet) {
673             DEBUG(daemon_log(LOG_DEBUG, "sending..."));
674             
675             if (send_packet(fd, iface, out_packet, out_packet_len) < 0)
676                 goto fail;
677             
678             avahi_free(out_packet);
679             out_packet = NULL;
680         }
681
682         if (in_packet) {
683             avahi_free(in_packet);
684             in_packet = NULL;
685         }
686
687         event = EVENT_NULL;
688         timeout = -1;
689         
690         if (next_wakeup_valid) {
691             usec = avahi_age(&next_wakeup);
692             timeout = usec < 0 ? (int) (-usec/1000) : 0;
693         }
694
695         DEBUG(daemon_log(LOG_DEBUG, "sleeping %ims", timeout));
696                     
697         while ((r = poll(pollfds, FD_MAX, timeout)) < 0 && errno == EINTR)
698             ;
699
700         if (r < 0) {
701             daemon_log(LOG_ERR, "poll() failed: %s", strerror(r));
702             goto fail;
703         } else if (r == 0) {
704             event = EVENT_TIMEOUT;
705             next_wakeup_valid = 0;
706         } else {
707             
708             
709             if (pollfds[FD_ARP].revents) {
710
711                 if (pollfds[FD_ARP].revents == POLLERR) {
712                     /* The interface is probably down, let's recreate our socket */
713                     
714                     close(fd);
715
716                     if ((fd = open_socket(iface, hw_address)) < 0)
717                         goto fail;
718
719                     pollfds[FD_ARP].fd = fd;
720                     
721                 } else {
722                 
723                     assert(pollfds[FD_ARP].revents == POLLIN);
724                     
725                     if (recv_packet(fd, &in_packet, &in_packet_len) < 0)
726                         goto fail;
727                     
728                     if (in_packet)
729                         event = EVENT_PACKET;
730                 }
731             }
732
733             if (event == EVENT_NULL &&
734                 pollfds[FD_IFACE].revents) {
735                 
736                 assert(pollfds[FD_IFACE].revents == POLLIN);
737
738                 if (iface_process(&event) < 0)
739                     goto fail;
740             }
741
742             if (event == EVENT_NULL &&
743                 pollfds[FD_SIGNAL].revents) {
744
745                 int sig;
746                 assert(pollfds[FD_SIGNAL].revents == POLLIN);
747
748                 if ((sig = daemon_signal_next()) <= 0) {
749                     daemon_log(LOG_ERR, "daemon_signal_next() failed");
750                     goto fail;
751                 }
752
753                 switch(sig) {
754                     case SIGINT:
755                     case SIGTERM:
756                         daemon_log(LOG_INFO, "Got %s, quitting.", sig == SIGINT ? "SIGINT" : "SIGTERM");
757                         ret = 0;
758                         goto fail;
759
760                     case SIGCHLD:
761                         waitpid(-1, NULL, WNOHANG);
762                         break;
763                     
764                     case SIGHUP:
765                         event = EVENT_REFRESH_REQUEST;
766                         break;
767                 }
768                 
769             }
770         }
771     }
772
773     ret = 0;
774     
775 fail:
776
777     if (state == STATE_RUNNING || state == STATE_ANNOUNCING)
778         do_callout(CALLOUT_STOP, iface, addr);
779
780     avahi_free(out_packet);
781     avahi_free(in_packet);
782     
783     if (fd >= 0)
784         close(fd);
785
786     if (iface_fd >= 0)
787         iface_done();
788
789     if (daemonize && !retval_sent)
790         daemon_retval_send(ret);
791     
792     return ret;
793 }
794
795
796 static void help(FILE *f, const char *a0) {
797     fprintf(f,
798             "%s [options] INTERFACE\n"
799             "    -h --help           Show this help\n"
800             "    -D --daemonize      Daemonize after startup\n"
801             "    -s --syslog         Write log messages to syslog(3) instead of STDERR\n"
802             "    -k --kill           Kill a running daemon\n"
803             "    -r --refresh        Request a running daemon to refresh it's IP address\n"
804             "    -c --check          Return 0 if a daemon is already running\n"
805             "    -V --version        Show version\n"
806             "    -S --start=ADDRESS  Start with this address from the IPv4LL range\n"
807             "                        169.254.0.0/16\n"
808             "    -w --wait           Wait until an address has been acquired before\n"
809             "                        daemonizing\n"
810             "       --no-proc-title  Don't modify process title\n"
811             "       --force-bind     Assign an IPv4LL address even if routable address\n"
812             "                        is already assigned\n"
813             "       --debug          Increase verbosity\n",
814             a0);
815 }
816
817 static int parse_command_line(int argc, char *argv[]) {
818     int c;
819     
820     enum {
821         OPTION_NO_PROC_TITLE = 256,
822         OPTION_FORCE_BIND,
823         OPTION_DEBUG
824     };
825     
826     static const struct option long_options[] = {
827         { "help",          no_argument,       NULL, 'h' },
828         { "daemonize",     no_argument,       NULL, 'D' },
829         { "syslog",        no_argument,       NULL, 's' },
830         { "kill",          no_argument,       NULL, 'k' },
831         { "refresh",       no_argument,       NULL, 'r' },
832         { "check",         no_argument,       NULL, 'c' },
833         { "version",       no_argument,       NULL, 'V' },
834         { "start",         required_argument, NULL, 'S' },
835         { "wait",          no_argument,       NULL, 'w' },
836         { "no-proc-title", no_argument,       NULL, OPTION_NO_PROC_TITLE },
837         { "force-bind",    no_argument,       NULL, OPTION_FORCE_BIND },
838         { "debug",         no_argument,       NULL, OPTION_DEBUG },
839         { NULL, 0, NULL, 0 }
840     };
841
842     opterr = 0;
843     while ((c = getopt_long(argc, argv, "hDkVrcS:", long_options, NULL)) >= 0) {
844
845         switch(c) {
846             case 's':
847                 use_syslog = 1;
848                 break;
849             case 'h':
850                 command = DAEMON_HELP;
851                 break;
852             case 'D':
853                 daemonize = 1;
854                 break;
855             case 'k':
856                 command = DAEMON_KILL;
857                 break;
858             case 'V':
859                 command = DAEMON_VERSION;
860                 break;
861             case 'r':
862                 command = DAEMON_REFRESH;
863                 break;
864             case 'c':
865                 command = DAEMON_CHECK;
866                 break;
867             case 'S':
868                 
869                 if ((start_address = inet_addr(optarg)) == (uint32_t) -1) {
870                     fprintf(stderr, "Failed to parse IP address '%s'.", optarg);
871                     return -1;
872                 }
873                 break;
874             case 'w':
875                 wait_for_address = 1;
876                 break;
877                 
878             case OPTION_NO_PROC_TITLE:
879                 modify_proc_title = 0;
880                 break;
881
882             case OPTION_DEBUG:
883                 debug = 1;
884                 break;
885
886             case OPTION_FORCE_BIND:
887                 force_bind = 1;
888                 break;
889
890             default:
891                 fprintf(stderr, "Invalid command line argument: %c\n", c);
892                 return -1;
893         }
894     }
895
896     if (command == DAEMON_RUN ||
897         command == DAEMON_KILL ||
898         command == DAEMON_REFRESH ||
899         command == DAEMON_CHECK) {
900
901         if (optind >= argc) {
902             fprintf(stderr, "Missing interface name.\n");
903             return -1;
904         }
905
906         interface_name = argv[optind++];
907     }
908
909     if (optind != argc) {
910         fprintf(stderr, "Too many arguments\n");
911         return -1;
912     }
913         
914     return 0;
915 }
916
917 static const char* pid_file_proc(void) {
918     return pid_file_name;
919 }
920
921 int main(int argc, char*argv[]) {
922     int r = 1;
923     int wrote_pid_file = 0;
924
925     avahi_init_proc_title(argc, argv);
926
927     if ((argv0 = strrchr(argv[0], '/')))
928         argv0++;
929     else
930         argv0 = argv[0];
931
932     daemon_pid_file_ident = daemon_log_ident = argv0;
933     daemon_pid_file_proc = pid_file_proc;
934     
935     if (parse_command_line(argc, argv) < 0)
936         goto finish;
937
938     pid_file_name = avahi_strdup_printf(AVAHI_RUNTIME_DIR"/avahi-autoipd.%s.pid", interface_name);
939
940     if (command == DAEMON_RUN) {
941         pid_t pid;
942         int ifindex;
943
944         init_rand_seed();
945         
946         if ((ifindex = if_nametoindex(interface_name)) <= 0) {
947             daemon_log(LOG_ERR, "Failed to get index for interface name '%s': %s", interface_name, strerror(errno));
948             goto finish;
949         }
950
951         if (getuid() != 0) {
952             daemon_log(LOG_ERR, "This program is intended to be run as root.");
953             goto finish;
954         }
955
956         if ((pid = daemon_pid_file_is_running()) >= 0) {
957             daemon_log(LOG_ERR, "Daemon already running on PID %u", pid);
958             goto finish;
959         }
960
961         if (daemonize) {
962             daemon_retval_init();
963             
964             if ((pid = daemon_fork()) < 0)
965                 goto finish;
966             else if (pid != 0) {
967                 int ret;
968                 /** Parent **/
969
970                 if ((ret = daemon_retval_wait(20)) < 0) {
971                     daemon_log(LOG_ERR, "Could not receive return value from daemon process.");
972                     goto finish;
973                 }
974
975                 r = ret;
976                 goto finish;
977             }
978
979             /* Child */
980         }
981
982         if (use_syslog || daemonize)
983             daemon_log_use = DAEMON_LOG_SYSLOG;
984
985         chdir("/");
986
987         if (daemon_pid_file_create() < 0) {
988             daemon_log(LOG_ERR, "Failed to create PID file: %s", strerror(errno));
989
990             if (daemonize)
991                 daemon_retval_send(1);
992             goto finish;
993         } else
994             wrote_pid_file = 1;
995
996         if (loop(ifindex, start_address) < 0)
997             goto finish;
998
999         r = 0;
1000     } else if (command == DAEMON_HELP) {
1001         help(stdout, argv0);
1002         
1003         r = 0;
1004     } else if (command == DAEMON_VERSION) {
1005         printf("%s "PACKAGE_VERSION"\n", argv0);
1006         
1007         r = 0;
1008     } else if (command == DAEMON_KILL) {
1009         if (daemon_pid_file_kill_wait(SIGTERM, 5) < 0) {
1010             daemon_log(LOG_WARNING, "Failed to kill daemon: %s", strerror(errno));
1011             goto finish;
1012         }
1013         
1014         r = 0;
1015     } else if (command == DAEMON_REFRESH) {
1016         if (daemon_pid_file_kill(SIGHUP) < 0) {
1017             daemon_log(LOG_WARNING, "Failed to kill daemon: %s", strerror(errno));
1018             goto finish;
1019         }
1020
1021         r = 0;
1022     } else if (command == DAEMON_CHECK)
1023         r = (daemon_pid_file_is_running() >= 0) ? 0 : 1;
1024
1025
1026 finish:
1027
1028     if (daemonize)
1029         daemon_retval_done();
1030     
1031     if (wrote_pid_file)
1032         daemon_pid_file_remove();
1033
1034     return r;
1035 }
1036
1037 /* TODO:
1038
1039 - chroot/drop privs/caps
1040 - user script
1041 - store last used address
1042 - man page
1043
1044 */