ab5b1d270153e46883e35cba4d1e85e0a4b21dcc
[gnupg.git] / common / homedir.c
1 /* homedir.c - Setup the home directory.
2  *      Copyright (C) 2004 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 2 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, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #include <config.h>
22 #include <stdlib.h>
23 #include <errno.h>
24 #include <fcntl.h>
25
26 #ifdef HAVE_W32_SYSTEM
27 #include <shlobj.h>
28 #ifndef CSIDL_APPDATA
29 #define CSIDL_APPDATA 0x001a
30 #endif
31 #ifndef CSIDL_LOCAL_APPDATA
32 #define CSIDL_LOCAL_APPDATA 0x001c
33 #endif
34 #ifndef CSIDL_FLAG_CREATE
35 #define CSIDL_FLAG_CREATE 0x8000
36 #endif
37 #endif /*HAVE_W32_SYSTEM*/
38
39
40
41 #include "util.h"
42 #include "sysutils.h"
43
44 /* Set up the default home directory.  The usual --homedir option
45    should be parsed later. */
46 const char *
47 default_homedir (void)
48 {
49   const char *dir;
50
51   dir = getenv("GNUPGHOME");
52 #ifdef HAVE_W32_SYSTEM
53   if (!dir || !*dir)
54     dir = read_w32_registry_string (NULL, "Software\\GNU\\GnuPG", "HomeDir");
55   if (!dir || !*dir)
56     {
57       char path[MAX_PATH];
58       
59       /* fixme: It might be better to use LOCAL_APPDATA because this
60          is defined as "non roaming" and thus more likely to be kept
61          locally.  For private keys this is desired.  However, given
62          that many users copy private keys anyway forth and back,
63          using a system roaming serives might be better than to let
64          them do it manually.  A security conscious user will anyway
65          use the registry entry to have better control.  */
66       if (SHGetFolderPath(NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE, 
67                           NULL, 0, path) >= 0) 
68         {
69           char *tmp = xmalloc (strlen (path) + 6 +1);
70           strcpy (stpcpy (tmp, path), "\\gnupg");
71           dir = tmp;
72           
73           /* Try to create the directory if it does not yet
74              exists.  */
75           if (access (dir, F_OK))
76             CreateDirectory (dir, NULL);
77         }
78     }
79 #endif /*HAVE_W32_SYSTEM*/
80   if (!dir || !*dir)
81     dir = GNUPG_DEFAULT_HOMEDIR;
82
83   return dir;
84 }