Bump to cups 2.3.3
[platform/upstream/cups.git] / cups / globals.c
index 8493a08..fd41bae 100644 (file)
@@ -1,29 +1,11 @@
 /*
- * "$Id: globals.c 11173 2013-07-23 12:31:34Z msweet $"
+ * Global variable access routines for CUPS.
  *
- *   Global variable access routines for CUPS.
+ * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
- *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   _cupsGlobalLock()    - Lock the global mutex.
- *   _cupsGlobals()       - Return a pointer to thread local storage
- *   _cupsGlobalUnlock()  - Unlock the global mutex.
- *   DllMain()            - Main entry for library.
- *   cups_fix_path()      - Fix a file path to use forward slashes consistently.
- *   cups_globals_alloc() - Allocate and initialize global data.
- *   cups_globals_free()  - Free global data.
- *   cups_globals_init()  - Initialize environment variables.
+ * Licensed under Apache License v2.0.  See the file "LICENSE" for more
+ * information.
  */
 
 /*
  */
 
 #include "cups-private.h"
+#ifndef _WIN32
+#  include <pwd.h>
+#endif /* !_WIN32 */
 
 
 /*
  * Local globals...
  */
 
-
+#ifdef DEBUG
+static int             cups_global_index = 0;
+                                       /* Next thread number */
+#endif /* DEBUG */
 static _cups_threadkey_t cups_globals_key = _CUPS_THREADKEY_INITIALIZER;
                                        /* Thread local storage key */
 #ifdef HAVE_PTHREAD_H
 static pthread_once_t  cups_globals_key_once = PTHREAD_ONCE_INIT;
                                        /* One-time initialization object */
 #endif /* HAVE_PTHREAD_H */
-#if defined(HAVE_PTHREAD_H) || defined(WIN32)
+#if defined(HAVE_PTHREAD_H) || defined(_WIN32)
 static _cups_mutex_t   cups_global_mutex = _CUPS_MUTEX_INITIALIZER;
                                        /* Global critical section */
-#endif /* HAVE_PTHREAD_H || WIN32 */
+#endif /* HAVE_PTHREAD_H || _WIN32 */
 
 
 /*
  * Local functions...
  */
 
-#ifdef WIN32
+#ifdef _WIN32
 static void            cups_fix_path(char *path);
-#endif /* WIN32 */
+#endif /* _WIN32 */
 static _cups_globals_t *cups_globals_alloc(void);
-#if defined(HAVE_PTHREAD_H) || defined(WIN32)
+#if defined(HAVE_PTHREAD_H) || defined(_WIN32)
 static void            cups_globals_free(_cups_globals_t *g);
-#endif /* HAVE_PTHREAD_H || WIN32 */
+#endif /* HAVE_PTHREAD_H || _WIN32 */
 #ifdef HAVE_PTHREAD_H
 static void            cups_globals_init(void);
 #endif /* HAVE_PTHREAD_H */
@@ -75,7 +63,7 @@ _cupsGlobalLock(void)
 {
 #ifdef HAVE_PTHREAD_H
   pthread_mutex_lock(&cups_global_mutex);
-#elif defined(WIN32)
+#elif defined(_WIN32)
   EnterCriticalSection(&cups_global_mutex.m_criticalSection);
 #endif /* HAVE_PTHREAD_H */
 }
@@ -130,13 +118,13 @@ _cupsGlobalUnlock(void)
 {
 #ifdef HAVE_PTHREAD_H
   pthread_mutex_unlock(&cups_global_mutex);
-#elif defined(WIN32)
+#elif defined(_WIN32)
   LeaveCriticalSection(&cups_global_mutex.m_criticalSection);
 #endif /* HAVE_PTHREAD_H */
 }
 
 
-#ifdef WIN32
+#ifdef _WIN32
 /*
  * 'DllMain()' - Main entry for library.
  */
@@ -180,7 +168,7 @@ DllMain(HINSTANCE hinst,            /* I - DLL module handle */
 
   return (TRUE);
 }
-#endif /* WIN32 */
+#endif /* _WIN32 */
 
 
 /*
@@ -192,13 +180,13 @@ cups_globals_alloc(void)
 {
   _cups_globals_t *cg = malloc(sizeof(_cups_globals_t));
                                        /* Pointer to global data */
-#ifdef WIN32
+#ifdef _WIN32
   HKEY         key;                    /* Registry key */
   DWORD                size;                   /* Size of string */
   static char  installdir[1024] = "",  /* Install directory */
                confdir[1024] = "",     /* Server root directory */
                localedir[1024] = "";   /* Locale directory */
-#endif /* WIN32 */
+#endif /* _WIN32 */
 
 
   if (!cg)
