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"
44 #define WPA_CTRL_DIR "/var/run/wpa_supplicant"
47 #define DHCPCD_RETRYOPEN 100 /* milliseconds */
48 #define DHCPCD_WI_HIST_MAX 10 /* Recall 10 scans for averages */
50 #define IF_SSIDSIZE 33
51 #define IF_BSSIDSIZE 64
56 typedef struct dhcpcd_wi_avs {
61 typedef struct dhcpcd_wi_scan {
62 struct dhcpcd_wi_scan *next;
63 char bssid[IF_BSSIDSIZE];
68 char ssid[IF_SSIDSIZE];
73 typedef struct dhcpcd_if {
74 struct dhcpcd_if *next;
89 struct dhcpcd_connection *con;
92 typedef struct dhcpcd_if {
93 struct dhcpcd_if *next;
105 typedef struct dhcpcd_config {
106 struct dhcpcd_config *next;
112 typedef struct dhcpcd_wi_hist {
113 struct dhcpcd_wi_hist *next;
114 char ifname[IF_NAMESIZE];
115 char bssid[IF_BSSIDSIZE];
121 typedef struct dhcpcd_wpa {
122 struct dhcpcd_wpa *next;
123 char ifname[IF_NAMESIZE];
130 struct dhcpcd_connection *con;
133 typedef struct dhcpcd_connection {
134 struct dhcpcd_connection *next;
139 DHCPCD_IF *interfaces;
141 DHCPCD_WI_HIST *wi_history;
143 void (*if_cb)(DHCPCD_IF *, void *);
145 void (*status_cb)(struct dhcpcd_connection *, const char *, void *);
146 void *status_context;
148 void (*wi_scanresults_cb)(DHCPCD_WPA *, void *);
149 void *wi_scanresults_context;
150 void (*wpa_status_cb)(DHCPCD_WPA *, const char *, void *);
151 void *wpa_status_context;
157 bool terminate_commands;
167 typedef void *DHCPCD_CONFIG;
168 typedef void *DHCPCD_WPA;
169 typedef void *DHCPCD_CONNECTION;
172 DHCPCD_CONNECTION * dhcpcd_new(void);
173 const char * dhcpcd_version(DHCPCD_CONNECTION *);
174 const char * dhcpcd_status(DHCPCD_CONNECTION *);
175 const char * dhcpcd_cffile(DHCPCD_CONNECTION *);
176 bool dhcpcd_realloc(DHCPCD_CONNECTION *, size_t);
177 int dhcpcd_open(DHCPCD_CONNECTION *);
178 void dhcpcd_close(DHCPCD_CONNECTION *);
179 void dhcpcd_free(DHCPCD_CONNECTION *);
180 void dhcpcd_set_if_callback(DHCPCD_CONNECTION *,
181 void (*)(DHCPCD_IF *, void *), void *);
182 void dhcpcd_set_status_callback(DHCPCD_CONNECTION *,
183 void (*)(DHCPCD_CONNECTION *, const char *, void *), void *);
184 int dhcpcd_get_fd(DHCPCD_CONNECTION *);
185 void dhcpcd_dispatch(DHCPCD_CONNECTION *);
186 DHCPCD_IF * dhcpcd_interfaces(DHCPCD_CONNECTION *);
187 DHCPCD_IF * dhcpcd_get_if(DHCPCD_CONNECTION *, const char *, const char *);
188 DHCPCD_CONNECTION * dhcpcd_if_connection(DHCPCD_IF *);
189 const char *dhcpcd_get_value(const DHCPCD_IF *, const char *);
190 const char *dhcpcd_get_prefix_value(const DHCPCD_IF *, const char *,
192 char * dhcpcd_if_message(DHCPCD_IF *i, bool *new_msg);
194 ssize_t dhcpcd_command(DHCPCD_CONNECTION *, const char *, char **);
195 ssize_t dhcpcd_command_arg(DHCPCD_CONNECTION *, const char *, const char *,
197 #define dhcpcd_rebind(c, i) dhcpcd_command_arg((c), "-n", (i), NULL)
198 #define dhcpcd_release(c, i) dhcpcd_command_arg((c), "-k", (i), NULL)
200 void dhcpcd_wpa_start(DHCPCD_CONNECTION *);
201 DHCPCD_WPA *dhcpcd_wpa_find(DHCPCD_CONNECTION *, const char *);
202 DHCPCD_WPA *dhcpcd_wpa_new(DHCPCD_CONNECTION *, const char *);
203 DHCPCD_CONNECTION *dhcpcd_wpa_connection(DHCPCD_WPA *);
204 int dhcpcd_wpa_open(DHCPCD_WPA *);
205 void dhcpcd_wpa_close(DHCPCD_WPA *);
206 void dhcpcd_wpa_dispatch(DHCPCD_WPA *);
207 int dhcpcd_wpa_get_fd(DHCPCD_WPA *);
208 DHCPCD_IF *dhcpcd_wpa_if(DHCPCD_WPA *);
209 void dhcpcd_wpa_if_event(DHCPCD_IF *);
210 void dhcpcd_wpa_set_scan_callback(DHCPCD_CONNECTION *,
211 void (*)(DHCPCD_WPA *, void *), void *);
212 void dhcpcd_wpa_set_status_callback(DHCPCD_CONNECTION *,
213 void (*)(DHCPCD_WPA *, const char *, void *), void *);
214 DHCPCD_WI_SCAN * dhcpcd_wi_scans(DHCPCD_IF *);
215 void dhcpcd_wi_scans_free(DHCPCD_WI_SCAN *);
216 void dhcpcd_wi_history_clear(DHCPCD_CONNECTION *);
217 bool dhcpcd_wpa_set_network(DHCPCD_WPA *, int, const char *, const char *);
218 int dhcpcd_wpa_find_network_new(DHCPCD_WPA *, const char *);
219 bool dhcpcd_wpa_command(DHCPCD_WPA *, const char *);
220 bool dhcpcd_wpa_command_arg(DHCPCD_WPA *, const char *, const char *);
222 bool dhcpcd_wpa_scan(DHCPCD_WPA *);
223 bool dhcpcd_wpa_reassociate(DHCPCD_WPA *);
224 bool dhcpcd_wpa_disconnect(DHCPCD_WPA *);
225 bool dhcpcd_wpa_config_write(DHCPCD_WPA *);
226 int dhcpcd_wpa_network_find_new(DHCPCD_WPA *, const char *);
227 bool dhcpcd_wpa_network_disable(DHCPCD_WPA *, int);
228 bool dhcpcd_wpa_network_enable(DHCPCD_WPA *, int);
229 bool dhcpcd_wpa_network_remove(DHCPCD_WPA *, int);
230 char * dhcpcd_wpa_network_get(DHCPCD_WPA *, int, const char *);
231 bool dhcpcd_wpa_network_set(DHCPCD_WPA *, int, const char *, const char *);
233 char ** dhcpcd_config_blocks(DHCPCD_CONNECTION *, const char *);
234 DHCPCD_OPTION *dhcpcd_config_read(DHCPCD_CONNECTION *,
235 const char *, const char *);
236 void dhcpcd_config_free(DHCPCD_OPTION *);
237 const char * dhcpcd_config_get(DHCPCD_OPTION *, const char *);
238 const char * dhcpcd_config_get_static(DHCPCD_OPTION *, const char *);
239 bool dhcpcd_config_set(DHCPCD_OPTION **, const char *, const char *);
240 bool dhcpcd_config_set_static(DHCPCD_OPTION **, const char *, const char *);
241 bool dhcpcd_config_write(DHCPCD_CONNECTION *,
242 const char *, const char *, const DHCPCD_OPTION *);