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