summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--initd/Makemodule.am2
-rw-r--r--initd/init.h12
-rw-r--r--initd/main.c2
-rw-r--r--lib/Makemodule.am2
-rw-r--r--lib/include/util.h21
-rw-r--r--lib/util/mksock.c (renamed from initd/mksock.c)53
6 files changed, 57 insertions, 35 deletions
diff --git a/initd/Makemodule.am b/initd/Makemodule.am
index 661742a..f740885 100644
--- a/initd/Makemodule.am
+++ b/initd/Makemodule.am
@@ -1,5 +1,5 @@
init_SOURCES = initd/main.c initd/init.h initd/signal_linux.c initd/runsvc.c
-init_SOURCES += initd/status.c initd/mksock.c initd/svclist.c
+init_SOURCES += initd/status.c initd/svclist.c
init_CPPFLAGS = $(AM_CPPFLAGS)
init_CFLAGS = $(AM_CFLAGS)
init_LDFLAGS = $(AM_LDFLAGS)
diff --git a/initd/init.h b/initd/init.h
index d07f310..2c39489 100644
--- a/initd/init.h
+++ b/initd/init.h
@@ -64,18 +64,6 @@ int runsvc_wait(service_t *svc);
*/
void print_status(const char *msg, int type, bool update);
-/********** mksock.c **********/
-
-/*
- Create a UNIX socket that programs can use to pass messages to init.
-
- Returns the socked fd or -1 on failure. The function takes care of
- printing error messages on failure.
-
- The socket has the CLOEXEC flag set.
-*/
-int mksock(void);
-
/********** svclist.c **********/
/*
diff --git a/initd/main.c b/initd/main.c
index 8adbe2f..2cacf12 100644
--- a/initd/main.c
+++ b/initd/main.c
@@ -207,7 +207,7 @@ int main(void)
runlevel = target;
if (target == TGT_BOOT && ti_sock == -1) {
- ti_sock = mksock();
+ ti_sock = mksock(INITSOCK, SOCK_FLAG_ROOT_ONLY);
if (ti_sock != -1) {
pfd[1].fd = ti_sock;
pfd[1].events = POLLIN;
diff --git a/lib/Makemodule.am b/lib/Makemodule.am
index c29ad2b..b8a1c17 100644
--- a/lib/Makemodule.am
+++ b/lib/Makemodule.am
@@ -1,7 +1,7 @@
HEADRS = lib/include/util.h lib/include/service.h lib/include/telinit.h
libinit_a_SOURCES = lib/util/delsvc.c lib/util/svcmap.c lib/util/enum_by_name.c
-libinit_a_SOURCES += lib/util/rdsvc.c lib/util/svcscan.c
+libinit_a_SOURCES += lib/util/rdsvc.c lib/util/svcscan.c lib/util/mksock.c
libinit_a_SOURCES += lib/util/del_svc_list.c lib/util/svc_tsort.c
libinit_a_SOURCES += lib/util/opensock.c lib/util/enum_to_name.c $(HEADRS)
libinit_a_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/lib/include/util.h b/lib/include/util.h
index f63a0d6..18133a8 100644
--- a/lib/include/util.h
+++ b/lib/include/util.h
@@ -35,6 +35,17 @@ typedef struct {
int value;
} enum_map_t;
+enum {
+ /* only allow root to connect */
+ SOCK_FLAG_ROOT_ONLY = 0x01,
+
+ /* allow everyone to connect */
+ SOCK_FLAG_EVERYONE = 0x02,
+
+ /* create a datagram socket, otherwise use a stream socket */
+ SOCK_FLAG_DGRAM = 0x04,
+};
+
/*
Search through an array of enum_map_t entries to resolve a string to
a numeric value. The end of the map is indicated by a sentinel entry
@@ -49,5 +60,15 @@ const enum_map_t *enum_by_name(const enum_map_t *map, const char *name);
*/
const char *enum_to_name(const enum_map_t *map, int value);
+/*
+ Create a UNIX stream socket at the given path.
+
+ Returns the socket fd, -1 on failure. The function takes care of
+ printing error messages on failure.
+
+ The socket has the CLOEXEC flag set.
+*/
+int mksock(const char *path, int flags);
+
#endif /* UTIL_H */
diff --git a/initd/mksock.c b/lib/util/mksock.c
index 0ec6b68..ae46096 100644
--- a/initd/mksock.c
+++ b/lib/util/mksock.c
@@ -23,16 +23,19 @@
#include <string.h>
#include <fcntl.h>
#include <stdio.h>
+#include <errno.h>
-#include "telinit.h"
-#include "init.h"
+#include "util.h"
-int mksock(void)
+int mksock(const char *path, int flags)
{
struct sockaddr_un un;
- int fd;
+ const char *errmsg;
+ int fd, type;
- fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
+ type = (flags & SOCK_FLAG_DGRAM) ? SOCK_DGRAM : SOCK_STREAM;
+
+ fd = socket(AF_UNIX, type | SOCK_CLOEXEC, 0);
if (fd < 0) {
perror("socket");
return -1;
@@ -41,31 +44,41 @@ int mksock(void)
memset(&un, 0, sizeof(un));
un.sun_family = AF_UNIX;
- strcpy(un.sun_path, INITSOCK);
+ strcpy(un.sun_path, path);
if (bind(fd, (struct sockaddr *)&un, sizeof(un))) {
- perror("bind: " INITSOCK);
- goto fail;
+ errmsg ="bind";
+ goto fail_errno;
}
- if (chown(INITSOCK, 0, 0)) {
- perror("chown: " INITSOCK);
- goto fail;
- }
+ if (flags & SOCK_FLAG_ROOT_ONLY) {
+ if (chown(path, 0, 0)) {
+ errmsg = "chown";
+ goto fail_errno;
+ }
- if (chmod(INITSOCK, 0770)) {
- perror("chmod: " INITSOCK);
- goto fail;
+ if (chmod(path, 0770)) {
+ errmsg = "chmod";
+ goto fail_errno;
+ }
+ } else if (flags & SOCK_FLAG_EVERYONE) {
+ if (chmod(path, 0777)) {
+ errmsg = "chmod";
+ goto fail_errno;
+ }
}
- if (listen(fd, 10)) {
- perror("listen");
- goto fail;
+ if (!(flags & SOCK_FLAG_DGRAM)) {
+ if (listen(fd, 10)) {
+ errmsg = "listen";
+ goto fail_errno;
+ }
}
return fd;
-fail:
+fail_errno:
+ fprintf(stderr, "%s: %s: %s\n", path, errmsg, strerror(errno));
close(fd);
- unlink(INITSOCK);
+ unlink(path);
return -1;
}