From d37b6dd45958c0fe542013bc60c74c7b74a1700b Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Fri, 25 Jun 2004 14:39:38 +0000
Subject: [PATCH] Add Tilghman's -R option to allow reconnecting when
 disconnected (bug #1916)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3302 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 asterisk.c | 33 +++++++++++++++++++++++++++++++--
 1 file changed, 31 insertions(+), 2 deletions(-)

diff --git a/asterisk.c b/asterisk.c
index e4ca793ccd..91680eee21 100755
--- a/asterisk.c
+++ b/asterisk.c
@@ -70,6 +70,7 @@ int option_initcrypto=0;
 int option_nocolor;
 int option_dumpcore = 0;
 int option_overrideconfig = 0;
+int option_reconnect = 0;
 int fully_booted = 0;
 
 static int ast_socket = -1;		/* UNIX Socket for allowing remote control */
@@ -871,7 +872,29 @@ static int ast_el_read_char(EditLine *el, char *cp)
 			/* if the remote side disappears exit */
 			if (res < 1) {
 				fprintf(stderr, "\nDisconnected from Asterisk server\n");
-				quit_handler(0, 0, 0, 0);
+				if (!option_reconnect) {
+					quit_handler(0, 0, 0, 0);
+				} else {
+					int tries;
+					int reconnects_per_second = 10;
+					fprintf(stderr, "\nAttempting to reconnect for 30 seconds\n");
+					for (tries=0;tries<30 * reconnects_per_second;tries++) {
+						if (ast_tryconnect()) {
+							printf(term_quit());
+							ast_register_verbose(console_verboser);
+							ast_verbose( "Asterisk " ASTERISK_VERSION ", Copyright (C) 1999-2004 Digium.\n");
+							ast_verbose( "Written by Mark Spencer <markster@digium.com>\n");
+							ast_verbose( "=========================================================================\n");
+							break;
+						} else {
+							usleep(1000000 / reconnects_per_second);
+						}
+					}
+					if (tries >= 30) {
+						fprintf(stderr, "Failed to reconnect for 30 seconds.  Quitting.\n");
+						quit_handler(0, 0, 0, 0);
+					}
+				}
 			}
 
 			buf[res] = '\0';
@@ -1394,6 +1417,7 @@ static int show_cli_help(void) {
 	printf("   -p              Run as pseudo-realtime thread\n");
 	printf("   -q              Quiet mode (supress output)\n");
 	printf("   -r              Connect to Asterisk on this machine\n");
+	printf("   -R              Connect to Asterisk, and attempt to reconnect if disconnected\n");
 	printf("   -v              Increase verbosity (multiple v's = more verbose)\n");
 	printf("   -x <cmd>        Execute command <cmd> (only valid with -r)\n");
 	printf("\n");
@@ -1498,7 +1522,7 @@ int main(int argc, char *argv[])
 	}
 	*/
 	/* Check for options */
-	while((c=getopt(argc, argv, "hfdvqprgcinx:C:")) != -1) {
+	while((c=getopt(argc, argv, "hfdvqprRgcinx:C:")) != -1) {
 		switch(c) {
 		case 'd':
 			option_debug++;
@@ -1518,6 +1542,11 @@ int main(int argc, char *argv[])
 			option_remote++;
 			option_nofork++;
 			break;
+		case 'R':
+			option_remote++;
+			option_nofork++;
+			option_reconnect++;
+			break;
 		case 'p':
 			option_highpriority++;
 			break;
-- 
GitLab