svn commit: samba r25679 - in branches/SAMBA_4_0/source/lib/replace: .

metze at samba.org metze at samba.org
Wed Oct 17 14:00:24 GMT 2007


Author: metze
Date: 2007-10-17 14:00:23 +0000 (Wed, 17 Oct 2007)
New Revision: 25679

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=25679

Log:
reapply: Allow ^C to interrupt smbpasswd if using our getpass. from Jeremy
metze
(cherry picked from commit d4ae42b1b2982dd786d6da16d7fa964d25fd3356)

Modified:
   branches/SAMBA_4_0/source/lib/replace/getpass.c


Changeset:
Modified: branches/SAMBA_4_0/source/lib/replace/getpass.c
===================================================================
--- branches/SAMBA_4_0/source/lib/replace/getpass.c	2007-10-17 14:00:09 UTC (rev 25678)
+++ branches/SAMBA_4_0/source/lib/replace/getpass.c	2007-10-17 14:00:23 UTC (rev 25679)
@@ -138,6 +138,21 @@
 #endif
 }
 
+static sig_atomic_t gotintr;
+static int in_fd = -1;
+
+/***************************************************************
+ Signal function to tell us were ^C'ed.
+****************************************************************/
+
+static void gotintr_sig(void)
+{
+	gotintr = 1;
+	if (in_fd != -1)
+		close(in_fd); /* Safe way to force a return. */
+	in_fd = -1;
+}
+
 char *getsmbpass(const char *prompt)
 {
 	FILE *in, *out;
@@ -147,7 +162,7 @@
 	size_t nread;
 
 	/* Catch problematic signals */
-	catch_signal(SIGINT, SIGNAL_CAST SIG_IGN);
+	catch_signal(SIGINT, SIGNAL_CAST gotintr_sig);
 
 	/* Try to write to and read from the terminal if we can.
 		If we can't open the terminal, use stderr and stdin.  */
@@ -182,14 +197,21 @@
 
 	/* Read the password.  */
 	buf[0] = 0;
-	fgets(buf, bufsize, in);
+	if (!gotintr) {
+		in_fd = fileno(in);
+		fgets(buf, bufsize, in);
+	}
 	nread = strlen(buf);
 	if (buf[nread - 1] == '\n')
 		buf[nread - 1] = '\0';
 
 	/* Restore echoing.  */
-	if (echo_off)
-		tcsetattr (fileno (in), TCSANOW, &t);
+	if (echo_off) {
+		if (gotintr && in_fd == -1)
+			in = fopen ("/dev/tty", "w+");
+		if (in != NULL)
+			tcsetattr (fileno (in), TCSANOW, &t);
+	}
 
 	if (in != stdin) /* We opened the terminal; now close it.  */
 		fclose(in);
@@ -198,6 +220,12 @@
 	catch_signal(SIGINT, SIGNAL_CAST SIG_DFL);
 
 	printf("\n");
+
+	if (gotintr) {
+		printf("Interupted by signal.\n");
+		fflush(stdout);
+		exit(1);
+	}
 	return buf;
 }
 



More information about the samba-cvs mailing list