aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2008-09-12 20:13:03 +0000
committerChristian Grothoff <christian@grothoff.org>2008-09-12 20:13:03 +0000
commit824628a22f59c312bc0f664665ec8d25be37910c (patch)
treef5f0c22daadc9dd38a06db426926ff90adfd4694
parent44cac11c40ecf8bd89b4e9b0f0cfd324fafa0a14 (diff)
downloadlibmicrohttpd-824628a22f59c312bc0f664665ec8d25be37910c.tar.gz
libmicrohttpd-824628a22f59c312bc0f664665ec8d25be37910c.zip
undo r7697 -- broke properly closing sockets, needless introduction of a trivial function
-rw-r--r--src/daemon/daemon.c156
1 files changed, 69 insertions, 87 deletions
diff --git a/src/daemon/daemon.c b/src/daemon/daemon.c
index 7b7046f6..950239a6 100644
--- a/src/daemon/daemon.c
+++ b/src/daemon/daemon.c
@@ -818,83 +818,6 @@ MHD_select_thread (void *cls)
818} 818}
819 819
820/** 820/**
821 * Bind daemon to socket
822 *
823 * @param options passed to the daemon
824 * @param port for the daemon to bind to
825 * @param servaddr: optional user initialized servaddr to bind to
826 * @param daemon
827 * @return 0 upon sucess or -1 on error
828 */
829static int bind_to_socket(unsigned int options,
830 unsigned short port,
831 const struct sockaddr * servaddr, struct MHD_Daemon * daemon ){
832 int socket_fd;
833 const int on = 1;
834 struct sockaddr_in servaddr4;
835 struct sockaddr_in6 servaddr6;
836 socklen_t addrlen;
837
838 if ((options & MHD_USE_IPv6) != 0)
839 socket_fd = SOCKET (PF_INET6, SOCK_STREAM, 0);
840 else
841 socket_fd = SOCKET (PF_INET, SOCK_STREAM, 0);
842 if (socket_fd < 0)
843 {
844 #if HAVE_MESSAGES
845 if ((options & MHD_USE_DEBUG) != 0)
846 FPRINTF (stderr, "Call to socket failed: %s\n", STRERROR (errno));
847 #endif
848 return -1;
849 }
850 if ((SETSOCKOPT (socket_fd,
851 SOL_SOCKET,
852 SO_REUSEADDR,
853 &on, sizeof (on)) < 0) && (options & MHD_USE_DEBUG) != 0)
854 {
855 #if HAVE_MESSAGES
856 FPRINTF (stderr, "setsockopt failed: %s\n", STRERROR (errno));
857 #endif
858 }
859
860 /* check for user supplied sockaddr */
861 if ((options & MHD_USE_IPv6) != 0)
862 addrlen = sizeof (struct sockaddr_in6);
863 else
864 addrlen = sizeof (struct sockaddr_in);
865 if (NULL == servaddr)
866 {
867 if ((options & MHD_USE_IPv6) != 0)
868 {
869 memset (&servaddr6, 0, sizeof (struct sockaddr_in6));
870 servaddr6.sin6_family = AF_INET6;
871 servaddr6.sin6_port = htons (port);
872 servaddr = (struct sockaddr *) &servaddr6;
873 }
874 else
875 {
876 memset (&servaddr4, 0, sizeof (struct sockaddr_in));
877 servaddr4.sin_family = AF_INET;
878 servaddr4.sin_port = htons (port);
879 servaddr = (struct sockaddr *) &servaddr4;
880 }
881 }
882
883 if (BIND (socket_fd, servaddr, addrlen) < 0)
884 {
885 #if HAVE_MESSAGES
886 if ((options & MHD_USE_DEBUG) != 0)
887 FPRINTF (stderr,
888 "Failed to bind to port %u: %s\n", port, STRERROR (errno));
889 #endif
890 CLOSE (socket_fd);
891 return -1;
892 }
893 daemon->socket_fd = socket_fd;
894 return 0;
895}
896
897/**
898 * Start a webserver on the given port. 821 * Start a webserver on the given port.
899 * 822 *
900 * @param port port to bind to 823 * @param port port to bind to
@@ -939,8 +862,13 @@ MHD_start_daemon_va (unsigned int options,
939 void *apc_cls, 862 void *apc_cls,
940 MHD_AccessHandlerCallback dh, void *dh_cls, va_list ap) 863 MHD_AccessHandlerCallback dh, void *dh_cls, va_list ap)
941{ 864{
942 const struct sockaddr * servaddr = NULL; 865 const int on = 1;
943 struct MHD_Daemon *retVal; 866 struct MHD_Daemon *retVal;
867 int socket_fd;
868 struct sockaddr_in servaddr4;
869 struct sockaddr_in6 servaddr6;
870 const struct sockaddr *servaddr = NULL;
871 socklen_t addrlen;
944 enum MHD_OPTION opt; 872 enum MHD_OPTION opt;
945 873
946 if ((port == 0) || (dh == NULL)) 874 if ((port == 0) || (dh == NULL))
@@ -1048,19 +976,73 @@ MHD_start_daemon_va (unsigned int options,
1048 } 976 }
1049 } 977 }
1050 978
1051 if (bind_to_socket(options, port, servaddr, retVal)){; 979 if ((options & MHD_USE_IPv6) != 0)
1052 free (retVal); 980 socket_fd = SOCKET (PF_INET6, SOCK_STREAM, 0);
1053 return NULL; 981 else
1054 } 982 socket_fd = SOCKET (PF_INET, SOCK_STREAM, 0);
983 if (socket_fd < 0)
984 {
985#if HAVE_MESSAGES
986 if ((options & MHD_USE_DEBUG) != 0)
987 FPRINTF (stderr, "Call to socket failed: %s\n", STRERROR (errno));
988#endif
989 free (retVal);
990 return NULL;
991 }
992 if ((SETSOCKOPT (socket_fd,
993 SOL_SOCKET,
994 SO_REUSEADDR,
995 &on, sizeof (on)) < 0) && (options & MHD_USE_DEBUG) != 0)
996 {
997#if HAVE_MESSAGES
998 FPRINTF (stderr, "setsockopt failed: %s\n", STRERROR (errno));
999#endif
1000 }
1001
1002 /* check for user supplied sockaddr */
1003 if ((options & MHD_USE_IPv6) != 0)
1004 addrlen = sizeof (struct sockaddr_in6);
1005 else
1006 addrlen = sizeof (struct sockaddr_in);
1007 if (NULL == servaddr)
1008 {
1009 if ((options & MHD_USE_IPv6) != 0)
1010 {
1011 memset (&servaddr6, 0, sizeof (struct sockaddr_in6));
1012 servaddr6.sin6_family = AF_INET6;
1013 servaddr6.sin6_port = htons (port);
1014 servaddr = (struct sockaddr *) &servaddr6;
1015 }
1016 else
1017 {
1018 memset (&servaddr4, 0, sizeof (struct sockaddr_in));
1019 servaddr4.sin_family = AF_INET;
1020 servaddr4.sin_port = htons (port);
1021 servaddr = (struct sockaddr *) &servaddr4;
1022 }
1023 }
1024 retVal->socket_fd = socket_fd;
1025 if (BIND (socket_fd, servaddr, addrlen) < 0)
1026 {
1027#if HAVE_MESSAGES
1028 if ((options & MHD_USE_DEBUG) != 0)
1029 FPRINTF (stderr,
1030 "Failed to bind to port %u: %s\n", port, STRERROR (errno));
1031#endif
1032 CLOSE (socket_fd);
1033 free (retVal);
1034 return NULL;
1035 }
1036
1055 1037
1056 if (LISTEN (retVal->socket_fd, 20) < 0) 1038 if (LISTEN (socket_fd, 20) < 0)
1057 { 1039 {
1058#if HAVE_MESSAGES 1040#if HAVE_MESSAGES
1059 if ((options & MHD_USE_DEBUG) != 0) 1041 if ((options & MHD_USE_DEBUG) != 0)
1060 FPRINTF (stderr, 1042 FPRINTF (stderr,
1061 "Failed to listen for connections: %s\n", STRERROR (errno)); 1043 "Failed to listen for connections: %s\n", STRERROR (errno));
1062#endif 1044#endif
1063 CLOSE (retVal->socket_fd); 1045 CLOSE (socket_fd);
1064 free (retVal); 1046 free (retVal);
1065 return NULL; 1047 return NULL;
1066 } 1048 }
@@ -1073,7 +1055,7 @@ MHD_start_daemon_va (unsigned int options,
1073#if HAVE_MESSAGES 1055#if HAVE_MESSAGES
1074 MHD_DLOG (retVal, "Failed to initialize TLS support\n"); 1056 MHD_DLOG (retVal, "Failed to initialize TLS support\n");
1075#endif 1057#endif
1076 CLOSE (retVal->socket_fd); 1058 CLOSE (socket_fd);
1077 free (retVal); 1059 free (retVal);
1078 return NULL; 1060 return NULL;
1079 } 1061 }
@@ -1088,7 +1070,7 @@ MHD_start_daemon_va (unsigned int options,
1088 "Failed to create listen thread: %s\n", STRERROR (errno)); 1070 "Failed to create listen thread: %s\n", STRERROR (errno));
1089#endif 1071#endif
1090 free (retVal); 1072 free (retVal);
1091 CLOSE (retVal->socket_fd); 1073 CLOSE (socket_fd);
1092 return NULL; 1074 return NULL;
1093 } 1075 }
1094 return retVal; 1076 return retVal;
@@ -1114,7 +1096,7 @@ MHD_stop_daemon (struct MHD_Daemon *daemon)
1114#endif 1096#endif
1115#endif 1097#endif
1116 CLOSE (fd); 1098 CLOSE (fd);
1117 if ((0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) || 1099 if ((0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) ||
1118 (0 != (daemon->options & MHD_USE_SELECT_INTERNALLY))) 1100 (0 != (daemon->options & MHD_USE_SELECT_INTERNALLY)))
1119 { 1101 {
1120 pthread_kill (daemon->pid, SIGALRM); 1102 pthread_kill (daemon->pid, SIGALRM);