1748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/* Feel free to use this example code in any way 2748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat you see fit (Public Domain) */ 3748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 4748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <sys/types.h> 5748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef _WIN32 6748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <sys/select.h> 7748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <sys/socket.h> 8748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#else 9748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <winsock2.h> 10748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 11748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <stdio.h> 12748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <stdlib.h> 13748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <string.h> 14748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <microhttpd.h> 15748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 16748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define PORT 8888 17748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define POSTBUFFERSIZE 512 18748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define MAXCLIENTS 2 19748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 20748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define GET 0 21748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define POST 1 22748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 23748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic unsigned int nr_of_uploading_clients = 0; 24748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 25748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstruct connection_info_struct 26748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{ 27748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat int connectiontype; 28748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat struct MHD_PostProcessor *postprocessor; 29748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat FILE *fp; 30748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat const char *answerstring; 31748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat int answercode; 32748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}; 33748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 34748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char *askpage = "<html><body>\n\ 35748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat Upload a file, please!<br>\n\ 36748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat There are %u clients uploading at the moment.<br>\n\ 37748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat <form action=\"/filepost\" method=\"post\" enctype=\"multipart/form-data\">\n\ 38748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat <input name=\"file\" type=\"file\">\n\ 39748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat <input type=\"submit\" value=\" Send \"></form>\n\ 40748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat </body></html>"; 41748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 42748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char *busypage = 43748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat "<html><body>This server is busy, please try again later.</body></html>"; 44748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 45748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char *completepage = 46748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat "<html><body>The upload has been completed.</body></html>"; 47748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 48748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char *errorpage = 49748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat "<html><body>This doesn't seem to be right.</body></html>"; 50748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char *servererrorpage = 51748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat "<html><body>An internal server error has occured.</body></html>"; 52748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char *fileexistspage = 53748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat "<html><body>This file already exists.</body></html>"; 54748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 55748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 56748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic int 57748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratsend_page (struct MHD_Connection *connection, const char *page, 58748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat int status_code) 59748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{ 60748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat int ret; 61748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat struct MHD_Response *response; 62748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 63748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat response = 64748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat MHD_create_response_from_buffer (strlen (page), (void *) page, 65748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat MHD_RESPMEM_MUST_COPY); 66748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (!response) 67748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return MHD_NO; 68748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE, "text/html"); 69748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat ret = MHD_queue_response (connection, status_code, response); 70748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat MHD_destroy_response (response); 71748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 72748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return ret; 73748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat} 74748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 75748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 76748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic int 77748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratiterate_post (void *coninfo_cls, enum MHD_ValueKind kind, const char *key, 78748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat const char *filename, const char *content_type, 79748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat const char *transfer_encoding, const char *data, uint64_t off, 80748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat size_t size) 81748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{ 82748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat struct connection_info_struct *con_info = coninfo_cls; 83748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat FILE *fp; 84748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 85748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat con_info->answerstring = servererrorpage; 86748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat con_info->answercode = MHD_HTTP_INTERNAL_SERVER_ERROR; 87748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 88748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (0 != strcmp (key, "file")) 89748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return MHD_NO; 90748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 91748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (!con_info->fp) 92748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat { 93748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (NULL != (fp = fopen (filename, "rb"))) 94748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat { 95748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat fclose (fp); 96748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat con_info->answerstring = fileexistspage; 97748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat con_info->answercode = MHD_HTTP_FORBIDDEN; 98748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return MHD_NO; 99748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat } 100748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 101748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat con_info->fp = fopen (filename, "ab"); 102748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (!con_info->fp) 103748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return MHD_NO; 104748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat } 105748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 106748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (size > 0) 107748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat { 108748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (!fwrite (data, size, sizeof (char), con_info->fp)) 109748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return MHD_NO; 110748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat } 111748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 112748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat con_info->answerstring = completepage; 113748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat con_info->answercode = MHD_HTTP_OK; 114748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 115748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return MHD_YES; 116748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat} 117748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 118748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 119748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic void 120748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratrequest_completed (void *cls, struct MHD_Connection *connection, 121748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat void **con_cls, enum MHD_RequestTerminationCode toe) 122748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{ 123748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat struct connection_info_struct *con_info = *con_cls; 124748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 125748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (NULL == con_info) 126748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return; 127748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 128748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (con_info->connectiontype == POST) 129748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat { 130748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (NULL != con_info->postprocessor) 131748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat { 132748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat MHD_destroy_post_processor (con_info->postprocessor); 133748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat nr_of_uploading_clients--; 134748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat } 135748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 136748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (con_info->fp) 137748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat fclose (con_info->fp); 138748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat } 139748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 140748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat free (con_info); 141748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *con_cls = NULL; 142748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat} 143748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 144748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 145748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic int 146748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratanswer_to_connection (void *cls, struct MHD_Connection *connection, 147748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat const char *url, const char *method, 148748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat const char *version, const char *upload_data, 149748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat size_t *upload_data_size, void **con_cls) 150748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{ 151748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (NULL == *con_cls) 152748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat { 153748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat struct connection_info_struct *con_info; 154748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 155748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (nr_of_uploading_clients >= MAXCLIENTS) 156748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return send_page (connection, busypage, MHD_HTTP_SERVICE_UNAVAILABLE); 157748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 158748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat con_info = malloc (sizeof (struct connection_info_struct)); 159748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (NULL == con_info) 160748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return MHD_NO; 161748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 162748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat con_info->fp = NULL; 163748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 164748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (0 == strcmp (method, "POST")) 165748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat { 166748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat con_info->postprocessor = 167748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat MHD_create_post_processor (connection, POSTBUFFERSIZE, 168748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat iterate_post, (void *) con_info); 169748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 170748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (NULL == con_info->postprocessor) 171748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat { 172748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat free (con_info); 173748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return MHD_NO; 174748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat } 175748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 176748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat nr_of_uploading_clients++; 177748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 178748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat con_info->connectiontype = POST; 179748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat con_info->answercode = MHD_HTTP_OK; 180748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat con_info->answerstring = completepage; 181748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat } 182748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat else 183748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat con_info->connectiontype = GET; 184748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 185748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *con_cls = (void *) con_info; 186748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 187748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return MHD_YES; 188748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat } 189748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 190748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (0 == strcmp (method, "GET")) 191748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat { 192748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat char buffer[1024]; 193748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 194748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat snprintf (buffer, sizeof (buffer), askpage, nr_of_uploading_clients); 195748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return send_page (connection, buffer, MHD_HTTP_OK); 196748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat } 197748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 198748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (0 == strcmp (method, "POST")) 199748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat { 200748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat struct connection_info_struct *con_info = *con_cls; 201748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 202748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (0 != *upload_data_size) 203748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat { 204748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat MHD_post_process (con_info->postprocessor, upload_data, 205748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *upload_data_size); 206748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *upload_data_size = 0; 207748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 208748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return MHD_YES; 209748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat } 210748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat else 211748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat { 212748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (NULL != con_info->fp) 213748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat { 214748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat fclose (con_info->fp); 215748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat con_info->fp = NULL; 216748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat } 217748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat /* Now it is safe to open and inspect the file before calling send_page with a response */ 218748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return send_page (connection, con_info->answerstring, 219748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat con_info->answercode); 220748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat } 221748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 222748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat } 223748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 224748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return send_page (connection, errorpage, MHD_HTTP_BAD_REQUEST); 225748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat} 226748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 227748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 228748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint 229748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratmain () 230748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{ 231748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat struct MHD_Daemon *daemon; 232748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 233748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat daemon = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY, PORT, NULL, NULL, 234748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat &answer_to_connection, NULL, 235748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat MHD_OPTION_NOTIFY_COMPLETED, request_completed, 236748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat NULL, MHD_OPTION_END); 237748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat if (NULL == daemon) 238748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return 1; 239748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat (void) getchar (); 240748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat MHD_stop_daemon (daemon); 241748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat return 0; 242748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat} 243