void mowgli_simple_eventloop_error_handler(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata) { mowgli_eventloop_pollable_t *pollable = mowgli_eventloop_io_pollable(io); if (pollable != NULL) mowgli_pollable_destroy(eventloop, pollable); }
static void accept_ready(mowgli_eventloop_t *ev, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *priv) { mowgli_eventloop_pollable_t *poll = mowgli_eventloop_io_pollable(io); u_conn *conn; u_link *link; sync_time(); link = link_create(); if (!(conn = u_conn_accept(ev, &u_link_conn_ctx, link, 0, poll->fd))) { link_destroy(link); /* TODO: close listener, maybe? */ return; } u_log(LG_VERBOSE, "new connection from %s", conn->ip); }
/********************************************************************************** * netlink glue * **********************************************************************************/ static void linux_handle(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata) { mowgli_eventloop_pollable_t *pollable = mowgli_eventloop_io_pollable(io); unsigned char buffer[BUFSIZ]; size_t len; while ((len = recvfrom(pollable->fd, buffer, BUFSIZ, 0, NULL, NULL)) >= 14) { packet_info_t info; info.packets = 1; info.len = len; info.ts.tv_sec = mowgli_eventloop_get_time(eventloop); info.ts.tv_usec = 0; info.new_flow = 0; dissect_ethernet(&info, buffer); } }
static void read_data(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata) { mowgli_eventloop_pollable_t *pollable = mowgli_eventloop_io_pollable(io); mowgli_dns_t *dns = userdata; char buf[2048]; char *ch; int ret; return_if_fail(pollable->fd == STDIN_FILENO); if ((ret = read(pollable->fd, buf, sizeof(buf))) < 0) { perror("read"); mowgli_pollable_destroy(eventloop, io); return; } else if (ret == 0) { return; } buf[--ret] = '\0'; ch = strtok(buf, " "); while (ch != NULL) { dns_query *dnsquery = mowgli_alloc(sizeof(dns_query)); mowgli_dns_query_t *query = &dnsquery->query; printf("Domain input: %s\n", ch); printf("End domain input\n"); query->callback = resolve_cb; query->ptr = dnsquery; dnsquery->domain = mowgli_strdup(ch); if (*ch == '+') { int type; void *addrptr; struct sockaddr_storage addr; if (strchr(++ch, ':') != NULL) { struct sockaddr_in6 *saddr = (struct sockaddr_in6 *) &addr; type = AF_INET6; addrptr = &saddr->sin6_addr; } else { struct sockaddr_in *saddr = (struct sockaddr_in *) &addr; type = AF_INET; addrptr = &saddr->sin_addr; } addr.ss_family = type; if ((ret = inet_pton(type, ch, addrptr)) != 1) { if (ret == -1) perror("inet_pton"); else printf("Invalid address %s\n", ch); return; } mowgli_dns_gethost_byaddr(dns, &addr, query); } else { mowgli_dns_gethost_byname(dns, ch, query, MOWGLI_DNS_T_A); } dnsquery->domain = mowgli_strdup(ch); ch = strtok(NULL, " "); } }