int main(int argc, char **argv) { yoml_t *doc, *t; size_t i; doc = parse("foo.yaml", "abc"); ok(doc != NULL); ok(strcmp(doc->filename, "foo.yaml") == 0); ok(doc->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.scalar, "abc") == 0); yoml_free(doc, NULL); doc = parse( "foo.yaml", "---\n" "a: b\n" "c: d\n" "---\n" "e: f\n"); ok(doc != NULL); ok(strcmp(doc->filename, "foo.yaml") == 0); ok(doc->type == YOML_TYPE_MAPPING); ok(doc->data.mapping.size == 2); t = doc->data.mapping.elements[0].key; ok(strcmp(t->filename, "foo.yaml") == 0); ok(t->type == YOML_TYPE_SCALAR); ok(strcmp(t->data.scalar, "a") == 0); t = doc->data.mapping.elements[0].value; ok(strcmp(t->filename, "foo.yaml") == 0); ok(t->type == YOML_TYPE_SCALAR); ok(strcmp(t->data.scalar, "b") == 0); t = doc->data.mapping.elements[1].key; ok(strcmp(t->filename, "foo.yaml") == 0); ok(t->type == YOML_TYPE_SCALAR); ok(strcmp(t->data.scalar, "c") == 0); t = doc->data.mapping.elements[1].value; ok(strcmp(t->filename, "foo.yaml") == 0); ok(t->type == YOML_TYPE_SCALAR); ok(strcmp(t->data.scalar, "d") == 0); yoml_free(doc, NULL); doc = parse( "bar.yaml", "- a: b\n" " c: d\n" "- e\n"); ok(doc != NULL); ok(strcmp(doc->filename, "bar.yaml") == 0); ok(doc->type == YOML_TYPE_SEQUENCE); ok(doc->data.sequence.size == 2); t = doc->data.sequence.elements[0]; ok(strcmp(doc->filename, "bar.yaml") == 0); ok(t->type == YOML_TYPE_MAPPING); ok(t->data.mapping.size == 2); t = doc->data.sequence.elements[0]->data.mapping.elements[0].key; ok(strcmp(doc->filename, "bar.yaml") == 0); ok(t->type == YOML_TYPE_SCALAR); ok(strcmp(t->data.scalar, "a") == 0); t = doc->data.sequence.elements[0]->data.mapping.elements[0].value; ok(strcmp(doc->filename, "bar.yaml") == 0); ok(t->type == YOML_TYPE_SCALAR); ok(strcmp(t->data.scalar, "b") == 0); t = doc->data.sequence.elements[0]->data.mapping.elements[1].key; ok(strcmp(doc->filename, "bar.yaml") == 0); ok(t->type == YOML_TYPE_SCALAR); ok(strcmp(t->data.scalar, "c") == 0); t = doc->data.sequence.elements[0]->data.mapping.elements[1].value; ok(strcmp(doc->filename, "bar.yaml") == 0); ok(t->type == YOML_TYPE_SCALAR); ok(strcmp(t->data.scalar, "d") == 0); t = doc->data.sequence.elements[1]; ok(strcmp(doc->filename, "bar.yaml") == 0); ok(t->type == YOML_TYPE_SCALAR); ok(strcmp(t->data.scalar, "e") == 0); yoml_free(doc, NULL); doc = parse( "baz.yaml", "- &abc\n" " - 1\n" " - 2\n" "- *abc\n"); ok(doc != NULL); ok(strcmp(doc->filename, "baz.yaml") == 0); ok(doc->type == YOML_TYPE_SEQUENCE); ok(doc->data.sequence.size == 2); ok(doc->data.sequence.elements[0] == doc->data.sequence.elements[1]); t = doc->data.sequence.elements[0]; ok(strcmp(t->filename, "baz.yaml") == 0); ok(t->_refcnt == 2); ok(t->type == YOML_TYPE_SEQUENCE); ok(t->data.sequence.size == 2); t = doc->data.sequence.elements[0]->data.sequence.elements[0]; ok(strcmp(t->filename, "baz.yaml") == 0); ok(t->type == YOML_TYPE_SCALAR); ok(strcmp(t->data.scalar, "1") == 0); t = doc->data.sequence.elements[0]->data.sequence.elements[1]; ok(strcmp(t->filename, "baz.yaml") == 0); ok(t->type == YOML_TYPE_SCALAR); ok(strcmp(t->data.scalar, "2") == 0); doc = parse( "foo.yaml", "- &link\n" " x: 1\n" " y: 2\n" "- <<: *link\n" " y: 3\n"); ok(doc != NULL); ok(doc->type == YOML_TYPE_SEQUENCE); ok(doc->data.sequence.size == 2); ok(doc->data.sequence.elements[0]->type == YOML_TYPE_MAPPING); ok(doc->data.sequence.elements[0]->data.mapping.size == 2); ok(doc->data.sequence.elements[0]->data.mapping.elements[0].key->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[0]->data.mapping.elements[0].key->data.scalar, "x") == 0); ok(doc->data.sequence.elements[0]->data.mapping.elements[0].value->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[0]->data.mapping.elements[0].value->data.scalar, "1") == 0); ok(doc->data.sequence.elements[0]->data.mapping.elements[1].key->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[0]->data.mapping.elements[1].key->data.scalar, "y") == 0); ok(doc->data.sequence.elements[0]->data.mapping.elements[1].value->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[0]->data.mapping.elements[1].value->data.scalar, "2") == 0); ok(doc->data.sequence.elements[1]->data.mapping.elements[0].key->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[0].key->data.scalar, "x") == 0); ok(doc->data.sequence.elements[1]->data.mapping.elements[0].value->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[0].value->data.scalar, "1") == 0); ok(doc->data.sequence.elements[1]->data.mapping.elements[1].key->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[1].key->data.scalar, "y") == 0); ok(doc->data.sequence.elements[1]->data.mapping.elements[1].value->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[1].value->data.scalar, "3") == 0); doc = parse( "foo.yaml", "- &CENTER { x: 1, y: 2 }\n" "- &LEFT { x: 0, y: 2 }\n" "- &BIG { r: 10 }\n" "- &SMALL { r: 1 }\n" "- # Explicit keys\n" " x: 1\n" " y: 2\n" " r: 10\n" "- # Merge one map\n" " << : *CENTER\n" " r: 10\n" "- # Merge multiple maps\n" " << : [ *CENTER, *BIG ]\n" "- # Override\n" " << : [ *BIG, *LEFT, *SMALL ]\n" " x: 1\n"); ok(doc != NULL); ok(doc->type == YOML_TYPE_SEQUENCE); for (i = 4; i <= 7; ++i) { ok(doc->data.sequence.elements[i]->type == YOML_TYPE_MAPPING); ok(doc->data.sequence.elements[i]->data.mapping.size == 3); t = get_value(doc->data.sequence.elements[i], "x"); ok(t != NULL); ok(t->type == YOML_TYPE_SCALAR); ok(strcmp(t->data.scalar, "1") == 0); t = get_value(doc->data.sequence.elements[i], "y"); ok(t != NULL); ok(t->type == YOML_TYPE_SCALAR); ok(strcmp(t->data.scalar, "2") == 0); t = get_value(doc->data.sequence.elements[i], "r"); ok(t != NULL); ok(t->type == YOML_TYPE_SCALAR); ok(strcmp(t->data.scalar, "10") == 0); } doc = parse( "foo.yaml", "- &link\n" " x: 1\n" " x: 2\n" "-\n" " x: 3\n" " <<: *link\n"); ok(doc != NULL); ok(doc->type == YOML_TYPE_SEQUENCE); ok(doc->data.sequence.size == 2); ok(doc->data.sequence.elements[0]->type == YOML_TYPE_MAPPING); ok(doc->data.sequence.elements[0]->data.mapping.size == 2); ok(doc->data.sequence.elements[0]->data.mapping.elements[0].key->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[0]->data.mapping.elements[0].key->data.scalar, "x") == 0); ok(doc->data.sequence.elements[0]->data.mapping.elements[0].value->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[0]->data.mapping.elements[0].value->data.scalar, "1") == 0); ok(doc->data.sequence.elements[0]->data.mapping.elements[1].key->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[0]->data.mapping.elements[1].key->data.scalar, "x") == 0); ok(doc->data.sequence.elements[0]->data.mapping.elements[1].value->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[0]->data.mapping.elements[1].value->data.scalar, "2") == 0); ok(doc->data.sequence.elements[1]->data.mapping.size == 3); ok(doc->data.sequence.elements[1]->data.mapping.elements[0].key->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[0].key->data.scalar, "x") == 0); ok(doc->data.sequence.elements[1]->data.mapping.elements[0].value->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[0].value->data.scalar, "3") == 0); ok(doc->data.sequence.elements[1]->data.mapping.elements[1].key->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[1].key->data.scalar, "x") == 0); ok(doc->data.sequence.elements[1]->data.mapping.elements[1].value->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[1].value->data.scalar, "1") == 0); ok(doc->data.sequence.elements[1]->data.mapping.elements[2].key->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[2].key->data.scalar, "x") == 0); ok(doc->data.sequence.elements[1]->data.mapping.elements[2].value->type == YOML_TYPE_SCALAR); ok(strcmp(doc->data.sequence.elements[1]->data.mapping.elements[2].value->data.scalar, "2") == 0); return done_testing(); }
int main(int argc, char **argv) { static struct option longopts[] = { { "conf", required_argument, NULL, 'c' }, { "help", no_argument, NULL, 'h' }, { NULL, 0, NULL, 0 } }; static struct config_t config = { {}, /* global_config */ NULL, /* listeners */ 0, /* num_listeners */ 1024, /* max_connections */ 1, /* num_threads */ NULL, /* thread_ids */ {}, /* state */ }; const char *config_file = "h2o.conf"; int opt_ch; yoml_t *config_yoml; h2o_config_init(&config.global_config); config.global_config.close_cb = on_close; { h2o_configurator_t *c = h2o_config_create_configurator(&config.global_config, sizeof(*c)); c->exit = on_config_listen_exit; h2o_config_define_command( c, "listen", H2O_CONFIGURATOR_FLAG_GLOBAL, on_config_listen, "port at which the server should listen for incoming requests (mandatory)", " - if the value is a scalar, it is treated as the port number (or as the", " service name)", " - if the value is a mapping, following properties are recognized:", " port: incoming port number or service name (mandatory)", " host: incoming address (default: any address)", " ssl: if using SSL (default: none)", " certificate-file: path of the certificate file", " key-file: path of the key file"); h2o_config_define_command( c, "max-connections", H2O_CONFIGURATOR_FLAG_GLOBAL, on_config_max_connections, "max connections (default: 1024)"); h2o_config_define_command( c, "num-threads", H2O_CONFIGURATOR_FLAG_GLOBAL, on_config_num_threads, "number of worker threads (default: 1)"); } h2o_access_log_register_configurator(&config.global_config); h2o_file_register_configurator(&config.global_config); h2o_proxy_register_configurator(&config.global_config); /* parse options */ while ((opt_ch = getopt_long(argc, argv, "c:h", longopts, NULL)) != -1) { switch (opt_ch) { case 'c': config_file = optarg; break; case 'h': usage(&config.global_config); exit(0); break; default: assert(0); break; } } argc -= optind; argv += optind; /* configure */ if ((config_yoml = load_config(config_file)) == NULL) exit(EX_CONFIG); if (h2o_config_configure(&config.global_config, config_file, config_yoml) != 0) exit(EX_CONFIG); yoml_free(config_yoml); setup_signal_handlers(); if (config.num_threads <= 1) { run_loop(&config); } else { config.thread_ids = alloca(sizeof(pthread_t) * config.num_threads); unsigned i; for (i = 0; i != config.num_threads; ++i) { pthread_create(config.thread_ids + i, NULL, run_loop, &config); } for (i = 0; i < config.num_threads; ++i) { pthread_join(config.thread_ids[i], NULL); } } return 0; }
int main(int argc, char **argv) { static struct option longopts[] = { { "conf", required_argument, NULL, 'c' }, { "help", no_argument, NULL, 'h' }, { NULL, 0, NULL, 0 } }; static struct port_configurator_t port_configurator = { { {}, "port", NULL, on_config_port, on_config_port_complete, on_config_port_context_create }, 0 }; static struct num_threads_configurator_t num_threads_configurator = { { {}, "num-threads", NULL, on_config_num_threads, NULL, NULL }, 1 /* default number of threads is 1 */ }; const char *config_file = "h2o.conf"; int opt_ch; yoml_t *config_yoml; h2o_global_configuration_t config; /* parse options */ while ((opt_ch = getopt_long(argc, argv, "c:h", longopts, NULL)) != -1) { switch (opt_ch) { case 'c': config_file = optarg; break; case 'h': usage(); exit(0); break; default: assert(0); break; } } argc -= optind; argv += optind; /* configure */ h2o_config_init(&config); h2o_linklist_insert(&config.global_configurators, &port_configurator.super._link); h2o_linklist_insert(&config.global_configurators, &num_threads_configurator.super._link); if ((config_yoml = load_config(config_file)) == NULL) exit(EX_CONFIG); if (h2o_config_configure(&config, config_file, config_yoml) != 0) exit(EX_CONFIG); yoml_free(config_yoml); if (num_threads_configurator.num_threads <= 1) { run_loop(&config); } else { pthread_t *tids = alloca(sizeof(pthread_t) * num_threads_configurator.num_threads); unsigned i; for (i = 0; i != num_threads_configurator.num_threads; ++i) { pthread_create(tids + i, NULL, run_loop, &config); } for (i = 0; i < num_threads_configurator.num_threads; ++i) { pthread_join(tids[i], NULL); } } return 0; }