]> rtime.felk.cvut.cz Git - lisovros/iproute2_canprio.git/blobdiff - misc/arpd.c
libnetlink: change rtnl_send() to take void *
[lisovros/iproute2_canprio.git] / misc / arpd.c
index fd8f7ca986051d1960f9cbeed27fc9718cd948f5..4f0021ba477a8ee70ca76f2fe9fe3eb62b94bfa5 100644 (file)
@@ -16,7 +16,7 @@
 #include <unistd.h>
 #include <stdlib.h>
 #include <netdb.h>
-#include <db41/db_185.h>
+#include <db_185.h>
 #include <sys/ioctl.h>
 #include <sys/poll.h>
 #include <errno.h>
@@ -27,6 +27,7 @@
 #include <time.h>
 #include <signal.h>
 #include <linux/if.h>
+#include <linux/if_ether.h>
 #include <linux/if_arp.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
@@ -41,7 +42,7 @@ int resolve_hosts;
 DB     *dbase;
 char   *dbname = "/var/lib/arpd/arpd.db";
 
-int    ifnum;  
+int    ifnum;
 int    *ifvec;
 char   **ifnames;
 
@@ -52,7 +53,7 @@ struct dbkey
 };
 
 #define IS_NEG(x)      (((__u8*)(x))[0] == 0xFF)
-#define NEG_TIME(x)    (((x)[2]<<24)|((x)[3]<<16)|((x)[4]<<8)|(x)[5]) 
+#define NEG_TIME(x)    (((x)[2]<<24)|((x)[3]<<16)|((x)[4]<<8)|(x)[5])
 #define NEG_AGE(x)     ((__u32)time(NULL) - NEG_TIME((__u8*)x))
 #define NEG_VALID(x)   (NEG_AGE(x) < negative_timeout)
 #define NEG_CNT(x)     (((__u8*)(x))[1])
@@ -93,7 +94,7 @@ int broadcast_burst = 3000;
 void usage(void)
 {
        fprintf(stderr,
-"Usage: arpd [ -lk ] [ -a N ] [ -b dbase ] [ -f file ] [ interfaces ]\n");
+"Usage: arpd [ -lkh? ] [ -a N ] [ -b dbase ] [ -B number ] [ -f file ] [ -n time ] [ -R rate ] [ interfaces ]\n");
        exit(1);
 }
 
@@ -179,7 +180,7 @@ int send_probe(int ifindex, __u32 addr)
 {
        struct ifreq ifr;
        struct sockaddr_in dst;
-       int len;
+       socklen_t len;
        unsigned char buf[256];
        struct arphdr *ah = (struct arphdr*)buf;
        unsigned char *p = (unsigned char *)(ah+1);
@@ -227,8 +228,7 @@ int send_probe(int ifindex, __u32 addr)
        memcpy(p, &addr, 4);
        p+=4;
 
-       len = sendto(pset[0].fd, buf, p-buf, 0, (struct sockaddr*)&sll, sizeof(sll));
-       if (len < 0)
+       if (sendto(pset[0].fd, buf, p-buf, 0, (struct sockaddr*)&sll, sizeof(sll)) < 0)
                return -1;
        stats.probes_sent++;
        return 0;
@@ -281,7 +281,7 @@ int respond_to_kernel(int ifindex, __u32 addr, char *lla, int llalen)
 
        addattr_l(&req.n, sizeof(req), NDA_DST, &addr, 4);
        addattr_l(&req.n, sizeof(req), NDA_LLADDR, lla, llalen);
-       return rtnl_send(&rth, (char*)&req, req.n.nlmsg_len) <= 0;
+       return rtnl_send(&rth, &req, req.n.nlmsg_len) <= 0;
 }
 
 void prepare_neg_entry(__u8 *ndata, __u32 stamp)
@@ -328,7 +328,6 @@ int do_one_request(struct nlmsghdr *n)
            !(ndm->ndm_state&~NUD_NOARP))
                return 0;
 
-       memset(tb, 0, sizeof(tb));
        parse_rtattr(tb, NDA_MAX, NDA_RTA(ndm), len);
 
        if (!tb[NDA_DST])
@@ -480,13 +479,14 @@ void get_arp_pkt(void)
 {
        unsigned char buf[1024];
        struct sockaddr_ll sll;
-       int sll_len = sizeof(sll);
+       socklen_t sll_len = sizeof(sll);
        struct arphdr *a = (struct arphdr*)buf;
        struct dbkey key;
        DBT dbkey, dbdat;
        int n;
 
-       n = recvfrom(pset[0].fd, buf, sizeof(buf), MSG_DONTWAIT, (struct sockaddr*)&sll, &sll_len);
+       n = recvfrom(pset[0].fd, buf, sizeof(buf), MSG_DONTWAIT,
+                    (struct sockaddr*)&sll, &sll_len);
        if (n < 0) {
                if (errno != EINTR && errno != EAGAIN)
                        syslog(LOG_ERR, "recvfrom: %m");
@@ -510,7 +510,7 @@ void get_arp_pkt(void)
        key.iface = sll.sll_ifindex;
        memcpy(&key.addr, (char*)(a+1) + a->ar_hln, 4);
 
-       /* DAD message, ignore. */ 
+       /* DAD message, ignore. */
        if (key.addr == 0)
                return;
 
@@ -538,7 +538,7 @@ void catch_signal(int sig, void (*handler)(int))
        sa.sa_handler = handler;
 #ifdef SA_INTERRUPT
        sa.sa_flags = SA_INTERRUPT;
-#endif 
+#endif
        sigaction(sig, &sa, NULL);
 }
 
@@ -708,6 +708,7 @@ int main(int argc, char **argv)
                                fprintf(stderr, "Invalid IP address: \"%s\"\n", ipbuf);
                                goto do_abort;
                        }
+
                        dbdat.data = hexstring_a2n(macbuf, b1, 6);
                        if (dbdat.data == NULL)
                                goto do_abort;
@@ -727,10 +728,10 @@ int main(int argc, char **argv)
                DBT dbkey, dbdat;
                printf("%-8s %-15s %s\n", "#Ifindex", "IP", "MAC");
                while (dbase->seq(dbase, &dbkey, &dbdat, R_NEXT) == 0) {
-                       struct dbkey *key = dbkey.data; 
+                       struct dbkey *key = dbkey.data;
                        if (handle_if(key->iface)) {
                                if (!IS_NEG(dbdat.data)) {
-                                       __u8 b1[18];
+                                       char b1[18];
                                        printf("%-8d %-15s %s\n",
                                               key->iface,
                                               inet_ntoa(*(struct in_addr*)&key->addr),
@@ -774,27 +775,9 @@ int main(int argc, char **argv)
 
        load_initial_table();
 
-       if (1) {
-               int fd;
-               pid_t pid = fork();
-
-               if (pid > 0)
-                       _exit(0);
-               if (pid < 0) {
-                       perror("arpd: fork");
-                       goto do_abort;
-               }
-
-               chdir("/");
-               fd = open("/dev/null", O_RDWR);
-               if (fd >= 0) {
-                       dup2(fd, 0);
-                       dup2(fd, 1);
-                       dup2(fd, 2);
-                       if (fd > 2)
-                               close(fd);
-               }
-               setsid();
+       if (daemon(0, 0)) {
+               perror("arpd: daemon");
+               goto do_abort;
        }
 
        openlog("arpd", LOG_PID | LOG_CONS, LOG_DAEMON);