aboutsummaryrefslogtreecommitdiff
path: root/src/daemon/daemon.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/daemon/daemon.c')
-rw-r--r--src/daemon/daemon.c156
1 files changed, 87 insertions, 69 deletions
diff --git a/src/daemon/daemon.c b/src/daemon/daemon.c
index 950239a6..7b7046f6 100644
--- a/src/daemon/daemon.c
+++ b/src/daemon/daemon.c
@@ -818,6 +818,83 @@ 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/**
821 * Start a webserver on the given port. 898 * Start a webserver on the given port.
822 * 899 *
823 * @param port port to bind to 900 * @param port port to bind to
@@ -862,13 +939,8 @@ MHD_start_daemon_va (unsigned int options,
862 void *apc_cls, 939 void *apc_cls,
863 MHD_AccessHandlerCallback dh, void *dh_cls, va_list ap) 940 MHD_AccessHandlerCallback dh, void *dh_cls, va_list ap)
864{ 941{
865 const int on = 1; 942 const struct sockaddr * servaddr = NULL;
866 struct MHD_Daemon *retVal; 943 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;
872 enum MHD_OPTION opt; 944 enum MHD_OPTION opt;
873 945
874 if ((port == 0) || (dh == NULL)) 946 if ((port == 0) || (dh == NULL))
@@ -976,73 +1048,19 @@ MHD_start_daemon_va (unsigned int options,
976 } 1048 }
977 } 1049 }
978 1050
979 if ((options & MHD_USE_IPv6) != 0) 1051 if (bind_to_socket(options, port, servaddr, retVal)){;
980 socket_fd = SOCKET (PF_INET6, SOCK_STREAM, 0); 1052 free (retVal);
981 else 1053 return NULL;
982 socket_fd = SOCKET (PF_INET, SOCK_STREAM, 0); 1054 }
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
1037 1055
1038 if (LISTEN (socket_fd, 20) < 0) 1056 if (LISTEN (retVal->socket_fd, 20) < 0)
1039 { 1057 {
1040#if HAVE_MESSAGES 1058#if HAVE_MESSAGES
1041 if ((options & MHD_USE_DEBUG) != 0) 1059 if ((options & MHD_USE_DEBUG) != 0)
1042 FPRINTF (stderr, 1060 FPRINTF (stderr,
1043 "Failed to listen for connections: %s\n", STRERROR (errno)); 1061 "Failed to listen for connections: %s\n", STRERROR (errno));
1044#endif 1062#endif
1045 CLOSE (socket_fd); 1063 CLOSE (retVal->socket_fd);
1046 free (retVal); 1064 free (retVal);
1047 return NULL; 1065 return NULL;
1048 } 1066 }
@@ -1055,7 +1073,7 @@ MHD_start_daemon_va (unsigned int options,
1055#if HAVE_MESSAGES 1073#if HAVE_MESSAGES
1056 MHD_DLOG (retVal, "Failed to initialize TLS support\n"); 1074 MHD_DLOG (retVal, "Failed to initialize TLS support\n");
1057#endif 1075#endif
1058 CLOSE (socket_fd); 1076 CLOSE (retVal->socket_fd);
1059 free (retVal); 1077 free (retVal);
1060 return NULL; 1078 return NULL;
1061 } 1079 }
@@ -1070,7 +1088,7 @@ MHD_start_daemon_va (unsigned int options,
1070 "Failed to create listen thread: %s\n", STRERROR (errno)); 1088 "Failed to create listen thread: %s\n", STRERROR (errno));
1071#endif 1089#endif
1072 free (retVal); 1090 free (retVal);
1073 CLOSE (socket_fd); 1091 CLOSE (retVal->socket_fd);
1074 return NULL; 1092 return NULL;
1075 } 1093 }
1076 return retVal; 1094 return retVal;
@@ -1096,7 +1114,7 @@ MHD_stop_daemon (struct MHD_Daemon *daemon)
1096#endif 1114#endif
1097#endif 1115#endif
1098 CLOSE (fd); 1116 CLOSE (fd);
1099 if ((0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) || 1117 if ((0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) ||
1100 (0 != (daemon->options & MHD_USE_SELECT_INTERNALLY))) 1118 (0 != (daemon->options & MHD_USE_SELECT_INTERNALLY)))
1101 { 1119 {
1102 pthread_kill (daemon->pid, SIGALRM); 1120 pthread_kill (daemon->pid, SIGALRM);