예제 #1
0
static const char *test_http_index(void) {
  struct ns_mgr mgr;
  struct ns_connection *nc;
  const char *local_addr = "127.0.0.1:7777";
  char buf[20] = "";

  ns_mgr_init(&mgr, NULL);
  ASSERT((nc = ns_bind(&mgr, local_addr, cb1)) != NULL);
  ns_set_protocol_http_websocket(nc);

  /* Test directory. */
  ASSERT((nc = ns_connect(&mgr, local_addr, cb9)) != NULL);
  ns_set_protocol_http_websocket(nc);
  nc->user_data = buf;
  ns_printf(nc, "GET /%s HTTP/1.0\n\n", "/");

  system("echo testdata >index.html");

  /* Run event loop. Use more cycles to let file download complete. */
  poll_mgr(&mgr, 200);
  ns_mgr_free(&mgr);
  system("rm index.html");

  /* Check that test buffer has been filled by the callback properly. */
  ASSERT(strcmp(buf, "testdata\n") == 0);

  return NULL;
}
예제 #2
0
int main(int argc, char *argv[]) {
  struct ns_mgr mgr;
  int i;

  ns_mgr_init(&mgr, NULL);

  /* Process command line arguments */
  for (i = 1; i < argc; i++) {
    if (strcmp(argv[i], "--show-headers") == 0) {
      s_show_headers = 1;
    } else if (strcmp(argv[i], "--hexdump") == 0 && i + 1 < argc) {
      mgr.hexdump_file = argv[++i];
    } else {
      break;
    }
  }

  if (i + 1 != argc) {
    fprintf(stderr, "Usage: %s [--show_headers] [--hexdump <file>] <URL>\n",
            argv[0]);
    exit(EXIT_FAILURE);
  }

  ns_connect_http(&mgr, ev_handler, argv[i], NULL);

  while (s_exit_flag == 0) {
    ns_mgr_poll(&mgr, 1000);
  }
  ns_mgr_free(&mgr);

  return 0;
}
int main(int argc, char *argv[]) {
  struct ns_mgr mgr;
  struct ns_connection *nc;
  int i;
  char *cp;

  ns_mgr_init(&mgr, NULL);
  nc = ns_bind(&mgr, s_http_port, ev_handler);
  ns_set_protocol_http_websocket(nc);
  s_http_server_opts.document_root = ".";
  s_http_server_opts.enable_directory_listing = "yes";

  /* Use current binary directory as document root */
  if (argc > 0 && ((cp = strrchr(argv[0], '/')) != NULL ||
      (cp = strrchr(argv[0], '/')) != NULL)) {
    *cp = '\0';
    s_http_server_opts.document_root = argv[0];
  }

  /* Process command line options to customize HTTP server */
  for (i = 1; i < argc; i++) {
    if (strcmp(argv[i], "-D") == 0 && i + 1 < argc) {
      mgr.hexdump_file = argv[++i];
    } else if (strcmp(argv[i], "-d") == 0 && i + 1 < argc) {
      s_http_server_opts.document_root = argv[++i];
    } else if (strcmp(argv[i], "-a") == 0 && i + 1 < argc) {
      s_http_server_opts.auth_domain = argv[++i];
    } else if (strcmp(argv[i], "-P") == 0 && i + 1 < argc) {
      s_http_server_opts.global_auth_file = argv[++i];
    } else if (strcmp(argv[i], "-p") == 0 && i + 1 < argc) {
      s_http_server_opts.per_directory_auth_file = argv[++i];
    } else if (strcmp(argv[i], "-r") == 0 && i + 1 < argc) {
      s_http_server_opts.url_rewrites = argv[++i];
#ifndef NS_DISABLE_CGI
    } else if (strcmp(argv[i], "-i") == 0 && i + 1 < argc) {
      s_http_server_opts.cgi_interpreter = argv[++i];
#endif
#ifdef NS_ENABLE_SSL
    } else if (strcmp(argv[i], "-s") == 0 && i + 1 < argc) {
      const char *ssl_cert = argv[++i];
      const char *err_str = ns_set_ssl(nc, ssl_cert, NULL);
      if (err_str != NULL) {
        fprintf(stderr, "Error loading SSL cert: %s\n", err_str);
        exit(1);
      }
#endif
    }
  }

  printf("Starting RESTful server on port %s\n", s_http_port);
  for (;;) {
    ns_mgr_poll(&mgr, 1000);
  }
  ns_mgr_free(&mgr);

  return 0;
}
예제 #4
0
static const char *test_http_errors(void) {
  struct ns_mgr mgr;
  struct ns_connection *nc;
  const char *local_addr = "127.0.0.1:7777";
  char status[40] = "";

  ns_mgr_init(&mgr, NULL);
  ASSERT((nc = ns_bind(&mgr, local_addr, cb1)) != NULL);
  ns_set_protocol_http_websocket(nc);

  /* Test file which exists but cannot be opened */
  ASSERT((nc = ns_connect(&mgr, local_addr, cb8)) != NULL);
  ns_set_protocol_http_websocket(nc);
  nc->user_data = status;
  system("touch test_unreadable; chmod 000 test_unreadable");
  ns_printf(nc, "GET /%s HTTP/1.0\n\n", "../test_unreadable");

  /* Run event loop. Use more cycles to let file download complete. */
  poll_mgr(&mgr, 200);
  system("rm -f test_unreadable");

  /* Check that it failed */
  ASSERT(strncmp(status, "HTTP/1.1 500", strlen("HTTP/1.1 500")) == 0);

  /* Test non existing file */
  ASSERT((nc = ns_connect(&mgr, local_addr, cb8)) != NULL);
  ns_set_protocol_http_websocket(nc);
  nc->user_data = status;
  ns_printf(nc, "GET /%s HTTP/1.0\n\n", "/please_dont_create_this_file_srsly");

  /* Run event loop. Use more cycles to let file download complete. */
  poll_mgr(&mgr, 200);

  /* Check that it failed */
  ASSERT(strncmp(status, "HTTP/1.1 404", strlen("HTTP/1.1 404")) == 0);

  /* Test directory without index.html */
  ASSERT((nc = ns_connect(&mgr, local_addr, cb8)) != NULL);
  ns_set_protocol_http_websocket(nc);
  nc->user_data = status;
  ns_printf(nc, "GET /%s HTTP/1.0\n\n", "/");

  /* Run event loop. Use more cycles to let file download complete. */
  poll_mgr(&mgr, 200);

  /* Check that it failed */
  ASSERT(strncmp(status, "HTTP/1.1 403", strlen("HTTP/1.1 403")) == 0);

  /* Cleanup */
  ns_mgr_free(&mgr);

  return NULL;
}
예제 #5
0
/*
 * This thread function executes user event handler.
 * It runs an event manager that has only one connection, until that
 * connection is alive.
 */
