Improve error reporting.
The return value of pcap_activate() is: 0, if activation succeeded, with no warnings; a non-zero positive number, if activation succeded with a warning - the number is a PCAP_WARNING_ indication of the warning; a negative number, if activation failed - the number is a PCAP_ERROR_ indication of the error. We should not treat non-zero positive numbers as errors. (Printing a warning might be useful.) We should treat non-zero negative numbers as errors, and translate it to an error message using libpcap's own pcap_statustostr(), rather than attempting to duplicate its mapping ourselves, as new error codes may appear in the future, and using pcap_statustostr() future-proofs us against that. In addition, if the error is PCAP_ERROR, we should report the return value of pcap_geterr(handle), as that will provide additional information about that "generic" error.
This commit is contained in:
parent
4316c2659a
commit
2d6e537e60
35
src/init.c
35
src/init.c
|
@ -143,30 +143,27 @@ pcap_t *capture_init(char *capture_source)
|
||||||
pcap_set_timeout(handle, 50);
|
pcap_set_timeout(handle, 50);
|
||||||
pcap_set_rfmon(handle, activate_rfmon);
|
pcap_set_rfmon(handle, activate_rfmon);
|
||||||
pcap_set_promisc(handle, 1);
|
pcap_set_promisc(handle, 1);
|
||||||
if(!(status = pcap_activate(handle)))
|
status = pcap_activate(handle);
|
||||||
|
if(status >= 0) {
|
||||||
|
// Complete success, or success with warning.
|
||||||
|
// XXX - report warning?
|
||||||
return handle;
|
return handle;
|
||||||
|
}
|
||||||
if(status == PCAP_ERROR_RFMON_NOTSUP) {
|
if(status == PCAP_ERROR_RFMON_NOTSUP) {
|
||||||
pcap_set_rfmon(handle, 0);
|
pcap_set_rfmon(handle, 0);
|
||||||
status = pcap_activate(handle);
|
status = pcap_activate(handle);
|
||||||
if(!status) return handle;
|
if(status >= 0) {
|
||||||
|
// Complete success, or success with warning.
|
||||||
|
// XXX - report warning?
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(status < 0) {
|
||||||
|
if(status == PCAP_ERROR)
|
||||||
|
cprintf(CRITICAL, "[X] ERROR: pcap_activate status %d - %s, %s\n", status, pcap_statustostr(status), pcap_geterr(handle));
|
||||||
|
else
|
||||||
|
cprintf(CRITICAL, "[X] ERROR: pcap_activate status %d - %s\n", status, pcap_statustostr(status));
|
||||||
}
|
}
|
||||||
cprintf(CRITICAL, "[X] ERROR: pcap_activate status %d\n", status);
|
|
||||||
static const char *pcap_errmsg[] = {
|
|
||||||
[1] = "generic error code",
|
|
||||||
[2] = "loop terminated by pcap_breakloop",
|
|
||||||
[3] = "the capture needs to be activated",
|
|
||||||
[4] = "the operation can't be performed on already activated captures",
|
|
||||||
[5] = "no such device exists",
|
|
||||||
[6] = "this device doesn't support rfmon (monitor) mode",
|
|
||||||
[7] = "operation supported only in monitor mode",
|
|
||||||
[8] = "no permission to open the device",
|
|
||||||
[9] = "interface isn't up",
|
|
||||||
[10]= "this device doesn't support setting the time stamp type",
|
|
||||||
[11]= "you don't have permission to capture in promiscuous mode",
|
|
||||||
[12]= "the requested time stamp precision is not supported",
|
|
||||||
};
|
|
||||||
if(status < 0 && status > -13)
|
|
||||||
cprintf(CRITICAL, "[X] PCAP: %s\n", pcap_errmsg[-status]);
|
|
||||||
pcap_close(handle);
|
pcap_close(handle);
|
||||||
handle = 0;
|
handle = 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue