Add --logger-fd alias.
[gnupg.git] / jnlib / logging.c
index 781f03e..37ae207 100644 (file)
@@ -1,30 +1,24 @@
-/* logging.c - useful logging functions
+/* logging.c - Useful logging functions
  * Copyright (C) 1998, 1999, 2000, 2001, 2003,
- *               2004 Free Software Foundation, Inc.
+ *               2004, 2005, 2006 Free Software Foundation, Inc.
  *
- * This file is part of GnuPG.
+ * This file is part of JNLIB.
  *
- * GnuPG is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * JNLIB is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 3 of
+ * the License, or (at your option) any later version.
  *
- * GnuPG is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * JNLIB is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 
-/* This file should replace logger.c in the future - for now it is not
- * used by GnuPG but by GPA.
- * It is a quite simple implemenation but sufficient for most purposes.
- */
-
 #include <config.h>
 #include <stdlib.h>
 #include <stdio.h>
 #define USE_FUNWRITER 1
 #endif
 
+#ifdef HAVE_FOPENCOOKIE
+typedef ssize_t my_funopen_hook_ret_t;
+#else
+typedef int     my_funopen_hook_ret_t;
+#endif
+
+
 static FILE *logstream;
 static int log_socket = -1;
 static char prefix_buffer[80];
@@ -64,23 +65,6 @@ static int force_prefixes;
 static int missing_lf;
 static int errorcount;
 
-#if 0
-static void
-write2stderr( const char *s )
-{
-    write( 2, s, strlen(s) );
-}
-
-
-static void
-do_die(int rc, const char *text )
-{
-    write2stderr("\nFatal error: ");
-    write2stderr(text);
-    write2stderr("\n");
-    abort();
-}
-#endif
 
 int
 log_get_errorcount (int clear)
@@ -109,10 +93,11 @@ struct fun_cookie_s {
   char name[1];
 };
 
-/* Write NBYTES of BUF to file descriptor FD. */
+/* Write NBYTES of BUFFER to file descriptor FD. */
 static int
-writen (int fd, const unsigned char *buf, size_t nbytes)
+writen (int fd, const void *buffer, size_t nbytes)
 {
+  const char *buf = buffer;
   size_t nleft = nbytes;
   int nwritten;
   
@@ -131,7 +116,7 @@ writen (int fd, const unsigned char *buf, size_t nbytes)
 }
 
 
-static in
+static my_funopen_hook_ret_
 fun_writer (void *cookie_arg, const char *buffer, size_t size)
 {
   struct fun_cookie_s *cookie = cookie_arg;
@@ -150,7 +135,8 @@ fun_writer (void *cookie_arg, const char *buffer, size_t size)
       cookie->fd = socket (PF_LOCAL, SOCK_STREAM, 0);
       if (cookie->fd == -1)
         {
-          if (!cookie->quiet && !running_detached)
+          if (!cookie->quiet && !running_detached
+              && isatty (fileno (stderr)))
             fprintf (stderr, "failed to create socket for logging: %s\n",
                      strerror(errno));
         }
@@ -168,7 +154,8 @@ fun_writer (void *cookie_arg, const char *buffer, size_t size)
       
           if (connect (cookie->fd, (struct sockaddr *) &addr, addrlen) == -1)
             {
-              if (!cookie->quiet && !running_detached)
+              if (!cookie->quiet && !running_detached
+                  && isatty (fileno (stderr)))
                 fprintf (stderr, "can't connect to `%s': %s\n",
                          cookie->name, strerror(errno));
               close (cookie->fd);
@@ -180,12 +167,16 @@ fun_writer (void *cookie_arg, const char *buffer, size_t size)
         {
           if (!running_detached)
             {
+              /* Due to all the problems with apps not running
+                 detahced but beeing caled with stderr closed or
+                 used for a different purposes, it does not make
+                 sense to switch to stderr.  We tehrefore disable it. */
               if (!cookie->quiet)
                 {
-                  fputs ("switching logging to stderr\n", stderr);
+                  /* fputs ("switching logging to stderr\n", stderr);*/
                   cookie->quiet = 1;
                 }
-              cookie->fd = fileno (stderr);
+              cookie->fd = -1; /*fileno (stderr);*/
             }
         }
       else /* Connection has been established. */
@@ -199,7 +190,8 @@ fun_writer (void *cookie_arg, const char *buffer, size_t size)
   if (cookie->fd != -1 && !writen (cookie->fd, buffer, size))
     return size; /* Okay. */ 
 
-  if (!running_detached && cookie->fd != -1)
+  if (!running_detached && cookie->fd != -1
+      && isatty (fileno (stderr)))
     {
       if (*cookie->name)
         fprintf (stderr, "error writing to `%s': %s\n",
@@ -499,9 +491,17 @@ do_logv (int level, const char *fmt, va_list arg_ptr)
     }
 
   if (level == JNLIB_LOG_FATAL)
-    exit(2);
+    {
+      if (missing_lf)
+        putc('\n', logstream );
+      exit(2);
+    }
   if (level == JNLIB_LOG_BUG)
-    abort();
+    {
+      if (missing_lf)
+        putc('\n', logstream );
+      abort();
+    }
 }
 
 static void