]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/home/homed-home.h
homed: Add InhibitSuspend() method
[thirdparty/systemd.git] / src / home / homed-home.h
index 0f314aad93c9fcf572bb361d5072f99835fe078c..b8b004642294628db7bd2c68ebcfe32a280ca79c 100644 (file)
@@ -138,12 +138,17 @@ struct Home {
         bool unregister_on_failure;
 
         /* The reading side of a FIFO stored in /run/systemd/home/, the writing side being used for reference
-         * counting. The references dropped to zero as soon as we see EOF. This concept exists twice: once
-         * for clients that are fine if we suspend the home directory on system suspend, and once for clients
-         * that are not ok with that. This allows us to determine for each home whether there are any clients
-         * that support unsuspend. */
+         * counting. The references dropped to zero as soon as we see EOF. This concept exists thrice: once
+         * for clients that are fine if we lock the home directory on system suspend, once for clients
+         * that are not ok with that, and once for clients that are usually ok with it but temporarily
+         * want to opt-out so that they can implement more advanced behavior on their own. This allows
+         * us to determine for each home whether there are any clients that don't support suspend at this
+         * moment. */
         sd_event_source *ref_event_source_please_suspend;
         sd_event_source *ref_event_source_dont_suspend;
+        /* This is distinct from ref_event_source_dont_suspend because it can be obtained from unprivileged
+         * code, and thus we don't count it as a reference on the home area. */
+        sd_event_source *inhibit_suspend_event_source;
 
         /* Any pending operations we still need to execute. These are for operations we want to queue if we
          * can't execute them right-away. */
@@ -197,6 +202,8 @@ int home_unregister(Home *h, sd_bus_error *error);
 int home_lock(Home *h, sd_bus_error *error);
 int home_unlock(Home *h, UserRecord *secret, sd_bus_error *error);
 
+bool home_is_referenced(Home *h);
+bool home_shall_suspend(Home *h);
 HomeState home_get_state(Home *h);
 
 int home_get_disk_status(Home *h, uint64_t *ret_disk_size,uint64_t *ret_disk_usage, uint64_t *ret_disk_free, uint64_t *ret_disk_ceiling, uint64_t *ret_disk_floor, statfs_f_type_t *ret_fstype, mode_t *ret_access_mode);
@@ -207,7 +214,15 @@ int home_killall(Home *h);
 
 int home_augment_status(Home *h, UserRecordLoadFlags flags, UserRecord **ret);
 
-int home_create_fifo(Home *h, bool please_suspend);
+typedef enum {
+        HOME_FIFO_PLEASE_SUSPEND,
+        HOME_FIFO_DONT_SUSPEND,
+        HOME_FIFO_INHIBIT_SUSPEND,
+        _HOME_FIFO_TYPE_MAX,
+        _HOME_FIFO_TYPE_INVALID = -EINVAL,
+} HomeFifoType;
+int home_create_fifo(Home *h, HomeFifoType mode);
+
 int home_schedule_operation(Home *h, Operation *o, sd_bus_error *error);
 
 int home_auto_login(Home *h, char ***ret_seats);