X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=unit.h;h=d3d4b0e9f629412ee0fe1c24ba86337391526fed;hp=4dc53a1a687ca6ab1425035b9515753a01967d0e;hb=9d58f1dbdb77be332731fb490d0d7f91a5718da8;hpb=41447faf1fc57463becabce399d983df762a104c diff --git a/unit.h b/unit.h index 4dc53a1a6..d3d4b0e9f 100644 --- a/unit.h +++ b/unit.h @@ -144,17 +144,6 @@ struct Meta { * the job for it */ Job *job; - bool in_load_queue:1; - bool in_dbus_queue:1; - bool in_cleanup_queue:1; - bool sent_dbus_new_signal:1; - - /* If we go down, pull down everything that depends on us, too */ - bool recursive_stop; - - /* Garbage collect us we nobody wants or requires us anymore */ - bool stop_when_unneeded; - usec_t active_enter_timestamp; usec_t active_exit_timestamp; @@ -172,6 +161,17 @@ struct Meta { /* Cleanup queue */ LIST_FIELDS(Meta, cleanup_queue); + + /* If we go down, pull down everything that depends on us, too */ + bool recursive_stop; + + /* Garbage collect us we nobody wants or requires us anymore */ + bool stop_when_unneeded; + + bool in_load_queue:1; + bool in_dbus_queue:1; + bool in_cleanup_queue:1; + bool sent_dbus_new_signal:1; }; #include "service.h" @@ -198,35 +198,21 @@ union Unit { struct UnitVTable { const char *suffix; - /* Can units of this type have multiple names? */ - bool no_alias:1; - - /* If true units of this types can never have "Requires" - * dependencies, because state changes can only be observed, - * not triggered */ - bool no_requires:1; - - /* Instances make no sense for this type */ - bool no_instances:1; - - /* Execlude this type from snapshots */ - bool no_snapshots:1; - /* This should reset all type-specific variables. This should - * not allocate memory, and is either called with 0 - * initialized data, or with data left from done() */ + * not allocate memory, and is called with zero-initialized + * data. It should hence only initialize variables that need + * to be set != 0. */ void (*init)(Unit *u); + /* This should free all type-specific variables. It should be + * idempotent. */ + void (*done)(Unit *u); + /* Actually load data from disk. This may fail, and should set * load_state to UNIT_LOADED, UNIT_MERGED or leave it at * UNIT_STUB if no configuration could be found. */ int (*load)(Unit *u); - /* This should free all type-specific variables. It should be - * idempotent. There's no need to reset variables that deal - * with dynamic memory/resources. */ - void (*done)(Unit *u); - /* If a a lot of units got created via enumerate(), this is * where to actually set the state and call unit_notify(). */ int (*coldplug)(Unit *u); @@ -239,6 +225,13 @@ struct UnitVTable { bool (*can_reload)(Unit *u); + /* Write all data that cannot be restored from other sources + * away using unit_serialize_item() */ + int (*serialize)(Unit *u, FILE *f, FDSet *fds); + + /* Restore one item from the serialization */ + int (*deserialize_item)(Unit *u, const char *key, const char *data, FDSet *fds); + /* Boils down the more complex internal state of this unit to * a simpler one that the engine can understand */ UnitActiveState (*active_state)(Unit *u); @@ -264,6 +257,9 @@ struct UnitVTable { /* Called whenever a bus PID lookup finishes */ void (*bus_query_pid_done)(Unit *u, const char *name, pid_t pid); + /* Called for each message received on the bus */ + DBusHandlerResult (*bus_message_handler)(Unit *u, DBusMessage *message); + /* This is called for each unit type and should be used to * enumerate existing devices and load them. However, * everything that is loaded here should still stay in @@ -273,6 +269,20 @@ struct UnitVTable { /* Type specific cleanups. */ void (*shutdown)(Manager *m); + + /* Can units of this type have multiple names? */ + bool no_alias:1; + + /* If true units of this types can never have "Requires" + * dependencies, because state changes can only be observed, + * not triggered */ + bool no_requires:1; + + /* Instances make no sense for this type */ + bool no_instances:1; + + /* Exclude this type from snapshots */ + bool no_snapshots:1; }; extern const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX]; @@ -330,6 +340,7 @@ Unit *unit_follow_merge(Unit *u); int unit_load_fragment_and_dropin(Unit *u); int unit_load_fragment_and_dropin_optional(Unit *u); +int unit_load_nop(Unit *u); int unit_load(Unit *unit); const char *unit_description(Unit *u); @@ -370,11 +381,18 @@ int set_unit_path(const char *p); char *unit_dbus_path(Unit *u); int unit_load_related_unit(Unit *u, const char *type, Unit **_found); +int unit_get_related_unit(Unit *u, const char *type, Unit **_found); char *unit_name_printf(Unit *u, const char* text); char *unit_full_printf(Unit *u, const char *text); char **unit_full_printf_strv(Unit *u, char **l); +bool unit_can_serialize(Unit *u); +int unit_serialize(Unit *u, FILE *f, FDSet *fds); +void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *value, ...) _printf_attr(4,5); +void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value); +int unit_deserialize(Unit *u, FILE *f, FDSet *fds); + const char *unit_type_to_string(UnitType i); UnitType unit_type_from_string(const char *s);