-
Notifications
You must be signed in to change notification settings - Fork 0
/
netcfg.h
272 lines (200 loc) · 9.29 KB
/
netcfg.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
#ifndef _NETCFG_H_
#define _NETCFG_H_
#define INTERFACES_FILE "/etc/network/interfaces"
#define HOSTS_FILE "/etc/hosts"
#define HOSTNAME_FILE "/etc/hostname"
#define NETWORKS_FILE "/etc/networks"
#define RESOLV_FILE "/etc/resolv.conf"
#define DHCLIENT_CONF "/etc/dhclient.conf"
#define DOMAIN_FILE "/tmp/domain_name"
#define NTP_SERVER_FILE "/tmp/dhcp-ntp-servers"
#define WPASUPP_CTRL "/var/run/wpa_supplicant"
#define WPAPID "/var/run/wpa_supplicant.pid"
#define DHCLIENT6_FILE "/var/lib/netcfg/dhclient6.conf"
#define DHCP6C_FILE "/var/lib/netcfg/dhcp6c.conf"
#define DEVNAMES "/etc/network/devnames"
#define DEVHOTPLUG "/etc/network/devhotplug"
#ifdef __linux__
#define STAB "/var/run/stab"
#endif
#define WPA_MIN 8 /* minimum passphrase length */
#define WPA_MAX 64 /* maximum passphrase length */
#define _GNU_SOURCE
#include <sys/types.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <cdebconf/debconfclient.h>
#ifndef ARRAY_SIZE
# define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
#endif
#define empty_str(s) (s != NULL && *s == '\0')
#define IPV6_HOSTS \
"# The following lines are desirable for IPv6 capable hosts\n" \
"::1 localhost ip6-localhost ip6-loopback\n" \
"ff02::1 ip6-allnodes\n" \
"ff02::2 ip6-allrouters\n"
/* The number of times to attempt to verify gateway reachability.
* Each try invokes arping with a one second timeout.
*/
#define NETCFG_GATEWAY_REACHABILITY_TRIES 50
#ifndef MAXHOSTNAMELEN
#define MAXHOSTNAMELEN 63
#endif
#define RETURN_TO_MAIN 10
#define CONFIGURE_MANUALLY 15
typedef enum { NOT_ASKED = 30, GO_BACK, REPLY_WEP, REPLY_WPA } response_t;
typedef enum { DHCP, STATIC, DUNNO } method_t;
typedef enum { ADHOC = 1, MANAGED = 2 } wifimode_t;
typedef enum { WPA_OK, WPA_QUEUED, WPA_UNAVAIL } wpa_t;
extern int wfd, skfd;
extern int input_result;
extern int have_domain;
/* network config */
extern char hostname[MAXHOSTNAMELEN + 1];
extern char domain[MAXHOSTNAMELEN + 1];
/* wireless */
extern char *essid, *wepkey, *passphrase;
extern wifimode_t mode;
/* Determine which of INET_ADDRSTRLEN or INET6_ADDRSTRLEN is longer
* (yeah, take a wild guess who'll win *that* one) and make that
* the string length. This makes sure that any string defined to
* be NETCFG_ADDRSTRLEN bytes long is guaranteed to be able to
* accomodate either an IPv4 or IPv6 address.
*/
#define NETCFG_ADDRSTRLEN ((INET_ADDRSTRLEN < INET6_ADDRSTRLEN) ? INET6_ADDRSTRLEN : INET_ADDRSTRLEN)
/* The maximum number of nameservers and NTP servers we'll store in the
* interface.
*/
#define NETCFG_NAMESERVERS_MAX 4
#define NETCFG_NTPSERVERS_MAX 4
/* The information required to configure a network interface. */
struct netcfg_interface {
char *name;
/* Is this a loopback interface?
* -1 if unknown, 0 if no, 1 if yes */
int loopback;
/* Was this interface configured with DHCP?
* -1 if unknown, 0 if no, 1 if yes */
int dhcp;
/* Was this interface configured using stateful DHCPv6?
*/
int dhcpv6;
/* Address family of the address we're configuring; AF_INET or AF_INET6 */
int address_family;
/* Did the interface get an IPv6 address/gateway via SLAAC?
* T (1) / F (0) / unknown (-1) */
int slaac;
/* Did the RA indicate that we should use stateful address
* configuration? T/F/?
*/
int v6_stateful_config;
/* Did the RA indicate that we should use stateless auxiliary
* config (DNS, NTP, etc)? T/F/?
*/
int v6_stateless_config;
/* The list of nameservers this interface has asked us to
* use.
*/
char nameservers[NETCFG_NAMESERVERS_MAX][NETCFG_ADDRSTRLEN];
/* The list of NTP servers this interface has asked us to
* use. Interestingly, the DHCP specs only allow NTP servers by
* IP address, not hostname, hence the use of NETCFG_ADDRSTRLEN.
*/
char ntp_servers[NETCFG_NTPSERVERS_MAX][NETCFG_ADDRSTRLEN];
/* The 'hostname' we want to send to the DHCP server so it'll give
* us a/the right lease.
*/
char dhcp_hostname[MAXHOSTNAMELEN];
char ipaddress[NETCFG_ADDRSTRLEN];
unsigned int masklen;
char gateway[NETCFG_ADDRSTRLEN];
char pointopoint[INET_ADDRSTRLEN];
/* Wireless mode */
wifimode_t mode;
/* Wireless configuration */
response_t wifi_security;
char *wepkey;
char *essid;
/* WPA */
wpa_t wpa_supplicant_status;
char *passphrase;
};
/* Somewhere we can store both in_addr and in6_addr; convenient for all those
* places you couldn't be bothered to deal with it yourself manually.
*/
union inX_addr {
struct in_addr in4;
struct in6_addr in6;
};
/* Set default values for all netcfg_interface parameters */
extern void netcfg_interface_init(struct netcfg_interface *iface);
/* common functions */
extern int check_kill_switch (const char *if_name);
extern int is_interface_up (const char *if_name);
extern int get_all_ifs (int all, char ***ptr);
extern char *get_ifdsc (struct debconfclient *client, const char *if_name);
extern FILE *file_open (char *path, const char *opentype);
extern void netcfg_die (struct debconfclient *client);
extern int netcfg_get_interface(struct debconfclient *client, char **if_name, int *num_interfaces, const char *defif);
extern short valid_hostname (const char *hname);
extern short valid_domain (const char *dname);
extern int netcfg_get_hostname(struct debconfclient *client, char *template, char *hostname, short hdset);
extern int netcfg_get_nameservers (struct debconfclient *client, char **nameservers, char *default_nameservers);
extern int netcfg_get_domain(struct debconfclient *client, char domain[]);
extern int netcfg_get_static(struct debconfclient *client, struct netcfg_interface *interface);
extern int netcfg_activate_dhcp(struct debconfclient *client, struct netcfg_interface *interface);
extern int nameserver_count (const struct netcfg_interface *interface);
extern int read_resolv_conf_nameservers (char *resolv_conf_file, struct netcfg_interface *interface);
extern void sigchld_handler (int sig __attribute__ ((unused)));
extern int ask_dhcp_options (struct debconfclient *client, const char *if_name);
extern void netcfg_write_loopback (void);
extern void netcfg_write_common (const char *ipaddress, const char *hostname, const char *domain);
void netcfg_nameservers_to_array(const char *nameservers, struct netcfg_interface *interface);
extern int is_wireless_iface (const char *if_name);
extern int netcfg_wireless_set_essid (struct debconfclient *client, struct netcfg_interface *interface);
extern int netcfg_wireless_set_wep (struct debconfclient *client, struct netcfg_interface *interface);
extern int wireless_security_type (struct debconfclient *client, const char *if_name);
extern int netcfg_set_passphrase (struct debconfclient *client, struct netcfg_interface *interface);
extern int init_wpa_supplicant_support (struct netcfg_interface *interface);
extern int kill_wpa_supplicant (void);
extern int wpa_supplicant_start (struct debconfclient *client, const struct netcfg_interface *interface);
extern int iface_is_hotpluggable(const char *if_name);
extern short find_in_stab (const char *if_name);
extern void deconfigure_network(struct netcfg_interface *iface);
extern void interface_up (const char *if_name);
extern void interface_down (const char *if_name);
extern void loop_setup(void);
extern int get_hostname_from_dns(const struct netcfg_interface *interface, char *hostname, const size_t max_hostname_len);
extern int inet_ptom (int af, const char *src, unsigned int *dst);
extern const char *inet_mtop (int af, unsigned int src, char *dst, socklen_t dst_len);
extern void inet_mton (int af, unsigned int src, void *dst);
extern void parse_args (int argc, char** argv);
extern void open_sockets (void);
extern void reap_old_files (void);
extern void netcfg_update_entropy (void);
extern int netcfg_write_resolv (const char *domain, const struct netcfg_interface *interface);
extern int ethtool_lite (const char *if_name);
extern int netcfg_detect_link(struct debconfclient *client, const struct netcfg_interface *interface);
extern int netcfg_parse_cidr_address(const char *address, struct netcfg_interface *interface);
extern void netcfg_network_address(const struct netcfg_interface *interface, char *network);
extern void netcfg_broadcast_address(const struct netcfg_interface *interface, char *broadcast);
extern int netcfg_gateway_reachable(const struct netcfg_interface *interface);
extern void preseed_hostname_from_fqdn(struct debconfclient *client, char *fqdn);
extern int netcfg_dhcp(struct debconfclient *client, struct netcfg_interface *interface);
extern void rtrim(char *);
/* ipv6.c */
extern void nc_v6_wait_for_complete_configuration(const struct netcfg_interface *interface);
extern int nc_v6_interface_configured(const struct netcfg_interface *interface, const int link_local);
extern int nc_v6_get_config_flags(struct debconfclient *client, struct netcfg_interface *interface);
/* write_interfaces.c */
extern int netcfg_write_interface(const struct netcfg_interface *interface);
/* rdnssd.c */
extern int start_rdnssd(struct debconfclient *client);
extern void cleanup_rdnssd(void);
extern void stop_rdnssd(void);
extern void read_rdnssd_nameservers(struct netcfg_interface *interface);
/* autoconfig.c */
extern void cleanup_dhcpv6_client(void);
extern int start_dhcpv6_client(struct debconfclient *client, const struct netcfg_interface *interface);
extern int netcfg_autoconfig(struct debconfclient *client, struct netcfg_interface *interface);
#endif /* _NETCFG_H_ */