static void *per_connection_thread_function(void *param) {
  struct ns_connection *c = (struct ns_connection *) param;
  struct ns_mgr m;

  ns_mgr_init(&m, NULL);
  ns_add_conn(&m, c);
  while (m.active_connections != NULL) {
    ns_mgr_poll(&m, 1000);
  }
  ns_mgr_free(&m);

  return param;
}
예제 #6
0
int main(void) {
  struct ns_mgr mgr;
  struct ns_connection *nc;

  ns_mgr_init(&mgr, NULL);
  nc = ns_bind(&mgr, s_http_port, ev_handler);
  ns_set_protocol_http_websocket(nc);

  printf("Starting JSON-RPC server on port %s\n", s_http_port);
  for (;;) {
    ns_mgr_poll(&mgr, 1000);
  }
  ns_mgr_free(&mgr);

  return 0;
}
예제 #7
0
static const char *test_connect_opts(void) {
  struct ns_mgr mgr;
  struct ns_connection *nc;
  struct ns_connect_opts opts;

  opts.user_data = (void*)0xdeadbeef;
  opts.flags = NSF_USER_6;

  ns_mgr_init(&mgr, NULL);
  ASSERT((nc = ns_connect_opt(&mgr, "127.0.0.1:33211", cb6, opts)) != NULL);
  ASSERT(nc->user_data == (void*)0xdeadbeef);
  ASSERT(nc->flags & NSF_USER_6);
  poll_mgr(&mgr, 50);
  ns_mgr_free(&mgr);
  return NULL;
}
예제 #8
0
static const char *test_connect_fail(void) {
  struct ns_mgr mgr;
  struct ns_connection *nc;
  char buf[100] = "0";

  ns_mgr_init(&mgr, NULL);
  ASSERT((nc = ns_connect(&mgr, "127.0.0.1:33211", cb5)) != NULL);
  nc->user_data = buf;
  poll_mgr(&mgr, 50);
  ns_mgr_free(&mgr);

  /* printf("failed connect status: [%s]\n", buf); */
  ASSERT(strcmp(buf, "0") != 0);

  return NULL;
}
예제 #9
0
int main(void) {
  struct ns_mgr mgr;
  const char *port1 = "1234", *port2 = "127.0.0.1:17000";

  ns_mgr_init(&mgr, NULL);
  ns_bind(&mgr, port1, ev_handler, NULL);
  ns_bind(&mgr, port2, ev_handler, NULL);

  printf("Starting echo mgr on ports %s, %s\n", port1, port2);
  for (;;) {
    ns_mgr_poll(&mgr, 1000);
  }
  ns_mgr_free(&mgr);

  return 0;
}
예제 #10
0
static const char *test_udp(void) {
  struct ns_mgr mgr;
  struct ns_connection *nc;
  const char *address = "udp://127.0.0.1:7878";
  char buf[20] = "";

  ns_mgr_init(&mgr, buf);
  ASSERT(ns_bind(&mgr, address, eh3) != NULL);
  ASSERT((nc = ns_connect(&mgr, address, eh3)) != NULL);
  ns_printf(nc, "%s", "boo!");

  { int i; for (i = 0; i < 50; i++) ns_mgr_poll(&mgr, 1); }
  ASSERT(memcmp(buf, "boo!", 4) == 0);
  ns_mgr_free(&mgr);

  return NULL;
}
예제 #11
0
static const char *test_http(void) {
  struct ns_mgr mgr;
  struct ns_connection *nc;
  const char *local_addr = "127.0.0.1:7777";
  char buf[20] = "", status[20] = "", mime[20] = "";

  ns_mgr_init(&mgr, NULL);
  ASSERT((nc = ns_bind(&mgr, local_addr, cb1)) != NULL);
  ns_set_protocol_http_websocket(nc);

  /* Valid HTTP request. Pass test buffer to the callback. */
  ASSERT((nc = ns_connect(&mgr, local_addr, cb2)) != NULL);
  ns_set_protocol_http_websocket(nc);
  nc->user_data = buf;
  ns_printf(nc, "%s", "POST /foo HTTP/1.0\nContent-Length: 10\n\n"
            "0123456789");

  /* Invalid HTTP request */
  ASSERT((nc = ns_connect(&mgr, local_addr, cb2)) != NULL);
  ns_set_protocol_http_websocket(nc);
  ns_printf(nc, "%s", "bl\x03\n\n");

  /* Test static file download by downloading this executable, argv[0] */
  ASSERT((nc = ns_connect(&mgr, local_addr, cb7)) != NULL);
  ns_set_protocol_http_websocket(nc);
  nc->user_data = status;
  ns_printf(nc, "GET /%s HTTP/1.0\n\n", s_argv_0);

  /* Test mime type for static file */
  ASSERT((nc = ns_connect(&mgr, local_addr, cb10)) != NULL);
  ns_set_protocol_http_websocket(nc);
  nc->user_data = mime;
  ns_printf(nc, "%s", "GET /data/dummy.xml HTTP/1.0\n\n");

  /* Run event loop. Use more cycles to let file download complete. */
  poll_mgr(&mgr, 200);
  ns_mgr_free(&mgr);

  /* Check that test buffer has been filled by the callback properly. */
  ASSERT(strcmp(buf, "[/foo 10]") == 0);
  ASSERT(strcmp(status, "success") == 0);
  ASSERT(strcmp(mime, "text/xml") == 0);

  return NULL;
}
예제 #12
0
static const char *test_thread(void) {
  struct ns_mgr mgr;
  struct ns_connection *nc;
  sock_t sp[2];
  char buf[20];

  ASSERT(ns_socketpair(sp) == 1);
  ns_start_thread(thread_func, &sp[1]);

  ns_mgr_init(&mgr, NULL);
  ASSERT((nc = ns_add_sock(&mgr, sp[0], eh2)) != NULL);
  nc->user_data = buf;
  poll_mgr(&mgr, 50);
  ASSERT(strcmp(buf, ":-)") == 0);
  ns_mgr_free(&mgr);
  closesocket(sp[1]);

  return NULL;
}
예제 #13
0
int main(int argc, char *argv[]) {
    struct ns_mgr mgr;

    if (argc != 3) {
        fprintf(stderr, "Usage: %s <port> <client|server>\n", argv[0]);
        exit(EXIT_FAILURE);
    } else if (strcmp(argv[2], "client") == 0) {
        int fds[2];
        struct ns_connection *ioconn, *server_conn;

        ns_mgr_init(&mgr, NULL, client_handler);

        // Connect to the pubsub server
        server_conn = ns_connect(&mgr, argv[1], NULL);
        if (server_conn == NULL) {
            fprintf(stderr, "Cannot connect to port %s\n", argv[1]);
            exit(EXIT_FAILURE);
        }

        // Create a socketpair and give one end to the thread that reads stdin
        ns_socketpair(fds);
        ns_start_thread(stdin_thread, &fds[1]);

        // The other end of a pair goes inside the server
        ioconn = ns_add_sock(&mgr, fds[0], NULL);
        ioconn->flags |= NSF_USER_1;    // Mark this so we know this is a stdin
        ioconn->user_data = server_conn;

    } else {
        // Server code path
        ns_mgr_init(&mgr, NULL, server_handler);
        ns_bind(&mgr, argv[1], NULL);
        printf("Starting pubsub server on port %s\n", argv[1]);
    }

    for (;;) {
        ns_mgr_poll(&mgr, 1000);
    }
    ns_mgr_free(&mgr);

    return EXIT_SUCCESS;
}
예제 #14
0
int main(void) {
  struct ns_mgr mgr;
  struct ns_connection *nc;

  signal(SIGTERM, signal_handler);
  signal(SIGINT, signal_handler);

  ns_mgr_init(&mgr, NULL);

  nc = ns_bind(&mgr, s_http_port, ev_handler);
  s_http_server_opts.document_root = ".";
  ns_set_protocol_http_websocket(nc);

  printf("Started on port %s\n", s_http_port);
  while (s_signal_received == 0) {
    ns_mgr_poll(&mgr, 200);
  }
  ns_mgr_free(&mgr);

  return 0;
}
예제 #15
0
static const char *test_mgr_with_ssl(int use_ssl) {
  char addr[100] = "127.0.0.1:0", ip[sizeof(addr)], buf[100] = "";
  struct ns_mgr mgr;
  struct ns_connection *nc;
  int port, port2;
#ifndef NS_ENABLE_SSL
  (void)use_ssl;
#endif

  ns_mgr_init(&mgr, NULL);
  /* mgr.hexdump_file = "/dev/stdout"; */

  ASSERT((nc = ns_bind(&mgr, addr, eh1)) != NULL);
  port2 = htons(nc->sa.sin.sin_port);
  ASSERT(port2 > 0);
#ifdef NS_ENABLE_SSL
  if (use_ssl) {
    ASSERT(ns_set_ssl(nc, S_PEM, CA_PEM) == NULL);
  }
#endif

  ns_sock_to_str(nc->sock, addr, sizeof(addr), 3);
  ASSERT(sscanf(addr, "%[^:]:%d", ip, &port) == 2);
  ASSERT(strcmp(ip, "127.0.0.1") == 0);
  ASSERT(port == port2);

  ASSERT((nc = ns_connect(&mgr, addr, eh1)) != NULL);
#ifdef NS_ENABLE_SSL
  if (use_ssl) {
    ASSERT(ns_set_ssl(nc, C_PEM, CA_PEM) == NULL);
  }
#endif
  nc->user_data = buf;
  poll_mgr(&mgr, 50);

  ASSERT(strcmp(buf, "ok!") == 0);

  ns_mgr_free(&mgr);
  return NULL;
}
예제 #16
0
static const char *test_rpc(void) {
  struct ns_mgr mgr;
  struct ns_connection *nc;
  const char *local_addr = "127.0.0.1:7779";
  char buf[100] = "";

  ns_mgr_init(&mgr, NULL);

  ASSERT((nc = ns_bind(&mgr, local_addr, rpc_server)) != NULL);
  ns_set_protocol_http_websocket(nc);

  ASSERT((nc = ns_connect(&mgr, local_addr, rpc_client)) != NULL);
  ns_set_protocol_http_websocket(nc);
  nc->user_data = buf;

  poll_mgr(&mgr, 50);
  ns_mgr_free(&mgr);

  ASSERT(strcmp(buf, "1 1 16") == 0);

  return NULL;
}
예제 #17
0
/* Big payloads follow a different code path because it will use the extended
 * length field and possibly ns_avprintf will need to reallocate the buffer. */
