Add guards when closing connections so that we can call the cb
[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
43 #ifndef WPA_CTRL_DIR
44 #define WPA_CTRL_DIR            "/var/run/wpa_supplicant"
45 #endif
46
47 #define DHCPCD_RETRYOPEN        100     /* milliseconds */
48 #define DHCPCD_WI_HIST_MAX      10      /* Recall 10 scans for averages */
49
50 #define IF_SSIDSIZE             33
51 #define IF_BSSIDSIZE            64
52 #define FLAGSIZE                64
53 #define TYPESIZE                8
54 #define REASONSIZE              16
55
56 typedef struct dhcpcd_wi_avs {
57         int value;
58         int average;
59 } DHCPCD_WI_AV;
60
61 typedef struct dhcpcd_wi_scan {
62         struct dhcpcd_wi_scan *next;
63         char bssid[IF_BSSIDSIZE];
64         int frequency;
65         DHCPCD_WI_AV quality;
66         DHCPCD_WI_AV noise;
67         DHCPCD_WI_AV level;
68         char ssid[IF_SSIDSIZE];
69         char flags[FLAGSIZE];
70 } DHCPCD_WI_SCAN;
71
72 #ifdef IN_LIBDHCPCD
73 typedef struct dhcpcd_if {
74         struct dhcpcd_if *next;
75         const char *ifname;
76         const char *type;
77         const char *reason;
78
79         unsigned int flags;
80         bool up;
81         bool wireless;
82         const char *ssid;
83
84         char *data;
85         size_t data_len;
86
87         char *last_message;
88
89         struct dhcpcd_connection *con;
90 } DHCPCD_IF;
91 #else
92 typedef struct dhcpcd_if {
93         struct dhcpcd_if *next;
94         const char *ifname;
95         const char *type;
96         const char *reason;
97
98         int flags;
99         bool up;
100         bool wireless;
101         const char *ssid;
102 } DHCPCD_IF;
103 #endif
104
105 typedef struct dhcpcd_config {
106         struct dhcpcd_config *next;
107         char *option;
108         char *value;
109 } DHCPCD_OPTION;
110
111 #ifdef IN_LIBDHCPCD
112 typedef struct dhcpcd_wi_hist {
113         struct dhcpcd_wi_hist *next;
114         char ifname[IF_NAMESIZE];
115         char bssid[IF_BSSIDSIZE];
116         int quality;
117         int noise;
118         int level;
119 } DHCPCD_WI_HIST;
120
121 typedef struct dhcpcd_wpa {
122         struct dhcpcd_wpa *next;
123         char ifname[IF_NAMESIZE];
124         bool open;
125         int command_fd;
126         char *command_path;
127         int listen_fd;
128         char *listen_path;
129         bool attached;
130         struct dhcpcd_connection *con;
131 } DHCPCD_WPA;
132
133 typedef struct dhcpcd_connection {
134         struct dhcpcd_connection *next;
135         bool open;
136         int command_fd;
137         int listen_fd;
138
139         DHCPCD_IF *interfaces;
140         DHCPCD_WPA *wpa;
141         DHCPCD_WI_HIST *wi_history;
142
143         void (*if_cb)(DHCPCD_IF *, void *);
144         void *if_context;
145         void (*status_cb)(struct dhcpcd_connection *, const char *, void *);
146         void *status_context;
147         void (*wi_scanresults_cb)(DHCPCD_WPA *, void *);
148         void *wi_scanresults_context;
149         void (*wpa_status_cb)(DHCPCD_WPA *, const char *, void *);
150         void *wpa_status_context;
151
152         char *buf;
153         size_t buflen;
154
155         char *version;
156         bool terminate_commands;
157         char *error;
158         int err;
159         int errors;
160         const char *status;
161
162         char *cffile;
163 } DHCPCD_CONNECTION;
164
165 #else
166 typedef void *DHCPCD_CONFIG;
167 typedef void *DHCPCD_WPA;
168 typedef void *DHCPCD_CONNECTION;
169 #endif
170
171 DHCPCD_CONNECTION * dhcpcd_new(void);
172 const char * dhcpcd_version(DHCPCD_CONNECTION *);
173 const char * dhcpcd_status(DHCPCD_CONNECTION *);
174 const char * dhcpcd_cffile(DHCPCD_CONNECTION *);
175 bool dhcpcd_realloc(DHCPCD_CONNECTION *, size_t);
176 int dhcpcd_open(DHCPCD_CONNECTION *);
177 void dhcpcd_close(DHCPCD_CONNECTION *);
178 void dhcpcd_free(DHCPCD_CONNECTION *);
179 void dhcpcd_set_if_callback(DHCPCD_CONNECTION *,
180     void (*)(DHCPCD_IF *, void *), void *);
181 void dhcpcd_set_status_callback(DHCPCD_CONNECTION *,
182     void (*)(DHCPCD_CONNECTION *, const char *, void *), void *);
183 int dhcpcd_get_fd(DHCPCD_CONNECTION *);
184 void dhcpcd_dispatch(DHCPCD_CONNECTION *);
185 DHCPCD_IF * dhcpcd_interfaces(DHCPCD_CONNECTION *);
186 DHCPCD_IF * dhcpcd_get_if(DHCPCD_CONNECTION *, const char *, const char *);
187 DHCPCD_CONNECTION * dhcpcd_if_connection(DHCPCD_IF *);
188 const char *dhcpcd_get_value(const DHCPCD_IF *, const char *);
189 const char *dhcpcd_get_prefix_value(const DHCPCD_IF *, const char *,
190     const char *);
191 char * dhcpcd_if_message(DHCPCD_IF *i, bool *new_msg);
192
193 ssize_t dhcpcd_command(DHCPCD_CONNECTION *, const char *, char **);
194 ssize_t dhcpcd_command_arg(DHCPCD_CONNECTION *, const char *, const char *,
195     char **);
196 #define dhcpcd_rebind(c, i)     dhcpcd_command_arg((c), "-n", (i), NULL)
197 #define dhcpcd_release(c, i)    dhcpcd_command_arg((c), "-k", (i), NULL)
198
199 DHCPCD_WPA *dhcpcd_wpa_find(DHCPCD_CONNECTION *, const char *);
200 DHCPCD_WPA *dhcpcd_wpa_new(DHCPCD_CONNECTION *, const char *);
201 DHCPCD_CONNECTION *dhcpcd_wpa_connection(DHCPCD_WPA *);
202 int dhcpcd_wpa_open(DHCPCD_WPA *);
203 void dhcpcd_wpa_close(DHCPCD_WPA *);
204 void dhcpcd_wpa_dispatch(DHCPCD_WPA *);
205 int dhcpcd_wpa_get_fd(DHCPCD_WPA *);
206 DHCPCD_IF *dhcpcd_wpa_if(DHCPCD_WPA *);
207 void dhcpcd_wpa_if_event(DHCPCD_IF *);
208 void dhcpcd_wpa_set_scan_callback(DHCPCD_CONNECTION *,
209     void (*)(DHCPCD_WPA *, void *), void *);
210 void dhcpcd_wpa_set_status_callback(DHCPCD_CONNECTION *,
211     void (*)(DHCPCD_WPA *, const char *, void *), void *);
212 DHCPCD_WI_SCAN * dhcpcd_wi_scans(DHCPCD_IF *);
213 void dhcpcd_wi_scans_free(DHCPCD_WI_SCAN *);
214 void dhcpcd_wi_history_clear(DHCPCD_CONNECTION *);
215 bool dhcpcd_wpa_set_network(DHCPCD_WPA *, int, const char *, const char *);
216 int dhcpcd_wpa_find_network_new(DHCPCD_WPA *, const char *);
217 bool dhcpcd_wpa_command(DHCPCD_WPA *, const char *);
218 bool dhcpcd_wpa_command_arg(DHCPCD_WPA *, const char *, const char *);
219
220 bool dhcpcd_wpa_scan(DHCPCD_WPA *);
221 bool dhcpcd_wpa_reassociate(DHCPCD_WPA *);
222 bool dhcpcd_wpa_disconnect(DHCPCD_WPA *);
223 bool dhcpcd_wpa_config_write(DHCPCD_WPA *);
224 int dhcpcd_wpa_network_find_new(DHCPCD_WPA *, const char *);
225 bool dhcpcd_wpa_network_disable(DHCPCD_WPA *, int);
226 bool dhcpcd_wpa_network_enable(DHCPCD_WPA *, int);
227 bool dhcpcd_wpa_network_remove(DHCPCD_WPA *, int);
228 char * dhcpcd_wpa_network_get(DHCPCD_WPA *, int, const char *);
229 bool dhcpcd_wpa_network_set(DHCPCD_WPA *, int, const char *, const char *);
230
231 char ** dhcpcd_config_blocks(DHCPCD_CONNECTION *, const char *);
232 DHCPCD_OPTION *dhcpcd_config_read(DHCPCD_CONNECTION *,
233     const char *, const char *);
234 void dhcpcd_config_free(DHCPCD_OPTION *);
235 const char * dhcpcd_config_get(DHCPCD_OPTION *, const char *);
236 const char * dhcpcd_config_get_static(DHCPCD_OPTION *, const char *);
237 bool dhcpcd_config_set(DHCPCD_OPTION **, const char *, const char *);
238 bool dhcpcd_config_set_static(DHCPCD_OPTION **, const char *, const char *);
239 bool dhcpcd_config_write(DHCPCD_CONNECTION *,
240     const char *, const char *, const DHCPCD_OPTION *);
241
242 #ifdef __cplusplus
243 }
244 #endif
245
246 #endif