Use calloc instead of malloc + memset.
[dhcpcd-ui] / src / libdhcpcd / libdhcpcd.h
1 /*
2  * libdhcpcd
3  * Copyright 2009 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 LIBDHCPCD_H
28 #define LIBDHCPCD_H
29
30 #include <net/if.h>
31 #include <netinet/in.h>
32
33 #include <poll.h>
34 #include <stdbool.h>
35
36 #define IF_SSIDSIZE 33
37 #define IF_BSSIDSIZE 64
38 #define FLAGSIZE 64
39 #define REASONSIZE 16
40
41 typedef struct dhcpcd_wi_avs {
42         int value;
43         int average;
44 } DHCPCD_WI_AV;
45
46 typedef struct dhcpcd_wi_scan {
47         struct dhcpcd_wi_scan *next;
48         char bssid[IF_BSSIDSIZE];
49         int frequency;
50         DHCPCD_WI_AV quality;
51         DHCPCD_WI_AV noise;
52         DHCPCD_WI_AV level;
53         char ssid[IF_SSIDSIZE];
54         char flags[FLAGSIZE];
55 } DHCPCD_WI_SCAN;
56
57 typedef struct dhcpcd_if {
58         struct dhcpcd_if *next;
59         char ifname[IF_NAMESIZE];
60         unsigned int flags;
61         char reason[REASONSIZE];
62         struct in_addr ip;
63         unsigned char cidr;
64         bool wireless;
65         char ssid[IF_SSIDSIZE];
66 } DHCPCD_IF;
67
68 /* Although we use DBus, we don't have to rely on it for our API */
69 #ifdef IN_LIBDHCPCD
70 #include <dbus/dbus.h>
71 typedef DBusMessage DHCPCD_MESSAGE;
72 typedef DBusMessageIter DHCPCD_MESSAGEITER;
73
74 typedef struct dhcpcd_wi_hist {
75         struct dhcpcd_wi_hist *next;
76         char ifname[IF_NAMESIZE];
77         char bssid[IF_BSSIDSIZE];
78         int quality;
79         int noise;
80         int level;
81 } DHCPCD_WI_HIST;
82
83 typedef struct dhcpcd_connection {
84         struct dhcpcd_connection *next;
85         DBusConnection *bus;
86         char *error;
87         int err;
88         int errors;
89         char *status;
90         void (*add_watch)(struct dhcpcd_connection *, const struct pollfd *,
91             void *);
92         void (*delete_watch)(struct dhcpcd_connection *, const struct pollfd *,
93             void *);
94         void *watch_data;
95         void (*event)(struct dhcpcd_connection *, DHCPCD_IF *, void *);
96         void (*status_changed)(struct dhcpcd_connection *, const char *,
97             void *);
98         void (*wi_scanresults)(struct dhcpcd_connection *, DHCPCD_IF *,
99             void *);
100         void *signal_data;
101         DHCPCD_IF *interfaces;
102         DHCPCD_WI_HIST *wi_history;
103 } DHCPCD_CONNECTION;
104
105 typedef struct dhcpcd_watch {
106         struct dhcpcd_watch *next;
107         DHCPCD_CONNECTION *connection;
108         DBusWatch *watch;
109         struct pollfd pollfd;
110 } DHCPCD_WATCH;
111 extern DHCPCD_WATCH *dhcpcd_watching;
112
113 #define DHCPCD_SERVICE  "name.marples.roy.dhcpcd"
114 #define DHCPCD_PATH     "/name/marples/roy/dhcpcd"
115
116 #ifdef __GLIBC__
117 #  define strlcpy(dst, src, n) snprintf(dst, n, "%s", src)
118 #endif
119
120 bool dhcpcd_iter_get(DHCPCD_CONNECTION *, DHCPCD_MESSAGEITER *, int, void *);
121 DHCPCD_MESSAGE * dhcpcd_send_reply(DHCPCD_CONNECTION *, DHCPCD_MESSAGE *);
122 DHCPCD_MESSAGE * dhcpcd_message_reply(DHCPCD_CONNECTION *,
123     const char *, const char *);
124 void dhcpcd_error_set(DHCPCD_CONNECTION *, const char *, int);
125 DHCPCD_IF * dhcpcd_if_new(DHCPCD_CONNECTION *, DBusMessageIter *, char **);
126 void dhcpcd_if_free(DHCPCD_IF *);
127 void dhcpcd_dispatch_signal(DHCPCD_CONNECTION *, const char *, void *);
128 bool dhcpcd_dispatch_message(DHCPCD_CONNECTION *, DHCPCD_MESSAGE *);
129 #else
130 typedef void * DHCPCD_CONNECTION;
131 #endif
132
133 DHCPCD_CONNECTION * dhcpcd_open(char **);
134 bool dhcpcd_close(DHCPCD_CONNECTION *);
135 const char * dhcpcd_error(DHCPCD_CONNECTION *);
136 void dhcpcd_error_clear(DHCPCD_CONNECTION *);
137 void dhcpcd_set_watch_functions(DHCPCD_CONNECTION *,
138     void (*)(DHCPCD_CONNECTION *, const struct pollfd *, void *),
139     void (*)(DHCPCD_CONNECTION *, const struct pollfd *, void *),
140     void *);
141 void dhcpcd_set_signal_functions(DHCPCD_CONNECTION *,
142     void (*)(DHCPCD_CONNECTION *, DHCPCD_IF *, void *),
143     void (*)(DHCPCD_CONNECTION *, const char *, void *),
144     void (*)(DHCPCD_CONNECTION *, DHCPCD_IF *, void *),
145     void *);
146 const char * dhcpcd_status(DHCPCD_CONNECTION *);
147 bool dhcpcd_command(DHCPCD_CONNECTION *, const char *, const char *, char **);
148 void dhcpcd_dispatch(int);
149 DHCPCD_IF * dhcpcd_interfaces(DHCPCD_CONNECTION *);
150 DHCPCD_IF * dhcpcd_if_find(DHCPCD_CONNECTION *, const char *);
151 DHCPCD_CONNECTION * dhcpcd_if_connection(DHCPCD_IF *);
152
153 bool dhcpcd_if_up(const DHCPCD_IF *);
154 bool dhcpcd_if_down(const DHCPCD_IF *);
155 char * dhcpcd_if_message(const DHCPCD_IF *);
156
157 DHCPCD_WI_SCAN * dhcpcd_wi_scans(DHCPCD_CONNECTION *, DHCPCD_IF *);
158 void dhcpcd_wi_scans_free(DHCPCD_WI_SCAN *);
159 void dhcpcd_wi_history_clear(DHCPCD_CONNECTION *);
160 bool dhcpcd_wpa_command(DHCPCD_CONNECTION *, DHCPCD_IF *, const char *, int);
161 bool dhcpcd_wpa_set_network(DHCPCD_CONNECTION *, DHCPCD_IF *,
162     int, const char *, const char *);
163 int dhcpcd_wpa_find_network_new(DHCPCD_CONNECTION *, DHCPCD_IF *,
164     const char *);
165
166 #define dhcpcd_rebind(c, i)                                                   \
167         dhcpcd_command(c, "Rebind", i ? (i)->ifname : NULL, NULL)
168 #define dhcpcd_release(c, i)                                                  \
169         dhcpcd_command(c, "Release", i ? (i)->ifname : NULL, NULL)
170
171 /* Our configuration is probably going to change ... */
172 #ifdef IN_LIBDHCPCD
173 typedef struct dhcpcd_config {
174         char *option;
175         char *value;
176         struct dhcpcd_config *next;
177 } DHCPCD_CONFIG;
178 #else
179 typedef void *DHCPCD_CONFIG;
180 #endif
181
182 char ** dhcpcd_config_blocks_get(DHCPCD_CONNECTION *, const char *);
183 DHCPCD_CONFIG * dhcpcd_config_load(DHCPCD_CONNECTION *,
184     const char *, const char *);
185 void dhcpcd_config_free(DHCPCD_CONFIG *);
186 const char * dhcpcd_config_get(DHCPCD_CONFIG *, const char *);
187 const char * dhcpcd_config_get_static(DHCPCD_CONFIG *, const char *);
188 bool dhcpcd_config_set(DHCPCD_CONFIG **, const char *, const char *);
189 bool dhcpcd_config_set_static(DHCPCD_CONFIG **, const char *, const char *);
190 bool dhcpcd_config_save(DHCPCD_CONNECTION *,
191     const char *, const char *, DHCPCD_CONFIG *);
192
193 #endif