Add minimalistic protected-headers support
[gpgol.git] / src / common_indep.c
index ba7b0ed..4a029a0 100644 (file)
@@ -1,6 +1,7 @@
 /* common_indep.c - Common, platform indepentent routines used by GpgOL
- *    Copyright (C) 2005, 2007, 2008 g10 Code GmbH
- *    Copyright (C) 2016 Intevation GmbH
+ * Copyright (C) 2005, 2007, 2008 g10 Code GmbH
+ * Copyright (C) 2016 by Bundesamt für Sicherheit in der Informationstechnik
+ * Software engineering by Intevation GmbH
  *
  * This file is part of GpgOL.
  *
@@ -23,6 +24,7 @@
 #include <windows.h>
 #endif
 
+#include <wchar.h>
 #include <stdlib.h>
 #include <ctype.h>
 
@@ -67,7 +69,7 @@ out_of_core (void)
 }
 
 void*
-xmalloc (size_t n)
+_xmalloc (size_t n)
 {
   void *p = malloc (n);
   if (!p)
@@ -76,7 +78,7 @@ xmalloc (size_t n)
 }
 
 void*
-xcalloc (size_t m, size_t n)
+_xcalloc (size_t m, size_t n)
 {
   void *p = calloc (m, n);
   if (!p)
@@ -85,7 +87,7 @@ xcalloc (size_t m, size_t n)
 }
 
 void *
-xrealloc (void *a, size_t n)
+_xrealloc (void *a, size_t n)
 {
   void *p = realloc (a, n);
   if (!p)
@@ -94,15 +96,26 @@ xrealloc (void *a, size_t n)
 }
 
 char*
-xstrdup (const char *s)
+_xstrdup (const char *s)
 {
-  char *p = xmalloc (strlen (s)+1);
+  char *p = _xmalloc (strlen (s)+1);
   strcpy (p, s);
   return p;
 }
 
+wchar_t*
+_xwcsdup (const wchar_t *s)
+{
+  wchar_t *p = wcsdup (s);
+  if (!s)
+    {
+      out_of_core ();
+    }
+  return p;
+}
+
 void
-xfree (void *p)
+_xfree (void *p)
 {
   if (p)
     free (p);
@@ -466,301 +479,3 @@ generate_boundary (char *buffer)
 
   return buffer;
 }
-
-/* The malloced name of the logfile and the logging stream.  If
-   LOGFILE is NULL, no logging is done. */
-static char *logfile;
-static FILE *logfp;
-
-#ifdef HAVE_W32_SYSTEM
-
-/* Acquire the mutex for logging.  Returns 0 on success. */
-static int
-lock_log (void)
-{
-  int code = WaitForSingleObject (log_mutex, INFINITE);
-  return code != WAIT_OBJECT_0;
-}
-
-/* Release the mutex for logging. No error return is done because this
-   is a fatal error anyway and we have no means for proper
-   notification. */
-static void
-unlock_log (void)
-{
-  ReleaseMutex (log_mutex);
-}
-#endif
-
-const char *
-get_log_file (void)
-{
-  return logfile? logfile : "";
-}
-
-void
-set_log_file (const char *name)
-{
-#ifdef HAVE_W32_SYSTEM
-  if (!lock_log ())
-    {
-#endif
-      if (logfp)
-        {
-          fclose (logfp);
-          logfp = NULL;
-        }
-      xfree (logfile);
-      if (!name || *name == '\"' || !*name)
-        logfile = NULL;
-      else
-        logfile = xstrdup (name);
-#ifdef HAVE_W32_SYSTEM
-      unlock_log ();
-    }
-#endif
-}
-
-static void
-do_log (const char *fmt, va_list a, int w32err, int err,
-        const void *buf, size_t buflen)
-{
-  if (!logfile)
-    return;
-
-#ifdef HAVE_W32_SYSTEM
-  if (lock_log ())
-    return;
-#endif
-
-  if (!strcmp (logfile, "stdout"))
-    {
-      logfp = stdout;
-    }
-  else if (!strcmp (logfile, "stderr"))
-    {
-      logfp = stderr;
-    }
-  if (!logfp)
-    logfp = fopen (logfile, "a+");
-#ifdef HAVE_W32_SYSTEM
-  if (!logfp)
-    {
-      unlock_log ();
-      return;
-    }
-
-  char time_str[9];
-  SYSTEMTIME utc_time;
-  GetSystemTime (&utc_time);
-  if (GetTimeFormatA (LOCALE_INVARIANT,
-                      TIME_FORCE24HOURFORMAT | LOCALE_USE_CP_ACP,
-                      &utc_time,
-                      "HH:mm:ss",
-                      time_str,
-                      9))
-    {
-      fprintf (logfp, "%s/%lu/",
-               time_str,
-               (unsigned long)GetCurrentThreadId ());
-    }
-  else
-    {
-      fprintf (logfp, "unknown/%lu/",
-               (unsigned long)GetCurrentThreadId ());
-    }
-#endif
-
-  if (err == 1)
-    fputs ("ERROR/", logfp);
-  vfprintf (logfp, fmt, a);
-#ifdef HAVE_W32_SYSTEM
-  if (w32err)
-    {
-      char tmpbuf[256];
-
-      FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, w32err,
-                     MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
-                     tmpbuf, sizeof (tmpbuf)-1, NULL);
-      fputs (": ", logfp);
-      if (*tmpbuf && tmpbuf[strlen (tmpbuf)-1] == '\n')
-        tmpbuf[strlen (tmpbuf)-1] = 0;
-      if (*tmpbuf && tmpbuf[strlen (tmpbuf)-1] == '\r')
-        tmpbuf[strlen (tmpbuf)-1] = 0;
-      fprintf (logfp, "%s (%d)", tmpbuf, w32err);
-    }
-#endif
-  if (buf)
-    {
-      const unsigned char *p = (const unsigned char*)buf;
-
-      for ( ; buflen; buflen--, p++)
-        fprintf (logfp, "%02X", *p);
-      putc ('\n', logfp);
-    }
-  else if ( *fmt && fmt[strlen (fmt) - 1] != '\n')
-    putc ('\n', logfp);
-
-  fflush (logfp);
-#ifdef HAVE_W32_SYSTEM
-  unlock_log ();
-#endif
-}
-
-const char *
-log_srcname (const char *file)
-{
-  const char *s = strrchr (file, '/');
-  return s? s+1:file;
-}
-
-void
-log_debug (const char *fmt, ...)
-{
-  va_list a;
-
-  va_start (a, fmt);
-  do_log (fmt, a, 0, 0, NULL, 0);
-  va_end (a);
-}
-
-void
-log_error (const char *fmt, ...)
-{
-  va_list a;
-
-  va_start (a, fmt);
-  do_log (fmt, a, 0, 1, NULL, 0);
-  va_end (a);
-}
-
-void
-log_vdebug (const char *fmt, va_list a)
-{
-  do_log (fmt, a, 0, 0, NULL, 0);
-}
-
-void
-log_hexdump (const void *buf, size_t buflen, const char *fmt, ...)
-{
-  va_list a;
-
-  va_start (a, fmt);
-  do_log (fmt, a, 0, 2, buf, buflen);
-  va_end (a);
-}
-
-#ifdef HAVE_W32_SYSTEM
-void
-log_debug_w32 (int w32err, const char *fmt, ...)
-{
-  va_list a;
-
-  if (w32err == -1)
-    w32err = GetLastError ();
-
-  va_start (a, fmt);
-  do_log (fmt, a, w32err, 0, NULL, 0);
-  va_end (a);
-}
-
-void
-log_error_w32 (int w32err, const char *fmt, ...)
-{
-  va_list a;
-
-  if (w32err == -1)
-    w32err = GetLastError ();
-
-  va_start (a, fmt);
-  do_log (fmt, a, w32err, 1, NULL, 0);
-  va_end (a);
-}
-
-static void
-do_log_window_info (HWND window, int level)
-{
-  char buf[1024+1];
-  char name[200];
-  int nname;
-  char *pname;
-  DWORD pid;
-
-  if (!window)
-    return;
-
-  GetWindowThreadProcessId (window, &pid);
-  if (pid != GetCurrentProcessId ())
-    return;
-
-  memset (buf, 0, sizeof (buf));
-  GetWindowText (window, buf, sizeof (buf)-1);
-  nname = GetClassName (window, name, sizeof (name)-1);
-  if (nname)
-    pname = name;
-  else
-    pname = NULL;
-
-  if (level == -1)
-    log_debug ("  parent=%p/%lu (%s) `%s'", window, (unsigned long)pid,
-               pname? pname:"", buf);
-  else
-    log_debug ("    %*shwnd=%p/%lu (%s) `%s'", level*2, "", window,
-               (unsigned long)pid, pname? pname:"", buf);
-}
-
-
-/* Helper to log_window_hierarchy.  */
-static HWND
-do_log_window_hierarchy (HWND parent, int level)
-{
-  HWND child;
-
-  child = GetWindow (parent, GW_CHILD);
-  while (child)
-    {
-      do_log_window_info (child, level);
-      do_log_window_hierarchy (child, level+1);
-      child = GetNextWindow (child, GW_HWNDNEXT);
-    }
-
-  return NULL;
-}
-
-
-/* Print a debug message using the format string FMT followed by the
-   window hierarchy of WINDOW.  */
-void
-log_window_hierarchy (HWND window, const char *fmt, ...)
-{
-  va_list a;
-
-  va_start (a, fmt);
-  do_log (fmt, a, 0, 0, NULL, 0);
-  va_end (a);
-  if (window)
-    {
-      do_log_window_info (window, -1);
-      do_log_window_hierarchy (window, 0);
-    }
-}
-
-void
-set_default_key (const char *name)
-{
-  if (!lock_log ())
-    {
-      if (!name || *name == '\"' || !*name)
-        {
-          xfree (opt.default_key);
-          opt.default_key = NULL;
-        }
-      else
-        {
-          xfree (opt.default_key);
-          opt.default_key = xstrdup (name);;
-        }
-      unlock_log ();
-    }
-}
-#endif