Click to See Complete Forum and Search --> : Ioctl inline assembly


raghu2383
August 24th, 2008, 04:42 AM
I was trying to call ioctl using inline assembly with system interrupt.

void main()
{
int i, res;

int s = 0;
s = socket(AF_INET,SOCK_STREAM,0);
struct ifreq ifr;
struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_addr;
char * ip;
ifr.ifr_ifindex = 1;
// res = ioctl (s, SIOCGIFNAME, &ifr);
// printf("\n first res %d", res);
// res = ioctl(s, 35088, &ifr);
// printf("\n second result %d", res);
__asm__("sub $12,%%esp\n"
"movl %%edx,(%%esp)\n"
"movl $35088,4(%%esp)\n"
"movl %%ecx,8(%%esp)\n"
"movl $54,%%eax\n" // FOr IOCTL
"movl %%esp,%%ebx\n"
"int $0x80\n"
"add $12,%%esp\n"
:"=a" (res)
:"d" (s), "c" (&ifr)
);
printf("%d", res);
return;
}

The assembly code returns -9, which is an error. Can someone help me out with this code?

raghu2383
August 24th, 2008, 05:00 AM
It is resolved, the correct code was

s = socket(AF_INET,SOCK_STREAM,0);
i = 35088;
__asm__("sub $12,%%esp\n"
"movl $54,%%eax\n"
"int $0x80\n"
"add $12,%%esp\n"
:"=a" (res)
:"b" (s), "c" (i), "d"(&ifr)
);