1 /* Copyright (C) 2001-2006 Artifex Software, Inc.
2    All Rights Reserved.
3 
4    This software is provided AS-IS with no warranty, either express or
5    implied.
6 
7    This software is distributed under license and may not be copied, modified
8    or distributed except as expressly authorized under the terms of that
9    license.  Refer to licensing information at http://www.artifex.com/
10    or contact Artifex Software, Inc.,  7 Mt. Lassen Drive - Suite A-134,
11    San Rafael, CA  94903, U.S.A., +1(415)492-9861, for further information.
12 */
13 
14 /* $Id: dwreg.c 9043 2008-08-28 22:48:19Z giles $ */
15 /* MS Windows registry values */
16 
17 #include <windows.h>
18 #include <stdio.h>
19 #include <stdlib.h>		/* for getenv */
20 #include <string.h>
21 #include "gscdefs.h"		/* for gs_productfamily and gs_revision */
22 
23 /* We store registry named values under the key
24  * "Software\\GPL Ghostscript"
25  * where "GPL Ghostscript" is actually gs_productfamily.
26  * Either HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER will be used.
27  */
28 int
win_registry_key(char * buf,int len)29 win_registry_key(char *buf, int len)
30 {
31     const char *software = "Software";
32     if (strlen(software) + 1 + strlen(gs_productfamily) >= len)
33 	return -1;
34 
35    strcpy(buf, software);
36    strcat(buf, "\\");
37    strcat(buf, gs_productfamily);
38    return 0;
39 }
40 
41 /*
42  * Get a named registry value from HKCU.
43  * name, ptr, plen and return values are the same as in gp_getenv();
44  */
45 int
win_get_reg_value(const char * name,char * ptr,int * plen)46 win_get_reg_value(const char *name, char *ptr, int *plen)
47 {
48     HKEY hkey;
49     DWORD cbData, keytype;
50     BYTE b;
51     LONG rc;
52     BYTE *bptr = (BYTE *)ptr;
53     char key[256];
54 
55     win_registry_key(key, sizeof(key));
56     if (RegOpenKeyEx(HKEY_CURRENT_USER, key, 0, KEY_READ, &hkey)
57 	== ERROR_SUCCESS) {
58 	keytype = REG_SZ;
59 	cbData = *plen;
60 	if (bptr == (char *)NULL)
61 	    bptr = &b;	/* Registry API won't return ERROR_MORE_DATA */
62 			/* if ptr is NULL */
63 	rc = RegQueryValueEx(hkey, (char *)name, 0, &keytype, bptr, &cbData);
64 	RegCloseKey(hkey);
65 	if (rc == ERROR_SUCCESS) {
66 	    *plen = cbData;
67 	    return 0;	/* found environment variable and copied it */
68 	} else if (rc == ERROR_MORE_DATA) {
69 	    /* buffer wasn't large enough */
70 	    *plen = cbData;
71 	    return -1;
72 	}
73     }
74     return 1;	/* not found */
75 }
76 
77 /*
78  * Set a named registry value under HKCU.
79  * name = name of named value
80  * str = value of named value
81  * Returns 0 on success.
82  */
83 int
win_set_reg_value(const char * name,const char * value)84 win_set_reg_value(const char *name, const char *value)
85 {
86     HKEY hkey;
87     LONG rc;
88     char key[256];
89     DWORD dwDisposition;
90 
91     win_registry_key(key, sizeof(key));
92     rc = RegOpenKeyEx(HKEY_CURRENT_USER, key, 0, KEY_WRITE, &hkey);
93     if (rc != ERROR_SUCCESS)
94 	rc = RegCreateKeyEx(HKEY_CURRENT_USER, key, 0, "", 0,
95 	    KEY_ALL_ACCESS, NULL, &hkey, &dwDisposition);
96     if (rc == ERROR_SUCCESS) {
97 	rc = RegSetValueEx(hkey, name, 0, REG_SZ,
98 		(CONST BYTE *)value, strlen(value)+1);
99 	RegCloseKey(hkey);
100     }
101 
102     return rc == ERROR_SUCCESS ? 0 : -1;
103 }
104 
105