Factor out service directory option processing
[oweals/dinit.git] / src / includes / options-processing.h
1 #ifndef DINIT_OPTIONS_PROCESSING_H
2 #define DINIT_OPTIONS_PROCESSING_H 1
3
4 #include <vector>
5
6 // A service directory entry, tracking the directory as a nul-terminated string, which may either
7 // be static or dynamically allocated (via new char[...]).
8 class dir_entry
9 {
10     const char *dir;
11     bool dir_dyn_allocd;  // dynamically allocated?
12
13     public:
14     dir_entry(const char *dir_p, bool dir_dyn_allocd_p) :
15         dir(dir_p), dir_dyn_allocd(dir_dyn_allocd_p)
16     { }
17
18     dir_entry(dir_entry &&other)
19     {
20         dir = other.dir;
21         dir_dyn_allocd = other.dir_dyn_allocd;
22         other.dir_dyn_allocd = false;
23     }
24
25     dir_entry(const dir_entry &other) = delete;
26
27     ~dir_entry()
28     {
29         if (dir_dyn_allocd) {
30             delete[] dir;
31         }
32     }
33
34     const char *get_dir() const
35     {
36         return dir;
37     }
38 };
39
40 // TODO this is close to just being a vector; make it so?
41 class service_dir_pathlist
42 {
43     std::vector<dir_entry> service_dirs; // directories containing service descriptions
44
45 public:
46     service_dir_pathlist() { }
47
48     service_dir_pathlist(const char *service_dir_p, bool dyn_allocd = false)
49     {
50         service_dirs.emplace_back(service_dir_p, dyn_allocd);
51     }
52
53     void add_dir(const char *service_dir_p, bool dyn_allocd = false)
54     {
55         service_dirs.emplace_back(service_dir_p, dyn_allocd);
56     }
57
58     size_t size()
59     {
60         return service_dirs.size();
61     }
62
63     dir_entry &operator[](size_t index)
64     {
65         return service_dirs[index];
66     }
67
68     std::vector<dir_entry>::iterator begin()
69     {
70         return service_dirs.begin();
71     }
72
73     std::vector<dir_entry>::iterator end()
74     {
75         return service_dirs.end();
76     }
77 };
78
79 class service_dir_opt
80 {
81     const char *service_dir = nullptr;;
82     bool service_dir_dynamic = false;
83
84     bool am_system_init;
85
86     static const char *user_home_path;
87
88     service_dir_pathlist service_dir_paths;
89
90 public:
91     // Get user home (and set user_home_path). (The return may become invalid after
92     // changing the environment (HOME variable) or using the getpwuid() function).
93     static const char * get_user_home();
94
95     void set_specified_service_dir(const char *specified_dir)
96     {
97         service_dir = specified_dir;
98     }
99
100     void build_paths();
101
102     service_dir_pathlist &get_paths()
103     {
104         return service_dir_paths;
105     }
106 };
107
108 #endif