diff options
author | Lennart Poettering <lennart@poettering.net> | 2010-01-26 21:39:06 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-01-26 21:39:06 +0100 |
commit | 87f0e418cf2c58b3201d06a60e3696ec672d2662 (patch) | |
tree | a27ef34fdf69505d983852d36d200b6e590726df /unit.h | |
parent | fd79db6a5df0f94c48736ce5aa0131d6ab108fb0 (diff) |
s/name/unit
Diffstat (limited to 'unit.h')
-rw-r--r-- | unit.h | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/unit.h b/unit.h new file mode 100644 index 0000000000..7803f3183c --- /dev/null +++ b/unit.h @@ -0,0 +1,235 @@ +/*-*- Mode: C; c-basic-offset: 8 -*-*/ + +#ifndef foounithfoo +#define foounithfoo + +#include <stdbool.h> +#include <stdlib.h> + +typedef union Unit Unit; +typedef struct Meta Meta; +typedef struct UnitVTable UnitVTable; +typedef enum UnitType UnitType; +typedef enum UnitLoadState UnitLoadState; +typedef enum UnitActiveState UnitActiveState; +typedef enum UnitDependency UnitDependency; + +#include "job.h" +#include "manager.h" +#include "set.h" +#include "util.h" +#include "list.h" +#include "socket-util.h" +#include "execute.h" +#include "util.h" + +#define UNIT_NAME_MAX 32 +#define DEFAULT_TIMEOUT_USEC (20*USEC_PER_SEC) +#define DEFAULT_RESTART_USEC (100*USEC_PER_MSEC) + +enum UnitType { + UNIT_SERVICE = 0, + UNIT_TIMER, + UNIT_SOCKET, + UNIT_TARGET, + UNIT_DEVICE, + UNIT_MOUNT, + UNIT_AUTOMOUNT, + UNIT_SNAPSHOT, + _UNIT_TYPE_MAX, + _UNIT_TYPE_INVALID = -1, +}; + +enum UnitLoadState { + UNIT_STUB, + UNIT_LOADED, + UNIT_FAILED, + _UNIT_LOAD_STATE_MAX +}; + +enum UnitActiveState { + UNIT_ACTIVE, + UNIT_ACTIVE_RELOADING, + UNIT_INACTIVE, + UNIT_ACTIVATING, + UNIT_DEACTIVATING, + _UNIT_ACTIVE_STATE_MAX +}; + +static inline bool UNIT_IS_ACTIVE_OR_RELOADING(UnitActiveState t) { + return t == UNIT_ACTIVE || t == UNIT_ACTIVE_RELOADING; +} + +static inline bool UNIT_IS_ACTIVE_OR_ACTIVATING(UnitActiveState t) { + return t == UNIT_ACTIVE || t == UNIT_ACTIVATING || t == UNIT_ACTIVE_RELOADING; +} + +static inline bool UNIT_IS_INACTIVE_OR_DEACTIVATING(UnitActiveState t) { + return t == UNIT_INACTIVE || t == UNIT_DEACTIVATING; +} + +enum UnitDependency { + /* Positive dependencies */ + UNIT_REQUIRES, + UNIT_SOFT_REQUIRES, + UNIT_WANTS, + UNIT_REQUISITE, + UNIT_SOFT_REQUISITE, + + /* Inverse of the above */ + UNIT_REQUIRED_BY, /* inverse of 'requires' and 'requisite' is 'required_by' */ + UNIT_SOFT_REQUIRED_BY, /* inverse of 'soft_requires' and 'soft_requisite' is 'soft_required_by' */ + UNIT_WANTED_BY, /* inverse of 'wants' */ + + /* Negative dependencies */ + UNIT_CONFLICTS, /* inverse of 'conflicts' is 'conflicts' */ + + /* Order */ + UNIT_BEFORE, /* inverse of before is after and vice versa */ + UNIT_AFTER, + + _UNIT_DEPENDENCY_MAX, + _UNIT_DEPENDENCY_INVALID = -1 +}; + +struct Meta { + Manager *manager; + UnitType type; + UnitLoadState load_state; + + char *id; /* One name is special because we use it for identification. Points to an entry in the names set */ + + Set *names; + Set *dependencies[_UNIT_DEPENDENCY_MAX]; + + char *description; + + /* If there is something to do with this unit, then this is + * the job for it */ + Job *job; + + bool in_load_queue:1; + + usec_t active_enter_timestamp; + usec_t active_exit_timestamp; + + /* Load queue */ + LIST_FIELDS(Meta, load_queue); +}; + +#include "service.h" +#include "timer.h" +#include "socket.h" +#include "target.h" +#include "device.h" +#include "mount.h" +#include "automount.h" +#include "snapshot.h" + +union Unit { + Meta meta; + Service service; + Timer timer; + Socket socket; + Target target; + Device device; + Mount mount; + Automount automount; + Snapshot snapshot; +}; + +struct UnitVTable { + const char *suffix; + + int (*init)(Unit *u); + void (*done)(Unit *u); + + void (*dump)(Unit *u, FILE *f, const char *prefix); + + int (*start)(Unit *u); + int (*stop)(Unit *u); + int (*reload)(Unit *u); + + bool (*can_reload)(Unit *u); + + /* Boils down the more complex internal state of this unit to + * a simpler one that the engine can understand */ + UnitActiveState (*active_state)(Unit *u); + + void (*fd_event)(Unit *u, int fd, uint32_t events); + void (*sigchld_event)(Unit *u, pid_t pid, int code, int status); + void (*timer_event)(Unit *u, int id, uint64_t n_elapsed); + + void (*retry)(Unit *u); +}; + +extern const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX]; + +#define UNIT_VTABLE(u) unit_vtable[(u)->meta.type] + +/* For casting a unit into the various unit types */ +#define DEFINE_CAST(UPPERCASE, MixedCase) \ + static inline MixedCase* UPPERCASE(Unit *u) { \ + if (!u || u->meta.type != UNIT_##UPPERCASE) \ + return NULL; \ + \ + return (MixedCase*) u; \ + } + +/* For casting the various unit types into a unit */ +#define UNIT(u) ((Unit*) (u)) + +DEFINE_CAST(SOCKET, Socket); +DEFINE_CAST(TIMER, Timer); +DEFINE_CAST(SERVICE, Service); +DEFINE_CAST(TARGET, Target); +DEFINE_CAST(DEVICE, Device); +DEFINE_CAST(MOUNT, Mount); +DEFINE_CAST(AUTOMOUNT, Automount); +DEFINE_CAST(SNAPSHOT, Snapshot); + +UnitType unit_name_to_type(const char *n); +bool unit_name_is_valid(const char *n); +char *unit_name_change_suffix(const char *n, const char *suffix); + +Unit *unit_new(Manager *m); +void unit_free(Unit *u); + +int unit_add_name(Unit *u, const char *name); +int unit_add_dependency(Unit *u, UnitDependency d, Unit *other); + +void unit_add_to_load_queue(Unit *u); + +int unit_merge(Unit *u, Unit *other); + +int unit_load_fragment_and_dropin(Unit *u); +int unit_load(Unit *unit); + +const char* unit_id(Unit *u); +const char *unit_description(Unit *u); + +UnitActiveState unit_active_state(Unit *u); + +void unit_dump(Unit *u, FILE *f, const char *prefix); + +bool unit_can_reload(Unit *u); +bool unit_can_start(Unit *u); + +int unit_start(Unit *u); +int unit_stop(Unit *u); +int unit_reload(Unit *u); + +void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns); + +int unit_watch_fd(Unit *u, int fd, uint32_t events); +void unit_unwatch_fd(Unit *u, int fd); + +int unit_watch_pid(Unit *u, pid_t pid); +void unit_unwatch_pid(Unit *u, pid_t pid); + +int unit_watch_timer(Unit *u, usec_t delay, int *id); +void unit_unwatch_timer(Unit *u, int *id); + +bool unit_job_is_applicable(Unit *u, JobType j); + +#endif |