core: Add info about tty mode etc to 'getinfo ttyinfo' master
authorWerner Koch <wk@gnupg.org>
Wed, 13 Jun 2018 14:10:53 +0000 (16:10 +0200)
committerWerner Koch <wk@gnupg.org>
Wed, 13 Jun 2018 14:11:48 +0000 (16:11 +0200)
* configure.ac: Check for 'stat'.
* pinentry/pinentry.c: Include types.h and stat.h.
(device_stat_string): New.
(cmd_getinfo): Print more info.

Signed-off-by: Werner Koch <wk@gnupg.org>
configure.ac
pinentry/pinentry.c

index e305e44..51a2313 100644 (file)
@@ -221,7 +221,7 @@ AC_HEADER_STDC
 AC_CHECK_HEADERS(string.h unistd.h langinfo.h termio.h locale.h utime.h wchar.h)
 
 dnl Checks for library functions.
-AC_CHECK_FUNCS(seteuid stpcpy mmap)
+AC_CHECK_FUNCS(seteuid stpcpy mmap stat)
 GNUPG_CHECK_MLOCK
 
 dnl Checks for standard types.
index 30c333b..cd813d8 100644 (file)
@@ -27,6 +27,8 @@
 #endif
 #include <stdlib.h>
 #include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 #include <unistd.h>
 #include <assert.h>
 #ifndef HAVE_W32_SYSTEM
@@ -1706,6 +1708,33 @@ cmd_message (assuan_context_t ctx, char *line)
   return cmd_confirm (ctx, "--one-button");
 }
 
+
+/* Return a staically allocated string with information on the mode,
+ * uid, and gid of DEVICE.  On error "?" is returned if DEVICE is
+ * NULL, "-" is returned.  */
+static const char *
+device_stat_string (const char *device)
+{
+#ifdef HAVE_STAT
+  static char buf[40];
+  struct stat st;
+
+  if (!device || !*device)
+    return "-";
+
+  if (stat (device, &st))
+    return "?";  /* Error */
+  snprintf (buf, sizeof buf, "%lo/%lu/%lu",
+            (unsigned long)st.st_mode,
+            (unsigned long)st.st_uid,
+            (unsigned long)st.st_gid);
+  return buf;
+#else
+  return "-";
+#endif
+}
+
+
 /* GETINFO <what>
 
    Multipurpose function to return a variety of information.
@@ -1721,7 +1750,7 @@ cmd_getinfo (assuan_context_t ctx, char *line)
 {
   int rc;
   const char *s;
-  char buffer[100];
+  char buffer[150];
 
   if (!strcmp (line, "version"))
     {
@@ -1753,10 +1782,17 @@ cmd_getinfo (assuan_context_t ctx, char *line)
     }
   else if (!strcmp (line, "ttyinfo"))
     {
-      snprintf (buffer, sizeof buffer, "%s %s %s",
+      snprintf (buffer, sizeof buffer, "%s %s %s %s %lu/%lu",
                 pinentry.ttyname? pinentry.ttyname : "-",
                 pinentry.ttytype? pinentry.ttytype : "-",
-                pinentry.display? pinentry.display : "-" );
+                pinentry.display? pinentry.display : "-",
+                device_stat_string (pinentry.ttyname),
+#ifdef HAVE_DOSISH_SYSTEM
+                0l, 0l
+#else
+                (unsigned long)geteuid (), (unsigned long)getegid ()
+#endif
+                );
       buffer[sizeof buffer -1] = 0;
       rc = assuan_send_data (ctx, buffer, strlen (buffer));
     }