|
|
|
@ -14,7 +14,7 @@
|
|
|
|
|
#include <ucontext.h>
|
|
|
|
|
#include <time.h>
|
|
|
|
|
|
|
|
|
|
#include "app_args.h"
|
|
|
|
|
//#include "app_args.h"
|
|
|
|
|
#include "request.h"
|
|
|
|
|
|
|
|
|
|
struct http_request;
|
|
|
|
@ -33,7 +33,7 @@ struct http_server
|
|
|
|
|
ucontext_t context;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct http_server* http_server_new( struct app_args* args, http_server_handler handler, void* handler_data )
|
|
|
|
|
struct http_server* http_server_new( struct http_server_args* args, http_server_handler handler, void* handler_data )
|
|
|
|
|
{
|
|
|
|
|
// Create server structure
|
|
|
|
|
struct http_server* srv = (struct http_server*)malloc( sizeof(struct http_server) );
|
|
|
|
@ -61,28 +61,32 @@ struct http_server* http_server_new( struct app_args* args, http_server_handler
|
|
|
|
|
// Bind socket
|
|
|
|
|
struct sockaddr_in addr;
|
|
|
|
|
addr.sin_family = AF_INET;
|
|
|
|
|
addr.sin_port = htons(args->port);
|
|
|
|
|
addr.sin_port = htons(args->bind_port);
|
|
|
|
|
addr.sin_addr.s_addr = INADDR_ANY;
|
|
|
|
|
|
|
|
|
|
if( !inet_aton( args->addr, &addr.sin_addr ) ) {
|
|
|
|
|
printf( "Unable to parse address %s: %s\n", args->addr, strerror(errno) );
|
|
|
|
|
exit(1);
|
|
|
|
|
if( args->bind_address ) {
|
|
|
|
|
if( !inet_aton( args->bind_address, &addr.sin_addr ) ) {
|
|
|
|
|
printf( "Unable to parse address %s: %s\n", args->bind_address, strerror(errno) );
|
|
|
|
|
exit(1);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
args->bind_address = "*";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if( -1 == bind( srv->sock, (struct sockaddr*)&addr, sizeof(addr) ) ) {
|
|
|
|
|
printf( "Error binding socket to %s:%d: %s\n",
|
|
|
|
|
args->addr, args->port, strerror(errno)
|
|
|
|
|
args->bind_address, args->bind_port, strerror(errno)
|
|
|
|
|
);
|
|
|
|
|
exit(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if( -1 == listen( srv->sock, 0 ) ) {
|
|
|
|
|
printf( "Unable to listen on %s:%d: %s\n",
|
|
|
|
|
args->addr, args->port, strerror(errno)
|
|
|
|
|
args->bind_address, args->bind_port, strerror(errno)
|
|
|
|
|
);
|
|
|
|
|
exit(1);
|
|
|
|
|
}
|
|
|
|
|
printf( "Listening on %s:%d\n", args->addr, args->port );
|
|
|
|
|
printf( "Listening on %s:%d\n", args->bind_address, args->bind_port );
|
|
|
|
|
|
|
|
|
|
if( -1 == fcntl( srv->sock, F_SETFL, O_NONBLOCK ) ) {
|
|
|
|
|
printf( "Unable to set O_NONBLOCK on server listening socket, continuing with reduced capacity: %s\n", strerror(errno) );
|
|
|
|
|