3 * Copyright 2009-2014 Roy Marples <roy@marples.name>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 #include <netinet/in.h>
40 #define DHCPCD_SOCKET "/var/run/dhcpcd.sock"
42 #ifndef DHCPCD_UNPRIV_SOCKET
43 #define DHCPCD_UNPRIV_SOCKET "/var/run/dhcpcd.unpriv.sock"
47 #define WPA_CTRL_DIR "/var/run/wpa_supplicant"
50 #define DHCPCD_RETRYOPEN 100 /* milliseconds */
51 #define DHCPCD_WI_HIST_MAX 10 /* Recall 10 scans for averages */
53 /* Each non printable byte of the SSID is represented as \000 */
54 #define IF_SSIDSIZE ((32 * 4) + 1)
55 #define IF_BSSIDSIZE 64
60 typedef struct dhcpcd_wi_avs {
65 typedef struct dhcpcd_wi_scan {
66 struct dhcpcd_wi_scan *next;
67 char bssid[IF_BSSIDSIZE];
69 #define WSF_SECURE 0x01
77 DHCPCD_WI_AV strength;
78 char ssid[IF_SSIDSIZE];
79 char wpa_flags[FLAGSIZE];
83 typedef struct dhcpcd_if {
84 struct dhcpcd_if *next;
99 struct dhcpcd_connection *con;
102 typedef struct dhcpcd_if {
103 struct dhcpcd_if *next;
115 typedef struct dhcpcd_config {
116 struct dhcpcd_config *next;
122 typedef struct dhcpcd_wi_hist {
123 struct dhcpcd_wi_hist *next;
124 char ifname[IF_NAMESIZE];
125 char bssid[IF_BSSIDSIZE];
132 typedef struct dhcpcd_wpa {
133 struct dhcpcd_wpa *next;
134 char ifname[IF_NAMESIZE];
141 struct dhcpcd_connection *con;
144 typedef struct dhcpcd_connection {
145 struct dhcpcd_connection *next;
150 const char *progname;
152 DHCPCD_IF *interfaces;
154 DHCPCD_WI_HIST *wi_history;
156 void (*if_cb)(DHCPCD_IF *, void *);
158 void (*status_cb)(struct dhcpcd_connection *, const char *, void *);
159 void *status_context;
161 void (*wi_scanresults_cb)(DHCPCD_WPA *, void *);
162 void *wi_scanresults_context;
163 void (*wpa_status_cb)(DHCPCD_WPA *, const char *, void *);
164 void *wpa_status_context;
170 bool terminate_commands;
180 typedef void *DHCPCD_CONFIG;
181 typedef void *DHCPCD_WPA;
182 typedef void *DHCPCD_CONNECTION;
185 DHCPCD_CONNECTION * dhcpcd_new(void);
186 const char * dhcpcd_version(DHCPCD_CONNECTION *);
187 void dhcpcd_set_progname(DHCPCD_CONNECTION *, const char *);
188 const char * dhcpcd_get_progname(const DHCPCD_CONNECTION *);
189 const char * dhcpcd_status(DHCPCD_CONNECTION *);
190 const char * dhcpcd_cffile(DHCPCD_CONNECTION *);
191 bool dhcpcd_realloc(DHCPCD_CONNECTION *, size_t);
192 int dhcpcd_open(DHCPCD_CONNECTION *, bool priv);
193 void dhcpcd_close(DHCPCD_CONNECTION *);
194 void dhcpcd_free(DHCPCD_CONNECTION *);
195 void dhcpcd_set_if_callback(DHCPCD_CONNECTION *,
196 void (*)(DHCPCD_IF *, void *), void *);
197 void dhcpcd_set_status_callback(DHCPCD_CONNECTION *,
198 void (*)(DHCPCD_CONNECTION *, const char *, void *), void *);
199 int dhcpcd_get_fd(DHCPCD_CONNECTION *);
200 bool dhcpcd_privileged(DHCPCD_CONNECTION *);
201 void dhcpcd_dispatch(DHCPCD_CONNECTION *);
202 DHCPCD_IF * dhcpcd_interfaces(DHCPCD_CONNECTION *);
203 char **dhcpcd_interface_names(DHCPCD_CONNECTION *, size_t *);
204 void dhcpcd_freev(char **);
205 char **dhcpcd_interface_names_sorted(DHCPCD_CONNECTION *);
206 DHCPCD_IF * dhcpcd_get_if(DHCPCD_CONNECTION *, const char *, const char *);
207 DHCPCD_CONNECTION * dhcpcd_if_connection(DHCPCD_IF *);
208 const char *dhcpcd_get_value(const DHCPCD_IF *, const char *);
209 const char *dhcpcd_get_prefix_value(const DHCPCD_IF *, const char *,
211 ssize_t dhcpcd_encode_string_escape(char *, size_t, const char *, size_t);
212 ssize_t dhcpcd_decode_string_escape(char *, size_t, const char *);
213 ssize_t dhcpcd_decode_hex(char *, size_t, const char *);
214 char * dhcpcd_if_message(DHCPCD_IF *, bool *);
216 ssize_t dhcpcd_command(DHCPCD_CONNECTION *, const char *, char **);
217 ssize_t dhcpcd_command_arg(DHCPCD_CONNECTION *, const char *, const char *,
219 #define dhcpcd_rebind(c, i) dhcpcd_command_arg((c), "-n", (i), NULL)
220 #define dhcpcd_release(c, i) dhcpcd_command_arg((c), "-k", (i), NULL)
222 void dhcpcd_wpa_start(DHCPCD_CONNECTION *);
223 DHCPCD_WPA *dhcpcd_wpa_find(DHCPCD_CONNECTION *, const char *);
224 DHCPCD_WPA *dhcpcd_wpa_new(DHCPCD_CONNECTION *, const char *);
225 DHCPCD_CONNECTION *dhcpcd_wpa_connection(DHCPCD_WPA *);
226 int dhcpcd_wpa_open(DHCPCD_WPA *);
227 void dhcpcd_wpa_close(DHCPCD_WPA *);
228 void dhcpcd_wpa_dispatch(DHCPCD_WPA *);
229 int dhcpcd_wpa_get_fd(DHCPCD_WPA *);
230 DHCPCD_IF *dhcpcd_wpa_if(DHCPCD_WPA *);
231 void dhcpcd_wpa_if_event(DHCPCD_IF *);
232 void dhcpcd_wpa_set_scan_callback(DHCPCD_CONNECTION *,
233 void (*)(DHCPCD_WPA *, void *), void *);
234 void dhcpcd_wpa_set_status_callback(DHCPCD_CONNECTION *,
235 void (*)(DHCPCD_WPA *, const char *, void *), void *);
236 int dhcpcd_wi_scan_compare(DHCPCD_WI_SCAN *a, DHCPCD_WI_SCAN *b);
237 DHCPCD_WI_SCAN * dhcpcd_wi_scans(DHCPCD_IF *);
238 void dhcpcd_wi_scans_free(DHCPCD_WI_SCAN *);
239 void dhcpcd_wi_history_clear(DHCPCD_CONNECTION *);
240 bool dhcpcd_wpa_set_network(DHCPCD_WPA *, int, const char *, const char *);
241 int dhcpcd_wpa_find_network_new(DHCPCD_WPA *, const char *);
242 bool dhcpcd_wpa_command(DHCPCD_WPA *, const char *);
243 bool dhcpcd_wpa_command_arg(DHCPCD_WPA *, const char *, const char *);
245 bool dhcpcd_wpa_scan(DHCPCD_WPA *);
246 bool dhcpcd_wpa_reconfigure(DHCPCD_WPA *);
247 bool dhcpcd_wpa_reassociate(DHCPCD_WPA *);
248 bool dhcpcd_wpa_disconnect(DHCPCD_WPA *);
249 bool dhcpcd_wpa_config_write(DHCPCD_WPA *);
250 int dhcpcd_wpa_network_find_new(DHCPCD_WPA *, const char *);
251 bool dhcpcd_wpa_network_disable(DHCPCD_WPA *, int);
252 bool dhcpcd_wpa_network_enable(DHCPCD_WPA *, int);
253 bool dhcpcd_wpa_network_select(DHCPCD_WPA *, int);
254 bool dhcpcd_wpa_network_remove(DHCPCD_WPA *, int);
255 char * dhcpcd_wpa_network_get(DHCPCD_WPA *, int, const char *);
256 bool dhcpcd_wpa_network_set(DHCPCD_WPA *, int, const char *, const char *);
258 #define DHCPCD_WPA_SUCCESS 0
259 #define DHCPCD_WPA_ERR -1
260 #define DHCPCD_WPA_ERR_SET -2
261 #define DHCPCD_WPA_ERR_SET_PSK -3
262 #define DHCPCD_WPA_ERR_ENABLE -4
263 #define DHCPCD_WPA_ERR_WRITE -5
264 #define DHCPCD_WPA_ERR_SELECT -6
265 #define DHCPCD_WPA_ERR_ASSOC -7
266 #define DHCPCD_WPA_ERR_DISCONN -8
267 #define DHCPCD_WPA_ERR_RECONF -9
268 int dhcpcd_wpa_configure(DHCPCD_WPA *w, DHCPCD_WI_SCAN *s, const char *p);
269 int dhcpcd_wpa_select(DHCPCD_WPA *w, DHCPCD_WI_SCAN *s);
271 char ** dhcpcd_config_blocks(DHCPCD_CONNECTION *, const char *);
272 DHCPCD_OPTION *dhcpcd_config_read(DHCPCD_CONNECTION *,
273 const char *, const char *);
274 void dhcpcd_config_free(DHCPCD_OPTION *);
275 const char * dhcpcd_config_get(DHCPCD_OPTION *, const char *);
276 const char * dhcpcd_config_get_static(DHCPCD_OPTION *, const char *);
277 bool dhcpcd_config_set(DHCPCD_OPTION **, const char *, const char *);
278 bool dhcpcd_config_set_static(DHCPCD_OPTION **, const char *, const char *);
279 bool dhcpcd_config_writeable(DHCPCD_CONNECTION *con);
280 bool dhcpcd_config_write(DHCPCD_CONNECTION *,
281 const char *, const char *, const DHCPCD_OPTION *);