From b153f0054dae3ba9fa8dfc3866113b4aee60f66d Mon Sep 17 00:00:00 2001 From: Kevin Cernekee Date: Mon, 8 Feb 2016 22:34:09 -0800 Subject: [PATCH] Convert tun_is_up into an inline function The tunnel state can be figured out by looking at tun_fd or tun_fh, so replace the discrete variable with an inline function. This has the side effect of fixing the case where the tunnel is set up by a library caller prior to entering the mainloop. Signed-off-by: Kevin Cernekee Signed-off-by: David Woodhouse --- mainloop.c | 15 +++++---------- openconnect-internal.h | 9 ++++++++- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/mainloop.c b/mainloop.c index 8b7b9a55..264abc50 100644 --- a/mainloop.c +++ b/mainloop.c @@ -50,7 +50,7 @@ int tun_mainloop(struct openconnect_info *vpninfo, int *timeout) struct pkt *this; int work_done = 0; - if (!vpninfo->tun_is_up) { + if (!tun_is_up(vpninfo)) { /* no tun yet, clear any queued packets */ while ((this = dequeue_packet(&vpninfo->incoming_queue))); return 0; @@ -168,7 +168,6 @@ int openconnect_mainloop(struct openconnect_info *vpninfo, { int ret = 0; - vpninfo->tun_is_up = 0; vpninfo->reconnect_timeout = reconnect_timeout; vpninfo->reconnect_interval = reconnect_interval; @@ -190,7 +189,7 @@ int openconnect_mainloop(struct openconnect_info *vpninfo, /* If tun is not up, loop more often to detect * a DTLS timeout (due to a firewall block) as soon. */ - if (vpninfo->tun_is_up) + if (tun_is_up(vpninfo)) timeout = INT_MAX; else timeout = 1000; @@ -200,14 +199,12 @@ int openconnect_mainloop(struct openconnect_info *vpninfo, * we have a better knowledge of the link MTU. We also * force the creation if DTLS enters sleeping mode - i.e., * we failed to connect on time. */ - if (vpninfo->tun_is_up == 0 && (vpninfo->dtls_state == DTLS_CONNECTED || + if (!tun_is_up(vpninfo) && (vpninfo->dtls_state == DTLS_CONNECTED || vpninfo->dtls_state == DTLS_SLEEPING)) { ret = setup_tun_device(vpninfo); if (ret) { break; } - - vpninfo->tun_is_up = 1; } ret = vpninfo->proto.udp_mainloop(vpninfo, &timeout); @@ -215,13 +212,11 @@ int openconnect_mainloop(struct openconnect_info *vpninfo, break; did_work += ret; - } else if (vpninfo->tun_is_up == 0) { + } else if (!tun_is_up(vpninfo)) { /* No DTLS - setup TUN device unconditionally */ ret = setup_tun_device(vpninfo); if (ret) break; - - vpninfo->tun_is_up = 1; } ret = vpninfo->proto.tcp_mainloop(vpninfo, &timeout); @@ -305,7 +300,7 @@ int openconnect_mainloop(struct openconnect_info *vpninfo, if (vpninfo->quit_reason && vpninfo->proto.vpn_close_session) vpninfo->proto.vpn_close_session(vpninfo, vpninfo->quit_reason); - if (vpninfo->tun_is_up) + if (tun_is_up(vpninfo)) os_shutdown_tun(vpninfo); return ret < 0 ? ret : -EIO; } diff --git a/openconnect-internal.h b/openconnect-internal.h index 7ebf31d5..c3904277 100644 --- a/openconnect-internal.h +++ b/openconnect-internal.h @@ -541,7 +541,6 @@ struct openconnect_info { uid_t uid; gid_t gid; #endif - int tun_is_up; /* whether the tun device is setup */ int use_tun_script; int script_tun; char *ifname; @@ -715,6 +714,14 @@ static inline int set_fd_cloexec(int fd) return fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); #endif } +static inline int tun_is_up(struct openconnect_info *vpninfo) +{ +#ifdef _WIN32 + return vpninfo->tun_fh != NULL; +#else + return vpninfo->tun_fd != -1; +#endif +} #ifdef _WIN32 #define pipe(fds) _pipe(fds, 4096, O_BINARY)