rendered paste body#include <Ecore_Config.h>
#include <sys/types.h>
#include <net/if.h>
struct data {
unsigned long cmd;
unsigned long data;
};
struct interface {
int fd;
char *name;
char *mode;
char *address;
char *netmask;
char *gateway;
struct data edata;
struct ifreq ifr;
};
void *sig_handler(int signum)
{
ending = 0;
}
int ending = 1;
int main(int argc, char **argv)
{
int i, iface_num;
struct interface **e_iface;
struct timespec tspec;
char key[PATH_MAX];
signal(SIGINT, sig_handler)
signal(SIGTERM, sig_handler);
signal(SIGKILL, sig_handler);
if(ecore_config_init("ether") != ECORE_CONFIG_ERR_SUCC) {
printf("Cannot init Ecore_Config\n");
return 1;
}
ecore_config_load();
iface_num = ecore_config_int_get("/iface/count");
e_iface = (struct interface **)malloc(sizeof(struct interface*) * iface_num);
memset(e_iface, 0, sizeof(struct interface *) * iface_num);
for(i = 0; i < iface_num; i++)
{
e_iface[i] = (struct interface *)malloc(sizeof(struct interface));
memset(e_iface[i], 0, sizeof(struct interface));
snprintf(key, PATH_MAX, "/iface/%d/name", i);
e_iface[i]->name = ecore_config_string_get(key);
snprintf(key, PATH_MAX, "/iface/%d/mode", i);
e_iface[i]->mode = ecore_config_string_get(key);
if(!strcmp(e_iface[i]->mode, "static"))
{
snprintf(key, PATH_MAX, "/iface/%d/address", i);
e_iface[i]->address = ecore_config_string_get(key);
snprintf(key, PATH_MAX, "/iface/%d/netmask", i);
e_iface[i]->netmask = ecore_config_string_get(key);
snprintf(key, PATH_MAX, "/iface/%d/gateway", i);
e_iface[i]->gateway = ecore_config_string_get(key);
}
strcpy(e_iface[i]->ifr.ifr_name, e_iface[i]->name);
e_iface[i]->fd = socket(AF_INET, SOCK_DGRAM, 0);
if(e_iface < 0)
printf("Warning: failed to open a socket for interface %s\n", e_iface[i]->name);
e_iface[i]->edata.cmd = 0xa;
e_iface[i]->ifr.ifr_data = (caddr_t)&e_iface[i]->edata;
printf("watching interface %s mode=%s (ip=%s, netmask=%s, gateway=%s)\n", e_iface[i]->name,
e_iface[i]->mode, e_iface[i]->address, e_iface[i]->netmask, e_iface[i]->gateway);
}
memset(&tspec, 0, sizeof(struct timespec));
tspec.tv_sec = 2;
while(ending)
{
nanosleep(&tspec, NULL);
for(i = 0; i < iface_num; i++)
{
ioctl(e_iface[i]->fd, 0x8946, &e_iface[i]->ifr);
printf("interface %s: Link is %s\n", e_iface[i]->name, e_iface[i]->edata.data ? "yes" : "no");
}
}
for(i = 0; i < iface_num; i++)
free(e_iface[i]);
free(e_iface);
ecore_config_shutdown();
}