[SCM] Samba Shared Repository - branch v3-2-test updated - initial-v3-2-unstable-49-gf4c0961

Stefan Metzmacher metze at samba.org
Mon Oct 15 11:26:20 GMT 2007


The branch, v3-2-test has been updated
       via  f4c0961a16a84dcdfe6e2faafb75c76983e6d466 (commit)
       via  33ee0cfb190a883229d0824d7194898fd8966ceb (commit)
       via  46c12de07fe6f44bcf58ca9de276e7932384843d (commit)
       via  0cd1ed0424ce87f60070d43caffda41be6706d59 (commit)
       via  d4ae42b1b2982dd786d6da16d7fa964d25fd3356 (commit)
       via  3e8f43e3cf97f10be4717978643ef3edca8650a5 (commit)
      from  0177158d85797e0d22c81d88175a77d4ad5ed711 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit f4c0961a16a84dcdfe6e2faafb75c76983e6d466
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Oct 15 11:02:24 2007 +0200

    fix the compilation of getpass.c and it's configure test
    
    metze

commit 33ee0cfb190a883229d0824d7194898fd8966ceb
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Jun 16 23:07:42 2006 +0000

    r16320: Ensure variable is not null before calling fclose. Klocwork #412. Jeremy.

commit 46c12de07fe6f44bcf58ca9de276e7932384843d
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Jun 15 05:32:21 2006 +0000

    r16245: Cope with string being zero len. Klocwork bug #410. Jeremy.

commit 0cd1ed0424ce87f60070d43caffda41be6706d59
Author: jmcd <jmcd at samba.org>
Date:   Thu Oct 23 13:47:17 2003 +0000

    Volker's fix for bug #668. Change the \n after the password prompt to go to tty instead of stdout.

commit d4ae42b1b2982dd786d6da16d7fa964d25fd3356
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Oct 5 16:20:38 2007 +0200

    reapply: Allow ^C to interrupt smbpasswd if using our getpass. from Jeremy
    
    metze

commit 3e8f43e3cf97f10be4717978643ef3edca8650a5
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Oct 5 15:55:19 2007 +0200

    reformat getpass() replacement code
    
    metze

-----------------------------------------------------------------------

Summary of changes:
 source/lib/replace/getpass.c  |  161 +++++++++++++++++++++++------------------
 source/lib/replace/getpass.m4 |    5 +-
 2 files changed, 91 insertions(+), 75 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/lib/replace/getpass.c b/source/lib/replace/getpass.c
index f6a72ad..4b21849 100644
--- a/source/lib/replace/getpass.c
+++ b/source/lib/replace/getpass.c
@@ -49,8 +49,6 @@ typedef int sig_atomic_t;
 #define SIGNAL_CAST (RETSIGTYPE (*)(int))
 #endif
 
-#ifdef REPLACE_GETPASS
-
 #ifdef SYSV_TERMIO 
 
 /* SYSTEM V TERMIO HANDLING */
@@ -131,81 +129,102 @@ static void catch_signal(int signum,void (*handler)(int ))
 	sigemptyset(&act.sa_mask);
 	sigaddset(&act.sa_mask,signum);
 	sigaction(signum,&act,&oldact);
-	return oldact.sa_handler;
 #else /* !HAVE_SIGACTION */
 	/* FIXME: need to handle sigvec and systems with broken signal() */
-	return signal(signum, handler);
+	signal(signum, handler);
 #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;