static const char *test_websocket_big(void) {
  struct ns_mgr mgr;
  struct ns_connection *nc;
  const char *local_addr = "127.0.0.1:7778";
  char buf[20] = "";
  struct big_payload_params params;
  params.buf = buf;

  ns_mgr_init(&mgr, NULL);
  /* mgr.hexdump_file = "/dev/stdout"; */
  ASSERT((nc = ns_bind(&mgr, local_addr, cb3_big)) != NULL);
  ns_set_protocol_http_websocket(nc);

  /* Websocket request */
  ASSERT((nc = ns_connect(&mgr, local_addr, cb4_big)) != NULL);
  ns_set_protocol_http_websocket(nc);
  params.size = 8192;
  nc->user_data = &params;
  ns_send_websocket_handshake(nc, "/ws", NULL);
  poll_mgr(&mgr, 50);

  /* Check that test buffer has been filled by the callback properly. */
  ASSERT(strcmp(buf, "success") == 0);

  /* Websocket request */
  ASSERT((nc = ns_connect(&mgr, local_addr, cb4_big)) != NULL);
  ns_set_protocol_http_websocket(nc);
  params.size = 65535;
  nc->user_data = &params;
  ns_send_websocket_handshake(nc, "/ws", NULL);
  poll_mgr(&mgr, 50);
  ns_mgr_free(&mgr);

  /* Check that test buffer has been filled by the callback properly. */
  ASSERT(strcmp(buf, "success") == 0);

  return NULL;
}
예제 #18
0
int main(int argc, char *argv[]) {
    struct ns_mgr mgr;
    struct ns_connection *nc;
    int i, redirect = 0;
    const char *vhost = NULL;

    ns_mgr_init(&mgr, NULL);

    /* Parse command line arguments */
    for (i = 1; i < argc; i++) {
        if (strcmp(argv[i], "-D") == 0) {
            mgr.hexdump_file = argv[i + 1];
            i++;
        } else if (strcmp(argv[i], "-k") == 0) {
            s_backend_keepalive = 1;
        } else if (strcmp(argv[i], "-l") == 0 && i + 1 < argc) {
            if (strcmp(argv[i + 1], "-") == 0) {
                s_log_file = stdout;
            } else {
                s_log_file = fopen(argv[i + 1], "a");
                if (s_log_file == NULL) {
                    perror("fopen");
                    exit(EXIT_FAILURE);
                }
            }
            i++;
        } else if (strcmp(argv[i], "-p") == 0) {
            s_http_port = argv[i + 1];
            i++;
        } else if (strcmp(argv[i], "-r") == 0 && i + 1 < argc) {
            redirect = 1;
        } else if (strcmp(argv[i], "-v") == 0 && i + 1 < argc) {
            if (strcmp(argv[i + 1], "") == 0) {
                vhost = NULL;
            } else {
                vhost = argv[i + 1];
            }
            i++;
        } else if (strcmp(argv[i], "-b") == 0 && i + 2 < argc) {
            struct http_backend *be =
                    vhost != NULL ? &s_vhost_backends[s_num_vhost_backends++]
                    : &s_default_backends[s_num_default_backends++];
            STAILQ_INIT(&be->conns);
            char *r = NULL;
            be->vhost = vhost;
            be->uri_prefix = argv[i + 1];
            be->host_port = argv[i + 2];
            be->redirect = redirect;
            be->uri_prefix_replacement = be->uri_prefix;
            if ((r = strchr(be->uri_prefix, '=')) != NULL) {
                *r = '\0';
                be->uri_prefix_replacement = r + 1;
            }
            printf(
                "Adding backend for %s%s : %s "
                "[redirect=%d,prefix_replacement=%s]\n",
                be->vhost == NULL ? "" : be->vhost, be->uri_prefix, be->host_port,
                be->redirect, be->uri_prefix_replacement);
            vhost = NULL;
            redirect = 0;
            i += 2;
#ifdef NS_ENABLE_SSL
        } else if (strcmp(argv[i], "-s") == 0 && i + 1 < argc) {
            s_ssl_cert = argv[++i];
#endif
        } else {
            print_usage_and_exit(argv[0]);
        }
    }

    /* Open listening socket */
    if ((nc = ns_bind(&mgr, s_http_port, ev_handler)) == NULL) {
        fprintf(stderr, "ns_bind(%s) failed\n", s_http_port);
        exit(EXIT_FAILURE);
    }

#if NS_ENABLE_SSL
    if (s_ssl_cert != NULL) {
        const char *err_str = ns_set_ssl(nc, s_ssl_cert, NULL);
        if (err_str != NULL) {
            fprintf(stderr, "Error loading SSL cert: %s\n", err_str);
            exit(1);
        }
    }
#endif
    ns_set_protocol_http_websocket(nc);

    if (s_num_vhost_backends + s_num_default_backends == 0) {
        print_usage_and_exit(argv[0]);
    }

    signal(SIGINT, signal_handler);
    signal(SIGTERM, signal_handler);

    /* Run event loop until signal is received */
    printf("Starting LB on port %s\n", s_http_port);
    while (s_sig_num == 0) {
        ns_mgr_poll(&mgr, 1000);
    }

    /* Cleanup */
    ns_mgr_free(&mgr);

    printf("Exiting on signal %d\n", s_sig_num);

    return EXIT_SUCCESS;
}
예제 #19
0
int main(int argc, char *argv[]) {
  struct ns_mgr mgr;
  struct ns_connection *nc;
  int i;
  int redirect;
  const char *vhost = NULL;

  ns_mgr_init(&mgr, NULL);

  /* Parse command line arguments */
  for (i = 1; i < argc; i++) {
    if (strcmp(argv[i], "-D") == 0) {
      mgr.hexdump_file = argv[i + 1];
      i++;
    } else if (strcmp(argv[i], "-p") == 0) {
      s_http_port = argv[i + 1];
      i++;
    } else if (strcmp(argv[i], "-r") == 0 && i + 1 < argc) {
      redirect = 1;
      i++;
    } else if (strcmp(argv[i], "-v") == 0 && i + 1 < argc) {
      vhost = argv[i + 1];
      i++;
    } else if (strcmp(argv[i], "-b") == 0 && i + 2 < argc) {
      s_http_backends[s_num_http_backends].vhost = vhost;
      s_http_backends[s_num_http_backends].uri_prefix = argv[i + 1];
      s_http_backends[s_num_http_backends].host_port = argv[i + 2];
      s_http_backends[s_num_http_backends].redirect = redirect;
      s_num_http_backends++;
      vhost = NULL;
      redirect = 0;
      i += 2;
#ifdef NS_ENABLE_SSL
    } else if (strcmp(argv[i], "-s") == 0 && i + 1 < argc) {
      s_ssl_cert = argv[++i];
#endif
    }
  }

  /* Open listening socket */
  if ((nc = ns_bind(&mgr, s_http_port, ev_handler)) == NULL) {
    fprintf(stderr, "ns_bind(%s) failed\n", s_http_port);
    exit(EXIT_FAILURE);
  }

#if NS_ENABLE_SSL
  if (s_ssl_cert != NULL) {
    const char *err_str = ns_set_ssl(nc, s_ssl_cert, NULL);
    if (err_str != NULL) {
      fprintf(stderr, "Error loading SSL cert: %s\n", err_str);
      exit(1);
    }
  }
#endif

  if (s_num_http_backends == 0) {
    fprintf(stderr, "Usage: %s [-D debug_dump_file] [-p http_port] "
#if NS_ENABLE_SSL
            "[-s ssl_cert] "
#endif
            "<[-r] [-v vhost] -b uri_prefix host_port> ... \n", argv[0]);
    exit(EXIT_FAILURE);
  }

  signal(SIGINT, signal_handler);
  signal(SIGTERM, signal_handler);

  /* Run event loop until signal is received */
  printf("Starting LB on port %s\n", s_http_port);
  while (s_sig_num == 0) {
    ns_mgr_poll(&mgr, 1000);
  }

  /* Cleanup */
  ns_mgr_free(&mgr);

  printf("Exiting on signal %d\n", s_sig_num);

  return EXIT_SUCCESS;
}
예제 #20
0
void HttpClient::deinit() {
	ns_mgr_free(&HttpClient::sNsMgr);
}