-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathipv4_config.c
137 lines (121 loc) · 3.9 KB
/
ipv4_config.c
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
#include "ipv4_config.h"
#include <stdio.h>
#include <errno.h>
#include <string.h>
/* int ipv4_config_read
* ( char* filename, char ifname[], ipv4_addr_t addr, ipv4_addr_t netmask );
*
* DESCRIPCIÓN:
* Esta función lee el fichero de configuración IPv4 especificado y devuelve
* el nombre del interfaz, la direccion IPv4 del mismo, y la máscara de
* subred.
*
* La memoria del nombre del interfaz, y de las direcciones IPv4 debe haber
* sido reservada previamente.
*
* PARÁMETROS:
* 'filename': Nombre del fichero de configuración que se desea leer.
* 'ifname': Variable donde se copiará el nombre de la interfaz leida del
* fichero de configuración.
* 'addr': Variable donde se copiará la dirección IPv4 del interfaz
* leida del fichero de configuración.
* 'netmask': Variable donde se copiará la máscara de subred leida del
* fichero de configuración.
*
* VALOR DEVUELTO:
* La función devuelve '0' si el fichero de configuración se ha leido
* correctamente.
*
* ERRORES:
* La función devuelve '-1' si se ha producido algún error al leer el
* fichero de configuración.
*/
int ipv4_config_read
( char* filename, char ifname[], ipv4_addr_t addr, ipv4_addr_t netmask )
{
int err = 0;
/* Open IPv4 Configuration file */
FILE* conf_file = fopen(filename, "r");
if (conf_file == NULL) {
fprintf(stderr, "Error opening IPv4 Configuration file \"%s\": %s.\n",
filename, strerror(errno));
return -1;
}
int ifname_read = 0;
int addr_read = 0;
int netmask_read = 0;
/* Init output parameters, just in case */
ifname[0] = '\0';
memset(addr, 0x00, IPv4_ADDR_SIZE);
memset(netmask, 0x00, IPv4_ADDR_SIZE);
int linenum = 0;
char line_buf[1024];
char name_str[256];
char value_str[256];
while ((! feof(conf_file)) && (err==0)) {
linenum++;
/* Read next line of config file */
char* line = fgets(line_buf, 1024, conf_file);
if (line == NULL) {
break;
}
/* If this line is empty or a comment, just ignore it */
if ((line_buf[0] == '\n') || (line_buf[0] == '#')) {
err = 0;
continue;
}
/* Parse line: Format "<var> <value>\n" */
err = sscanf(line, "%s %s\n", name_str, value_str);
if (err != 2) {
fprintf(stderr, "%s:%d: Invalid IPv4 Configuration file format.\n",
filename, linenum);
fprintf(stderr, "%s:%d: Format must be: <var> <value>\n",
filename, linenum);
err = -1;
} else {
/* Parse read name/value pair */
if (strcasecmp(name_str, "Interface") == 0) {
strcpy(ifname, value_str);
ifname_read = 1;
err = 0;
} else if (strcasecmp(name_str, "IPv4Address") == 0) {
err = ipv4_str_addr(value_str, addr);
if (err != 0) {
fprintf(stderr, "%s:%d: Invalid 'IPv4Address' value: \"%s\"\n",
filename, linenum, value_str);
} else {
addr_read = 1;
}
} else if (strcasecmp(name_str, "SubnetMask") == 0) {
err = ipv4_str_addr(value_str, netmask);
if (err != 0) {
fprintf(stderr, "%s:%d: Invalid 'SubnetMask' value: \"%s\"\n",
filename, linenum, value_str);
} else {
netmask_read = 1;
}
} else {
fprintf(stderr, "%s:%d: Unknown variable: \"%s\"\n",
filename, linenum, name_str);
err = -1;
}
}
}
if (err == 0) {
if (ifname_read == 0) {
fprintf(stderr, "%s: Missing 'Interface' value\n", filename);
err = -1;
}
if (addr_read == 0) {
fprintf(stderr, "%s: Missing 'IPv4Address' value\n", filename);
err = -1;
}
if (netmask_read == 0) {
fprintf(stderr, "%s: Missing 'SubnetMask' value\n", filename);
err = -1;
}
}
/* Close IPv4 Configuration file */
fclose(conf_file);
return err;
}