static int do_accept(int listenfd) { int connfd; struct sockaddr_storage ss; socklen_t len = sizeof(ss); char host[NI_MAXHOST], port[NI_MAXSERV]; int rc; memset(&ss, 0, sizeof(ss)); connfd = accept(listenfd, (struct sockaddr *) &ss, &len); if (connfd < 0) { err("failed to accept connection"); return -1; } rc = getnameinfo((struct sockaddr *) &ss, len, host, sizeof(host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV); if (rc) err("getnameinfo: %s", gai_strerror(rc)); #ifdef HAVE_LIBWRAP rc = tcpd_auth(connfd); if (rc < 0) { info("denied access from %s", host); close(connfd); return -1; } #endif info("connection from %s:%s", host, port); return connfd; }
/* * put client socket in non blocking mode and * create a prelude_io object for IO abstraction. * * Tell server-logic to handle event on the newly accepted client. */ static int setup_client_socket(server_generic_t *server, server_generic_client_t *cdata, int client) { int ret; #ifdef HAVE_TCP_WRAPPERS if ( server->sa->sa_family != AF_UNIX ) { ret = tcpd_auth(cdata, client); if ( ret < 0 ) return -1; } #endif /* * set client socket non blocking. */ #if ! ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) ret = fcntl(client, F_SETFL, O_NONBLOCK); if ( ret < 0 ) return prelude_error_verbose(PRELUDE_ERROR_GENERIC, "could not set non blocking mode for client: %s", strerror(errno)); fcntl(client, F_SETFD, fcntl(client, F_GETFD) | FD_CLOEXEC); #endif ret = prelude_io_new(&cdata->fd); if ( ret < 0 ) return ret; prelude_io_set_sys_io(cdata->fd, client); cdata->msg = NULL; cdata->state = 0; return 0; }
static int my_accept(int lsock) { int csock; struct sockaddr_storage ss; socklen_t len = sizeof(ss); char host[NI_MAXHOST], port[NI_MAXSERV]; int ret; bzero(&ss, sizeof(ss)); csock = accept(lsock, (struct sockaddr *) &ss, &len); if (csock < 0) { err("accept"); return -1; } ret = getnameinfo((struct sockaddr *) &ss, len, host, sizeof(host), port, sizeof(port), (NI_NUMERICHOST | NI_NUMERICSERV)); if (ret) err("getnameinfo, %s", gai_strerror(ret)); #ifdef HAVE_LIBWRAP ret = tcpd_auth(csock); if (ret < 0) { info("deny access from %s", host); close(csock); return -1; } #endif info("connected from %s:%s", host, port); return csock; }