diff options
Diffstat (limited to 'src/daemon/daemon.c')
-rw-r--r-- | src/daemon/daemon.c | 156 |
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 | */ | ||
829 | static 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); |