0
*/etc/network/interfacesを読み、* ethernet_t []に保存し、値を変更してインタフェースに書き戻すための小さなプログラムを書く。主な機能はすべて正常に動作します。しかし、関数としてコードを分けることはできず、配列のポインタを渡すことはできません。以下の私のコードです:関数のパラメータとしてポインタを使用して読み書きするネットワークを解析する
#include <stdio.h>
#include <ctype.h>
typedef struct {
char sys_ifname[10];
char address[20];
char netmask[20];
char network[20];
char gateway[20];
protocol_e protocol;
} ethernet_t;
#define MAX_NIC 4
char *removing_leading_and_trailing_whitespace(char *a);
int
write_to_interface (ethernet_t *interface[], const char *filename)
{
FILE *fp;
/* should grant root privilege */
if ((fp = fopen(filename, "w")) == NULL) {
perror ("fopen");
exit (-1);
}
printf ("File open %s for writing successfully\n", filename);
/* set DHCP for test */
interface[2]->protocol = DHCP;
fprintf (fp, "# /etc/network/interface\n");
fprintf (fp, "\nauto lo\n");
fprintf (fp, "iface lo inet loopback\n");
int i;
for (i=0; i<MAX_NIC; i++) {
printf ("\nauto %s\n", interface[i]->sys_ifname);
fprintf (fp, "\nauto %s\n", interface[i]->sys_ifname);
fprintf (fp, "iface %s inet %s\n", interface[i]->sys_ifname,
interface[i]->protocol == DHCP ? "dhcp" : "static");
if (interface[i]->protocol == STATIC) {
fprintf (fp, "\taddress %s\n", interface[i]->address);
fprintf (fp, "\tnetmaks %s\n", interface[i]->netmask);
fprintf (fp, "\tnetwork %s\n", interface[i]->network);
fprintf (fp, "\tgateway %s\n", interface[i]->gateway);
}
}
fclose(fp);
printf ("Done!\n");
return 0;
}
int
main(void)
{
int i;
char line[256];
char *p;
FILE *fp;
ethernet_t interface[MAX_NIC];
ethernet_t *current_interface = NULL;
bzero(interface, sizeof(ethernet_t) * MAX_NIC);
#if YOCTO
const char *filename = "/etc/network/interfaces";
#else
const char *filename = "/etc/network/interfaces.ubuntu";
#endif
if ((fp = fopen(filename, "r")) == NULL) {
perror ("fopen");
exit (-1);
}
i = 0;
current_interface = interface;
while (fgets(line, sizeof(line), fp) && i <= MAX_NIC) {
p = removing_leading_and_trailing_whitespace(line);
if (strlen(p) && p[0] != '#') {
/* scan for interface name */
if (strstr(p, "auto")) {
p = removing_leading_and_trailing_whitespace(p + strlen("auto"));
if (strcmp(p, "lo") != 0) { /* interface lo is loopback */
current_interface = interface + i;
/* interface default STATIC */
current_interface->protocol = STATIC;
strcpy (current_interface->sys_ifname, p);
i++;
}
}
else if (strstr(p, "dhcp") && current_interface) {
current_interface->protocol = DHCP;
}
else if (strstr(p, "address") && current_interface) {
p = removing_leading_and_trailing_whitespace(p + strlen("address"));
memcpy (current_interface->address, p, strlen(p));
}
else if (strstr(p, "netmask") && current_interface) {
p = removing_leading_and_trailing_whitespace(p + strlen("netmask"));
memcpy (current_interface->netmask, p, strlen(p));
}
else if (strstr(p, "network") && current_interface) {
p = removing_leading_and_trailing_whitespace(p + strlen("network"));
memcpy (current_interface->network, p, strlen(p));
}
else if (strstr(p, "gateway") && current_interface) {
p = removing_leading_and_trailing_whitespace(p + strlen("gateway"));
memcpy (current_interface->gateway, p, strlen(p));
}
} /* if (strlen(p) && p[0] != '#') */
} /* while */
fclose (fp);
#if 1
write_to_interface ((ethernet_t **)interface, filename);
#else
/* should grant root privilege */
if ((fp = fopen(filename, "w")) == NULL) {
perror ("fopen");
exit (-1);
}
printf ("File open %s for writing successfully\n", filename);
interface[2].protocol = DHCP;
fprintf (fp, "# /etc/network/interface\n");
fprintf (fp, "# was auto generated by Vicom\n");
fprintf (fp, "\nauto lo\n");
fprintf (fp, "iface lo inet loopback\n");
for (i=0; i<MAX_NIC; i++) {
fprintf (fp, "\nauto %s\n", interface[i].sys_ifname);
fprintf (fp, "iface %s inet %s\n", interface[i].sys_ifname,
interface[i].protocol == DHCP ? "dhcp" : "static");
if (interface[i].protocol == STATIC) {
fprintf (fp, "\taddress %s\n", interface[i].address);
fprintf (fp, "\tnetmaks %s\n", interface[i].netmask);
fprintf (fp, "\tnetwork %s\n", interface[i].network);
fprintf (fp, "\tgateway %s\n", interface[i].gateway);
}
}
fclose(fp);
printf ("Done!\n");
#endif
return 0;
}
私はLinux上でそれを実行すると、私は私の質問が適切に機能してどのように配列のポインタデリファレンスです
File open /etc/network/interfaces.ubuntu for writing successfully Segmentation fault (core dumped)
を得ましたか。
しかし、 'interface'は構造体の配列であり、構造体へのポインタの配列ではありませんか?では、なぜそれをポインタの配列として渡そうとしていますか?それは意味をなさない。 –
あなたの関数は単に 'ethernet_t * interface'とsizeパラメータを受け入れます。 – StoryTeller
ありがとう、私はできるだけ早く試してみます。 –