w32: Remove unused code.
[gnupg.git] / jnlib / w32-reg.c
1 /* w32-reg.c -  MS-Windows Registry access
2  * Copyright (C) 1999, 2002, 2007 Free Software Foundation, Inc.
3  *
4  * This file is part of JNLIB.
5  *
6  * JNLIB is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 3 of
9  * the License, or (at your option) any later version.
10  *
11  * JNLIB is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <config.h>
21 #ifdef HAVE_W32_SYSTEM
22  /* This module is only used in this environment */
23
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include <stdarg.h>
28 #ifdef HAVE_WINSOCK2_H
29 # include <winsock2.h>
30 #endif
31 #include <windows.h>
32
33 #include "libjnlib-config.h"
34 #include "w32help.h"
35
36 static HKEY
37 get_root_key(const char *root)
38 {
39   HKEY root_key;
40
41   if (!root)
42     root_key = HKEY_CURRENT_USER;
43   else if (!strcmp( root, "HKEY_CLASSES_ROOT" ) )
44     root_key = HKEY_CLASSES_ROOT;
45   else if (!strcmp( root, "HKEY_CURRENT_USER" ) )
46     root_key = HKEY_CURRENT_USER;
47   else if (!strcmp( root, "HKEY_LOCAL_MACHINE" ) )
48     root_key = HKEY_LOCAL_MACHINE;
49   else if (!strcmp( root, "HKEY_USERS" ) )
50     root_key = HKEY_USERS;
51   else if (!strcmp( root, "HKEY_PERFORMANCE_DATA" ) )
52     root_key = HKEY_PERFORMANCE_DATA;
53   else if (!strcmp( root, "HKEY_CURRENT_CONFIG" ) )
54     root_key = HKEY_CURRENT_CONFIG;
55   else
56     return NULL;
57
58   return root_key;
59 }
60
61
62 /* Return a string from the Win32 Registry or NULL in case of error.
63    Caller must release the return value.  A NULL for root is an alias
64    for HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE in turn.  */
65 char *
66 read_w32_registry_string (const char *root, const char *dir, const char *name)
67 {
68   HKEY root_key, key_handle;
69   DWORD n1, nbytes, type;
70   char *result = NULL;
71
72   if ( !(root_key = get_root_key(root) ) )
73     return NULL;
74
75   if ( RegOpenKeyEx( root_key, dir, 0, KEY_READ, &key_handle ) )
76     {
77       if (root)
78         return NULL; /* No need for a RegClose, so return immediately. */
79       /* It seems to be common practise to fall back to HKLM. */
80       if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle) )
81         return NULL; /* Still no need for a RegClose. */
82     }
83
84   nbytes = 1;
85   if (RegQueryValueEx( key_handle, name, 0, NULL, NULL, &nbytes ) )
86     goto leave;
87   result = jnlib_malloc ((n1=nbytes+1));
88   if (!result)
89     goto leave;
90   if (RegQueryValueEx( key_handle, name, 0, &type, result, &n1 ))
91     {
92       jnlib_free (result);
93       result = NULL;
94       goto leave;
95     }
96   result[nbytes] = 0; /* Make sure it is a string.  */
97   if (type == REG_EXPAND_SZ && strchr (result, '%'))
98     {
99       char *tmp;
100
101       n1 += 1000;
102       tmp = jnlib_malloc (n1+1);
103       if (!tmp)
104         goto leave;
105       nbytes = ExpandEnvironmentStrings (result, tmp, n1);
106       if (nbytes && nbytes > n1)
107         {
108           jnlib_free (tmp);
109           n1 = nbytes;
110           tmp = jnlib_malloc (n1 + 1);
111           if (!tmp)
112             goto leave;
113           nbytes = ExpandEnvironmentStrings (result, tmp, n1);
114           if (nbytes && nbytes > n1)
115             {
116               /* Oops - truncated, better don't expand at all.  */
117               jnlib_free (tmp);
118               goto leave;
119             }
120           tmp[nbytes] = 0;
121           jnlib_free (result);
122           result = tmp;
123         }
124       else if (nbytes)
125         {
126           /* Okay, reduce the length.  */
127           tmp[nbytes] = 0;
128           jnlib_free (result);
129           result = jnlib_malloc (strlen (tmp)+1);
130           if (!result)
131             result = tmp;
132             else
133               {
134                 strcpy (result, tmp);
135                 jnlib_free (tmp);
136               }
137         }
138       else
139         {
140           /* Error - don't expand.  */
141           jnlib_free (tmp);
142         }
143     }
144
145  leave:
146   RegCloseKey (key_handle);
147   return result;
148 }
149
150
151 #endif /*HAVE_W32_SYSTEM*/