diff options
author | Sung-jae Park <nicesj.park@samsung.com> | 2014-01-21 02:24:18 -0800 |
---|---|---|
committer | Gerrit Code Review <gerrit@review.vlan103.tizen.org> | 2014-01-21 02:24:18 -0800 |
commit | 363dfceb1b1a97c1decffefdace33e773e7a017b (patch) | |
tree | 10814ba66288d2ba0b3787fb0da5da62bc836c60 | |
parent | b63a3bb2deb3759d6987fffd40759bd4667776b4 (diff) | |
parent | d36b77829448e74ddec3d255dab2fcd25b552fff (diff) | |
download | com-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.h | 6 | ||||
-rw-r--r-- | src/secure_socket.c | 29 |
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; |