static void *sigh(void *arg) { int signum; sigset_t sigcatch; pthread_dbg("thread started"); sigemptyset(&sigcatch); sigaddset(&sigcatch, SIGHUP); sigaddset(&sigcatch, SIGINT); sigaddset(&sigcatch, SIGTERM); #ifdef ENABLE_VT sigaddset(&sigcatch, SIGPIPE); #endif for ( ;; ) { sigwait(&sigcatch, &signum); switch (signum) { case SIGHUP: reinit(); break; case SIGINT: case SIGTERM: #ifdef ENABLE_VT case SIGPIPE: #endif terminate(); default: break; } } pthread_exit(NULL); }
static void *mh_listen(void *arg) { uint8_t msg[MAX_PKT_LEN]; struct in6_pktinfo pktinfo; struct in6_addr haoa, rta; struct sockaddr_in6 addr; struct ip6_mh *mh; struct in6_addr_bundle addrs; ssize_t len; struct mh_handler *h; pthread_dbg("thread started"); while (1) { pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); len = mh_recv(msg, sizeof(msg), &addr, &pktinfo, &haoa, &rta); /* check if socket has closed */ if (len == -EBADF) break; /* common validity check */ if (len < sizeof(struct ip6_mh)) continue; addrs.src = &addr.sin6_addr; addrs.dst = &pktinfo.ipi6_addr; if (!IN6_IS_ADDR_UNSPECIFIED(&haoa)) { addrs.remote_coa = &haoa; } else { addrs.remote_coa = NULL; } if (!IN6_IS_ADDR_UNSPECIFIED(&rta)) { addrs.local_coa = &rta; } else { addrs.local_coa = NULL; } addrs.bind_coa = NULL; mh = (struct ip6_mh *) msg; pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); pthread_rwlock_rdlock(&handler_lock); h = mh_handler_get(mh->ip6mh_type); if (h) h->recv(mh, len, &addrs, pktinfo.ipi6_ifindex); pthread_rwlock_unlock(&handler_lock); } pthread_exit(NULL); }
static void *icmp6_listen(void *arg) { uint8_t msg[MAX_PKT_LEN]; struct sockaddr_in6 addr; struct in6_addr *saddr, *daddr; struct in6_pktinfo pkt_info; struct icmp6_hdr *ih; int iif, hoplimit; ssize_t len; struct icmp6_handler *h; pthread_dbg("thread started"); while (1) { pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); len = icmp6_recv(icmp6_sock.fd, msg, sizeof(msg), &addr, &pkt_info, &hoplimit); /* check if socket has closed */ if (len == -EBADF) break; /* common validity check */ if (len < sizeof(struct icmp6_hdr)) continue; saddr = &addr.sin6_addr; daddr = &pkt_info.ipi6_addr; iif = pkt_info.ipi6_ifindex; ih = (struct icmp6_hdr *)msg; /* multiplex to right handler */ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); pthread_rwlock_rdlock(&handler_lock); if ((h = icmp6_handler_get(ih->icmp6_type)) != NULL) h->recv(ih, len, saddr, daddr, iif, hoplimit); pthread_rwlock_unlock(&handler_lock); } pthread_exit(NULL); }