1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2 #pragma once
3 
4 /***
5   Copyright © 2010 Maarten Lankhorst
6 ***/
7 
8 #include "sd-device.h"
9 #include "unit.h"
10 
11 typedef struct Swap Swap;
12 
13 typedef enum SwapExecCommand {
14         SWAP_EXEC_ACTIVATE,
15         SWAP_EXEC_DEACTIVATE,
16         _SWAP_EXEC_COMMAND_MAX,
17         _SWAP_EXEC_COMMAND_INVALID = -EINVAL,
18 } SwapExecCommand;
19 
20 typedef enum SwapResult {
21         SWAP_SUCCESS,
22         SWAP_FAILURE_RESOURCES,
23         SWAP_FAILURE_TIMEOUT,
24         SWAP_FAILURE_EXIT_CODE,
25         SWAP_FAILURE_SIGNAL,
26         SWAP_FAILURE_CORE_DUMP,
27         SWAP_FAILURE_START_LIMIT_HIT,
28         _SWAP_RESULT_MAX,
29         _SWAP_RESULT_INVALID = -EINVAL,
30 } SwapResult;
31 
32 typedef struct SwapParameters {
33         char *what;
34         char *options;
35         int priority;
36         bool priority_set;
37 } SwapParameters;
38 
39 struct Swap {
40         Unit meta;
41 
42         char *what;
43 
44         /* If the device has already shown up, this is the device
45          * node, which might be different from what, due to
46          * symlinks */
47         char *devnode;
48 
49         SwapParameters parameters_proc_swaps;
50         SwapParameters parameters_fragment;
51 
52         bool from_proc_swaps:1;
53         bool from_fragment:1;
54 
55         /* Used while looking for swaps that vanished or got added
56          * from/to /proc/swaps */
57         bool is_active:1;
58         bool just_activated:1;
59 
60         SwapResult result;
61         SwapResult clean_result;
62 
63         usec_t timeout_usec;
64 
65         ExecCommand exec_command[_SWAP_EXEC_COMMAND_MAX];
66         ExecContext exec_context;
67         KillContext kill_context;
68         CGroupContext cgroup_context;
69 
70         ExecRuntime *exec_runtime;
71         DynamicCreds dynamic_creds;
72 
73         SwapState state, deserialized_state;
74 
75         ExecCommand* control_command;
76         SwapExecCommand control_command_id;
77         pid_t control_pid;
78 
79         sd_event_source *timer_event_source;
80 
81         /* In order to be able to distinguish dependencies on
82         different device nodes we might end up creating multiple
83         devices for the same swap. We chain them up here. */
84 
85         LIST_FIELDS(struct Swap, same_devnode);
86 };
87 
88 extern const UnitVTable swap_vtable;
89 
90 int swap_process_device_new(Manager *m, sd_device *dev);
91 int swap_process_device_remove(Manager *m, sd_device *dev);
92 
93 const char* swap_exec_command_to_string(SwapExecCommand i) _const_;
94 SwapExecCommand swap_exec_command_from_string(const char *s) _pure_;
95 
96 const char* swap_result_to_string(SwapResult i) _const_;
97 SwapResult swap_result_from_string(const char *s) _pure_;
98 
99 DEFINE_CAST(SWAP, Swap);
100