From 9a88f7da453eadc72d8f333700dbd80777feecd1 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Sun, 25 Feb 2018 14:33:19 +0100 Subject: Initial commit Signed-off-by: David Oberhollenzer --- lib/include/service.h | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++ lib/include/telinit.h | 20 +++++++++++++++++ lib/include/util.h | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 lib/include/service.h create mode 100644 lib/include/telinit.h create mode 100644 lib/include/util.h (limited to 'lib/include') diff --git a/lib/include/service.h b/lib/include/service.h new file mode 100644 index 0000000..eb92d85 --- /dev/null +++ b/lib/include/service.h @@ -0,0 +1,62 @@ +#ifndef SERVICE_H +#define SERVICE_H + +#include + +enum { + SVC_ONCE = 0, + SVC_WAIT, + SVC_RESPAWN, +}; + +enum { + TGT_BOOT = 0, + TGT_SHUTDOWN, + TGT_REBOOT, + TGT_CAD, + + TGT_MAX +}; + +typedef struct service_t { + int type; /* SVC_* service type */ + int target; /* TGT_* service target */ + char *name; /* canonical service name */ + char *desc; /* description string */ + char **exec; /* command lines to execute */ + size_t num_exec; /* number of command lines */ + char *ctty; /* controlling tty or log file */ + + char **before; + size_t num_before; + char **after; + size_t num_after; + + pid_t pid; + int status; /* process exit status */ + + struct service_t *next; +} service_t; + +typedef struct { + service_t *targets[TGT_MAX]; +} service_list_t; + +/* + Read a service from a file. +*/ +service_t *rdsrv(int dirfd, const char *filename); + +void delsrv(service_t *srv); + +int srvscan(const char *directory, service_list_t *list); + +void del_srv_list(service_list_t *list); + +/* + Sort a list of services by dependencies. +*/ +service_t *srv_tsort(service_t *list); + +#endif /* SERVICE_H */ + diff --git a/lib/include/telinit.h b/lib/include/telinit.h new file mode 100644 index 0000000..72ad871 --- /dev/null +++ b/lib/include/telinit.h @@ -0,0 +1,20 @@ +#ifndef TELINIT_H +#define TELINIT_H + +#include "config.h" + +#define INITSOCK SOCKDIR "/" "initd.socket" + +enum { + TI_SHUTDOWN = 1, + TI_REBOOT = 2, +}; + +typedef struct { + int type; +} ti_msg_t; + +int opensock(void); + +#endif /* TELINIT_H */ + diff --git a/lib/include/util.h b/lib/include/util.h new file mode 100644 index 0000000..bed2ba7 --- /dev/null +++ b/lib/include/util.h @@ -0,0 +1,58 @@ +#ifndef UTIL_H +#define UTIL_H + +#include +#include +#include + +#include "config.h" + +#ifdef __GNUC__ + #define NORETURN __attribute__((noreturn)) +#endif + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +typedef struct { + const char *name; + int value; +} enum_map_t; + + +/* + Read from fd until end-of-file or a line feed is encountered. + + Returns NULL with errno set on failure. Returns NULL with errno + cleared if end-of-file is reached. + + The line must be deallocated with free(). +*/ +char *rdline(int fd); + +/* + Split a line of the shape "key = value" into key and value part. + + The key can contain alphanumeric characters and can be padded with + spaces or tabs. + + The value can be either a sequence of alphanumeric characters, period + or underscore OR a string in quotation marks. For strings, the + quotation marks are removed and escape sequences are processed. + + The value may also be padded with spaces or tabs but the line may not + contain anything else after the value, except for spaces, tabs or + the '#' symbol which is interpreted as start of a comment. +*/ +int splitkv(char *line, char **key, char **value); + +/* + 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 + with the name set to NULL. +*/ +const enum_map_t *enum_by_name(const enum_map_t *map, const char *name); + +char *strexpand(const char *inp, size_t argc, const char *const *argv); + +#endif /* UTIL_H */ + -- cgit v1.2.3