-  int echo_off;
-  static char buf[256];
-  static size_t bufsize = sizeof(buf);
-  size_t nread;
-
-  /* Catch problematic signals */
-  catch_signal(SIGINT, SIGNAL_CAST SIG_IGN);
-
-  /* Try to write to and read from the terminal if we can.
-     If we can't open the terminal, use stderr and stdin.  */
-
-  in = fopen ("/dev/tty", "w+");
-  if (in == NULL)
-    {
-      in = stdin;
-      out = stderr;
-    }
-  else
-    out = in;
-
-  setvbuf(in, NULL, _IONBF, 0);
-
-  /* Turn echoing off if it is on now.  */
-
-  if (tcgetattr (fileno (in), &t) == 0)
-    {
-	  if (ECHO_IS_ON(t))
-	{
-		TURN_ECHO_OFF(t);
-		echo_off = tcsetattr (fileno (in), TCSAFLUSH, &t) == 0;
-		TURN_ECHO_ON(t);
+	FILE *in, *out;
+	int echo_off;
+	static char buf[256];
+	static size_t bufsize = sizeof(buf);
+	size_t nread;
+
+	/* Catch problematic signals */
+	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.  */
+
+	in = fopen ("/dev/tty", "w+");
+	if (in == NULL) {
+		in = stdin;
+		out = stderr;
+	} else {
+		out = in;
 	}
-      else
-	echo_off = 0;
-    }
-  else
-    echo_off = 0;
-
-  /* Write the prompt.  */
-  fputs (prompt, out);
-  fflush (out);
-
-  /* Read the password.  */
-  buf[0] = 0;
-  fgets(buf, bufsize, in);
-  nread = strlen(buf);
-  if (buf[nread - 1] == '\n')
-    buf[nread - 1] = '\0';
-
-  /* Restore echoing.  */
-  if (echo_off)
-    (void) tcsetattr (fileno (in), TCSANOW, &t);
-
-  if (in != stdin)
-    /* We opened the terminal; now close it.  */
-    fclose (in);
-
-  /* Catch problematic signals */
-  catch_signal(SIGINT, SIGNAL_CAST SIG_DFL);
-
-  printf("\n");
-  return buf;
-}
 
-#else
- void getsmbpasswd_dummy(void);
- void getsmbpasswd_dummy(void) {;}
-#endif
+	setvbuf(in, NULL, _IONBF, 0);
+
+	/* Turn echoing off if it is on now.  */
+
+	if (tcgetattr (fileno (in), &t) == 0) {
+		if (ECHO_IS_ON(t)) {
+			TURN_ECHO_OFF(t);
+			echo_off = tcsetattr (fileno (in), TCSAFLUSH, &t) == 0;
+			TURN_ECHO_ON(t);
+		} else {
+			echo_off = 0;
+		}
+	} else {
+		echo_off = 0;
+	}
+
+	/* Write the prompt.  */
+	fputs(prompt, out);
+	fflush(out);
+
+	/* Read the password.  */
+	buf[0] = 0;
+	if (!gotintr) {
+		in_fd = fileno(in);
+		fgets(buf, bufsize, in);
+	}
+	nread = strlen(buf);
+	if (nread) {
+		if (buf[nread - 1] == '\n')
+			buf[nread - 1] = '\0';
+	}
+
+	/* Restore echoing.  */
+	if (echo_off) {
+		if (gotintr && in_fd == -1)
+			in = fopen ("/dev/tty", "w+");
+		if (in != NULL)
+			tcsetattr (fileno (in), TCSANOW, &t);
+	}
+
+	fprintf(out, "\n");
+	fflush(out);
+
+	if (in && in != stdin) /* We opened the terminal; now close it.  */
+		fclose(in);
+
+	/* Catch problematic signals */
+	catch_signal(SIGINT, SIGNAL_CAST SIG_DFL);
+
+	if (gotintr) {
+		printf("Interupted by signal.\n");
+		fflush(stdout);
+		exit(1);
+	}
+	return buf;
+}
diff --git a/source/lib/replace/getpass.m4 b/source/lib/replace/getpass.m4
index 20d04a6..17dfdf7 100644
--- a/source/lib/replace/getpass.m4
+++ b/source/lib/replace/getpass.m4
@@ -3,11 +3,8 @@ SAVE_CPPFLAGS="$CPPFLAGS"
 CPPFLAGS="$CPPFLAGS -I$libreplacedir/"
 AC_TRY_COMPILE([
 #include "confdefs.h"
-#define _LIBREPLACE_REPLACE_H
-#define REPLACE_GETPASS 1
-#define main dont_declare_main
+#define NO_CONFIG_H
 #include "$libreplacedir/getpass.c"
-#undef main
 ],[],samba_cv_REPLACE_GETPASS=yes,samba_cv_REPLACE_GETPASS=no)
 CPPFLAGS="$SAVE_CPPFLAGS"
 ])


-- 
Samba Shared Repository


More information about the samba-cvs mailing list