@@ -212,25 +200,33 @@ cups_globals_alloc(void)
   memset(cg, 0, sizeof(_cups_globals_t));
   cg->encryption     = (http_encryption_t)-1;
   cg->password_cb    = (cups_password_cb2_t)_cupsGetPassword;
-  cg->any_root       = 1;
-  cg->expired_certs  = 1;
-  cg->expired_root   = 1;
+  cg->trust_first    = -1;
+  cg->any_root       = -1;
+  cg->expired_certs  = -1;
+  cg->validate_certs = -1;
+
+#ifdef DEBUG
+ /*
+  * Friendly thread ID for debugging...
+  */
+
+  cg->thread_id = ++ cups_global_index;
+#endif /* DEBUG */
 
  /*
   * Then set directories as appropriate...
   */
 
-#ifdef WIN32
+#ifdef _WIN32
   if (!installdir[0])
   {
    /*
     * Open the registry...
     */
 
-    strcpy(installdir, "C:/Program Files/cups.org");
+    strlcpy(installdir, "C:/Program Files/cups.org", sizeof(installdir));
 
-    if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\cups.org", 0, KEY_READ,
-                      &key))
+    if (!RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\cups.org", 0, KEY_READ, &key))
     {
      /*
       * Grab the installation directory...
@@ -239,7 +235,7 @@ cups_globals_alloc(void)
       char  *ptr;                      /* Pointer into installdir */
 
       size = sizeof(installdir);
-      RegQueryValueEx(key, "installdir", NULL, NULL, installdir, &size);
+      RegQueryValueExA(key, "installdir", NULL, NULL, installdir, &size);
       RegCloseKey(key);
 
       for (ptr = installdir; *ptr;)
@@ -277,6 +273,8 @@ cups_globals_alloc(void)
   if ((cg->localedir = getenv("LOCALEDIR")) == NULL)
     cg->localedir = localedir;
 
+  cg->home = getenv("HOME");
+
 #else
 #  ifdef HAVE_GETEUID
   if ((geteuid() != getuid() && getuid()) || getegid() != getgid())
@@ -315,8 +313,23 @@ cups_globals_alloc(void)
 
     if ((cg->localedir = getenv("LOCALEDIR")) == NULL)
       cg->localedir = CUPS_LOCALEDIR;
+
+    cg->home = getenv("HOME");
+
+#  ifdef __APPLE__ /* Sandboxing now exposes the container as the home directory */
+    if (cg->home && strstr(cg->home, "/Library/Containers/"))
+      cg->home = NULL;
+#  endif /* !__APPLE__ */
+  }
+
+  if (!cg->home)
+  {
+    struct passwd      *pw;            /* User info */
+
+    if ((pw = getpwuid(getuid())) != NULL)
+      cg->home = _cupsStrAlloc(pw->pw_dir);
   }
-#endif /* WIN32 */
+#endif /* _WIN32 */
 
   return (cg);
 }
@@ -326,7 +339,7 @@ cups_globals_alloc(void)
  * 'cups_globals_free()' - Free global data.
  */
 
-#if defined(HAVE_PTHREAD_H) || defined(WIN32)
+#if defined(HAVE_PTHREAD_H) || defined(_WIN32)
 static void
 cups_globals_free(_cups_globals_t *cg) /* I - Pointer to global data */
 {
@@ -349,7 +362,9 @@ cups_globals_free(_cups_globals_t *cg)      /* I - Pointer to global data */
 
   httpClose(cg->http);
 
+#ifdef HAVE_SSL
   _httpFreeCredentials(cg->tls_credentials);
+#endif /* HAVE_SSL */
 
   cupsFileClose(cg->stdio_files[0]);
   cupsFileClose(cg->stdio_files[1]);
@@ -357,9 +372,12 @@ cups_globals_free(_cups_globals_t *cg)     /* I - Pointer to global data */
 
   cupsFreeOptions(cg->cupsd_num_settings, cg->cupsd_settings);
 
+  if (cg->raster_error.start)
+    free(cg->raster_error.start);
+
   free(cg);
 }
-#endif /* HAVE_PTHREAD_H || WIN32 */
+#endif /* HAVE_PTHREAD_H || _WIN32 */
 
 
 #ifdef HAVE_PTHREAD_H
@@ -377,8 +395,3 @@ cups_globals_init(void)
   pthread_key_create(&cups_globals_key, (void (*)(void *))cups_globals_free);
 }
 #endif /* HAVE_PTHREAD_H */
-
-
-/*
- * End of "$Id: globals.c 11173 2013-07-23 12:31:34Z msweet $".
- */