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