#include
#include

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

#include
#include

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char* argv[])
{
    int fd_arp;      /* socket fd for receive packets */
    char device[10]; /* ethernet device name */
    u_char *ptr;
    struct in_addr myip, mymask;
    struct ifreq ifr; /* ifr structure */
    struct sockaddr_in *sin_ptr;

    if(argc < 2)
        strcpy(device, "eth0");
    else
        strcpy(device, argv[1]);
    strcpy(ifr.ifr_name, device);

    if ((fd_arp = socket(AF_INET, SOCK_PACKET, htons(0x0806))) < 0) {
        perror( "arp socket error");
        return -1;
    }

    /* ifr.ifr_addr.sa_family = AF_INET; */

    /* get ip address of my interface */
    if(ioctl(fd_arp, SIOCGIFADDR, &ifr) < 0) {
        perror("ioctl SIOCGIFADDR error");
        myip.s_addr = 0;
    }
    else {
        sin_ptr = (struct sockaddr_in *)&ifr.ifr_addr;
        myip = sin_ptr->sin_addr;
    }

    /* get network mask of my interface */
    if (ioctl(fd_arp, SIOCGIFNETMASK, &ifr) < 0) {
        perror("ioctl SIOCGIFNETMASK error");
        mymask.s_addr = 0;
    }
    else {
        sin_ptr = (struct sockaddr_in *)&ifr.ifr_addr;
        mymask = sin_ptr->sin_addr;
    }

    /* get mac address of the interface */
    if (ioctl(fd_arp, SIOCGIFHWADDR, &ifr) < 0) {
        perror("ioctl SIOCGIFHWADDR error");
        ptr = NULL;
    }
    else {
        ptr = (u_char *)&ifr.ifr_ifru.ifru_hwaddr.sa_data[0];
    }

    printf( "device: %s\n", device);
    printf( "request netmask %s\n", inet_ntoa(mymask));
    printf( "request IP %s\n", inet_ntoa(myip));
    if (ptr)
        printf( "request mac %02x:%02x:%02x:%02x:%02x:%02x\n",
            *ptr, *(ptr + 1), *(ptr + 2), *(ptr + 3),
            *(ptr + 4), *(ptr + 5) );
    else
        printf( "request mac ?:?:?:?:?:?\n");

    return 0;
}

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define BUFSIZE 2048
#define DEBUG

struct route_info{
        struct in_addr dstAddr;
        struct in_addr srcAddr;
        struct in_addr gateWay;
        char ifName[IF_NAMESIZE];
};

