Skip to content
Snippets Groups Projects
mongoose.c 125 KiB
Newer Older
Sergey Lyubka's avatar
Sergey Lyubka committed
      } else if (setgid(pw->pw_gid) != 0) {
        error_msg = "setgid() failed";
      } else if (setuid(pw->pw_uid) != 0) {
        error_msg = "setuid() failed";
      }
Sergey Lyubka's avatar
Sergey Lyubka committed
#endif
#ifdef USE_SSL
    } else if (ind == SSL_CERTIFICATE) {
Sergey Lyubka's avatar
Sergey Lyubka committed
      SSL_library_init();
      if ((server->ssl_ctx = SSL_CTX_new(SSLv23_server_method())) == NULL) {
        error_msg = "SSL_CTX_new() failed";
      } else if (SSL_CTX_use_certificate_file(server->ssl_ctx, value, 1) == 0 ||
                 SSL_CTX_use_PrivateKey_file(server->ssl_ctx, value, 1) == 0) {
        error_msg = "Cannot load PEM file";
      } else {
        SSL_CTX_use_certificate_chain_file(server->ssl_ctx, value);
      }
Sergey Lyubka's avatar
Sergey Lyubka committed
#endif

void mg_set_http_error_handler(struct mg_server *server, mg_handler_t handler) {
  server->error_handler = handler;
}

void mg_set_listening_socket(struct mg_server *server, int sock) {
  if (server->listening_sock != INVALID_SOCKET) {
    closesocket(server->listening_sock);
  }
Sergey Lyubka's avatar
Sergey Lyubka committed
  server->listening_sock = (sock_t) sock;
}

int mg_get_listening_socket(struct mg_server *server) {
  return server->listening_sock;
}

const char *mg_get_option(const struct mg_server *server, const char *name) {
  const char **opts = (const char **) server->config_options;
  int i = get_option_index(name);
  return i == -1 ? NULL : opts[i] == NULL ? "" : opts[i];
}

struct mg_server *mg_create_server(void *server_data) {
  struct mg_server *server = (struct mg_server *) calloc(1, sizeof(*server));

#ifdef _WIN32
  WSADATA data;
  WSAStartup(MAKEWORD(2, 2), &data);
#else
  // Ignore SIGPIPE signal, so if browser cancels the request, it
  // won't kill the whole process.
  signal(SIGPIPE, SIG_IGN);
#endif

  LINKED_LIST_INIT(&server->active_connections);
  LINKED_LIST_INIT(&server->uri_handlers);
Sergey Lyubka's avatar
Sergey Lyubka committed

  // Create control socket pair. Do it in a loop to protect from
  // interrupted syscalls in mg_socketpair().
  do {
    mg_socketpair(server->ctl);
  } while (server->ctl[0] == INVALID_SOCKET);
  server->server_data = server_data;
  server->listening_sock = INVALID_SOCKET;
  set_default_option_values(server->config_options);
  return server;