All pastes #35900 Raw Edit

Mine

public text v1 · immutable
#35900 ·published 2006-01-05 20:38 UTC
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();
}