[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

Re: (how to fetch mac address) arp



> dedicated machine which is alloted him/her. so i have made my authentication
> based on IP. Now smart guy changes their IP address to use other person's
> account. So now i want to restrict them at their mac address.

ok i get the point... since you already have the IP address, all you
want to do is to get the MAC address for it... i suggest that you do the
following - at start maintain a database of all IPs and their respective
MAC addressess... next whenever a request for login comes from a
particular machine, you use a system call to map the IP to its MAC
address... and then cross-check this information from the database
you've maintained... (by database i mean a simple text file...)

for the IP->ARP mapping you could use the following code... (i've
borrowed it from Steven's Unix Net Prog vol 1.. refer to that book for
more details...) note: unp.h is the author's own header - it contains
declarations for all system header files to be included and some other
constants... 

source code follows...
-----------------------------------------------

#include        "unp.h"
#include        <net/if_arp.h>

int
main(int argc, char **argv)
{
        int                                     family, sockfd;
        char                            str[INET6_ADDRSTRLEN];
        char                            **pptr;
        unsigned char           *ptr;
        struct arpreq           arpreq;
        struct sockaddr_in      *sin;

        pptr = my_addrs(&family);
        for ( ; *pptr != NULL; pptr++) {
                printf("%s: ", Inet_ntop(family, *pptr, str,
sizeof(str)));
                switch (family) {
                case AF_INET:
                        sockfd = Socket(AF_INET, SOCK_DGRAM, 0);

                        sin = (struct sockaddr_in *) &arpreq.arp_pa;
                        bzero(sin, sizeof(struct sockaddr_in));
                        sin->sin_family = AF_INET;
                        memcpy(&sin->sin_addr, *pptr, sizeof(struct
in_addr));

                        Ioctl(sockfd, SIOCGARP, &arpreq);

                        ptr = &arpreq.arp_ha.sa_data[0];
                        printf("%x:%x:%x:%x:%x:%x\n", *ptr, *(ptr+1),
                                   *(ptr+2), *(ptr+3), *(ptr+4),
*(ptr+5));
                        break;

                default:
                        err_quit("unsupported address family: %d",
family);
                }
        }
        exit(0);
}
-----------------------------------

hope this helps....

bye,
Abhas Abhinav
DeepRoot Linux
Ahmedabad, INDIA.