* pinentry/pinentry.h (struct pinentry): Add TOUCH_FILE.
authorWerner Koch <wk@gnupg.org>
Wed, 14 Feb 2007 16:24:02 +0000 (16:24 +0000)
committerWerner Koch <wk@gnupg.org>
Wed, 14 Feb 2007 16:24:02 +0000 (16:24 +0000)
* pinentry/pinentry.c (option_handler): New option "touch-file".
(pinentry_have_display): Ignore an empty DISPLAY.
* pinentry/pinentry-curses.c (do_touch_file): New.
(curses_cmd_handler): Call it.
* configure.ac: Check for utime.h.

ChangeLog
NEWS
configure.ac
pinentry/pinentry-curses.c
pinentry/pinentry.c
pinentry/pinentry.h

index 116aba2..885ff67 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2007-02-14  Werner Koch  <wk@g10code.com>
+
+       * pinentry/pinentry.h (struct pinentry): Add TOUCH_FILE.
+       * pinentry/pinentry.c (option_handler): New option "touch-file".
+       (pinentry_have_display): Ignore an empty DISPLAY.
+       * pinentry/pinentry-curses.c (do_touch_file): New.
+       (curses_cmd_handler): Call it.
+       * configure.ac: Check for utime.h.
+
 2007-01-24  Werner Koch  <wk@g10code.com>
 
        * pinentry/pinentry.c (cmd_message): New.
 2007-01-24  Werner Koch  <wk@g10code.com>
 
        * pinentry/pinentry.c (cmd_message): New.
diff --git a/NEWS b/NEWS
index 81c487f..484798c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,9 @@ Noteworthy changes in version 0.7.3
  * New command MESSAGE and --one-button compatibility option to
    CONFIRM.
 
  * New command MESSAGE and --one-button compatibility option to
    CONFIRM.
 
+ * New Assuan option touch-file to set a file which will be touched
+   after ncurses does not need the display anymore.
+
 
 Noteworthy changes in version 0.7.2 (2005-01-27)
 ------------------------------------------------
 
 Noteworthy changes in version 0.7.2 (2005-01-27)
 ------------------------------------------------
index 7e12925..1ada980 100644 (file)
@@ -102,7 +102,7 @@ fi
 
 # Checks for header files.
 AC_HEADER_STDC
 
 # Checks for header files.
 AC_HEADER_STDC
-AC_CHECK_HEADERS(string.h unistd.h langinfo.h termio.h locale.h)
+AC_CHECK_HEADERS(string.h unistd.h langinfo.h termio.h locale.h utime.h)
 
 dnl Checks for library functions.
 AC_CHECK_FUNCS(seteuid stpcpy mmap)
 
 dnl Checks for library functions.
 AC_CHECK_FUNCS(seteuid stpcpy mmap)
index a356480..da33173 100644 (file)
 #include <limits.h>
 #include <string.h>
 #include <errno.h>
 #include <limits.h>
 #include <string.h>
 #include <errno.h>
+#include <time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef HAVE_UTIME_H
+#include <utime.h>
+#endif /*HAVE_UTIME_H*/
 
 #include <memory.h>
 
 
 #include <memory.h>
 
@@ -723,8 +729,38 @@ dialog_run (pinentry_t pinentry, const char *tty_name, const char *tty_type)
   return diag.pin ? (done < 0 ? -1 : diag.pin_len) : (done < 0 ? 0 : 1);
 }
 
   return diag.pin ? (done < 0 ? -1 : diag.pin_len) : (done < 0 ? 0 : 1);
 }
 
+
+/* If a touch has been registered, touch that file.  */
+static void
+do_touch_file (pinentry_t pinentry)
+{
+#ifdef HAVE_UTIME_H
+  struct stat st;
+  time_t tim;
+
+  if (!pinentry->touch_file || !*pinentry->touch_file)
+    return;
+
+  if (stat (pinentry->touch_file, &st))
+    return; /* Oops.  */
+
+  /* Make sure that we actually update the mtime.  */
+  while ( (tim = time (NULL)) == st.st_mtime )
+    sleep (1);
+
+  /* Update but ignore errors as we can't do anything in that case.
+     Printing error messages may even clubber the display further. */
+  utime (pinentry->touch_file, NULL);
+#endif /*HAVE_UTIME_H*/
+}
+
+
 int
 curses_cmd_handler (pinentry_t pinentry)
 {
 int
 curses_cmd_handler (pinentry_t pinentry)
 {
-  return dialog_run (pinentry, pinentry->ttyname, pinentry->ttytype);
+  int rc;
+
+  rc = dialog_run (pinentry, pinentry->ttyname, pinentry->ttytype);
+  do_touch_file (pinentry);
+  return rc;
 }
 }
index 7aa7456..78e8fe5 100644 (file)
@@ -65,6 +65,7 @@ struct pinentry pinentry =
     0,         /* Enhanced mode.  */
     1,         /* Global grab.  */
     0,         /* Parent Window ID.  */
     0,         /* Enhanced mode.  */
     1,         /* Global grab.  */
     0,         /* Parent Window ID.  */
+    NULL,       /* Touch file.  */
     0,         /* Result.  */
     0,          /* Locale error flag. */
     0           /* One-button flag.  */
     0,         /* Result.  */
     0,          /* Locale error flag. */
     0           /* One-button flag.  */
@@ -256,7 +257,10 @@ pinentry_init (const char *pgmname)
 int
 pinentry_have_display (int argc, char **argv)
 {
 int
 pinentry_have_display (int argc, char **argv)
 {
-  if (getenv ("DISPLAY"))
+  const char *s;
+
+  s = getenv ("DISPLAY");
+  if (s && *s)
     return 1;
   for (; argc; argc--, argv++)
     if (!strcmp (*argv, "--display"))
     return 1;
   for (; argc; argc--, argv++)
     if (!strcmp (*argv, "--display"))
@@ -451,6 +455,14 @@ option_handler (ASSUAN_CONTEXT ctx, const char *key, const char *value)
       pinentry.parent_wid = atoi (value);
       /* FIXME: Use strtol and add some error handling.  */
     }
       pinentry.parent_wid = atoi (value);
       /* FIXME: Use strtol and add some error handling.  */
     }
+  else if (!strcmp (key, "touch-file"))
+    {
+      if (pinentry.touch_file)
+        free (pinentry.touch_file);
+      pinentry.touch_file = strdup (value);
+      if (!pinentry.touch_file)
+       return ASSUAN_Out_Of_Core;
+    }
   else
     return ASSUAN_Invalid_Option;
   return 0;
   else
     return ASSUAN_Invalid_Option;
   return 0;
index 9f63255..b85aa5b 100644 (file)
@@ -67,6 +67,10 @@ struct pinentry
      should be displayed.  */
   int parent_wid;
 
      should be displayed.  */
   int parent_wid;
 
+  /* The name of an optional file which will be touched after a curses
+     entry has been displayed.  */
+  char *touch_file;
+
   /* The user should set this to -1 if the user canceled the request,
      and to the length of the PIN stored in pin otherwise.  */
   int result;
   /* The user should set this to -1 if the user canceled the request,
      and to the length of the PIN stored in pin otherwise.  */
   int result;