diff options
| author | David Oberhollenzer <david.oberhollenzer@tele2.at> | 2018-05-27 10:15:03 +0200 | 
|---|---|---|
| committer | David Oberhollenzer <david.oberhollenzer@tele2.at> | 2018-06-09 15:32:29 +0200 | 
| commit | ed23d075cae1353dcbec06925b2491e09395aafe (patch) | |
| tree | f1793472ddc02015aebda72df8ceeeb22dfadab8 | |
| parent | bf63f78b6698f33ed3acbd4aed8822a35688c1ba (diff) | |
Make mksock() more generic, move to util library
Signed-off-by: David Oberhollenzer <david.oberhollenzer@tele2.at>
| -rw-r--r-- | initd/Makemodule.am | 2 | ||||
| -rw-r--r-- | initd/init.h | 12 | ||||
| -rw-r--r-- | initd/main.c | 2 | ||||
| -rw-r--r-- | lib/Makemodule.am | 2 | ||||
| -rw-r--r-- | lib/include/util.h | 21 | ||||
| -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;  }  | 
