IOCTL SIOCGIWSCAN ошибка E2BIG
Я пытаюсь использовать IOCTL "SIOCGIWSCAN" от беспроводного добавочного номера, чтобы получить результат сканирования из драйвера:
проблема в том, что iwrq.u.data.length всегда равен 0, и я постоянно получаю ошибку E2BIG.
Любая идея об этой ошибке и каковы возможные причины этого?
это фрагмент кода, который используется для получения результата сканирования "это похоже на команду iwlist от беспроводных инструментов": Примечание: iwlist отлично работает: "сканирование iwlist wlan0" дает результат сканирования?
....
while (true) {
fd_set rfds;
int last_fd;
int retc;
// re init
FD_ZERO(&rfds);
last_fd = -1;
retc = select(last_fd + 1, &rfds, NULL, NULL, &time_out);
int ret_errno = errno;
if(retc < 0) // errno check the type
{
if(ret_errno == EAGAIN || ret_errno == EINTR)
{
continue; // try another time
}
goto exit;
}
if(retc == 0)
{
iwrq.u.data.pointer = buffer;
iwrq.u.data.length = data_length;
iwrq.u.data.flags = 0 ;
if(ioctl(sk_fd, SIOCGIWSCAN , &iwrq) < 0){
errn = errno;
if(errn == EAGAIN)
{
if(num_try > 0){
num_try --; // decrease max try
}
else
{
goto exit;
}
time_out.tv_sec = 0;
time_out.tv_usec = 300000; // sleep for 300 ms
continue;
}
else if(errn == E2BIG){
// buffer too small to hold result
// extend it
if(iwrq.u.data.length > data_length)
{
data_length *= 2;
buffer =(char *) realloc(buffer,data_length * sizeof(char));
if(!buffer){
goto exit;
}
}
// setup timer
time_out.tv_sec = 0;
time_out.tv_usec = 300000; // 100 ms
continue; // try again
}
//ioctl Wireless Scan Unhandled ERROR
goto exit;
}else
{
break; // we have result go and parse it
}
}
/// parse scan result section
....