Add support for non-root users to use initctl, e.g. group wheel

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg committed 2021-11-30 11:44:22 +01:00
1 parent d994420d4d
commit 980152fd53
2 files changed
+20 -3

No files matched your search

+10
View File
@@ -114,6 +114,10 @@ AC_ARG_WITH(sysconfig,
AS_HELP_STRING([--with-sysconfig=DIR], [System environment directory, sourced by .conf files, default /etc/default & /etc/conf.d]), AS_HELP_STRING([--with-sysconfig=DIR], [System environment directory, sourced by .conf files, default /etc/default & /etc/conf.d]),
[sysconfig=$withval], [sysconfig=default]) [sysconfig=$withval], [sysconfig=default])
AC_ARG_WITH(group,
AS_HELP_STRING([--with-group=NAME], [Group for /run/finit/socket (initctl), default: root]),
[group=$withval], [group=root])
AC_ARG_WITH(hostname, AC_ARG_WITH(hostname,
AS_HELP_STRING([--with-hostname=NAME], [If /etc/hostname is missing, default: noname]), AS_HELP_STRING([--with-hostname=NAME], [If /etc/hostname is missing, default: noname]),
[hostname=$withval], [hostname=yes]) [hostname=$withval], [hostname=yes])
@@ -188,6 +192,11 @@ AS_IF([test "x$with_heading" != "xno"], [
AS_IF([test "x$heading" = "xyes"], [heading=""]) AS_IF([test "x$heading" = "xyes"], [heading=""])
AC_DEFINE_UNQUOTED(INIT_OSHEADING, "$heading", [Displayed by Finit at boot, defaults to /etc/os-release PRETTY_NAME])]) AC_DEFINE_UNQUOTED(INIT_OSHEADING, "$heading", [Displayed by Finit at boot, defaults to /etc/os-release PRETTY_NAME])])
AS_IF([test "x$with_group" != "xno"], [
AS_IF([test "x$group" = "xyes"], [
group=root])])
AC_DEFINE_UNQUOTED(DEFGROUP, "$group", [For /run/finit/socket])
AS_IF([test "x$with_hostname" != "xno"], [ AS_IF([test "x$with_hostname" != "xno"], [
AS_IF([test "x$hostname" = "xyes"], [ AS_IF([test "x$hostname" = "xyes"], [
hostname=noname])]) hostname=noname])])
@@ -273,6 +282,7 @@ Optional features:
Run fsck fix mode.....: $enable_fsckfix Run fsck fix mode.....: $enable_fsckfix
Redirect output.......: $enable_redirect Redirect output.......: $enable_redirect
Default hostname......: $hostname Default hostname......: $hostname
Default group.........: $group
Default runlevel......: $runlevel Default runlevel......: $runlevel
------------- Compiler version -------------- ------------- Compiler version --------------
+10 -3
View File
@@ -466,12 +466,13 @@ error:
int api_init(uev_ctx_t *ctx) int api_init(uev_ctx_t *ctx)
{ {
int sd;
mode_t oldmask;
struct sockaddr_un sun = { struct sockaddr_un sun = {
.sun_family = AF_UNIX, .sun_family = AF_UNIX,
.sun_path = INIT_SOCKET, .sun_path = INIT_SOCKET,
}; };
mode_t oldmask;
int uid, gid;
int sd;
_d("Setting up external API socket ..."); _d("Setting up external API socket ...");
sd = socket(AF_UNIX, SOCK_SEQPACKET | SOCK_CLOEXEC, 0); sd = socket(AF_UNIX, SOCK_SEQPACKET | SOCK_CLOEXEC, 0);
@@ -480,14 +481,20 @@ int api_init(uev_ctx_t *ctx)
return 1; return 1;
} }
uid = geteuid();
gid = getgroup(DEFGROUP);
erase(INIT_SOCKET); erase(INIT_SOCKET);
oldmask = umask(0077); oldmask = umask(0117);
if (-1 == bind(sd, (struct sockaddr*)&sun, sizeof(sun))) if (-1 == bind(sd, (struct sockaddr*)&sun, sizeof(sun)))
goto error; goto error;
if (-1 == listen(sd, 10)) if (-1 == listen(sd, 10))
goto error; goto error;
if (chown(INIT_SOCKET, uid, gid))
_pe("Failed setting group %s on %s", DEFGROUP, INIT_SOCKET);
umask(oldmask); umask(oldmask);
if (!uev_io_init(ctx, &api_watcher, api_cb, NULL, sd, UEV_READ)) if (!uev_io_init(ctx, &api_watcher, api_cb, NULL, sd, UEV_READ))
return 0; return 0;