X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flogind.h;h=fd668a2c19cc7863dd0260afb326e3c731852239;hp=5e69a71b021f15e560fc737c2ac2664bd57d32f1;hb=57a8eca84a1eda99c8cfb63889fa300ba982cb77;hpb=202630822f52e06dce8404633407329c38099278 diff --git a/src/logind.h b/src/logind.h index 5e69a71b0..fd668a2c1 100644 --- a/src/logind.h +++ b/src/logind.h @@ -32,115 +32,12 @@ #include "hashmap.h" #include "cgroup-util.h" -/* TODO: - * - * recreate VTs when disallocated - * udev rules - * spawn user systemd - * non-local X11 server - * udev-acl - * reboot/shutdown halt management - * PAM rewrite - */ - typedef struct Manager Manager; -typedef struct Device Device; -typedef struct Seat Seat; -typedef struct Session Session; -typedef struct User User; - -struct Device { - Manager *manager; - - char *sysfs; - Seat *seat; - - dual_timestamp timestamp; - - LIST_FIELDS(struct Device, devices); -}; - -struct Seat { - Manager *manager; - char *id; - - char *state_file; - - LIST_HEAD(Device, devices); - - Session *active; - LIST_HEAD(Session, sessions); -}; - -typedef enum SessionType { - SESSION_TERMINAL, - SESSION_X11, - _SESSION_TYPE_MAX, - _SESSION_TYPE_INVALID = -1 -} SessionType; - -struct Session { - Manager *manager; - - char *id; - SessionType type; - - char *state_file; - - User *user; - - dual_timestamp timestamp; - - char *tty; - char *display; - - bool remote; - char *remote_host; - - int vtnr; - Seat *seat; - - pid_t leader; - uint64_t audit_id; - - int pipe_fd; - - char *cgroup_path; - char **controllers, **reset_controllers; - - bool kill_processes; - - LIST_FIELDS(Session, sessions_by_user); - LIST_FIELDS(Session, sessions_by_seat); -}; - -typedef enum UserState { - USER_OFFLINE, - USER_LINGERING, - USER_ONLINE, - USER_ACTIVE, - _USER_STATE_MAX, - _USER_STATE_INVALID = -1 -} UserState; - -struct User { - Manager *manager; - - uid_t uid; - gid_t gid; - char *name; - - char *state_file; - char *runtime_path; - char *service; - char *cgroup_path; - - Session *display; - - dual_timestamp timestamp; - LIST_HEAD(Session, sessions); -}; +#include "logind-device.h" +#include "logind-seat.h" +#include "logind-session.h" +#include "logind-user.h" struct Manager { DBusConnection *bus; @@ -150,86 +47,82 @@ struct Manager { Hashmap *sessions; Hashmap *users; + LIST_HEAD(Seat, seat_gc_queue); + LIST_HEAD(Session, session_gc_queue); + LIST_HEAD(User, user_gc_queue); + struct udev *udev; - struct udev_monitor *udev_monitor; + struct udev_monitor *udev_seat_monitor, *udev_vcsa_monitor; + + int udev_seat_fd; + int udev_vcsa_fd; - int udev_fd; int console_active_fd; int bus_fd; int epoll_fd; - int n_autovts; + unsigned n_autovts; Seat *vtconsole; char *cgroup_path; char **controllers, **reset_controllers; - char **kill_only_users, **kill_exlude_users; + char **kill_only_users, **kill_exclude_users; bool kill_user_processes; + + unsigned long session_counter; + + Hashmap *cgroups; + Hashmap *fifo_fds; }; -Device* device_new(Manager *m, const char *sysfs); -void device_free(Device *d); -void device_attach(Device *d, Seat *s); -void device_detach(Device *d); - -Seat *seat_new(Manager *m, const char *id); -void seat_free(Seat *s); -int seat_preallocate_vts(Seat *s); -void seat_active_vt_changed(Seat *s, int vtnr); -int seat_apply_acls(Seat *s); -int seat_stop(Seat *s); -int seat_save(Seat *s); -int seat_load(Seat *s); - -Session *session_new(Manager *m, User *u, const char *id); -void session_free(Session *s); -int session_activate(Session *s); -bool session_is_active(Session *s); -int session_check_gc(Session *s); -int session_start(Session *s); -int session_stop(Session *s); -int session_save(Session *s); -int session_load(Session *s); - -User* user_new(Manager *m, uid_t uid, gid_t gid, const char *name); -void user_free(User *u); -int user_start(User *u); -int user_stop(User *u); -int user_check_gc(User *u); -UserState user_get_state(User *u); -int user_save(User *u); -int user_load(User *u); +enum { + FD_SEAT_UDEV, + FD_VCSA_UDEV, + FD_CONSOLE, + FD_BUS, + FD_FIFO_BASE +}; Manager *manager_new(void); void manager_free(Manager *m); + int manager_add_device(Manager *m, const char *sysfs, Device **_device); int manager_add_seat(Manager *m, const char *id, Seat **_seat); int manager_add_session(Manager *m, User *u, const char *id, Session **_session); int manager_add_user(Manager *m, uid_t uid, gid_t gid, const char *name, User **_user); int manager_add_user_by_name(Manager *m, const char *name, User **_user); int manager_add_user_by_uid(Manager *m, uid_t uid, User **_user); -int manager_process_device(Manager *m, struct udev_device *d); -int manager_dispatch_udev(Manager *m); + +int manager_process_seat_device(Manager *m, struct udev_device *d); +int manager_dispatch_seat_udev(Manager *m); +int manager_dispatch_vcsa_udev(Manager *m); int manager_dispatch_console(Manager *m); + int manager_enumerate_devices(Manager *m); int manager_enumerate_seats(Manager *m); int manager_enumerate_sessions(Manager *m); int manager_enumerate_users(Manager *m); -int manager_start_one_linger_user(Manager *m, const char *user); -int manager_start_linger_users(Manager *m); + int manager_startup(Manager *m); int manager_run(Manager *m); int manager_spawn_autovt(Manager *m, int vtnr); -const char* session_type_to_string(SessionType t); -SessionType session_type_from_string(const char *s); +void manager_cgroup_notify_empty(Manager *m, const char *cgroup); + +void manager_gc(Manager *m, bool drop_not_started); + +int manager_get_idle_hint(Manager *m, dual_timestamp *t); + +extern const DBusObjectPathVTable bus_manager_vtable; + +DBusHandlerResult bus_message_filter(DBusConnection *c, DBusMessage *message, void *userdata); -const char* user_state_to_string(UserState s); -UserState user_state_from_string(const char *s); +int manager_send_changed(Manager *manager, const char *properties); -bool x11_display_is_local(const char *display); +/* gperf lookup function */ +const struct ConfigPerfItem* logind_gperf_lookup(const char *key, unsigned length); #endif