17dd7cddfSDavid du Colombier /* Copyright (C) 1998, 1999 Aladdin Enterprises. All rights reserved.
27dd7cddfSDavid du Colombier
3*593dc095SDavid du Colombier This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier implied.
57dd7cddfSDavid du Colombier
6*593dc095SDavid du Colombier This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier
10*593dc095SDavid du Colombier For more information about licensing, please refer to
11*593dc095SDavid du Colombier http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier San Rafael, CA 94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier
17*593dc095SDavid du Colombier /* $Id: gp_wgetv.c,v 1.6 2002/02/21 22:24:52 giles Exp $ */
187dd7cddfSDavid du Colombier /* MS Windows implementation of gp_getenv */
197dd7cddfSDavid du Colombier
207dd7cddfSDavid du Colombier #include <windows.h>
217dd7cddfSDavid du Colombier #include <stdio.h>
227dd7cddfSDavid du Colombier #include <stdlib.h> /* for getenv */
237dd7cddfSDavid du Colombier #include <string.h>
247dd7cddfSDavid du Colombier #include "gscdefs.h" /* for gs_productfamily and gs_revision */
257dd7cddfSDavid du Colombier
267dd7cddfSDavid du Colombier /* prototypes */
277dd7cddfSDavid du Colombier int gp_getenv_registry(HKEY hkeyroot, const char *key, const char *name,
287dd7cddfSDavid du Colombier char *ptr, int *plen);
297dd7cddfSDavid du Colombier
307dd7cddfSDavid du Colombier /* ------ Environment variables ------ */
317dd7cddfSDavid du Colombier
327dd7cddfSDavid du Colombier /* Get the value of an environment variable. See gp.h for details. */
337dd7cddfSDavid du Colombier int
gp_getenv(const char * name,char * ptr,int * plen)347dd7cddfSDavid du Colombier gp_getenv(const char *name, char *ptr, int *plen)
357dd7cddfSDavid du Colombier {
367dd7cddfSDavid du Colombier const char *str = getenv(name);
377dd7cddfSDavid du Colombier
387dd7cddfSDavid du Colombier if (str) {
397dd7cddfSDavid du Colombier int len = strlen(str);
407dd7cddfSDavid du Colombier
417dd7cddfSDavid du Colombier if (len < *plen) {
427dd7cddfSDavid du Colombier /* string fits */
437dd7cddfSDavid du Colombier strcpy(ptr, str);
447dd7cddfSDavid du Colombier *plen = len + 1;
457dd7cddfSDavid du Colombier return 0;
467dd7cddfSDavid du Colombier }
477dd7cddfSDavid du Colombier /* string doesn't fit */
487dd7cddfSDavid du Colombier *plen = len + 1;
497dd7cddfSDavid du Colombier return -1;
507dd7cddfSDavid du Colombier }
517dd7cddfSDavid du Colombier /* environment variable was not found */
527dd7cddfSDavid du Colombier
537dd7cddfSDavid du Colombier #ifdef __WIN32__
547dd7cddfSDavid du Colombier {
557dd7cddfSDavid du Colombier /* If using Win32, look in the registry for a value with
567dd7cddfSDavid du Colombier * the given name. The registry value will be under the key
573ff48bf5SDavid du Colombier * HKEY_CURRENT_USER\Software\AFPL Ghostscript\N.NN
587dd7cddfSDavid du Colombier * or if that fails under the key
593ff48bf5SDavid du Colombier * HKEY_LOCAL_MACHINE\Software\AFPL Ghostscript\N.NN
603ff48bf5SDavid du Colombier * where "AFPL Ghostscript" is actually gs_productfamily
617dd7cddfSDavid du Colombier * and N.NN is obtained from gs_revision.
627dd7cddfSDavid du Colombier */
637dd7cddfSDavid du Colombier DWORD version = GetVersion();
647dd7cddfSDavid du Colombier
657dd7cddfSDavid du Colombier if (!(((HIWORD(version) & 0x8000) != 0)
667dd7cddfSDavid du Colombier && ((HIWORD(version) & 0x4000) == 0))) {
677dd7cddfSDavid du Colombier /* not Win32s */
687dd7cddfSDavid du Colombier int code;
697dd7cddfSDavid du Colombier char key[256];
703ff48bf5SDavid du Colombier char dotversion[16];
713ff48bf5SDavid du Colombier
723ff48bf5SDavid du Colombier sprintf(dotversion, "%d.%02d", (int)(gs_revision / 100),
733ff48bf5SDavid du Colombier (int)(gs_revision % 100));
743ff48bf5SDavid du Colombier sprintf(key, "Software\\%s\\%s", gs_productfamily, dotversion);
757dd7cddfSDavid du Colombier
767dd7cddfSDavid du Colombier code = gp_getenv_registry(HKEY_CURRENT_USER, key, name, ptr, plen);
777dd7cddfSDavid du Colombier if ( code <= 0 )
787dd7cddfSDavid du Colombier return code; /* found it */
797dd7cddfSDavid du Colombier
807dd7cddfSDavid du Colombier code = gp_getenv_registry(HKEY_LOCAL_MACHINE, key, name, ptr, plen);
817dd7cddfSDavid du Colombier if ( code <= 0 )
827dd7cddfSDavid du Colombier return code; /* found it */
837dd7cddfSDavid du Colombier }
847dd7cddfSDavid du Colombier }
857dd7cddfSDavid du Colombier #endif
867dd7cddfSDavid du Colombier
877dd7cddfSDavid du Colombier /* nothing found at all */
887dd7cddfSDavid du Colombier
897dd7cddfSDavid du Colombier if (*plen > 0)
907dd7cddfSDavid du Colombier *ptr = 0;
917dd7cddfSDavid du Colombier *plen = 1;
927dd7cddfSDavid du Colombier return 1;
937dd7cddfSDavid du Colombier }
947dd7cddfSDavid du Colombier
957dd7cddfSDavid du Colombier
967dd7cddfSDavid du Colombier /*
977dd7cddfSDavid du Colombier * Get a named registry value.
987dd7cddfSDavid du Colombier * Key = hkeyroot\\key, named value = name.
997dd7cddfSDavid du Colombier * name, ptr, plen and return values are the same as in gp_getenv();
1007dd7cddfSDavid du Colombier */
1017dd7cddfSDavid du Colombier
1027dd7cddfSDavid du Colombier int
gp_getenv_registry(HKEY hkeyroot,const char * key,const char * name,char * ptr,int * plen)1037dd7cddfSDavid du Colombier gp_getenv_registry(HKEY hkeyroot, const char *key, const char *name,
1047dd7cddfSDavid du Colombier char *ptr, int *plen)
1057dd7cddfSDavid du Colombier {
1067dd7cddfSDavid du Colombier HKEY hkey;
1077dd7cddfSDavid du Colombier DWORD cbData, keytype;
1087dd7cddfSDavid du Colombier BYTE b;
1097dd7cddfSDavid du Colombier LONG rc;
1107dd7cddfSDavid du Colombier BYTE *bptr = (BYTE *)ptr;
1117dd7cddfSDavid du Colombier
1127dd7cddfSDavid du Colombier if (RegOpenKeyEx(hkeyroot, key, 0, KEY_READ, &hkey)
1137dd7cddfSDavid du Colombier == ERROR_SUCCESS) {
1147dd7cddfSDavid du Colombier keytype = REG_SZ;
1157dd7cddfSDavid du Colombier cbData = *plen;
1167dd7cddfSDavid du Colombier if (bptr == (char *)NULL)
1177dd7cddfSDavid du Colombier bptr = &b; /* Registry API won't return ERROR_MORE_DATA */
1187dd7cddfSDavid du Colombier /* if ptr is NULL */
1197dd7cddfSDavid du Colombier rc = RegQueryValueEx(hkey, (char *)name, 0, &keytype, bptr, &cbData);
1207dd7cddfSDavid du Colombier RegCloseKey(hkey);
1217dd7cddfSDavid du Colombier if (rc == ERROR_SUCCESS) {
1227dd7cddfSDavid du Colombier *plen = cbData;
1237dd7cddfSDavid du Colombier return 0; /* found environment variable and copied it */
1247dd7cddfSDavid du Colombier } else if (rc == ERROR_MORE_DATA) {
1257dd7cddfSDavid du Colombier /* buffer wasn't large enough */
1267dd7cddfSDavid du Colombier *plen = cbData;
1277dd7cddfSDavid du Colombier return -1;
1287dd7cddfSDavid du Colombier }
1297dd7cddfSDavid du Colombier }
1307dd7cddfSDavid du Colombier return 1; /* not found */
1317dd7cddfSDavid du Colombier }
132