summaryrefslogtreecommitdiff
path: root/src/serv.c
diff options
context:
space:
mode:
authorSimon Josefsson <simon@josefsson.org>2009-04-24 16:10:58 +0200
committerSimon Josefsson <simon@josefsson.org>2009-04-24 16:10:58 +0200
commit6ccb2ccaf7d0e8a5391433a6654eef08059f686c (patch)
treec6d42b442ae829f2ae419ce0dca623f6c20c75d0 /src/serv.c
parent50c6c3c93cc583172d1521d43c0d92347632d561 (diff)
downloadgnutls-6ccb2ccaf7d0e8a5391433a6654eef08059f686c.tar.gz
gnutls-serv: Listen on all interfaces.
Diffstat (limited to 'src/serv.c')
-rw-r--r--src/serv.c161
1 files changed, 94 insertions, 67 deletions
diff --git a/src/serv.c b/src/serv.c
index cef62ab587..0ef667f855 100644
--- a/src/serv.c
+++ b/src/serv.c
@@ -124,7 +124,7 @@ static int wrap_db_delete (void *dbf, gnutls_datum_t key);
LIST_TYPE_DECLARE (listener_item, char *http_request;
char *http_response; int request_length;
int response_length; int response_written;
- int http_state;
+ int http_state; int listen_socket;
int fd; gnutls_session_t tls_session; int handshake_ok;);
static const char *
@@ -631,6 +631,7 @@ listen_socket (const char *name, int listen_port)
char portname[6];
int s;
int yes;
+ listener_item *j = NULL;
snprintf (portname, sizeof (portname), "%d", listen_port);
memset (&hints, 0, sizeof (hints));
@@ -644,24 +645,40 @@ listen_socket (const char *name, int listen_port)
}
s = -1;
- for (ptr = res; (ptr != NULL) && (s == -1); ptr = ptr->ai_next)
+ for (ptr = res; ptr != NULL; ptr = ptr->ai_next)
{
- if ((s =
- socket (ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol)) < 0)
+ /* Print what we are doing. */
+ {
+ char host[NI_MAXHOST], service[NI_MAXSERV];
+ int rc = getnameinfo(ptr->ai_addr, ptr->ai_addrlen,
+ host, NI_MAXHOST,
+ service, NI_MAXSERV,
+ NI_NUMERICHOST|NI_NUMERICSERV);
+ if (rc == 0)
+ fprintf (stderr, "%s listening to %s:%s (family %d)...",
+ name, host, service, ptr->ai_family);
+ else
+ {
+ fprintf(stderr, "getnameinfo: %s\n", gai_strerror(s));
+ fprintf (stderr, "%s listening to *:%s (family %d)...",
+ name, portname, ptr->ai_family);
+ }
+ }
+
+ if ((s = socket (ptr->ai_family, ptr->ai_socktype,
+ ptr->ai_protocol)) < 0)
{
perror ("socket() failed");
continue;
}
yes = 1;
- if (setsockopt
- (s, SOL_SOCKET, SO_REUSEADDR, (const void *) &yes,
- sizeof (yes)) < 0)
+ if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR,
+ (const void *) &yes, sizeof (yes)) < 0)
{
perror ("setsockopt() failed");
failed:
close (s);
- s = -1;
continue;
}
@@ -676,16 +693,24 @@ listen_socket (const char *name, int listen_port)
perror ("listen() failed");
goto failed;
}
+
+ /* new list entry for the connection */
+ lappend (listener_list);
+ j = listener_list.tail;
+ j->listen_socket = 1;
+ j->fd = s;
+
+ /* Complete earlier message. */
+ fprintf (stderr, "done\n");
}
+ fflush (stderr);
+
freeaddrinfo (res);
- if (s == -1)
- {
- return -1;
- }
+ if (!j)
+ return -1;
- printf ("%s ready. Listening to port '%s'.\n\n", name, portname);
- return s;
+ return 0;
}
static void
@@ -790,7 +815,7 @@ addr_ntop (const struct sockaddr *sa, socklen_t salen,
int
main (int argc, char **argv)
{
- int ret, n, h;
+ int ret, n;
char topbuf[512];
char name[256];
int accept_fd;
@@ -1021,8 +1046,7 @@ main (int argc, char **argv)
/* gnutls_anon_set_server_dh_params(dh_cred, dh_params); */
#endif
- h = listen_socket (name, port);
- if (h < 0)
+ if (listen_socket (name, port) < 0)
exit (1);
for (;;)
@@ -1035,10 +1059,6 @@ main (int argc, char **argv)
FD_ZERO (&wr);
n = 0;
-/* check for new incoming connections */
- FD_SET (h, &rd);
- n = MAX (n, h);
-
/* flag which connections we are reading or writing to within the fd sets */
lloopstart (listener_list, j)
{
@@ -1052,6 +1072,11 @@ main (int argc, char **argv)
}
#endif
+ if (j->listen_socket)
+ {
+ FD_SET (j->fd, &rd);
+ n = MAX (n, j->fd);
+ }
if (j->http_state == HTTP_STATE_REQUEST)
{
FD_SET (j->fd, &rd);
@@ -1075,58 +1100,60 @@ main (int argc, char **argv)
exit (1);
}
-/* a new connection has arrived */
- if (FD_ISSET (h, &rd))
- {
- gnutls_session_t tls_session;
+/* read or write to each connection as indicated by select()'s return argument */
+ lloopstart (listener_list, j)
+ {
- tls_session = initialize_session ();
+ /* a new connection has arrived */
+ if (FD_ISSET (j->fd, &rd) && j->listen_socket)
+ {
+ gnutls_session_t tls_session;
- calen = sizeof (client_address);
- memset (&client_address, 0, calen);
- accept_fd = accept (h, (struct sockaddr *) &client_address, &calen);
+ tls_session = initialize_session ();
- if (accept_fd < 0)
- {
- perror ("accept()");
- }
- else
- {
- time_t tt;
- char *ctt;
-
-/* new list entry for the connection */
- lappend (listener_list);
- j = listener_list.tail;
- j->http_request = (char *) strdup ("");
- j->http_state = HTTP_STATE_REQUEST;
- j->fd = accept_fd;
-
- j->tls_session = tls_session;
- gnutls_transport_set_ptr (tls_session,
- (gnutls_transport_ptr_t) accept_fd);
- j->handshake_ok = 0;
-
- if (verbose == 0)
- {
- tt = time (0);
- ctt = ctime (&tt);
- ctt[strlen (ctt) - 1] = 0;
+ calen = sizeof (client_address);
+ memset (&client_address, 0, calen);
+ accept_fd = accept (j->fd, (struct sockaddr *) &client_address,
+ &calen);
-/*
- printf("\n* connection from %s, port %d\n",
- inet_ntop(AF_INET, &client_address.sin_addr, topbuf,
- sizeof(topbuf)), ntohs(client_address.sin_port));
- */
+ if (accept_fd < 0)
+ {
+ perror ("accept()");
+ }
+ else
+ {
+ time_t tt;
+ char *ctt;
+
+ /* new list entry for the connection */
+ lappend (listener_list);
+ j = listener_list.tail;
+ j->http_request = (char *) strdup ("");
+ j->http_state = HTTP_STATE_REQUEST;
+ j->fd = accept_fd;
+
+ j->tls_session = tls_session;
+ gnutls_transport_set_ptr (tls_session,
+ (gnutls_transport_ptr_t) accept_fd);
+ j->handshake_ok = 0;
+
+ if (verbose == 0)
+ {
+ tt = time (0);
+ ctt = ctime (&tt);
+ ctt[strlen (ctt) - 1] = 0;
- }
- }
- }
+ /*
+ printf("\n* connection from %s, port %d\n",
+ inet_ntop(AF_INET, &client_address.sin_addr, topbuf,
+ sizeof(topbuf)), ntohs(client_address.sin_port));
+ */
-/* read or write to each connection as indicated by select()'s return argument */
- lloopstart (listener_list, j)
- {
- if (FD_ISSET (j->fd, &rd))
+ }
+ }
+ }
+
+ if (FD_ISSET (j->fd, &rd) && !j->listen_socket)
{
/* read partial GET request */
char buf[1024];