diff options
author | Kristóf Marussy <kris7topher@gmail.com> | 2020-01-27 21:04:35 +0100 |
---|---|---|
committer | Kristóf Marussy <kris7topher@gmail.com> | 2020-01-27 21:04:35 +0100 |
commit | a7e6138ad09e77a8792a03640a43660a063a1e2d (patch) | |
tree | afae50ccb705f56851aece3d92757e457dfbbfc3 /src/firejail/dhcp.c | |
parent | clarify dropping python2 support in meld.profile (#3167) (diff) | |
download | firejail-a7e6138ad09e77a8792a03640a43660a063a1e2d.tar.gz firejail-a7e6138ad09e77a8792a03640a43660a063a1e2d.tar.zst firejail-a7e6138ad09e77a8792a03640a43660a063a1e2d.zip |
Fix indentation for dhcp client code
Diffstat (limited to 'src/firejail/dhcp.c')
-rw-r--r-- | src/firejail/dhcp.c | 205 |
1 files changed, 104 insertions, 101 deletions
diff --git a/src/firejail/dhcp.c b/src/firejail/dhcp.c index f7d417d3d..7593a47f2 100644 --- a/src/firejail/dhcp.c +++ b/src/firejail/dhcp.c | |||
@@ -29,130 +29,133 @@ pid_t dhclient4_pid = 0; | |||
29 | pid_t dhclient6_pid = 0; | 29 | pid_t dhclient6_pid = 0; |
30 | 30 | ||
31 | typedef struct { | 31 | typedef struct { |
32 | char *version_arg; | 32 | char *version_arg; |
33 | char *pid_file; | 33 | char *pid_file; |
34 | char *leases_file; | 34 | char *leases_file; |
35 | uint8_t generate_duid; | 35 | uint8_t generate_duid; |
36 | char *duid_leases_file; | 36 | char *duid_leases_file; |
37 | pid_t *pid; | 37 | pid_t *pid; |
38 | ptrdiff_t arg_offset; | 38 | ptrdiff_t arg_offset; |
39 | } Dhclient; | 39 | } Dhclient; |
40 | 40 | ||
41 | static const Dhclient dhclient4 = { .version_arg = "-4", | 41 | static const Dhclient dhclient4 = { |
42 | .pid_file = RUN_DHCLIENT_4_PID_FILE, | 42 | .version_arg = "-4", |
43 | .leases_file = RUN_DHCLIENT_4_LEASES_FILE, | 43 | .pid_file = RUN_DHCLIENT_4_PID_FILE, |
44 | .generate_duid = 1, | 44 | .leases_file = RUN_DHCLIENT_4_LEASES_FILE, |
45 | .pid = &dhclient4_pid, | 45 | .generate_duid = 1, |
46 | .arg_offset = offsetof(Bridge, arg_ip_dhcp) | 46 | .pid = &dhclient4_pid, |
47 | .arg_offset = offsetof(Bridge, arg_ip_dhcp) | ||
47 | }; | 48 | }; |
48 | 49 | ||
49 | static const Dhclient dhclient6 = { .version_arg = "-6", | 50 | static const Dhclient dhclient6 = { |
50 | .pid_file = RUN_DHCLIENT_6_PID_FILE, | 51 | .version_arg = "-6", |
51 | .leases_file = RUN_DHCLIENT_6_LEASES_FILE, | 52 | .pid_file = RUN_DHCLIENT_6_PID_FILE, |
52 | .duid_leases_file = RUN_DHCLIENT_4_LEASES_FILE, | 53 | .leases_file = RUN_DHCLIENT_6_LEASES_FILE, |
53 | .pid = &dhclient6_pid, | 54 | .duid_leases_file = RUN_DHCLIENT_4_LEASES_FILE, |
54 | .arg_offset = offsetof(Bridge, arg_ip6_dhcp) | 55 | .pid = &dhclient6_pid, |
56 | .arg_offset = offsetof(Bridge, arg_ip6_dhcp) | ||
55 | }; | 57 | }; |
56 | 58 | ||
57 | static void dhcp_run_dhclient(const Dhclient *client) { | 59 | static void dhcp_run_dhclient(const Dhclient *client) { |
58 | char *argv[256] = { "dhclient", | 60 | char *argv[256] = { |
59 | client->version_arg, | 61 | "dhclient", |
60 | "-pf", client->pid_file, | 62 | client->version_arg, |
61 | "-lf", client->leases_file, | 63 | "-pf", client->pid_file, |
62 | }; | 64 | "-lf", client->leases_file, |
63 | int i = 6; | 65 | }; |
64 | if (client->generate_duid) | 66 | int i = 6; |
65 | argv[i++] = "-i"; | 67 | if (client->generate_duid) |
66 | if (client->duid_leases_file) { | 68 | argv[i++] = "-i"; |
67 | argv[i++] = "-df"; | 69 | if (client->duid_leases_file) { |
68 | argv[i++] = client->duid_leases_file; | 70 | argv[i++] = "-df"; |
69 | } | 71 | argv[i++] = client->duid_leases_file; |
70 | if (arg_debug) | 72 | } |
71 | argv[i++] = "-v"; | 73 | if (arg_debug) |
72 | if (*(uint8_t *) ((char *) &cfg.bridge0 + client->arg_offset)) | 74 | argv[i++] = "-v"; |
73 | argv[i++] = cfg.bridge0.devsandbox; | 75 | if (*(uint8_t *)((char *)&cfg.bridge0 + client->arg_offset)) |
74 | if (*(uint8_t *) ((char *) &cfg.bridge1 + client->arg_offset)) | 76 | argv[i++] = cfg.bridge0.devsandbox; |
75 | argv[i++] = cfg.bridge1.devsandbox; | 77 | if (*(uint8_t *)((char *)&cfg.bridge1 + client->arg_offset)) |
76 | if (*(uint8_t *) ((char *) &cfg.bridge2 + client->arg_offset)) | 78 | argv[i++] = cfg.bridge1.devsandbox; |
77 | argv[i++] = cfg.bridge2.devsandbox; | 79 | if (*(uint8_t *)((char *)&cfg.bridge2 + client->arg_offset)) |
78 | if (*(uint8_t *) ((char *) &cfg.bridge3 + client->arg_offset)) | 80 | argv[i++] = cfg.bridge2.devsandbox; |
79 | argv[i++] = cfg.bridge3.devsandbox; | 81 | if (*(uint8_t *)((char *)&cfg.bridge3 + client->arg_offset)) |
82 | argv[i++] = cfg.bridge3.devsandbox; | ||
80 | 83 | ||
81 | sbox_run_v(SBOX_ROOT | SBOX_CAPS_NETWORK | SBOX_CAPS_NET_SERVICE | SBOX_SECCOMP, argv); | 84 | sbox_run_v(SBOX_ROOT | SBOX_CAPS_NETWORK | SBOX_CAPS_NET_SERVICE | SBOX_SECCOMP, argv); |
82 | } | 85 | } |
83 | 86 | ||
84 | static pid_t dhcp_read_pidfile(const Dhclient *client) { | 87 | static pid_t dhcp_read_pidfile(const Dhclient *client) { |
85 | // We have to run dhclient as a forking daemon (not pass the -d option), | 88 | // We have to run dhclient as a forking daemon (not pass the -d option), |
86 | // because we want to be notified of a successful DHCP lease by the parent process exit. | 89 | // because we want to be notified of a successful DHCP lease by the parent process exit. |
87 | // However, try to be extra paranoid with race conditions, | 90 | // However, try to be extra paranoid with race conditions, |
88 | // because dhclient only writes the daemon pid into the pidfile | 91 | // because dhclient only writes the daemon pid into the pidfile |
89 | // after its parent process has exited. | 92 | // after its parent process has exited. |
90 | int tries = 0; | 93 | int tries = 0; |
91 | pid_t found = 0; | 94 | pid_t found = 0; |
92 | while (found == 0 && tries < 10) { | 95 | while (found == 0 && tries < 10) { |
93 | if (tries >= 1) | 96 | if (tries >= 1) |
94 | usleep(100000); | 97 | usleep(100000); |
95 | FILE *pidfile = fopen(client->pid_file, "r"); | 98 | FILE *pidfile = fopen(client->pid_file, "r"); |
96 | if (pidfile) { | 99 | if (pidfile) { |
97 | long pid; | 100 | long pid; |
98 | if (fscanf(pidfile, "%ld", &pid) == 1) { | 101 | if (fscanf(pidfile, "%ld", &pid) == 1) { |
99 | char *pidname = pid_proc_comm((pid_t) pid); | 102 | char *pidname = pid_proc_comm((pid_t) pid); |
100 | if (pidname && strcmp(pidname, "dhclient") == 0) | 103 | if (pidname && strcmp(pidname, "dhclient") == 0) |
101 | found = (pid_t) pid; | 104 | found = (pid_t) pid; |
102 | } | 105 | } |
103 | fclose(pidfile); | 106 | fclose(pidfile); |
104 | } | 107 | } |
105 | ++tries; | 108 | ++tries; |
106 | } | 109 | } |
107 | if (found == 0) { | 110 | if (found == 0) { |
108 | fprintf(stderr, "Error: Cannot get dhclient %s PID from %s\n", | 111 | fprintf(stderr, "Error: Cannot get dhclient %s PID from %s\n", |
109 | client->version_arg, client->pid_file); | 112 | client->version_arg, client->pid_file); |
110 | exit(1); | 113 | exit(1); |
111 | } | 114 | } |
112 | return found; | 115 | return found; |
113 | } | 116 | } |
114 | 117 | ||
115 | static void dhcp_start_dhclient(const Dhclient *client) { | 118 | static void dhcp_start_dhclient(const Dhclient *client) { |
116 | dhcp_run_dhclient(client); | 119 | dhcp_run_dhclient(client); |
117 | *(client->pid) = dhcp_read_pidfile(client); | 120 | *(client->pid) = dhcp_read_pidfile(client); |
118 | } | 121 | } |
119 | 122 | ||
120 | static void dhcp_waitll(const char *ifname) { | 123 | static void dhcp_waitll(const char *ifname) { |
121 | sbox_run(SBOX_ROOT | SBOX_CAPS_NETWORK | SBOX_SECCOMP, 3, PATH_FNET, "waitll", ifname); | 124 | sbox_run(SBOX_ROOT | SBOX_CAPS_NETWORK | SBOX_SECCOMP, 3, PATH_FNET, "waitll", ifname); |
122 | } | 125 | } |
123 | 126 | ||
124 | static void dhcp_waitll_all() { | 127 | static void dhcp_waitll_all() { |
125 | if (cfg.bridge0.arg_ip6_dhcp) | 128 | if (cfg.bridge0.arg_ip6_dhcp) |
126 | dhcp_waitll(cfg.bridge0.devsandbox); | 129 | dhcp_waitll(cfg.bridge0.devsandbox); |
127 | if (cfg.bridge1.arg_ip6_dhcp) | 130 | if (cfg.bridge1.arg_ip6_dhcp) |
128 | dhcp_waitll(cfg.bridge1.devsandbox); | 131 | dhcp_waitll(cfg.bridge1.devsandbox); |
129 | if (cfg.bridge2.arg_ip6_dhcp) | 132 | if (cfg.bridge2.arg_ip6_dhcp) |
130 | dhcp_waitll(cfg.bridge2.devsandbox); | 133 | dhcp_waitll(cfg.bridge2.devsandbox); |
131 | if (cfg.bridge3.arg_ip6_dhcp) | 134 | if (cfg.bridge3.arg_ip6_dhcp) |
132 | dhcp_waitll(cfg.bridge3.devsandbox); | 135 | dhcp_waitll(cfg.bridge3.devsandbox); |
133 | } | 136 | } |
134 | 137 | ||
135 | void dhcp_start(void) { | 138 | void dhcp_start(void) { |
136 | if (!any_dhcp()) | 139 | if (!any_dhcp()) |
137 | return; | 140 | return; |
138 | 141 | ||
139 | EUID_ROOT(); | 142 | EUID_ROOT(); |
140 | if (mkdir(RUN_DHCLIENT_DIR, 0700)) | 143 | if (mkdir(RUN_DHCLIENT_DIR, 0700)) |
141 | errExit("mkdir"); | 144 | errExit("mkdir"); |
142 | 145 | ||
143 | if (any_ip_dhcp()) { | 146 | if (any_ip_dhcp()) { |
144 | dhcp_start_dhclient(&dhclient4); | 147 | dhcp_start_dhclient(&dhclient4); |
145 | if (arg_debug) | 148 | if (arg_debug) |
146 | printf("Running dhclient -4 in the background as pid %ld\n", (long) dhclient4_pid); | 149 | printf("Running dhclient -4 in the background as pid %ld\n", (long) dhclient4_pid); |
147 | } | 150 | } |
148 | if (any_ip6_dhcp()) { | 151 | if (any_ip6_dhcp()) { |
149 | dhcp_waitll_all(); | 152 | dhcp_waitll_all(); |
150 | dhcp_start_dhclient(&dhclient6); | 153 | dhcp_start_dhclient(&dhclient6); |
151 | if (arg_debug) | 154 | if (arg_debug) |
152 | printf("Running dhclient -6 in the background as pid %ld\n", (long) dhclient6_pid); | 155 | printf("Running dhclient -6 in the background as pid %ld\n", (long) dhclient6_pid); |
153 | if (dhclient4_pid == dhclient6_pid) { | 156 | if (dhclient4_pid == dhclient6_pid) { |
154 | fprintf(stderr, "Error: dhclient -4 and -6 have the same PID: %ld\n", (long) dhclient4_pid); | 157 | fprintf(stderr, "Error: dhclient -4 and -6 have the same PID: %ld\n", (long) dhclient4_pid); |
155 | exit(1); | 158 | exit(1); |
156 | } | 159 | } |
157 | } | 160 | } |
158 | } | 161 | } |