xref: /plan9/sys/src/cmd/gs/src/gp_wgetv.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
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