Print --version etc via estream
[gnupg.git] / common / homedir.c
1 /* homedir.c - Setup the home directory.
2  * Copyright (C) 2004, 2006, 2007, 2010 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
6  * GnuPG is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * GnuPG is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <config.h>
21 #include <stdlib.h>
22 #include <errno.h>
23 #include <fcntl.h>
24
25 #ifdef HAVE_W32_SYSTEM
26 #include <shlobj.h>
27 #ifndef CSIDL_APPDATA
28 #define CSIDL_APPDATA 0x001a
29 #endif
30 #ifndef CSIDL_LOCAL_APPDATA
31 #define CSIDL_LOCAL_APPDATA 0x001c
32 #endif
33 #ifndef CSIDL_COMMON_APPDATA
34 #define CSIDL_COMMON_APPDATA 0x0023
35 #endif
36 #ifndef CSIDL_FLAG_CREATE
37 #define CSIDL_FLAG_CREATE 0x8000
38 #endif
39 #endif /*HAVE_W32_SYSTEM*/
40
41
42
43 #include "util.h"
44 #include "sysutils.h"
45
46
47 /* This is a helper function to load a Windows function from either of
48    one DLLs. */
49 #ifdef HAVE_W32_SYSTEM
50 static HRESULT
51 w32_shgetfolderpath (HWND a, int b, HANDLE c, DWORD d, LPSTR e)
52 {
53   static int initialized;
54   static HRESULT (WINAPI * func)(HWND,int,HANDLE,DWORD,LPSTR);
55
56   if (!initialized)
57     {
58       static char *dllnames[] = { "shell32.dll", "shfolder.dll", NULL };
59       void *handle;
60       int i;
61
62       initialized = 1;
63
64       for (i=0, handle = NULL; !handle && dllnames[i]; i++)
65         {
66           handle = dlopen (dllnames[i], RTLD_LAZY);
67           if (handle)
68             {
69               func = dlsym (handle, "SHGetFolderPathA");
70               if (!func)
71                 {
72                   dlclose (handle);
73                   handle = NULL;
74                 }
75             }
76         }
77     }
78
79   if (func)
80     return func (a,b,c,d,e);
81   else
82     return -1;
83 }
84 #endif /*HAVE_W32_SYSTEM*/
85
86
87 /* Get the standard home directory.  In general this function should
88    not be used as it does not consider a registry value (under W32) or
89    the GNUPGHOME environment variable.  It is better to use
90    default_homedir(). */
91 const char *
92 standard_homedir (void)
93 {
94 #ifdef HAVE_W32_SYSTEM
95   static const char *dir;
96
97   if (!dir)
98     {
99       char path[MAX_PATH];
100       
101       /* It might be better to use LOCAL_APPDATA because this is
102          defined as "non roaming" and thus more likely to be kept
103          locally.  For private keys this is desired.  However, given
104          that many users copy private keys anyway forth and back,
105          using a system roaming services might be better than to let
106          them do it manually.  A security conscious user will anyway
107          use the registry entry to have better control.  */
108       if (w32_shgetfolderpath (NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE, 
109                                NULL, 0, path) >= 0) 
110         {
111           char *tmp = xmalloc (strlen (path) + 6 +1);
112           strcpy (stpcpy (tmp, path), "\\gnupg");
113           dir = tmp;
114           
115           /* Try to create the directory if it does not yet exists.  */
116           if (access (dir, F_OK))
117             {
118 #ifdef HAVE_W32CE_SYSTEM
119               wchar_t *wdir = utf8_to_wchar (dir);
120               if (wdir)
121                 {
122                   CreateDirectory (wdir, NULL);
123                   xfree (wdir);
124                 }
125 #else              
126               CreateDirectory (dir, NULL);
127 #endif
128             }
129         }
130       else
131         dir = GNUPG_DEFAULT_HOMEDIR;
132     }
133   return dir;
134 #else/*!HAVE_W32_SYSTEM*/
135   return GNUPG_DEFAULT_HOMEDIR;
136 #endif /*!HAVE_W32_SYSTEM*/
137 }
138
139 /* Set up the default home directory.  The usual --homedir option
140    should be parsed later. */
141 const char *
142 default_homedir (void)
143 {
144   const char *dir;
145
146   dir = getenv ("GNUPGHOME");
147 #ifdef HAVE_W32_SYSTEM
148   if (!dir || !*dir)
149     {
150       static const char *saved_dir;
151       
152       if (!saved_dir)
153         {
154           if (!dir || !*dir)
155             {
156               char *tmp;
157
158               tmp = read_w32_registry_string (NULL, "Software\\GNU\\GnuPG",
159                                               "HomeDir");
160               if (tmp && !*tmp)
161                 {
162                   xfree (tmp);
163                   tmp = NULL;
164                 }
165               if (tmp)
166                 saved_dir = tmp;
167             }
168           
169           if (!saved_dir)
170             saved_dir = standard_homedir ();
171         }
172       dir = saved_dir;
173     }
174 #endif /*HAVE_W32_SYSTEM*/
175   if (!dir || !*dir)
176     dir = GNUPG_DEFAULT_HOMEDIR;
177
178   return dir;
179 }
180
181
182 #ifdef HAVE_W32_SYSTEM
183 static const char *
184 w32_rootdir (void)
185 {
186   static int got_dir;
187   static char dir[MAX_PATH+5];
188
189   if (!got_dir)
190     {
191       char *p;
192       int rc;
193
194 #ifdef HAVE_W32CE_SYSTEM
195       {
196         wchar_t wdir [MAX_PATH+5];
197         rc = GetModuleFileName (NULL, wdir, MAX_PATH);
198         if (rc && WideCharToMultiByte (CP_UTF8, 0, wdir, -1, dir, MAX_PATH-4,
199                                        NULL, NULL) < 0)
200           rc = 0;
201       }
202 #else
203       rc = GetModuleFileName (NULL, dir, MAX_PATH);
204 #endif
205       if (!rc)
206         {
207           log_debug ("GetModuleFileName failed: %s\n", w32_strerror (0));
208           *dir = 0;
209         }
210       got_dir = 1;
211       p = strrchr (dir, DIRSEP_C);
212       if (p)
213         *p = 0;
214       else
215         {
216           log_debug ("bad filename `%s' returned for this process\n", dir);
217           *dir = 0; 
218         }
219     }
220
221   if (*dir)
222     return dir;
223   /* Fallback to the hardwired value. */
224   return GNUPG_LIBEXECDIR;
225 }
226
227 static const char *
228 w32_commondir (void)
229 {
230   static char *dir;
231
232   if (!dir)
233     {
234       char path[MAX_PATH];
235
236       if (w32_shgetfolderpath (NULL, CSIDL_COMMON_APPDATA, 
237                                NULL, 0, path) >= 0) 
238         {
239           char *tmp = xmalloc (strlen (path) + 4 +1);
240           strcpy (stpcpy (tmp, path), "\\GNU");
241           dir = tmp;
242           /* No auto create of the directory.  Either the installer or
243              the admin has to create these directories.  */
244         }
245       else
246         {
247           /* Ooops: Not defined - probably an old Windows version.
248              Use the installation directory instead.  */
249           dir = xstrdup (w32_rootdir ());
250         }
251     }
252   
253   return dir;
254 }
255 #endif /*HAVE_W32_SYSTEM*/
256
257
258
259
260 /* Return the name of the sysconfdir.  This is a static string.  This
261    function is required because under Windows we can't simply compile
262    it in.  */
263 const char *
264 gnupg_sysconfdir (void)
265 {
266 #ifdef HAVE_W32_SYSTEM
267   static char *name;
268
269   if (!name)
270     {
271       const char *s1, *s2;
272       s1 = w32_commondir ();
273       s2 = DIRSEP_S "etc" DIRSEP_S "gnupg";
274       name = xmalloc (strlen (s1) + strlen (s2) + 1);
275       strcpy (stpcpy (name, s1), s2);
276     }
277   return name;
278 #else /*!HAVE_W32_SYSTEM*/
279   return GNUPG_SYSCONFDIR;
280 #endif /*!HAVE_W32_SYSTEM*/
281 }
282
283
284 const char *
285 gnupg_bindir (void)
286 {
287 #ifdef HAVE_W32_SYSTEM
288   return w32_rootdir ();
289 #else /*!HAVE_W32_SYSTEM*/
290   return GNUPG_BINDIR;
291 #endif /*!HAVE_W32_SYSTEM*/
292 }
293
294
295 /* Return the name of the libexec directory.  The name is allocated in
296    a static area on the first use.  This function won't fail. */
297 const char *
298 gnupg_libexecdir (void)
299 {
300 #ifdef HAVE_W32_SYSTEM
301   return w32_rootdir ();
302 #else /*!HAVE_W32_SYSTEM*/
303   return GNUPG_LIBEXECDIR;
304 #endif /*!HAVE_W32_SYSTEM*/
305 }
306
307 const char *
308 gnupg_libdir (void)
309 {
310 #ifdef HAVE_W32_SYSTEM
311   static char *name;
312
313   if (!name)
314     {
315       const char *s1, *s2;
316       s1 = w32_rootdir ();
317       s2 = DIRSEP_S "lib" DIRSEP_S "gnupg";
318       name = xmalloc (strlen (s1) + strlen (s2) + 1);
319       strcpy (stpcpy (name, s1), s2);
320     }
321   return name;
322 #else /*!HAVE_W32_SYSTEM*/
323   return GNUPG_LIBDIR;
324 #endif /*!HAVE_W32_SYSTEM*/
325 }
326
327 const char *
328 gnupg_datadir (void)
329 {
330 #ifdef HAVE_W32_SYSTEM
331   static char *name;
332
333   if (!name)
334     {
335       const char *s1, *s2;
336       s1 = w32_rootdir ();
337       s2 = DIRSEP_S "share" DIRSEP_S "gnupg";
338       name = xmalloc (strlen (s1) + strlen (s2) + 1);
339       strcpy (stpcpy (name, s1), s2);
340     }
341   return name;
342 #else /*!HAVE_W32_SYSTEM*/
343   return GNUPG_DATADIR;
344 #endif /*!HAVE_W32_SYSTEM*/
345 }
346
347
348 const char *
349 gnupg_localedir (void)
350 {
351 #ifdef HAVE_W32_SYSTEM
352   static char *name;
353
354   if (!name)
355     {
356       const char *s1, *s2;
357       s1 = w32_rootdir ();
358       s2 = DIRSEP_S "share" DIRSEP_S "locale";
359       name = xmalloc (strlen (s1) + strlen (s2) + 1);
360       strcpy (stpcpy (name, s1), s2);
361     }
362   return name;
363 #else /*!HAVE_W32_SYSTEM*/
364   return LOCALEDIR;
365 #endif /*!HAVE_W32_SYSTEM*/
366 }
367
368
369 /* Return the default socket name used by DirMngr. */
370 const char *
371 dirmngr_socket_name (void)
372 {
373 #ifdef HAVE_W32_SYSTEM
374   static char *name;
375
376   if (!name)
377     {
378       char s1[MAX_PATH];
379       const char *s2;
380
381       /* We need something akin CSIDL_COMMON_PROGRAMS, but local
382          (non-roaming).  */
383       if (w32_shgetfolderpath (NULL, CSIDL_WINDOWS, NULL, 0, s1) < 0)
384         strcpy (s1, "C:\\WINDOWS");
385       s2 = DIRSEP_S "S.dirmngr";
386       name = xmalloc (strlen (s1) + strlen (s2) + 1);
387       strcpy (stpcpy (name, s1), s2);
388     }
389   return name;
390 #else /*!HAVE_W32_SYSTEM*/
391   return "/var/run/dirmngr/socket";
392 #endif /*!HAVE_W32_SYSTEM*/
393 }
394
395
396
397 /* Return the file name of a helper tool.  WHICH is one of the
398    GNUPG_MODULE_NAME_foo constants.  */
399 const char *
400 gnupg_module_name (int which)
401 {
402   const char *s, *s2;
403
404 #define X(a,b) do {                                          \
405         static char *name;                                   \
406         if (!name)                                           \
407           {                                                  \
408             s = gnupg_ ## a ();                              \
409             s2 = DIRSEP_S b EXEEXT_S;                        \
410             name = xmalloc (strlen (s) + strlen (s2) + 1);   \
411             strcpy (stpcpy (name, s), s2);                   \
412           }                                                  \
413         return name;                                         \
414       } while (0)                                                     
415
416   switch (which)
417     {
418     case GNUPG_MODULE_NAME_AGENT:
419 #ifdef GNUPG_DEFAULT_AGENT
420       return GNUPG_DEFAULT_AGENT;
421 #else 
422       X(bindir, "gpg-agent");
423 #endif
424       
425     case GNUPG_MODULE_NAME_PINENTRY:
426 #ifdef GNUPG_DEFAULT_PINENTRY
427       return GNUPG_DEFAULT_PINENTRY;
428 #else 
429       X(bindir, "pinentry");
430 #endif
431
432     case GNUPG_MODULE_NAME_SCDAEMON:
433 #ifdef GNUPG_DEFAULT_SCDAEMON
434       return GNUPG_DEFAULT_SCDAEMON;
435 #else 
436       X(bindir, "scdaemon");
437 #endif
438
439     case GNUPG_MODULE_NAME_DIRMNGR:
440 #ifdef GNUPG_DEFAULT_DIRMNGR
441       return GNUPG_DEFAULT_DIRMNGR;
442 #else 
443       X(bindir, "dirmngr");
444 #endif
445
446     case GNUPG_MODULE_NAME_PROTECT_TOOL:
447 #ifdef GNUPG_DEFAULT_PROTECT_TOOL
448       return GNUPG_DEFAULT_PROTECT_TOOL;
449 #else 
450       X(libexecdir, "gpg-protect-tool");
451 #endif
452
453     case GNUPG_MODULE_NAME_CHECK_PATTERN:
454       X(libexecdir, "gpg-check-pattern");
455
456     case GNUPG_MODULE_NAME_GPGSM:
457       X(bindir, "gpgsm");
458
459     case GNUPG_MODULE_NAME_GPG:
460       X(bindir, "gpg2");
461
462     case GNUPG_MODULE_NAME_CONNECT_AGENT:
463       X(bindir, "gpg-connect-agent");
464
465     case GNUPG_MODULE_NAME_GPGCONF:
466       X(bindir, "gpgconf");
467
468     default: 
469       BUG ();
470     }
471 #undef X
472 }