[PATCH/RFC V2 14/26] tun, cstp: Don't exit() on failure

Kevin Cernekee cernekee at gmail.com
Sun Aug 11 21:49:15 EDT 2013


These files are part of a library now so they should report errors back
to the caller.

Signed-off-by: Kevin Cernekee <cernekee at gmail.com>
---
 cstp.c |    9 +++++----
 tun.c  |   20 +++++++++++---------
 2 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/cstp.c b/cstp.c
index 71fde30..4c15d0d 100644
--- a/cstp.c
+++ b/cstp.c
@@ -196,8 +196,9 @@ static int start_cstp_connection(struct openconnect_info *vpninfo)
 	if (vpninfo->dtls_times.last_rekey + vpninfo->dtls_times.rekey <
 	    time(NULL) + 300 &&
 	    openconnect_random(vpninfo->dtls_secret, sizeof(vpninfo->dtls_secret))) {
-		fprintf(stderr, _("Failed to initialise DTLS secret\n"));
-		exit(1);
+		vpn_progress(vpninfo, PRG_ERR,
+			     _("Failed to initialise DTLS secret\n"));
+		return -EIO;
 	}
 
  retry:
@@ -238,7 +239,7 @@ static int start_cstp_connection(struct openconnect_info *vpninfo)
 				vpn_progress(vpninfo, PRG_ERR,
 					     _("Failed to open HTTPS connection to %s\n"),
 					     vpninfo->hostname);
-				exit(1);
+				return -EIO;
 			}
 			goto retry;
 		}
@@ -264,7 +265,7 @@ static int start_cstp_connection(struct openconnect_info *vpninfo)
 			     _("Got inappropriate HTTP CONNECT response: %s\n"),
 			     buf);
 		if (!strncmp(buf, "HTTP/1.1 401 ", 13))
-			exit(2);
+			return -EPERM;
 		return -EINVAL;
 	}
 
diff --git a/tun.c b/tun.c
index e4f7a5e..2edb8d9 100644
--- a/tun.c
+++ b/tun.c
@@ -508,7 +508,7 @@ static int os_setup_tun(struct openconnect_info *vpninfo)
 		vpn_progress(vpninfo, PRG_ERR,
 			     _("Failed to open tun device: %s\n"),
 			     strerror(tunerr));
-		exit(1);
+		return -EIO;
 	}
 	memset(&ifr, 0, sizeof(ifr));
 	ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
@@ -519,7 +519,7 @@ static int os_setup_tun(struct openconnect_info *vpninfo)
 		vpn_progress(vpninfo, PRG_ERR,
 			     _("TUNSETIFF failed: %s\n"),
 			     strerror(errno));
-		exit(1);
+		return -EIO;
 	}
 	if (!vpninfo->ifname)
 		vpninfo->ifname = strdup(ifr.ifr_name);
@@ -615,8 +615,10 @@ static int os_setup_tun(struct openconnect_info *vpninfo)
 				break;
 		}
 		if (tun_fd < 0) {
-			perror(_("open tun"));
-			exit(1);
+			vpn_progress(vpninfo, PRG_ERR,
+				     _("Failed to open tun device: %s\n"),
+				     strerror(errno));
+			return -EIO;
 		}
 		vpninfo->ifname = strdup(tun_name + 5);
 	}
@@ -624,7 +626,7 @@ static int os_setup_tun(struct openconnect_info *vpninfo)
 	i = 1;
 	if (ioctl(tun_fd, TUNSIFHEAD, &i) < 0) {
 		perror(_("TUNSIFHEAD"));
-		exit(1);
+		return -EIO;
 	}
 #endif
 #endif
@@ -657,13 +659,13 @@ int openconnect_setup_tun_script(struct openconnect_info *vpninfo, char *tun_scr
 
 	set_script_env(vpninfo);
 	if (socketpair(AF_UNIX, SOCK_DGRAM, 0, fds)) {
-		perror(_("socketpair"));
-		exit(1);
+		vpn_progress(vpninfo, PRG_ERR, _("socketpair failed: %s\n"), strerror(errno));
+		return -EIO;
 	}
 	child = fork();
 	if (child < 0) {
-		perror(_("fork"));
-		exit(1);
+		vpn_progress(vpninfo, PRG_ERR, _("fork failed: %s\n"), strerror(errno));
+		return -EIO;
 	} else if (!child) {
 		if (setpgid(0, getpid()) < 0)
 			perror(_("setpgid"));
-- 
1.7.9.5




More information about the openconnect-devel mailing list