summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSung-jae Park <nicesj.park@samsung.com>2014-01-21 02:24:18 -0800
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>2014-01-21 02:24:18 -0800
commit363dfceb1b1a97c1decffefdace33e773e7a017b (patch)
tree10814ba66288d2ba0b3787fb0da5da62bc836c60
parentb63a3bb2deb3759d6987fffd40759bd4667776b4 (diff)
parentd36b77829448e74ddec3d255dab2fcd25b552fff (diff)
downloadcom-core-363dfceb1b1a97c1decffefdace33e773e7a017b.tar.gz
com-core-363dfceb1b1a97c1decffefdace33e773e7a017b.tar.bz2
com-core-363dfceb1b1a97c1decffefdace33e773e7a017b.zip
Merge "Apply Rusty Lynch's systemd socket activation feature." into tizen
-rw-r--r--include/secure_socket.h6
-rw-r--r--src/secure_socket.c29
2 files changed, 35 insertions, 0 deletions
diff --git a/include/secure_socket.h b/include/secure_socket.h
index c5c7c35..ade51ab 100644
--- a/include/secure_socket.h
+++ b/include/secure_socket.h
@@ -29,6 +29,12 @@ extern "C" {
#define COM_CORE_LOCAL_SCHEME_LEN (8)
/*!
+ * sdlocal:///tmp/.socket.file => /tmp/.socket.file
+ */
+#define COM_CORE_SD_LOCAL_SCHEME "sdlocal://"
+#define COM_CORE_SD_LOCAL_SCHEME_LEN (10)
+
+/*!
* remote://IPADDR:PORT
* remote://:PORT => Using INADDR_ANY in this case
*/
diff --git a/src/secure_socket.c b/src/secure_socket.c
index dd54924..58cc898 100644
--- a/src/secure_socket.c
+++ b/src/secure_socket.c
@@ -29,6 +29,7 @@
#include <netinet/tcp.h>
#include <errno.h>
#include <stdlib.h>
+#include <systemd/sd-daemon.h>
#include <dlog.h>
@@ -107,6 +108,23 @@ static inline int create_inet_socket(const char *peer, int port, struct sockaddr
return handle;
}
+static inline int create_systemd_socket(const char *peer, int port, struct sockaddr *addr)
+{
+ int handle = -1;
+ int cnt;
+
+ cnt = sd_listen_fds(0);
+ if (cnt > 1) {
+ ErrPrint("To many file descriptors are received on socket activation: %d\n", cnt);
+ } else if (cnt == 1) {
+ handle = SD_LISTEN_FDS_START + 0;
+ } else {
+ handle = create_inet_socket(peer, port, addr);
+ }
+
+ return handle;
+}
+
static inline int setup_unix_handle(int handle)
{
int on = 1;
@@ -157,6 +175,17 @@ static inline char *parse_scheme(const char *peer, int *port, struct function_ta
vtable->create_socket = create_unix_socket;
vtable->setup_handle = setup_unix_handle;
+ } else if (!strncasecmp(peer, COM_CORE_SD_LOCAL_SCHEME, COM_CORE_SD_LOCAL_SCHEME_LEN)) {
+ vtable->type = (int)SCHEME_LOCAL;
+ peer += COM_CORE_SD_LOCAL_SCHEME_LEN;
+
+ addr = strdup(peer);
+ if (!addr) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ }
+
+ vtable->create_socket = create_systemd_socket;
+ vtable->setup_handle = setup_unix_handle;
} else if (!strncasecmp(peer, COM_CORE_REMOTE_SCHEME, COM_CORE_REMOTE_SCHEME_LEN)) {
register int len;
char *endptr;