From 33cbc9830086b71e2782b704716cdd44d946b52b Mon Sep 17 00:00:00 2001 From: Jeremy Lakeman Date: Mon, 24 Feb 2014 16:47:16 +1030 Subject: [PATCH] Add proc files for http server & mdp udp ports --- conf_schema.h | 1 + httpd.c | 1 + overlay_mdp.c | 43 ++++++++++++++++++++++++++++++------------- serval.h | 1 + server.c | 29 +++++++++++++++++++++++++++++ testdefs_rhizome.sh | 6 +++--- tests/jni | 7 ++++--- 7 files changed, 69 insertions(+), 19 deletions(-) diff --git a/conf_schema.h b/conf_schema.h index 28d14b75..600bbb45 100644 --- a/conf_schema.h +++ b/conf_schema.h @@ -343,6 +343,7 @@ END_ARRAY(5) STRUCT(mdp) SUB_STRUCT(mdp_iftypelist, iftype,) +ATOM(bool_t, enable_inet, 0, boolean,, "If true, allow mdp clients to connect over loopback UDP") END_STRUCT STRUCT(olsr) diff --git a/httpd.c b/httpd.c index 8f4ddeeb..1cb148de 100644 --- a/httpd.c +++ b/httpd.c @@ -205,6 +205,7 @@ error: return WHY("Failed to start HTTP server"); success: + server_write_proc_state("http_port", "%d\n", port); INFOF("HTTP SERVER START port=%"PRIu16" fd=%d services=RESTful%s%s", port, httpd_server_socket, diff --git a/overlay_mdp.c b/overlay_mdp.c index 094bf749..270331ed 100644 --- a/overlay_mdp.c +++ b/overlay_mdp.c @@ -177,25 +177,42 @@ int overlay_mdp_setup_sockets() watch(&mdp_sock2); } - if (mdp_sock2_inet.poll.fd == -1) { - const char *port_str = getenv("SERVAL_MDP_INET_PORT"); - if (port_str){ - int fd = esocket(PF_INET, SOCK_DGRAM, 0); - if (fd>=0){ - struct socket_address addr; - addr.addrlen = sizeof(addr.inet); - addr.inet.sin_family = AF_INET; - addr.inet.sin_port = htons(atoi(port_str)); - addr.inet.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - if (socket_bind(fd, &addr)==0){ + if (mdp_sock2_inet.poll.fd == -1 && config.mdp.enable_inet) { + int fd = esocket(PF_INET, SOCK_DGRAM, 0); + if (fd>=0){ + // try to find a free UDP port somewhere between 4210 & 4260 + uint16_t start_port = 4210; + + struct socket_address addr; + addr.addrlen = sizeof(addr.inet); + addr.inet.sin_family = AF_INET; + addr.inet.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + + const char *port_str = getenv("SERVAL_MDP_INET_PORT"); + if (port_str) + start_port = atoi(port_str); + + uint16_t end_port = start_port+50; + uint16_t port; + + for (port = start_port; port<=end_port; port++){ + addr.inet.sin_port = htons(port); + if (bind(fd, &addr.addr, addr.addrlen)!=-1){ mdp_sock2_inet.poll.fd = fd; + fd = -1; mdp_sock2_inet.poll.events = POLLIN; watch(&mdp_sock2_inet); + server_write_proc_state("mdp_inet_port", "%d\n", port); INFOF("Socket mdp.2.inet: fd=%d %s", fd, alloca_socket_address(&addr)); - }else{ - close(fd); + break; } + + if (errno != EADDRINUSE) + WHY_perror("bind"); } + + if (fd!=-1) + close(fd); } } return 0; diff --git a/serval.h b/serval.h index 4e087233..00d9c3ef 100644 --- a/serval.h +++ b/serval.h @@ -306,6 +306,7 @@ int server_pid(); void server_save_argv(int argc, const char *const *argv); int server(const struct cli_parsed *parsed); int server_write_pid(); +int server_write_proc_state(const char *path, const char *fmt, ...); int server_create_stopfile(); int server_remove_stopfile(); int server_check_stopfile(); diff --git a/server.c b/server.c index 8047080b..62dafa5a 100644 --- a/server.c +++ b/server.c @@ -20,6 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include #include #include +#include #include #include @@ -135,6 +136,34 @@ int server_write_pid() return 0; } +int server_write_proc_state(const char *path, const char *fmt, ...) +{ + char path_buf[400]; + strbuf sbname = strbuf_local(path_buf, sizeof path_buf); + strbuf_path_join(sbname, serval_instancepath(), "proc", path, NULL); + if (strbuf_overrun(sbname)) + return WHY("Buffer overrun building proc filename"); + + char *name = strbuf_str(sbname); + + size_t dirsiz = strlen(name) + 1; + char dir_buf[dirsiz]; + strcpy(dir_buf, name); + const char *dir = dirname(dir_buf); // modifies dir_buf[] + if (mkdirs(dir, 0700) == -1) + return WHY_perror("mkdirs()"); + + FILE *f = fopen(name, "w"); + + va_list ap; + va_start(ap, fmt); + vfprintf(f, fmt, ap); + va_end(ap); + + fclose(f); + return 0; +} + /* Called periodically by the server process in its main loop. */ void server_config_reload(struct sched_ent *alarm) diff --git a/testdefs_rhizome.sh b/testdefs_rhizome.sh index feab56bf..245dd03f 100644 --- a/testdefs_rhizome.sh +++ b/testdefs_rhizome.sh @@ -347,10 +347,10 @@ rhizome_http_server_started() { } get_rhizome_server_port() { + set_instance $2 local _var="$1" - local _logvar=LOG${2#+} - local _port=$($SED -n -e '/HTTP SERVER START/s/.*port=\([0-9]\{1,\}\).*services=[^ ]*\.*/\1/p' "${!_logvar}" | $SED -n '$p') - assert --message="instance $2 Rhizome HTTP server port number is known" [ -n "$_port" ] + local _port=$(<"$SERVALINSTANCE_PATH/proc/http_port") + assert --message="instance $instance_name Rhizome HTTP server port number is known" [ -n "$_port" ] if [ -n "$_var" ]; then eval "$_var=\$_port" tfw_log "$_var=$_port" diff --git a/tests/jni b/tests/jni index cb77028f..3668014d 100755 --- a/tests/jni +++ b/tests/jni @@ -113,8 +113,9 @@ doc_DnaLookup="DNA Lookup via JNI MDP API" setup_DnaLookup() { configure_servald_server() { add_servald_interface - executeOk_servald config set debug.mdprequests on - export SERVAL_MDP_INET_PORT="411$instance_number" + executeOk_servald config \ + set debug.mdprequests on \ + set mdp.enable_inet on } setup set_instance +A @@ -123,7 +124,7 @@ setup_DnaLookup() { set_instance +A } test_DnaLookup() { - export SERVAL_MDP_INET_PORT="411$instance_number" + export SERVAL_MDP_INET_PORT=$(<"$SERVALINSTANCE_PATH/proc/mdp_inet_port") execute --timeout=10 --core-backtrace java "-Djava.library.path=$LD_LIBRARY_PATH" -classpath "$PWD/classes" org.servalproject.test.CommandLine 'lookup' assertStdoutGrep "$SIDB" tfw_cat --stdout --stderr