static gboolean httpd_listen_in_event(G_GNUC_UNUSED GIOChannel *source, G_GNUC_UNUSED GIOCondition condition, gpointer data) { struct httpd_output *httpd = data; int fd; struct sockaddr_storage sa; socklen_t sa_length = sizeof(sa); g_mutex_lock(httpd->mutex); /* the listener socket has become readable - a client has connected */ fd = accept(httpd->fd, (struct sockaddr*)&sa, &sa_length); if (fd >= 0) httpd_client_add(httpd, fd); else if (fd < 0 && errno != EINTR) g_warning("accept() failed: %s", g_strerror(errno)); g_mutex_unlock(httpd->mutex); return true; }
static void httpd_listen_in_event(int fd, const struct sockaddr *address, size_t address_length, G_GNUC_UNUSED int uid, void *ctx) { struct httpd_output *httpd = ctx; /* the listener socket has become readable - a client has connected */ #ifdef HAVE_LIBWRAP if (address->sa_family != AF_UNIX) { char *hostaddr = sockaddr_to_string(address, address_length, NULL); const char *progname = g_get_prgname(); struct request_info req; request_init(&req, RQ_FILE, fd, RQ_DAEMON, progname, 0); fromhost(&req); if (!hosts_access(&req)) { /* tcp wrappers says no */ g_warning("libwrap refused connection (libwrap=%s) from %s", progname, hostaddr); g_free(hostaddr); close_socket(fd); g_mutex_unlock(httpd->mutex); return; } g_free(hostaddr); } #else (void)address; (void)address_length; #endif /* HAVE_WRAP */ g_mutex_lock(httpd->mutex); if (fd >= 0) { /* can we allow additional client */ if (httpd->open && (httpd->clients_max == 0 || httpd->clients_cnt < httpd->clients_max)) httpd_client_add(httpd, fd); else close_socket(fd); } else if (fd < 0 && errno != EINTR) { g_warning("accept() failed: %s", g_strerror(errno)); } g_mutex_unlock(httpd->mutex); }