Implement /run/user/UID/gnupg based sockets.
[gnupg.git] / common / homedir.c
1 /* homedir.c - Setup the home directory.
2  * Copyright (C) 2004, 2006, 2007, 2010 Free Software Foundation, Inc.
3  * Copyright (C) 2013, 2016 Werner Koch
4  *
5  * This file is part of GnuPG.
6  *
7  * This file is free software; you can redistribute it and/or modify
8  * it under the terms of either
9  *
10  *   - the GNU Lesser General Public License as published by the Free
11  *     Software Foundation; either version 3 of the License, or (at
12  *     your option) any later version.
13  *
14  * or
15  *
16  *   - the GNU General Public License as published by the Free
17  *     Software Foundation; either version 2 of the License, or (at
18  *     your option) any later version.
19  *
20  * or both in parallel, as here.
21  *
22  * This file is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25  * GNU General Public License for more details.
26  *
27  * You should have received a copy of the GNU General Public License
28  * along with this program; if not, see <http://www.gnu.org/licenses/>.
29  */
30
31 #include <config.h>
32 #include <stdlib.h>
33 #include <errno.h>
34 #include <fcntl.h>
35 #include <unistd.h>
36
37 #ifdef HAVE_W32_SYSTEM
38 #include <winsock2.h>   /* Due to the stupid mingw64 requirement to
39                            include this header before windows.h which
40                            is often implicitly included.  */
41 #include <shlobj.h>
42 #ifndef CSIDL_APPDATA
43 #define CSIDL_APPDATA 0x001a
44 #endif
45 #ifndef CSIDL_LOCAL_APPDATA
46 #define CSIDL_LOCAL_APPDATA 0x001c
47 #endif
48 #ifndef CSIDL_COMMON_APPDATA
49 #define CSIDL_COMMON_APPDATA 0x0023
50 #endif
51 #ifndef CSIDL_FLAG_CREATE
52 #define CSIDL_FLAG_CREATE 0x8000
53 #endif
54 #endif /*HAVE_W32_SYSTEM*/
55
56 #ifdef HAVE_STAT
57 #include <sys/stat.h> /* for stat() */
58 #endif
59
60
61
62 #include "util.h"
63 #include "sysutils.h"
64 #include "zb32.h"
65
66 /* The GnuPG homedir.  This is only accessed by the functions
67  * gnupg_homedir and gnupg_set_homedir.  Malloced.  */
68 static char *the_gnupg_homedir;
69
70 /* Flag indicating that home directory is not the default one.  */
71 static byte non_default_homedir;
72
73
74 #ifdef HAVE_W32_SYSTEM
75 /* A flag used to indicate that a control file for gpgconf has been
76    detected.  Under Windows the presence of this file indicates a
77    portable installations and triggers several changes:
78
79    - The GNUGHOME directory is fixed relative to installation
80      directory.  All other means to set the home directory are ignore.
81
82    - All registry variables will be ignored.
83
84    This flag is not used on Unix systems.
85  */
86 static byte w32_portable_app;
87 #endif /*HAVE_W32_SYSTEM*/
88
89 #ifdef HAVE_W32_SYSTEM
90 /* This flag is true if this process' binary has been installed under
91    bin and not in the root directory as often used before GnuPG 2.1. */
92 static byte w32_bin_is_bin;
93 #endif /*HAVE_W32_SYSTEM*/
94
95
96 #ifdef HAVE_W32_SYSTEM
97 static const char *w32_rootdir (void);
98 #endif
99
100
101
102 #ifdef HAVE_W32_SYSTEM
103 static void
104 w32_try_mkdir (const char *dir)
105 {
106 #ifdef HAVE_W32CE_SYSTEM
107   wchar_t *wdir = utf8_to_wchar (dir);
108   if (wdir)
109     {
110       CreateDirectory (wdir, NULL);
111       xfree (wdir);
112     }
113 #else
114   CreateDirectory (dir, NULL);
115 #endif
116 }
117 #endif
118
119
120 /* This is a helper function to load a Windows function from either of
121    one DLLs. */
122 #ifdef HAVE_W32_SYSTEM
123 static HRESULT
124 w32_shgetfolderpath (HWND a, int b, HANDLE c, DWORD d, LPSTR e)
125 {
126   static int initialized;
127   static HRESULT (WINAPI * func)(HWND,int,HANDLE,DWORD,LPSTR);
128
129   if (!initialized)
130     {
131       static char *dllnames[] = { "shell32.dll", "shfolder.dll", NULL };
132       void *handle;
133       int i;
134
135       initialized = 1;
136
137       for (i=0, handle = NULL; !handle && dllnames[i]; i++)
138         {
139           handle = dlopen (dllnames[i], RTLD_LAZY);
140           if (handle)
141             {
142               func = dlsym (handle, "SHGetFolderPathA");
143               if (!func)
144                 {
145                   dlclose (handle);
146                   handle = NULL;
147                 }
148             }
149         }
150     }
151
152   if (func)
153     return func (a,b,c,d,e);
154   else
155     return -1;
156 }
157 #endif /*HAVE_W32_SYSTEM*/
158
159
160 /* Check whether DIR is the default homedir.  */
161 static int
162 is_gnupg_default_homedir (const char *dir)
163 {
164   int result;
165   char *a = make_absfilename (dir, NULL);
166   char *b = make_absfilename (GNUPG_DEFAULT_HOMEDIR, NULL);
167   result = !compare_filenames (a, b);
168   xfree (b);
169   xfree (a);
170   return result;
171 }
172
173
174 /* Get the standard home directory.  In general this function should
175    not be used as it does not consider a registry value (under W32) or
176    the GNUPGHOME environment variable.  It is better to use
177    default_homedir(). */
178 const char *
179 standard_homedir (void)
180 {
181 #ifdef HAVE_W32_SYSTEM
182   static const char *dir;
183
184   if (!dir)
185     {
186       const char *rdir;
187
188       rdir = w32_rootdir ();
189       if (w32_portable_app)
190         {
191           dir = xstrconcat (rdir, DIRSEP_S "home", NULL);
192         }
193       else
194         {
195           char path[MAX_PATH];
196
197           /* It might be better to use LOCAL_APPDATA because this is
198              defined as "non roaming" and thus more likely to be kept
199              locally.  For private keys this is desired.  However,
200              given that many users copy private keys anyway forth and
201              back, using a system roaming services might be better
202              than to let them do it manually.  A security conscious
203              user will anyway use the registry entry to have better
204              control.  */
205           if (w32_shgetfolderpath (NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE,
206                                    NULL, 0, path) >= 0)
207             {
208               char *tmp = xmalloc (strlen (path) + 6 +1);
209               strcpy (stpcpy (tmp, path), "\\gnupg");
210               dir = tmp;
211
212               /* Try to create the directory if it does not yet exists.  */
213               if (access (dir, F_OK))
214                 w32_try_mkdir (dir);
215             }
216           else
217             dir = GNUPG_DEFAULT_HOMEDIR;
218         }
219     }
220   return dir;
221 #else/*!HAVE_W32_SYSTEM*/
222   return GNUPG_DEFAULT_HOMEDIR;
223 #endif /*!HAVE_W32_SYSTEM*/
224 }
225
226 /* Set up the default home directory.  The usual --homedir option
227    should be parsed later. */
228 const char *
229 default_homedir (void)
230 {
231   const char *dir;
232
233 #ifdef HAVE_W32_SYSTEM
234   /* For a portable application we only use the standard homedir.  */
235   w32_rootdir ();
236   if (w32_portable_app)
237     return standard_homedir ();
238 #endif /*HAVE_W32_SYSTEM*/
239
240   dir = getenv ("GNUPGHOME");
241 #ifdef HAVE_W32_SYSTEM
242   if (!dir || !*dir)
243     {
244       static const char *saved_dir;
245
246       if (!saved_dir)
247         {
248           if (!dir || !*dir)
249             {
250               char *tmp;
251
252               tmp = read_w32_registry_string (NULL,
253                                               GNUPG_REGISTRY_DIR,
254                                               "HomeDir");
255               if (tmp && !*tmp)
256                 {
257                   xfree (tmp);
258                   tmp = NULL;
259                 }
260               if (tmp)
261                 saved_dir = tmp;
262             }
263
264           if (!saved_dir)
265             saved_dir = standard_homedir ();
266         }
267       dir = saved_dir;
268     }
269 #endif /*HAVE_W32_SYSTEM*/
270   if (!dir || !*dir)
271     dir = GNUPG_DEFAULT_HOMEDIR;
272   else if (!is_gnupg_default_homedir (dir))
273     non_default_homedir = 1;
274
275   return dir;
276 }
277
278
279 #ifdef HAVE_W32_SYSTEM
280 /* Check whether gpgconf is installed and if so read the gpgconf.ctl
281    file. */
282 static void
283 check_portable_app (const char *dir)
284 {
285   char *fname;
286
287   fname = xstrconcat (dir, DIRSEP_S "gpgconf.exe", NULL);
288   if (!access (fname, F_OK))
289     {
290       strcpy (fname + strlen (fname) - 3, "ctl");
291       if (!access (fname, F_OK))
292         {
293           /* gpgconf.ctl file found.  Record this fact.  */
294           w32_portable_app = 1;
295           {
296             unsigned int flags;
297             log_get_prefix (&flags);
298             log_set_prefix (NULL, (flags | GPGRT_LOG_NO_REGISTRY));
299           }
300           /* FIXME: We should read the file to detect special flags
301              and print a warning if we don't understand them  */
302         }
303     }
304   xfree (fname);
305 }
306
307
308 /* Determine the root directory of the gnupg installation on Windows.  */
309 static const char *
310 w32_rootdir (void)
311 {
312   static int got_dir;
313   static char dir[MAX_PATH+5];
314
315   if (!got_dir)
316     {
317       char *p;
318       int rc;
319       wchar_t wdir [MAX_PATH+5];
320
321       rc = GetModuleFileNameW (NULL, wdir, MAX_PATH);
322       if (rc && WideCharToMultiByte (CP_UTF8, 0, wdir, -1, dir, MAX_PATH-4,
323                                      NULL, NULL) < 0)
324         rc = 0;
325       if (!rc)
326         {
327           log_debug ("GetModuleFileName failed: %s\n", w32_strerror (-1));
328           *dir = 0;
329         }
330       got_dir = 1;
331       p = strrchr (dir, DIRSEP_C);
332       if (p)
333         {
334           *p = 0;
335
336           check_portable_app (dir);
337
338           /* If we are installed below "bin" we strip that and use
339              the top directory instead.  */
340           p = strrchr (dir, DIRSEP_C);
341           if (p && !strcmp (p+1, "bin"))
342             {
343               *p = 0;
344               w32_bin_is_bin = 1;
345             }
346         }
347       if (!p)
348         {
349           log_debug ("bad filename '%s' returned for this process\n", dir);
350           *dir = 0;
351         }
352     }
353
354   if (*dir)
355     return dir;
356   /* Fallback to the hardwired value. */
357   return GNUPG_LIBEXECDIR;
358 }
359
360 static const char *
361 w32_commondir (void)
362 {
363   static char *dir;
364
365   if (!dir)
366     {
367       const char *rdir;
368       char path[MAX_PATH];
369
370       /* Make sure that w32_rootdir has been called so that we are
371          able to check the portable application flag.  The common dir
372          is the identical to the rootdir.  In that case there is also
373          no need to strdup its value.  */
374       rdir = w32_rootdir ();
375       if (w32_portable_app)
376         return rdir;
377
378       if (w32_shgetfolderpath (NULL, CSIDL_COMMON_APPDATA,
379                                NULL, 0, path) >= 0)
380         {
381           char *tmp = xmalloc (strlen (path) + 4 +1);
382           strcpy (stpcpy (tmp, path), "\\GNU");
383           dir = tmp;
384           /* No auto create of the directory.  Either the installer or
385              the admin has to create these directories.  */
386         }
387       else
388         {
389           /* Ooops: Not defined - probably an old Windows version.
390              Use the installation directory instead.  */
391           dir = xstrdup (rdir);
392         }
393     }
394
395   return dir;
396 }
397 #endif /*HAVE_W32_SYSTEM*/
398
399
400 /* Change the homedir.  Some care must be taken to set this early
401  * enough because previous calls to gnupg_homedir may else return a
402  * different string.  */
403 void
404 gnupg_set_homedir (const char *newdir)
405 {
406   if (!newdir || !*newdir)
407     newdir = default_homedir ();
408   else if (!is_gnupg_default_homedir (newdir))
409     non_default_homedir = 1;
410   xfree (the_gnupg_homedir);
411   the_gnupg_homedir = make_absfilename (newdir, NULL);;
412 }
413
414
415 /* Return the homedir.  The returned string is valid until another
416  * gnupg-set-homedir call.  This is always an absolute directory name.
417  * The function replaces the former global var opt.homedir.  */
418 const char *
419 gnupg_homedir (void)
420 {
421   /* If a homedir has not been set, set it to the default.  */
422   if (!the_gnupg_homedir)
423     the_gnupg_homedir = make_absfilename (default_homedir (), NULL);
424   return the_gnupg_homedir;
425 }
426
427
428 /* Return whether the home dir is the default one.  */
429 int
430 gnupg_default_homedir_p (void)
431 {
432   return !non_default_homedir;
433 }
434
435
436 /* Helper for gnupg-socketdir.  This is a global function, so that
437  * gpgconf can use it for its --create-socketdir command.  If
438  * SKIP_CHECKS is set permission checks etc. are not done.  The
439  * function always returns a malloced directory name and stores these
440  * bit flags at R_INFO:
441  *
442  *   1 := Internal error, stat failed, out of core, etc.
443  *   2 := No /run/user directory.
444  *   4 := Directory not owned by the user, not a directory
445  *        or wrong permissions.
446  *   8 := Same as 4 but for the subdir.
447  *  16 := mkdir failed
448  *  32 := Non default homedir; checking subdir.
449  *  64 := Subdir does not exist.
450  * 128 := Using homedir as fallback.
451  */
452 char *
453 _gnupg_socketdir_internal (int skip_checks, unsigned *r_info)
454 {
455 #if defined(HAVE_W32_SYSTEM) || !defined(HAVE_STAT)
456
457   (void)skip_checks;
458   *r_info = 0;
459   name = xstrdup (gnupg_homedir ());
460
461 #else /* Unix and stat(2) available. */
462
463   static const char * const bases[] = { "/run", "/var/run", NULL};
464   int i;
465   struct stat sb;
466   char prefix[13 + 1 + 20 + 6 + 1];
467   const char *s;
468   char *name = NULL;
469
470   *r_info = 0;
471
472   /* First make sure that non_default_homedir can be set.  */
473   gnupg_homedir ();
474
475   /* It has been suggested to first check XDG_RUNTIME_DIR envvar.
476    * However, the specs state that the lifetime of the directory MUST
477    * be bound to the user being logged in.  Now GnuPG may also be run
478    * as a background process with no (desktop) user logged in.  Thus
479    * we better don't do that.  */
480
481   /* Check whether we have a /run/user dir.  */
482   for (i=0; bases[i]; i++)
483     {
484       snprintf (prefix, sizeof prefix, "%s/user/%u",
485                 bases[i], (unsigned int)getuid ());
486       if (!stat (prefix, &sb) && S_ISDIR(sb.st_mode))
487         break;
488     }
489   if (!bases[i])
490     {
491       *r_info |= 2; /* No /run/user directory.  */
492       goto leave;
493     }
494
495   if (sb.st_uid != getuid ())
496     {
497       *r_info |= 4; /* Not owned by the user.  */
498       if (!skip_checks)
499         goto leave;
500     }
501
502   if (strlen (prefix) + 7 >= sizeof prefix)
503     {
504       *r_info |= 1; /* Ooops: Buffer too short to append "/gnupg".  */
505       goto leave;
506     }
507   strcat (prefix, "/gnupg");
508
509   /* Check whether the gnupg sub directory has proper permissions.  */
510   if (stat (prefix, &sb))
511     {
512       if (errno != ENOENT)
513         {
514           *r_info |= 1; /* stat failed.  */
515           goto leave;
516         }
517
518       /* Try to create the directory and check again.  */
519       if (gnupg_mkdir (prefix, "-rwx"))
520         {
521           *r_info |= 16; /* mkdir failed.  */
522           goto leave;
523         }
524       if (stat (prefix, &sb))
525         {
526           *r_info |= 1; /* stat failed.  */
527           goto leave;
528         }
529     }
530   /* Check that it is a directory, owned by the user, and only the
531    * user has permissions to use it.  */
532   if (!S_ISDIR(sb.st_mode)
533       || sb.st_uid != getuid ()
534       || (sb.st_mode & (S_IRWXG|S_IRWXO)))
535     {
536       *r_info |= 4; /* Bad permissions or not a directory. */
537       if (!skip_checks)
538         goto leave;
539     }
540
541   /* If a non default homedir is used, we check whether an
542    * corresponding sub directory below the socket dir is available
543    * and use that.  We has the non default homedir to keep the new
544    * subdir short enough.  */
545   if (non_default_homedir)
546     {
547       char sha1buf[20];
548       char *suffix;
549
550       *r_info |= 32; /* Testing subdir.  */
551       s = gnupg_homedir ();
552       gcry_md_hash_buffer (GCRY_MD_SHA1, sha1buf, s, strlen (s));
553       suffix = zb32_encode (sha1buf, 8*15);
554       if (!suffix)
555         {
556           *r_info |= 1; /* Out of core etc. */
557           goto leave;
558         }
559       name = strconcat (prefix, "/d.", suffix, NULL);
560       xfree (suffix);
561       if (!name)
562         {
563           *r_info |= 1; /* Out of core etc. */
564           goto leave;
565         }
566
567       /* Stat that directory and check constraints.  Note that we
568        * do not auto create such a directory because we would not
569        * have a way to remove it.  Thus the directory needs to be
570        * pre-created.  The command
571        *    gpgconf --create-socketdir
572        * can be used tocreate that directory.  */
573       if (stat (name, &sb))
574         {
575           if (errno != ENOENT)
576             *r_info |= 1; /* stat failed. */
577           else
578             *r_info |= 64; /* Subdir does not exist.  */
579           if (!skip_checks)
580             {
581               xfree (name);
582               name = NULL;
583               goto leave;
584             }
585         }
586       else if (!S_ISDIR(sb.st_mode)
587                || sb.st_uid != getuid ()
588                || (sb.st_mode & (S_IRWXG|S_IRWXO)))
589         {
590           *r_info |= 8; /* Bad permissions or subdir is not a directory.  */
591           if (!skip_checks)
592             {
593               xfree (name);
594               name = NULL;
595               goto leave;
596             }
597         }
598     }
599   else
600     name = xstrdup (prefix);
601
602  leave:
603   /* If nothing works fall back to the homedir.  */
604   if (!name)
605     {
606       *r_info |= 128; /* Fallback.  */
607       name = xstrdup (gnupg_homedir ());
608     }
609
610 #endif /* Unix */
611
612   return name;
613 }
614
615
616 /*
617  * Return the name of the socket dir.  That is the directory used for
618  * the IPC local sockets.  This is an absolute directory name.
619  */
620 const char *
621 gnupg_socketdir (void)
622 {
623   static char *name;
624
625   if (!name)
626     {
627       unsigned int dummy;
628       name = _gnupg_socketdir_internal (0, &dummy);
629     }
630
631   return name;
632 }
633
634
635 /* Return the name of the sysconfdir.  This is a static string.  This
636    function is required because under Windows we can't simply compile
637    it in.  */
638 const char *
639 gnupg_sysconfdir (void)
640 {
641 #ifdef HAVE_W32_SYSTEM
642   static char *name;
643
644   if (!name)
645     {
646       const char *s1, *s2;
647       s1 = w32_commondir ();
648       s2 = DIRSEP_S "etc" DIRSEP_S "gnupg";
649       name = xmalloc (strlen (s1) + strlen (s2) + 1);
650       strcpy (stpcpy (name, s1), s2);
651     }
652   return name;
653 #else /*!HAVE_W32_SYSTEM*/
654   return GNUPG_SYSCONFDIR;
655 #endif /*!HAVE_W32_SYSTEM*/
656 }
657
658
659 const char *
660 gnupg_bindir (void)
661 {
662 #if defined (HAVE_W32CE_SYSTEM)
663   static char *name;
664
665   if (!name)
666     name = xstrconcat (w32_rootdir (), DIRSEP_S "bin", NULL);
667   return name;
668 #elif defined(HAVE_W32_SYSTEM)
669   const char *rdir;
670
671   rdir = w32_rootdir ();
672   if (w32_bin_is_bin)
673     {
674       static char *name;
675
676       if (!name)
677         name = xstrconcat (rdir, DIRSEP_S "bin", NULL);
678       return name;
679     }
680   else
681     return rdir;
682 #else /*!HAVE_W32_SYSTEM*/
683   return GNUPG_BINDIR;
684 #endif /*!HAVE_W32_SYSTEM*/
685 }
686
687
688 /* Return the name of the libexec directory.  The name is allocated in
689    a static area on the first use.  This function won't fail. */
690 const char *
691 gnupg_libexecdir (void)
692 {
693 #ifdef HAVE_W32_SYSTEM
694   return gnupg_bindir ();
695 #else /*!HAVE_W32_SYSTEM*/
696   return GNUPG_LIBEXECDIR;
697 #endif /*!HAVE_W32_SYSTEM*/
698 }
699
700 const char *
701 gnupg_libdir (void)
702 {
703 #ifdef HAVE_W32_SYSTEM
704   static char *name;
705
706   if (!name)
707     name = xstrconcat (w32_rootdir (), DIRSEP_S "lib" DIRSEP_S "gnupg", NULL);
708   return name;
709 #else /*!HAVE_W32_SYSTEM*/
710   return GNUPG_LIBDIR;
711 #endif /*!HAVE_W32_SYSTEM*/
712 }
713
714 const char *
715 gnupg_datadir (void)
716 {
717 #ifdef HAVE_W32_SYSTEM
718   static char *name;
719
720   if (!name)
721     name = xstrconcat (w32_rootdir (), DIRSEP_S "share" DIRSEP_S "gnupg", NULL);
722   return name;
723 #else /*!HAVE_W32_SYSTEM*/
724   return GNUPG_DATADIR;
725 #endif /*!HAVE_W32_SYSTEM*/
726 }
727
728
729 const char *
730 gnupg_localedir (void)
731 {
732 #ifdef HAVE_W32_SYSTEM
733   static char *name;
734
735   if (!name)
736     name = xstrconcat (w32_rootdir (), DIRSEP_S "share" DIRSEP_S "locale",
737                        NULL);
738   return name;
739 #else /*!HAVE_W32_SYSTEM*/
740   return LOCALEDIR;
741 #endif /*!HAVE_W32_SYSTEM*/
742 }
743
744
745 /* Return the name of the cache directory.  The name is allocated in a
746    static area on the first use.  Windows only: If the directory does
747    not exist it is created.  */
748 const char *
749 gnupg_cachedir (void)
750 {
751 #ifdef HAVE_W32_SYSTEM
752   static const char *dir;
753
754   if (!dir)
755     {
756       const char *rdir;
757
758       rdir = w32_rootdir ();
759       if (w32_portable_app)
760         {
761           dir = xstrconcat (rdir,
762                             DIRSEP_S, "var",
763                             DIRSEP_S, "cache",
764                             DIRSEP_S, "gnupg", NULL);
765         }
766       else
767         {
768           char path[MAX_PATH];
769           const char *s1[] = { "GNU", "cache", "gnupg", NULL };
770           int s1_len;
771           const char **comp;
772
773           s1_len = 0;
774           for (comp = s1; *comp; comp++)
775             s1_len += 1 + strlen (*comp);
776
777           if (w32_shgetfolderpath (NULL, CSIDL_LOCAL_APPDATA|CSIDL_FLAG_CREATE,
778                                    NULL, 0, path) >= 0)
779             {
780               char *tmp = xmalloc (strlen (path) + s1_len + 1);
781               char *p;
782
783               p = stpcpy (tmp, path);
784               for (comp = s1; *comp; comp++)
785                 {
786                   p = stpcpy (p, "\\");
787                   p = stpcpy (p, *comp);
788
789                   if (access (tmp, F_OK))
790                     w32_try_mkdir (tmp);
791                 }
792
793               dir = tmp;
794             }
795           else
796             {
797               dir = "c:\\temp\\cache\\gnupg";
798 #ifdef HAVE_W32CE_SYSTEM
799               dir += 2;
800               w32_try_mkdir ("\\temp\\cache");
801               w32_try_mkdir ("\\temp\\cache\\gnupg");
802 #endif
803             }
804         }
805     }
806   return dir;
807 #else /*!HAVE_W32_SYSTEM*/
808   return GNUPG_LOCALSTATEDIR "/cache/" PACKAGE_NAME;
809 #endif /*!HAVE_W32_SYSTEM*/
810 }
811
812
813 /* Return the system socket name used by DirMngr.  */
814 const char *
815 dirmngr_sys_socket_name (void)
816 {
817 #ifdef HAVE_W32_SYSTEM
818   static char *name;
819
820   if (!name)
821     {
822       char *p;
823 # ifdef HAVE_W32CE_SYSTEM
824       const char *s1, *s2;
825
826       s1 = default_homedir ();
827 # else
828       char s1buf[MAX_PATH];
829       const char *s1, *s2;
830
831       s1 = default_homedir ();
832       if (!w32_portable_app)
833         {
834           /* We need something akin CSIDL_COMMON_PROGRAMS, but local
835              (non-roaming).  This is because the file needs to be on
836              the local machine and makes only sense on that machine.
837              CSIDL_WINDOWS seems to be the only location which
838              guarantees that. */
839           if (w32_shgetfolderpath (NULL, CSIDL_WINDOWS, NULL, 0, s1buf) < 0)
840             strcpy (s1buf, "C:\\WINDOWS");
841           s1 = s1buf;
842         }
843 # endif
844       s2 = DIRSEP_S DIRMNGR_SOCK_NAME;
845       name = xmalloc (strlen (s1) + strlen (s2) + 1);
846       strcpy (stpcpy (name, s1), s2);
847       for (p=name; *p; p++)
848         if (*p == '/')
849           *p = '\\';
850     }
851   return name;
852 #else /*!HAVE_W32_SYSTEM*/
853   return GNUPG_LOCALSTATEDIR "/run/" PACKAGE_NAME "/"DIRMNGR_SOCK_NAME;
854 #endif /*!HAVE_W32_SYSTEM*/
855 }
856
857
858 /* Return the user socket name used by DirMngr.  If a user specific
859    dirmngr installation is not supported, NULL is returned.  */
860 const char *
861 dirmngr_user_socket_name (void)
862 {
863   static char *name;
864
865   if (!name)
866     name = make_filename (gnupg_socketdir (), DIRMNGR_SOCK_NAME, NULL);
867   return name;
868 }
869
870
871 /* Return the default pinentry name.  If RESET is true the internal
872    cache is first flushed.  */
873 static const char *
874 get_default_pinentry_name (int reset)
875 {
876   static struct {
877     const char *(*rfnc)(void);
878     const char *name;
879   } names[] = {
880     /* The first entry is what we return in case we found no
881        other pinentry.  */
882     { gnupg_bindir, DIRSEP_S "pinentry" EXEEXT_S },
883 #ifdef HAVE_W32_SYSTEM
884     /* Try Gpg4win directory (with bin and without.) */
885     { w32_rootdir, "\\..\\Gpg4win\\bin\\pinentry.exe" },
886     { w32_rootdir, "\\..\\Gpg4win\\pinentry.exe" },
887     /* Try old Gpgwin directory.  */
888     { w32_rootdir, "\\..\\GNU\\GnuPG\\pinentry.exe" },
889     /* Try a Pinentry from the common GNU dir.  */
890     { w32_rootdir, "\\..\\GNU\\bin\\pinentry.exe" },
891 #endif
892     /* Last chance is a pinentry-basic (which comes with the
893        GnuPG 2.1 Windows installer).  */
894     { gnupg_bindir, DIRSEP_S "pinentry-basic" EXEEXT_S }
895   };
896   static char *name;
897
898   if (reset)
899     {
900       xfree (name);
901       name = NULL;
902     }
903
904   if (!name)
905     {
906       int i;
907
908       for (i=0; i < DIM(names); i++)
909         {
910           char *name2;
911
912           name2 = xstrconcat (names[i].rfnc (), names[i].name, NULL);
913           if (!access (name2, F_OK))
914             {
915               /* Use that pinentry.  */
916               xfree (name);
917               name = name2;
918               break;
919             }
920           if (!i) /* Store the first as fallback return.  */
921             name = name2;
922           else
923             xfree (name2);
924         }
925     }
926
927   return name;
928 }
929
930
931 /* Return the file name of a helper tool.  WHICH is one of the
932    GNUPG_MODULE_NAME_foo constants.  */
933 const char *
934 gnupg_module_name (int which)
935 {
936 #define X(a,b) do {                                                     \
937     static char *name;                                                  \
938     if (!name)                                                          \
939       name = xstrconcat (gnupg_ ## a (), DIRSEP_S b EXEEXT_S, NULL);    \
940     return name;                                                        \
941   } while (0)
942
943   switch (which)
944     {
945     case GNUPG_MODULE_NAME_AGENT:
946 #ifdef GNUPG_DEFAULT_AGENT
947       return GNUPG_DEFAULT_AGENT;
948 #else
949       X(bindir, "gpg-agent");
950 #endif
951
952     case GNUPG_MODULE_NAME_PINENTRY:
953 #ifdef GNUPG_DEFAULT_PINENTRY
954       return GNUPG_DEFAULT_PINENTRY;  /* (Set by a configure option) */
955 #else
956       return get_default_pinentry_name (0);
957 #endif
958
959     case GNUPG_MODULE_NAME_SCDAEMON:
960 #ifdef GNUPG_DEFAULT_SCDAEMON
961       return GNUPG_DEFAULT_SCDAEMON;
962 #else
963       X(libexecdir, "scdaemon");
964 #endif
965
966     case GNUPG_MODULE_NAME_DIRMNGR:
967 #ifdef GNUPG_DEFAULT_DIRMNGR
968       return GNUPG_DEFAULT_DIRMNGR;
969 #else
970       X(bindir, DIRMNGR_NAME);
971 #endif
972
973     case GNUPG_MODULE_NAME_PROTECT_TOOL:
974 #ifdef GNUPG_DEFAULT_PROTECT_TOOL
975       return GNUPG_DEFAULT_PROTECT_TOOL;
976 #else
977       X(libexecdir, "gpg-protect-tool");
978 #endif
979
980     case GNUPG_MODULE_NAME_DIRMNGR_LDAP:
981 #ifdef GNUPG_DEFAULT_DIRMNGR_LDAP
982       return GNUPG_DEFAULT_DIRMNGR_LDAP;
983 #else
984       X(libexecdir, "dirmngr_ldap");
985 #endif
986
987     case GNUPG_MODULE_NAME_CHECK_PATTERN:
988       X(libexecdir, "gpg-check-pattern");
989
990     case GNUPG_MODULE_NAME_GPGSM:
991       X(bindir, "gpgsm");
992
993     case GNUPG_MODULE_NAME_GPG:
994 #if USE_GPG2_HACK
995       X(bindir, GPG_NAME "2");
996 #else
997       X(bindir, GPG_NAME);
998 #endif
999
1000     case GNUPG_MODULE_NAME_CONNECT_AGENT:
1001       X(bindir, "gpg-connect-agent");
1002
1003     case GNUPG_MODULE_NAME_GPGCONF:
1004       X(bindir, "gpgconf");
1005
1006     default:
1007       BUG ();
1008     }
1009 #undef X
1010 }
1011
1012
1013 /* Flush some of the cached module names.  This is for example used by
1014    gpg-agent to allow configuring a different pinentry.  */
1015 void
1016 gnupg_module_name_flush_some (void)
1017 {
1018   (void)get_default_pinentry_name (1);
1019 }