[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [taler-twister] branch master updated: Adding serve mode "u
From: |
gnunet |
Subject: |
[GNUnet-SVN] [taler-twister] branch master updated: Adding serve mode "unix". |
Date: |
Thu, 06 Jun 2019 16:20:59 +0200 |
This is an automated email from the git hooks/post-receive script.
marcello pushed a commit to branch master
in repository twister.
The following commit(s) were added to refs/heads/master by this push:
new 3dabe91 Adding serve mode "unix".
3dabe91 is described below
commit 3dabe91c4dccd0f8ea8093797d70bec3ae5cf0a4
Author: Marcello Stanisci <address@hidden>
AuthorDate: Thu Jun 6 16:20:31 2019 +0200
Adding serve mode "unix".
---
src/test/test_twister.sh | 6 +
src/twister/taler-twister-service.c | 227 +++++++++++++++++++++++++++++++++---
2 files changed, 220 insertions(+), 13 deletions(-)
diff --git a/src/test/test_twister.sh b/src/test/test_twister.sh
index 123c0b1..52a38a6 100755
--- a/src/test/test_twister.sh
+++ b/src/test/test_twister.sh
@@ -47,6 +47,12 @@ twister_service_pid=$!
echo Twister launched.
+sleep 1
+if ! ps xo pid | grep ${twister_service_pid}; then
+ echo Twister did not start correctly
+ return 77
+fi
+
# hack the response code.
taler-twister -c ./test_twister.conf --responsecode 202
diff --git a/src/twister/taler-twister-service.c
b/src/twister/taler-twister-service.c
index 518d95f..24ae0fc 100644
--- a/src/twister/taler-twister-service.c
+++ b/src/twister/taler-twister-service.c
@@ -54,6 +54,7 @@
#endif
#define REQUEST_BUFFER_MAX (1024*1024)
+#define UNIX_BACKLOG 500
/**
* Log curl error.
@@ -2107,6 +2108,197 @@ do_shutdown (void *cls)
target_server_base_url = NULL;
}
+/**
+ * Connect to a unix domain socket.
+ *
+ * @param path the IPC path
+ * @param mode the IPC path mode
+ * @return the file descriptor of the connection.
+ */
+static int
+open_unix_path (const char *path,
+ mode_t mode)
+{
+
+ struct GNUNET_NETWORK_Handle *nh;
+ struct sockaddr_un *un;
+ int fd;
+
+ if (sizeof (un->sun_path) <= strlen (path))
+ {
+ fprintf (stderr,
+ "path `%s' too long\n",
+ path);
+ return -1;
+ }
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Creating listen socket '%s' with mode %o\n",
+ path,
+ mode);
+
+ if (GNUNET_OK !=
+ GNUNET_DISK_directory_create_for_file (path))
+ {
+ GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR,
+ "mkdir",
+ path);
+ }
+
+ un = GNUNET_new (struct sockaddr_un);
+ un->sun_family = AF_UNIX;
+
+ strncpy (un->sun_path,
+ path,
+ sizeof (un->sun_path) - 1);
+ GNUNET_NETWORK_unix_precheck (un);
+
+ if (NULL == (nh = GNUNET_NETWORK_socket_create (AF_UNIX,
+ SOCK_STREAM,
+ 0)))
+ {
+ fprintf (stderr,
+ "create failed for AF_UNIX\n");
+ GNUNET_free (un);
+ return -1;
+ }
+ if (GNUNET_OK !=
+ GNUNET_NETWORK_socket_bind (nh,
+ (void *) un,
+ sizeof (struct sockaddr_un)))
+ {
+ fprintf (stderr,
+ "bind failed for AF_UNIX\n");
+ GNUNET_free (un);
+ GNUNET_NETWORK_socket_close (nh);
+ return -1;
+ }
+ GNUNET_free (un);
+ if (GNUNET_OK != GNUNET_NETWORK_socket_listen (nh,
+ UNIX_BACKLOG))
+ {
+ fprintf (stderr,
+ "listen failed for AF_UNIX\n");
+ GNUNET_NETWORK_socket_close (nh);
+ return -1;
+ }
+
+ if (0 != chmod (path,
+ mode))
+ {
+ fprintf (stderr,
+ "chmod failed: %s\n",
+ strerror (errno));
+ GNUNET_NETWORK_socket_close (nh);
+ return -1;
+ }
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "set socket '%s' to mode %o\n",
+ path,
+ mode);
+ fd = GNUNET_NETWORK_get_fd (nh);
+ GNUNET_NETWORK_socket_free_memory_only_ (nh);
+ return fd;
+}
+
+
+/**
+ * Crawl the configuration file and extracts the serving
+ * method, TCP vs IPC, and the respective details (port/path/mode)
+ *
+ * @param cfg configuration handle.
+ * @param port[out] port number to use
+ * @param path[out] unix path for IPC.
+ * @param mode[out] mode string for @a path.
+ * @return GNUNET_SYSERR if the parsing didn't succeed.
+ */
+static int
+parse_serving_mean (const struct GNUNET_CONFIGURATION_Handle *cfg,
+ uint16_t *port,
+ char **path,
+ mode_t *mode)
+{
+
+ const char *serve;
+ const char *choices[] = {"tcp", "unix", NULL};
+ char *modestring;
+ unsigned long long port_ull;
+
+
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_choice (cfg,
+ "twister",
+ "SERVE",
+ choices,
+ &serve))
+ {
+ GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+ "twister",
+ "SERVE");
+ return GNUNET_SYSERR;
+ }
+
+ if (0 == strcmp ("tcp", serve))
+ {
+ if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number
+ (cfg,
+ "twister",
+ "HTTP_PORT",
+ &port_ull))
+ {
+ GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+ "twister",
+ "HTTP_PORT");
+ return GNUNET_SYSERR;
+ }
+ *port = (uint16_t) port_ull;
+ return GNUNET_OK;
+ }
+
+ /* serving via unix */
+
+ if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string
+ (cfg,
+ "twister",
+ "SERVE_UNIXPATH",
+ path))
+ {
+ GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+ "twister",
+ "SERVE_UNIXPATH");
+ return GNUNET_SYSERR;
+ }
+
+ if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string
+ (cfg,
+ "twister",
+ "SERVE_UNIXMODE",
+ &modestring))
+ {
+ GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+ "twister",
+ "SERVE_UNIXMODE");
+ return GNUNET_SYSERR;
+ }
+
+ errno = 0;
+ *mode = (mode_t) strtoul (modestring, NULL, 8);
+
+ if (0 != errno)
+ {
+ GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
+ "twister",
+ "SERVE_UNIXMODE",
+ "must be octal number");
+ GNUNET_free (modestring);
+ return GNUNET_SYSERR;
+ }
+
+ GNUNET_free (modestring);
+
+
+ return GNUNET_OK;
+}
+
/**
* Main function that will be run. Main tasks are (1) init. the
@@ -2123,7 +2315,11 @@ run (void *cls,
const struct GNUNET_CONFIGURATION_Handle *c,
struct GNUNET_SERVICE_Handle *service)
{
- unsigned long long port;
+ uint16_t port;
+ int fh = -1;
+
+ char *serve_unixpath;
+ mode_t serve_unixmode;
(void) cls;
(void) service;
@@ -2165,31 +2361,36 @@ run (void *cls,
GNUNET_SCHEDULER_shutdown ();
return;
}
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_number (c,
- "twister",
- "HTTP_PORT",
- &port))
+
+ if (GNUNET_SYSERR == parse_serving_mean (c,
+ &port,
+ &serve_unixpath,
+ &serve_unixmode))
{
- GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
- "twister",
- "HTTP_PORT");
+ GNUNET_break (0);
GNUNET_SCHEDULER_shutdown ();
return;
}
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Proxy listens on port %llu\n",
- port);
+
+ if (NULL != serve_unixpath)
+ {
+ /* Connect the 'fh' socket. */
+ fh = open_unix_path (serve_unixpath,
+ serve_unixmode);
+
+ GNUNET_assert (-1 != fh);
+ }
/* start MHD daemon for HTTP */
mhd_daemon = MHD_start_daemon
(MHD_USE_DEBUG | MHD_ALLOW_SUSPEND_RESUME | MHD_USE_DUAL_STACK,
- (uint16_t) port,
+ (-1 == fh) ? (uint16_t) port : 0,
NULL, NULL,
&create_response, NULL,
MHD_OPTION_CONNECTION_TIMEOUT, (unsigned int) 16,
MHD_OPTION_NOTIFY_COMPLETED, &mhd_completed_cb, NULL,
MHD_OPTION_URI_LOG_CALLBACK, &mhd_log_callback, NULL,
+ MHD_OPTION_LISTEN_SOCKET, fh,
MHD_OPTION_END);
if (NULL == mhd_daemon)
--
To stop receiving notification emails like this one, please contact
address@hidden
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] [taler-twister] branch master updated: Adding serve mode "unix".,
gnunet <=