Fix a compiler warning
[dhcpcd-ui] / src / libdhcpcd / dhcpcd.h
1 /*
2  * libdhcpcd
3  * Copyright 2009-2014 Roy Marples <roy@marples.name>
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
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.
13  *
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
24  * SUCH DAMAGE.
25  */
26
27 #ifndef DHCPCD_H
28 #define DHCPCD_H
29
30 #include <net/if.h>
31 #include <netinet/in.h>
32
33 #include <stdbool.h>
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 #ifndef DHCPCD_SOCKET
40 #define DHCPCD_SOCKET           "/var/run/dhcpcd.sock"
41 #endif
42 #ifndef DHCPCD_UNPRIV_SOCKET
43 #define DHCPCD_UNPRIV_SOCKET    "/var/run/dhcpcd.unpriv.sock"
44 #endif
45
46 #ifndef WPA_CTRL_DIR
47 #define WPA_CTRL_DIR            "/var/run/wpa_supplicant"
48 #endif
49
50 #define DHCPCD_RETRYOPEN        100     /* milliseconds */
51 #define DHCPCD_WI_HIST_MAX      10      /* Recall 10 scans for averages */
52
53 /* Each non printable byte of the SSID is represented as \000 */
54 #define IF_SSIDSIZE             ((32 * 4) + 1)
55 #define IF_BSSIDSIZE            64
56 #define FLAGSIZE                64
57 #define TYPESIZE                8
58 #define REASONSIZE              16
59
60 typedef struct dhcpcd_wi_avs {
61         int value;
62         int average;
63 } DHCPCD_WI_AV;
64
65 typedef struct dhcpcd_wi_scan {
66         struct dhcpcd_wi_scan *next;
67         char bssid[IF_BSSIDSIZE];
68         int frequency;
69         DHCPCD_WI_AV quality;
70         DHCPCD_WI_AV noise;
71         DHCPCD_WI_AV level;
72         DHCPCD_WI_AV strength;
73         char ssid[IF_SSIDSIZE];
74         char flags[FLAGSIZE];
75 } DHCPCD_WI_SCAN;
76
77 #ifdef IN_LIBDHCPCD
78 typedef struct dhcpcd_if {
79         struct dhcpcd_if *next;
80         const char *ifname;
81         const char *type;
82         const char *reason;
83
84         unsigned int flags;
85         bool up;
86         bool wireless;
87         char ssid[IF_SSIDSIZE];
88
89         char *data;
90         size_t data_len;
91
92         char *last_message;
93
94         struct dhcpcd_connection *con;
95 } DHCPCD_IF;
96 #else
97 typedef struct dhcpcd_if {
98         struct dhcpcd_if *next;
99         const char *ifname;
100         const char *type;
101         const char *reason;
102
103         int flags;
104         bool up;
105         bool wireless;
106         char ssid[IF_SSIDSIZE];
107 } DHCPCD_IF;
108 #endif
109
110 typedef struct dhcpcd_config {
111         struct dhcpcd_config *next;
112         char *option;
113         char *value;
114 } DHCPCD_OPTION;
115
116 #ifdef IN_LIBDHCPCD
117 typedef struct dhcpcd_wi_hist {
118         struct dhcpcd_wi_hist *next;
119         char ifname[IF_NAMESIZE];
120         char bssid[IF_BSSIDSIZE];
121         int quality;
122         int noise;
123         int level;
124         int strength;
125 } DHCPCD_WI_HIST;
126
127 typedef struct dhcpcd_wpa {
128         struct dhcpcd_wpa *next;
129         char ifname[IF_NAMESIZE];
130         bool open;
131         int command_fd;
132         char *command_path;
133         int listen_fd;
134         char *listen_path;
135         bool attached;
136         struct dhcpcd_connection *con;
137 } DHCPCD_WPA;
138
139 typedef struct dhcpcd_connection {
140         struct dhcpcd_connection *next;
141         bool open;
142         bool privileged;
143         int command_fd;
144         int listen_fd;
145         const char *progname;
146
147         DHCPCD_IF *interfaces;
148         DHCPCD_WPA *wpa;
149         DHCPCD_WI_HIST *wi_history;
150
151         void (*if_cb)(DHCPCD_IF *, void *);
152         void *if_context;
153         void (*status_cb)(struct dhcpcd_connection *, const char *, void *);
154         void *status_context;
155         bool wpa_started;
156         void (*wi_scanresults_cb)(DHCPCD_WPA *, void *);
157         void *wi_scanresults_context;
158         void (*wpa_status_cb)(DHCPCD_WPA *, const char *, void *);
159         void *wpa_status_context;
160
161         char *buf;
162         size_t buflen;
163
164         char *version;
165         bool terminate_commands;
166         char *error;
167         int err;
168         int errors;
169         const char *status;
170
171         char *cffile;
172 } DHCPCD_CONNECTION;
173
174 #else
175 typedef void *DHCPCD_CONFIG;
176 typedef void *DHCPCD_WPA;
177 typedef void *DHCPCD_CONNECTION;
178 #endif
179
180 DHCPCD_CONNECTION * dhcpcd_new(void);
181 const char * dhcpcd_version(DHCPCD_CONNECTION *);
182 void dhcpcd_set_progname(DHCPCD_CONNECTION *, const char *);
183 const char * dhcpcd_get_progname(const DHCPCD_CONNECTION *);
184 const char * dhcpcd_status(DHCPCD_CONNECTION *);
185 const char * dhcpcd_cffile(DHCPCD_CONNECTION *);
186 bool dhcpcd_realloc(DHCPCD_CONNECTION *, size_t);
187 int dhcpcd_open(DHCPCD_CONNECTION *, bool priv);
188 void dhcpcd_close(DHCPCD_CONNECTION *);
189 void dhcpcd_free(DHCPCD_CONNECTION *);
190 void dhcpcd_set_if_callback(DHCPCD_CONNECTION *,
191     void (*)(DHCPCD_IF *, void *), void *);
192 void dhcpcd_set_status_callback(DHCPCD_CONNECTION *,
193     void (*)(DHCPCD_CONNECTION *, const char *, void *), void *);
194 int dhcpcd_get_fd(DHCPCD_CONNECTION *);
195 bool dhcpcd_privileged(DHCPCD_CONNECTION *);
196 void dhcpcd_dispatch(DHCPCD_CONNECTION *);
197 DHCPCD_IF * dhcpcd_interfaces(DHCPCD_CONNECTION *);
198 DHCPCD_IF * dhcpcd_get_if(DHCPCD_CONNECTION *, const char *, const char *);
199 DHCPCD_CONNECTION * dhcpcd_if_connection(DHCPCD_IF *);
200 const char *dhcpcd_get_value(const DHCPCD_IF *, const char *);
201 const char *dhcpcd_get_prefix_value(const DHCPCD_IF *, const char *,
202     const char *);
203 #ifdef IN_LIBDHCPCD
204 /* This function only exists if libc does not provide a working version */
205 int dhcpcd_strnunvis(char *dst, size_t dlen, const char *src);
206 #endif
207 ssize_t dhcpcd_decode(char *dst, size_t dlen, const char *src);
208 ssize_t dhcpcd_decode_shell(char *dst, size_t dlen, const char *src);
209 ssize_t dhcpcd_decode_hex(char *dst, size_t dlen, const char *src);
210 char * dhcpcd_if_message(DHCPCD_IF *i, bool *new_msg);
211
212 ssize_t dhcpcd_command(DHCPCD_CONNECTION *, const char *, char **);
213 ssize_t dhcpcd_command_arg(DHCPCD_CONNECTION *, const char *, const char *,
214     char **);
215 #define dhcpcd_rebind(c, i)     dhcpcd_command_arg((c), "-n", (i), NULL)
216 #define dhcpcd_release(c, i)    dhcpcd_command_arg((c), "-k", (i), NULL)
217
218 void dhcpcd_wpa_start(DHCPCD_CONNECTION *);
219 DHCPCD_WPA *dhcpcd_wpa_find(DHCPCD_CONNECTION *, const char *);
220 DHCPCD_WPA *dhcpcd_wpa_new(DHCPCD_CONNECTION *, const char *);
221 DHCPCD_CONNECTION *dhcpcd_wpa_connection(DHCPCD_WPA *);
222 int dhcpcd_wpa_open(DHCPCD_WPA *);
223 void dhcpcd_wpa_close(DHCPCD_WPA *);
224 void dhcpcd_wpa_dispatch(DHCPCD_WPA *);
225 int dhcpcd_wpa_get_fd(DHCPCD_WPA *);
226 DHCPCD_IF *dhcpcd_wpa_if(DHCPCD_WPA *);
227 void dhcpcd_wpa_if_event(DHCPCD_IF *);
228 void dhcpcd_wpa_set_scan_callback(DHCPCD_CONNECTION *,
229     void (*)(DHCPCD_WPA *, void *), void *);
230 void dhcpcd_wpa_set_status_callback(DHCPCD_CONNECTION *,
231     void (*)(DHCPCD_WPA *, const char *, void *), void *);
232 DHCPCD_WI_SCAN * dhcpcd_wi_scans(DHCPCD_IF *);
233 void dhcpcd_wi_scans_free(DHCPCD_WI_SCAN *);
234 void dhcpcd_wi_history_clear(DHCPCD_CONNECTION *);
235 bool dhcpcd_wpa_set_network(DHCPCD_WPA *, int, const char *, const char *);
236 int dhcpcd_wpa_find_network_new(DHCPCD_WPA *, const char *);
237 bool dhcpcd_wpa_command(DHCPCD_WPA *, const char *);
238 bool dhcpcd_wpa_command_arg(DHCPCD_WPA *, const char *, const char *);
239
240 bool dhcpcd_wpa_scan(DHCPCD_WPA *);
241 bool dhcpcd_wpa_reassociate(DHCPCD_WPA *);
242 bool dhcpcd_wpa_disconnect(DHCPCD_WPA *);
243 bool dhcpcd_wpa_config_write(DHCPCD_WPA *);
244 int dhcpcd_wpa_network_find_new(DHCPCD_WPA *, const char *);
245 bool dhcpcd_wpa_network_disable(DHCPCD_WPA *, int);
246 bool dhcpcd_wpa_network_enable(DHCPCD_WPA *, int);
247 bool dhcpcd_wpa_network_remove(DHCPCD_WPA *, int);
248 char * dhcpcd_wpa_network_get(DHCPCD_WPA *, int, const char *);
249 bool dhcpcd_wpa_network_set(DHCPCD_WPA *, int, const char *, const char *);
250
251 #define DHCPCD_WPA_SUCCESS       0
252 #define DHCPCD_WPA_ERR          -1
253 #define DHCPCD_WPA_ERR_SET      -2
254 #define DHCPCD_WPA_ERR_SET_PSK  -3
255 #define DHCPCD_WPA_ERR_ENABLE   -4
256 #define DHCPCD_WPA_ERR_WRITE    -5
257 #define DHCPCD_WPA_ERR_ASSOC    -6
258 int dhcpcd_wpa_configure_psk(DHCPCD_WPA *w, DHCPCD_WI_SCAN *s, const char *p);
259
260 char ** dhcpcd_config_blocks(DHCPCD_CONNECTION *, const char *);
261 DHCPCD_OPTION *dhcpcd_config_read(DHCPCD_CONNECTION *,
262     const char *, const char *);
263 void dhcpcd_config_free(DHCPCD_OPTION *);
264 const char * dhcpcd_config_get(DHCPCD_OPTION *, const char *);
265 const char * dhcpcd_config_get_static(DHCPCD_OPTION *, const char *);
266 bool dhcpcd_config_set(DHCPCD_OPTION **, const char *, const char *);
267 bool dhcpcd_config_set_static(DHCPCD_OPTION **, const char *, const char *);
268 bool dhcpcd_config_writeable(DHCPCD_CONNECTION *con);
269 bool dhcpcd_config_write(DHCPCD_CONNECTION *,
270     const char *, const char *, const DHCPCD_OPTION *);
271
272 #ifdef __cplusplus
273 }
274 #endif
275
276 #endif