Skip to content
Snippets Groups Projects
mongoose.c 156 KiB
Newer Older
Sergey Lyubka's avatar
Sergey Lyubka committed
          ping_idle_websocket_connection(conn, current_time);
        }

        if (nc->last_io_time + MONGOOSE_IDLE_TIMEOUT_SECONDS < current_time) {
          mg_ev_handler(nc, NS_CLOSE, NULL);
Sergey Lyubka's avatar
Sergey Lyubka committed
          nc->flags |= NSF_CLOSE_IMMEDIATELY;
        }
      }
      break;

    default:
      break;
  }
}

static void iter2(struct ns_connection *nc, enum ns_event ev, void *param) {
  mg_handler_t func = NULL;
  struct connection *conn = (struct connection *) nc->connection_data;
  const char *msg = (const char *) param;
  int n;
  (void) ev;

  //DBG(("%p [%s]", conn, msg));
  if (sscanf(msg, "%p %n", &func, &n) && func != NULL) {
    conn->mg_conn.callback_param = (void *) (msg + n);
    func(&conn->mg_conn, MG_POLL);
  }
}

void mg_wakeup_server_ex(struct mg_server *server, mg_handler_t cb,
                         const char *fmt, ...) {
  va_list ap;
  char buf[8 * 1024];
  int len;

  // Encode callback (cb) into a buffer
  len = snprintf(buf, sizeof(buf), "%p ", cb);
  va_start(ap, fmt);
  len += vsnprintf(buf + len, sizeof(buf) - len, fmt, ap);
  va_end(ap);

  // "len + 1" is to include terminating \0 in the message
  ns_server_wakeup_ex(&server->ns_server, iter2, buf, len + 1);
}

Sergey Lyubka's avatar
Sergey Lyubka committed
void mg_wakeup_server(struct mg_server *server) {
  ns_server_wakeup_ex(&server->ns_server, NULL, (void *) "", 0);
void mg_set_listening_socket(struct mg_server *server, int sock) {
Sergey Lyubka's avatar
Sergey Lyubka committed
  if (server->ns_server.listening_sock != INVALID_SOCKET) {
    closesocket(server->ns_server.listening_sock);
Sergey Lyubka's avatar
Sergey Lyubka committed
  server->ns_server.listening_sock = (sock_t) sock;
Sergey Lyubka's avatar
Sergey Lyubka committed
  return server->ns_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, mg_handler_t handler) {
  struct mg_server *server = (struct mg_server *) calloc(1, sizeof(*server));
Sergey Lyubka's avatar
Sergey Lyubka committed
  ns_server_init(&server->ns_server, server_data, mg_ev_handler);
  set_default_option_values(server->config_options);
  server->event_handler = handler;
  return server;