#include #include #include 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(); }