int readNlSock(int sockFd, char *bufPtr, int seqNum, int pId)
{
        struct nlmsghdr *nlHdr;
        int readLen = 0, msgLen = 0;

        do {    /* Recieve response from the kernel */
                if((readLen = recv(sockFd, bufPtr, BUFSIZE - msgLen, 0)) < 0) {
                        perror("SOCK READ: ");
                        return -1;
                }
                nlHdr = (struct nlmsghdr *)bufPtr;

                /* Check if the header is valid */
                if((NLMSG_OK(nlHdr, readLen) == 0) || (nlHdr->nlmsg_type == NLMSG_ERROR)) {
                        perror("Error in recieved packet");
                        return -1;
                }

                /* Check if the its the last message */
                if(nlHdr->nlmsg_type == NLMSG_DONE) {
                        break;
                }
                else {
                        /* Else move the pointer to buffer appropriately */
                        bufPtr += readLen;
                        msgLen += readLen;
                }

                /* Check if its a multi part message */
                if((nlHdr->nlmsg_flags & NLM_F_MULTI) == 0) {
                        /* return if its not */
                        break;
                }
        } while((nlHdr->nlmsg_seq != seqNum) || (nlHdr->nlmsg_pid != pId));

        return msgLen;
}
#ifdef DEBUG
/* For printing the routes. */
void printRoute(struct route_info *rtInfo)
{
        char tempBuf[512];

        /* Print Destination address */
        if(rtInfo->dstAddr.s_addr != 0)
                strcpy(tempBuf, inet_ntoa(rtInfo->dstAddr));
        else
                sprintf(tempBuf,"*.*.*.*\t");
        fprintf(stdout,"%s\t", tempBuf);

        /* Print Gateway address */
        if(rtInfo->gateWay.s_addr != 0)
                strcpy(tempBuf, inet_ntoa(rtInfo->gateWay));
        else
                sprintf(tempBuf,"*.*.*.*\t");
        fprintf(stdout,"%s\t", tempBuf);

        /* Print Interface Name*/
        fprintf(stdout,"%s\t\t", rtInfo->ifName);

        /* Print Source address */
        if(rtInfo->srcAddr.s_addr != 0)
                strcpy(tempBuf, inet_ntoa(rtInfo->srcAddr));
        else
                sprintf(tempBuf,"*.*.*.*\t");
        fprintf(stdout,"%s\n", tempBuf);
}
#endif
/* For parsing the route info returned */
void parseRoutes(struct nlmsghdr *nlHdr, struct route_info *rtInfo,char *gateway)
{
        struct rtmsg *rtMsg;
        struct rtattr *rtAttr;
        int rtLen;
        char *tempBuf = NULL;

        tempBuf = (char *)malloc(100);
        rtMsg = (struct rtmsg *)NLMSG_DATA(nlHdr);

        /* If the route is not for AF_INET or does not belong to main routing table then return. */
        if((rtMsg->rtm_family != AF_INET) || (rtMsg->rtm_table != RT_TABLE_MAIN))
                return;

        /* get the rtattr field */
        rtAttr = (struct rtattr *)RTM_RTA(rtMsg);
        rtLen = RTM_PAYLOAD(nlHdr);
        for(;RTA_OK(rtAttr,rtLen);rtAttr = RTA_NEXT(rtAttr,rtLen)) {
                switch(rtAttr->rta_type) {
                        case RTA_OIF:
                                if_indextoname(*(int *)RTA_DATA(rtAttr), rtInfo->ifName);
                                break;
                        case RTA_GATEWAY:
                                rtInfo->gateWay.s_addr = *(u_int *)RTA_DATA(rtAttr);
                                break;
                        case RTA_PREFSRC:
                                rtInfo->srcAddr.s_addr = *(u_int *)RTA_DATA(rtAttr);
                                break;
                        case RTA_DST:
                                rtInfo->dstAddr.s_addr = *(u_int *)RTA_DATA(rtAttr);
                                break;
                }
        }
        #ifdef DEBUG
        printRoute(rtInfo);
        #endif

        //printf("%s\n", inet_ntoa(rtInfo->dstAddr));
        if(strstr(inet_ntoa(rtInfo->dstAddr), "0.0.0.0"))
                sprintf(gateway, "%s", inet_ntoa(rtInfo->gateWay));
        free(tempBuf);
        return;
}
int get_gateway(char *gateway)
{
        struct nlmsghdr *nlMsg;
        struct rtmsg *rtMsg;
        struct route_info *rtInfo;
        char msgBuf[BUFSIZE];
        int sock, len, msgSeq = 0;

        /* Create Socket */
        if((sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE)) < 0) {
                perror("Socket Creation: ");
                return -1;
        }

        /* Initialize the buffer */
        memset(msgBuf, 0, BUFSIZE);

        /* point the header and the msg structure pointers into the buffer */
        nlMsg = (struct nlmsghdr *)msgBuf;
        rtMsg = (struct rtmsg *)NLMSG_DATA(nlMsg);

        /* Fill in the nlmsg header*/
        nlMsg->nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); // Length of message.
        nlMsg->nlmsg_type = RTM_GETROUTE; // Get the routes from kernel routing table .

        nlMsg->nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST; // The message is a request for dump.
        nlMsg->nlmsg_seq = msgSeq++; // Sequence of the message packet.
        nlMsg->nlmsg_pid = getpid(); // PID of process sending the request.

        /* Send the request */
        if(send(sock, nlMsg, nlMsg->nlmsg_len, 0) < 0) {
                printf("Write To Socket Failed...\n");
                return -1;
        }

        /* Read the response */
        if((len = readNlSock(sock, msgBuf, msgSeq, getpid())) < 0) {
                printf("Read From Socket Failed...\n");
                return -1;
        }

        /* Parse and print the response */
        rtInfo = (struct route_info *)malloc(sizeof(struct route_info));
        // ADDED BY BOB
        /* THIS IS THE NETTSTAT -RL code I commented out the printing here and in parse routes */
        #ifdef DEBUG
        fprintf(stdout, "Destination\tGateway\t\tInterface\tSource\n");
        #endif
        for(; NLMSG_OK(nlMsg,len); nlMsg=NLMSG_NEXT(nlMsg,len)) {
                memset(rtInfo, 0, sizeof(struct route_info));
                parseRoutes(nlMsg, rtInfo, gateway);
        }
        free(rtInfo);
        close(sock);

        return 0;
}
int main()
{
        char gateway[255]={0};

        get_gateway(gateway);
        printf("Gateway:%s\n", gateway);

        return 0;
}


台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

親手打造 GNU/Linux 中文環境 (五) - 訊息國際化的解決方案 (gettext 簡介)

謝東翰 ,小虫

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()