From c78bbd2f731ae44c7d2588b9bb3d19005f192fc6 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Fri, 15 Mar 2019 11:23:40 +0100 Subject: [PATCH] Add helpers for initd socket Signed-off-by: David Oberhollenzer --- lib/Makemodule.am | 2 ++ lib/include/initsock.h | 23 +++++++++++++++ lib/init/init_socket_create.c | 34 +++++++++++++++++++++ lib/init/init_socket_open.c | 46 +++++++++++++++++++++++++++++ lib/init/init_socket_send_request.c | 28 ++++++++++++++++++ 5 files changed, 133 insertions(+) create mode 100644 lib/include/initsock.h create mode 100644 lib/init/init_socket_create.c create mode 100644 lib/init/init_socket_open.c create mode 100644 lib/init/init_socket_send_request.c diff --git a/lib/Makemodule.am b/lib/Makemodule.am index 258cfe3..901cd60 100644 --- a/lib/Makemodule.am +++ b/lib/Makemodule.am @@ -1,6 +1,8 @@ libinit_a_SOURCES = lib/init/delsvc.c lib/init/svcmap.c lib/init/rdsvc.c libinit_a_SOURCES += lib/init/svcscan.c lib/init/del_svc_list.c libinit_a_SOURCES += lib/init/svc_tsort.c lib/include/service.h +libinit_a_SOURCES += lib/init/init_socket_open.c lib/init/init_socket_create.c +libinit_a_SOURCES += lib/include/initsock.h lib/init/init_socket_send_request.c libinit_a_CPPFLAGS = $(AM_CPPFLAGS) libinit_a_CFLAGS = $(AM_CFLAGS) diff --git a/lib/include/initsock.h b/lib/include/initsock.h new file mode 100644 index 0000000..5c1437c --- /dev/null +++ b/lib/include/initsock.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: ISC */ +#ifndef INITSOCK_H +#define INITSOCK_H + +#include "config.h" + +#define INIT_SOCK_PATH SOCKDIR "/init.sock" + +typedef enum { + EIR_STATUS = 0x00, +} E_INIT_REQUEST; + +typedef struct { + E_INIT_REQUEST rq; +} init_request_t; + +int init_socket_create(void); + +int init_socket_open(const char *tmppath); + +int init_socket_send_request(int fd, E_INIT_REQUEST rq); + +#endif /* INITSOCK_H */ diff --git a/lib/init/init_socket_create.c b/lib/init/init_socket_create.c new file mode 100644 index 0000000..a5a0972 --- /dev/null +++ b/lib/init/init_socket_create.c @@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: ISC */ +#include +#include +#include +#include + +#include "initsock.h" + +int init_socket_create(void) +{ + struct sockaddr_un un; + int fd; + + fd = socket(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0); + if (fd < 0) { + perror("socket"); + return -1; + } + + memset(&un, 0, sizeof(un)); + un.sun_family = AF_UNIX; + + strcpy(un.sun_path, INIT_SOCK_PATH); + unlink(INIT_SOCK_PATH); + + if (bind(fd, (struct sockaddr *)&un, sizeof(un))) { + perror("bind: " INIT_SOCK_PATH); + close(fd); + unlink(INIT_SOCK_PATH); + return -1; + } + + return fd; +} diff --git a/lib/init/init_socket_open.c b/lib/init/init_socket_open.c new file mode 100644 index 0000000..d0cf168 --- /dev/null +++ b/lib/init/init_socket_open.c @@ -0,0 +1,46 @@ +/* SPDX-License-Identifier: ISC */ +#include +#include +#include +#include +#include +#include + +#include "initsock.h" + +int init_socket_open(const char *tmppath) +{ + struct sockaddr_un un; + int fd; + + fd = socket(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0); + if (fd < 0) { + perror("socket"); + return -1; + } + + memset(&un, 0, sizeof(un)); + un.sun_family = AF_UNIX; + + strcpy(un.sun_path, tmppath); + + if (bind(fd, (struct sockaddr *)&un, sizeof(un))) { + fprintf(stderr, "bind: %s: %s", tmppath, strerror(errno)); + close(fd); + unlink(tmppath); + return -1; + } + + memset(&un, 0, sizeof(un)); + un.sun_family = AF_UNIX; + + strcpy(un.sun_path, INIT_SOCK_PATH); + + if (connect(fd, (struct sockaddr *)&un, sizeof(un))) { + perror("connect: " INIT_SOCK_PATH); + close(fd); + return -1; + } + + return fd; +} diff --git a/lib/init/init_socket_send_request.c b/lib/init/init_socket_send_request.c new file mode 100644 index 0000000..dd88856 --- /dev/null +++ b/lib/init/init_socket_send_request.c @@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: ISC */ +#include +#include +#include +#include + +#include "initsock.h" + +int init_socket_send_request(int fd, E_INIT_REQUEST rq) +{ + init_request_t request; + ssize_t ret; + + memset(&request, 0, sizeof(request)); + request.rq = rq; + +retry: + ret = write(fd, &request, sizeof(request)); + + if (ret < 0) { + if (errno == EINTR) + goto retry; + perror(INIT_SOCK_PATH); + return -1; + } + + return 0; +}