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