1
0
Fork 0
mirror of https://github.com/pygos/init.git synced 2024-12-22 07:10:49 +01:00

Make mksock() more generic, move to util library

Signed-off-by: David Oberhollenzer <david.oberhollenzer@tele2.at>
This commit is contained in:
David Oberhollenzer 2018-05-27 10:15:03 +02:00
parent bf63f78b66
commit ed23d075ca
6 changed files with 58 additions and 36 deletions

View file

@ -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)

View file

@ -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 **********/
/*

View file

@ -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;

View file

@ -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)

View file

@ -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 */

View file

@ -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(path, 0770)) {
errmsg = "chmod";
goto fail_errno;
}
} else if (flags & SOCK_FLAG_EVERYONE) {
if (chmod(path, 0777)) {
errmsg = "chmod";
goto fail_errno;
}
}
if (chmod(INITSOCK, 0770)) {
perror("chmod: " INITSOCK);
goto fail;
}
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;
}