I wrote a small application in C I want to use as a CGI-Programm with Busybox.
The program gets the IP of a client via CGI (with stdlib getenv("REMOTE_ADDR")) and does
an ARP-request to get the corresponding MAC-address.
My app works when compiled on a standard debian installation.
I get an ioctl-error on my OpenWRT.
Sure, I cross-compiled it with the SDK like that:
./staging_dir_mipsel/bin/mipsel-linux-uclibc-gcc-3.4.4 myapp.c -o index.cgi
This is the part of the code doing the arp-request:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if_arp.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#define INTERFACE "br0"
int main(void) {
char *cgiraddr;
int s,x;
struct arpreq a;
struct sockaddr_in * sin;
struct in_addr addr;
char macaddr[18]= "\0";
char macpart[3] = "\0";
if ((s = socket(AF_INET,SOCK_DGRAM,0) == -1)) {
printf("ERROR: Socket error");
return -1;
}
cgiraddr = getenv("REMOTE_ADDR");
if(cgiraddr!=NULL) {
// prepare ARP-Request
memset(&a,0,sizeof(a));
strcpy(a.arp_dev,INTERFACE);
sin = (struct sockaddr_in *) &(a.arp_pa);
sin->sin_family = AF_INET;
a.arp_flags = ATF_PUBL;
if (! inet_aton(cgiraddr,&addr)) {
printf("ERROR: could not convert IP address.");
return EXIT_FAILURE;
}
// perform ARP-Request
memcpy(&sin->sin_addr,&addr,sizeof(struct in_addr));
if (ioctl(s,SIOCGARP,&a) < 0) { // <--- I get the Error here
printf("ERROR: ioctl error");
return EXIT_FAILURE;
}
//convert MAC as formatted string
for (x=0;x<6;x++) {
sprintf(macpart,"%02x",a.arp_ha.sa_data[x] & 0xff);
strncat(macaddr,macpart,2);
strncat(macaddr,x==5 ?" ":":",1);
}
// Output HTML-Page
printf("Content-Type: text/html\n");
printf("<html><head><title>Mac-Addr</title></head>\n");
printf("<body>\n");
printf("MAC: %s",macaddr);
printf("</body></html>\n");
} else {
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
Normal arp -a with the IP-Adress gives an correct answer.
(Last edited by Lace on 29 Dec 2006, 22:32)