mirror of
https://github.com/troglobit/finit.git
synced 2026-10-02 14:02:52 +07:00
Finit had no way to answer the question every service manager gets asked: what is running, and change it. D-Bus is how the rest of userspace asks, but linking libdbus, sd-bus or GIO into PID 1 buys a dependency, an allocator and a main loop we do not control. So libink: the wire format, an object tree, and a bus of Finit's own at /run/finit/bus, gated like INIT_SOCKET. It speaks the standard org.freedesktop.DBus, .Peer, .Introspectable interfaces, and Finit's own Manager1, Service1 and Cond1 on top. Methods that change something are marked privileged and answered only for a caller the kernel vouched for, via SO_PEERCRED. Server and client both, since initctl is the first thing that needs to talk to it, and its Start/Stop/Restart/Reload now go over the bus rather than the legacy socket. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
54 lines
954 B
C
54 lines
954 B
C
/* libink — shared I/O helpers.
|
|
*
|
|
* Server send paths (libink/dispatch.c, libink/auth.c) and the
|
|
* client (libink/client.c) all need EINTR-resilient write_all /
|
|
* read_full. On any other error they return -1 with an unknown
|
|
* number of bytes already transferred.
|
|
*
|
|
* Copyright (c) 2026 Joachim Wiberg <troglobit@gmail.com>
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
#include <errno.h>
|
|
#include <unistd.h>
|
|
|
|
#include "internal.h"
|
|
|
|
int __io_write_all(int fd, const void *buf, size_t len)
|
|
{
|
|
const char *p = buf;
|
|
|
|
while (len > 0) {
|
|
ssize_t n = write(fd, p, len);
|
|
|
|
if (n < 0) {
|
|
if (errno == EINTR)
|
|
continue;
|
|
return -1;
|
|
}
|
|
p += n;
|
|
len -= (size_t)n;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int __io_read_full(int fd, void *buf, size_t len)
|
|
{
|
|
char *p = buf;
|
|
|
|
while (len > 0) {
|
|
ssize_t n = read(fd, p, len);
|
|
|
|
if (n == 0)
|
|
return -1;
|
|
if (n < 0) {
|
|
if (errno == EINTR)
|
|
continue;
|
|
return -1;
|
|
}
|
|
p += n;
|
|
len -= (size_t)n;
|
|
}
|
|
return 0;
|
|
}
|