[Listener] Better handling of threads
Fix thread headers, check the return value of pthread_create(), and wait for the threads at the end of the program.
This commit is contained in:
parent
fd4b51aeff
commit
f71a4650e2
|
@ -69,6 +69,7 @@ enum {MODE_ACTIVE = 'a', MODE_PASSIVE = 'p', MODE_MIXED = 'm'} ;
|
||||||
#define ERR_OPENING_IFACE 2 // Error when opening capture interface
|
#define ERR_OPENING_IFACE 2 // Error when opening capture interface
|
||||||
#define ERR_BAD_USAGE 3 // Bad program call
|
#define ERR_BAD_USAGE 3 // Bad program call
|
||||||
#define ERR_PARSING_CONFIG_FILE 4 // Error reading the configuration file
|
#define ERR_PARSING_CONFIG_FILE 4 // Error reading the configuration file
|
||||||
|
#define ERR_CREATING_THREAD 6 // Error creating a thread
|
||||||
|
|
||||||
|
|
||||||
/* Function headers */
|
/* Function headers */
|
||||||
|
@ -81,7 +82,7 @@ void print_configuration(void) ;
|
||||||
#endif // DEBUG
|
#endif // DEBUG
|
||||||
|
|
||||||
#ifdef USE_PTHREAD
|
#ifdef USE_PTHREAD
|
||||||
void keep_mode_monitor(char *iface) ;
|
void* keep_mode_monitor(void *iface) ;
|
||||||
#endif // USE_PTHREAD
|
#endif // USE_PTHREAD
|
||||||
int capture(void) ;
|
int capture(void) ;
|
||||||
void read_packet(u_char *args, const struct pcap_pkthdr *header,
|
void read_packet(u_char *args, const struct pcap_pkthdr *header,
|
||||||
|
@ -90,8 +91,8 @@ void get_mac_addr(char *eth, uint8_t mac_bytes[6]) ;
|
||||||
void get_ip_addr(char *eth, char *ip_bytes) ;
|
void get_ip_addr(char *eth, char *ip_bytes) ;
|
||||||
|
|
||||||
#ifdef USE_PTHREAD
|
#ifdef USE_PTHREAD
|
||||||
void autocalibrate(void) ;
|
void* autocalibrate(void *NULL_value) ;
|
||||||
void autocalibrate_hello(void) ;
|
void* autocalibrate_hello(void *NULL_value) ;
|
||||||
void send_autocalibration_request(void) ;
|
void send_autocalibration_request(void) ;
|
||||||
uint_fast16_t make_packet(uint8_t **packet) ;
|
uint_fast16_t make_packet(uint8_t **packet) ;
|
||||||
#endif // USE_PTHREAD
|
#endif // USE_PTHREAD
|
||||||
|
|
|
@ -104,19 +104,89 @@ int main(int argc, char *argv[])
|
||||||
#ifdef USE_PTHREAD
|
#ifdef USE_PTHREAD
|
||||||
/* Set up threads */
|
/* Set up threads */
|
||||||
if (GET_KEEP_MONITOR())
|
if (GET_KEEP_MONITOR())
|
||||||
pthread_create(&keep_monitor_thread, NULL,
|
{
|
||||||
(void *) &keep_mode_monitor, GET_WIFI_IFACE()) ;
|
ret = pthread_create(&keep_monitor_thread, NULL,
|
||||||
|
&keep_mode_monitor, GET_WIFI_IFACE()) ;
|
||||||
|
if (ret != 0)
|
||||||
|
{
|
||||||
|
perror("Cannot create keep monitor thread") ;
|
||||||
|
ret = ERR_CREATING_THREAD ;
|
||||||
|
goto exit ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (GET_AUTOCALIBRATION())
|
if (GET_AUTOCALIBRATION())
|
||||||
{
|
{
|
||||||
pthread_create(&autocalibration_thread, NULL,
|
ret = pthread_create(&autocalibration_thread, NULL,
|
||||||
(void *) &autocalibrate, NULL) ;
|
&autocalibrate, NULL) ;
|
||||||
pthread_create(&autocalibration_hello_thread, NULL,
|
if (ret != 0)
|
||||||
(void *) &autocalibrate_hello, NULL) ;
|
{
|
||||||
|
perror("Cannot create autocalibration thread") ;
|
||||||
|
ret = ERR_CREATING_THREAD ;
|
||||||
|
goto exit ;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = pthread_create(&autocalibration_hello_thread, NULL,
|
||||||
|
&autocalibrate_hello, NULL) ;
|
||||||
|
if (ret != 0)
|
||||||
|
{
|
||||||
|
perror("Cannot create autocalibration hello thread") ;
|
||||||
|
ret = ERR_CREATING_THREAD ;
|
||||||
|
goto exit ;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif // USE_PTHREAD
|
#endif // USE_PTHREAD
|
||||||
|
|
||||||
ret = capture() ; // Capture loop
|
ret = capture() ; // Capture loop
|
||||||
|
|
||||||
|
/* Wait for the threads to terminate */
|
||||||
|
|
||||||
|
if (GET_KEEP_MONITOR())
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Waiting for the keep mode monitor thread... ") ;
|
||||||
|
if (pthread_join(keep_monitor_thread, NULL) != 0)
|
||||||
|
perror("Cannot join keep mode monitor thread") ;
|
||||||
|
else
|
||||||
|
fprintf(stderr, "OK.\n") ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GET_AUTOCALIBRATION())
|
||||||
|
{
|
||||||
|
// We must cancel this thread because it can be blocked on the
|
||||||
|
// recvfrom() call:
|
||||||
|
fprintf(stderr,
|
||||||
|
"Cancelling the autocalibration thread... ") ;
|
||||||
|
if (pthread_cancel(autocalibration_thread) != 0)
|
||||||
|
perror("Cannot cancel autocalibration thread") ;
|
||||||
|
else
|
||||||
|
fprintf(stderr, "OK.\n") ;
|
||||||
|
|
||||||
|
fprintf(stderr,
|
||||||
|
"Waiting for the autocalibration thread... ") ;
|
||||||
|
if (pthread_join(autocalibration_thread, NULL) != 0)
|
||||||
|
perror("Cannot join autocalibration thread") ;
|
||||||
|
else
|
||||||
|
fprintf(stderr, "OK.\n") ;
|
||||||
|
|
||||||
|
// We must cancel this thread if we do not want to wait
|
||||||
|
// autocalibration_hello_delay seconds (in the worst case):
|
||||||
|
fprintf(stderr,
|
||||||
|
"Cancelling the autocalibration hello thread... ") ;
|
||||||
|
if (pthread_cancel(autocalibration_hello_thread) != 0)
|
||||||
|
perror("Cannot cancel autocalibration hello thread") ;
|
||||||
|
else
|
||||||
|
fprintf(stderr, "OK.\n") ;
|
||||||
|
|
||||||
|
fprintf(stderr,
|
||||||
|
"Waiting for the autocalibration hello thread... ") ;
|
||||||
|
if (pthread_join(autocalibration_hello_thread, NULL) != 0)
|
||||||
|
perror("Cannot join autocalibration hello thread") ;
|
||||||
|
else
|
||||||
|
fprintf(stderr, "OK.\n") ;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Last cleaning tasks */
|
||||||
|
exit:
|
||||||
#ifdef USE_CONFIG_FILE
|
#ifdef USE_CONFIG_FILE
|
||||||
cfg_free(cfg) ; // Clean configuration
|
cfg_free(cfg) ; // Clean configuration
|
||||||
#endif // USE_CONFIG_FILE
|
#endif // USE_CONFIG_FILE
|
||||||
|
@ -491,7 +561,7 @@ void print_configuration()
|
||||||
* Thread function. Switches interface 'iface' to monitor mode every
|
* Thread function. Switches interface 'iface' to monitor mode every
|
||||||
* second.
|
* second.
|
||||||
*/
|
*/
|
||||||
void keep_mode_monitor(char *iface)
|
void* keep_mode_monitor(void *iface)
|
||||||
{
|
{
|
||||||
if (GET_VERBOSE())
|
if (GET_VERBOSE())
|
||||||
fprintf(stderr, "Thread for keeping monitor mode launched.\n") ;
|
fprintf(stderr, "Thread for keeping monitor mode launched.\n") ;
|
||||||
|
@ -499,9 +569,11 @@ void keep_mode_monitor(char *iface)
|
||||||
while (run)
|
while (run)
|
||||||
{
|
{
|
||||||
// Switch the interface to monitor mode:
|
// Switch the interface to monitor mode:
|
||||||
owl_iface_mode_monitor(iface) ;
|
owl_iface_mode_monitor((char*) iface) ;
|
||||||
sleep(1) ; // Wait for 1 second
|
sleep(1) ; // Wait for 1 second
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pthread_exit(NULL) ;
|
||||||
}
|
}
|
||||||
#endif // USE_PTHREAD
|
#endif // USE_PTHREAD
|
||||||
|
|
||||||
|
@ -958,7 +1030,7 @@ void get_ip_addr(char *eth, char ip[16])
|
||||||
/* *** Autocalibration functions *** */
|
/* *** Autocalibration functions *** */
|
||||||
#ifdef USE_PTHREAD
|
#ifdef USE_PTHREAD
|
||||||
|
|
||||||
void autocalibrate_hello()
|
void* autocalibrate_hello(void *NULL_value)
|
||||||
{
|
{
|
||||||
int send_sockfd ;
|
int send_sockfd ;
|
||||||
struct sockaddr_in serv;
|
struct sockaddr_in serv;
|
||||||
|
@ -982,11 +1054,13 @@ void autocalibrate_hello()
|
||||||
}
|
}
|
||||||
|
|
||||||
(void) close(send_sockfd) ;
|
(void) close(send_sockfd) ;
|
||||||
|
|
||||||
|
pthread_exit(NULL_value) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void autocalibrate()
|
void* autocalibrate(void *NULL_value)
|
||||||
{
|
{
|
||||||
int nread ; // recvfrom return value
|
int nread ; // recvfrom return value
|
||||||
struct sockaddr_in client; // UDP client structure
|
struct sockaddr_in client; // UDP client structure
|
||||||
|
@ -1039,6 +1113,8 @@ void autocalibrate()
|
||||||
}
|
}
|
||||||
|
|
||||||
(void) close(listen_sockfd) ;
|
(void) close(listen_sockfd) ;
|
||||||
|
|
||||||
|
pthread_exit(NULL_value) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue