aboutsummaryrefslogtreecommitdiffstats
path: root/src/firejail/dhcp.c
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kris7topher@gmail.com>2020-01-27 21:04:35 +0100
committerLibravatar Kristóf Marussy <kris7topher@gmail.com>2020-01-27 21:04:35 +0100
commita7e6138ad09e77a8792a03640a43660a063a1e2d (patch)
treeafae50ccb705f56851aece3d92757e457dfbbfc3 /src/firejail/dhcp.c
parentclarify dropping python2 support in meld.profile (#3167) (diff)
downloadfirejail-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.c205
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;
29pid_t dhclient6_pid = 0; 29pid_t dhclient6_pid = 0;
30 30
31typedef struct { 31typedef 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
41static const Dhclient dhclient4 = { .version_arg = "-4", 41static 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
49static const Dhclient dhclient6 = { .version_arg = "-6", 50static 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
57static void dhcp_run_dhclient(const Dhclient *client) { 59static 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
84static pid_t dhcp_read_pidfile(const Dhclient *client) { 87static 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
115static void dhcp_start_dhclient(const Dhclient *client) { 118static 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
120static void dhcp_waitll(const char *ifname) { 123static 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
124static void dhcp_waitll_all() { 127static 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
135void dhcp_start(void) { 138void 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}