1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00
cde/cde/programs/dtlogin/resource.c
2022-02-07 09:48:13 +08:00

878 lines
25 KiB
C

/*
* CDE - Common Desktop Environment
*
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/* $TOG: resource.c /main/7 1997/03/14 13:45:09 barstow $ */
/* (c) Copyright 1997 The Open Group */
/* *
* (c) Copyright 1993, 1994 Hewlett-Packard Company *
* (c) Copyright 1993, 1994 International Business Machines Corp. *
* (c) Copyright 1993, 1994 Sun Microsystems, Inc. *
* (c) Copyright 1993, 1994 Novell, Inc. *
*/
/*
* xdm - display manager daemon
*
* Copyright 1988 Massachusetts Institute of Technology
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted, provided
* that the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of M.I.T. not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. M.I.T. makes no representations about the
* suitability of this software for any purpose. It is provided "as is"
* without express or implied warranty.
*
* Author: Keith Packard, MIT X Consortium
*/
/*
* resource.c
*/
# include "dm.h"
# include "vgmsg.h"
# include <X11/Xresource.h>
# include <X11/Xmu/CharSet.h>
# include <string.h>
void CleanUpName( char *src, char *dst, int len) ;
static char * getFullFileName(char *name, int special, char * lang);
extern char * qualifyWithFirst(char *, char *);
void GetSysParms(char **tzpp, char **fhpp, char **ftpp); // fontpath.c
/* XtOffset() hack for ibmrt BandAidCompiler */
int session_set = False;
char *config;
char *servers;
int request_port;
int debugLevel;
char *errorLogFile;
int errorLogSize;
int daemonMode;
int quiet;
char *pidFile;
int lockPidFile;
char *authDir;
int autoRescan;
int removeDomainname;
char *keyFile;
char *accessFile;
char **exportList; /* List of all export env vars */
char *sysParmsFile;
char *timeZone;
char *fpHead = NULL;
char *fpTail = NULL;
int wakeupInterval;
int langListTimeout;
#ifdef DEF_NETWORK_DEV
char *networkDev;
#endif
/*
* Dtlogin will accept both Dtlogin and XDM resources. The string variable
* "AppName" contains the proper application name to use in looking up
* resources.
*/
# define DISPLAYMANAGER "DisplayManager"
# define DTLOGIN "Dtlogin"
static char AppName[16] = DTLOGIN;
# define DM_STRING 0
# define DM_INT 1
# define DM_BOOL 2
# define DM_ARGV 3
#ifdef BLS
# define DEF_XDM_CONFIG CDE_INSTALLATION_TOP "/lib/X11/Dtlogin/Xconfig"
# define DEF_AUTH_DIR CDE_INSTALLATION_TOP "/lib/X11/Dtlogin"
# define DEF_KEY_FILE CDE_INSTALLATION_TOP "/lib/X11/Dtlogin/Xkeys"
#endif
/*
* the following constants are supposed to be set in the makefile from
* parameters set util/imake.includes/site.def (or *.macros in that directory
* if it is server-specific). DO NOT CHANGE THESE DEFINITIONS!
*/
#ifndef DEF_SERVER_LINE
# ifdef sun
#define DEF_SERVER_LINE ":0 local /usr/openwin/bin/X :0"
# else
#define DEF_SERVER_LINE ":0 local /usr/bin/X11/X :0"
# endif /* sun */
#endif
#ifndef XRDB_PROGRAM
# ifdef sun
#define XRDB_PROGRAM "/usr/openwin/bin/xrdb"
# else
#define XRDB_PROGRAM "/usr/bin/X11/xrdb"
# endif /* sun */
#endif
#ifndef DEF_SESSION
#define DEF_SESSION CDE_INSTALLATION_TOP "/bin/Xsession"
#endif
#ifndef DEF_USER_PATH
# ifdef sun
# define DEF_USER_PATH "/usr/openwin/bin:/bin:/usr/bin:/usr/contrib/bin:/usr/local/bin:."
# else
# define DEF_USER_PATH "/usr/bin/X11:/bin:/usr/bin:/usr/contrib/bin:/usr/local/bin"
# endif /* sun */
#endif
#ifndef DEF_SYSTEM_PATH
# ifdef sun
# define DEF_SYSTEM_PATH "/usr/openwin/bin:/etc:/bin:/usr/bin"
# else
# define DEF_SYSTEM_PATH "/usr/bin/X11:/etc:/bin:/usr/bin"
# endif /* sun */
#endif
#ifndef DEF_SYSTEM_SHELL
#define DEF_SYSTEM_SHELL "/bin/sh"
#endif
#ifndef DEF_FAILSAFE_CLIENT
# ifdef sun
#define DEF_FAILSAFE_CLIENT "/usr/openwin/bin/xterm"
# else
#define DEF_FAILSAFE_CLIENT "/usr/bin/X11/xterm"
# endif /* sun */
#endif
#ifndef DEF_XDM_CONFIG
#define DEF_XDM_CONFIG "Xconfig"
#endif
#ifndef DEF_CHOOSER
#define DEF_CHOOSER CDE_INSTALLATION_TOP "/bin/chooser"
#endif
#ifndef CPP_PROGRAM
#define CPP_PROGRAM "/lib/cpp"
#endif
#ifndef DEF_XDM_AUTH_GEN
#define DEF_XDM_AUTH_GEN CDE_CONFIGURATION_TOP "/xdmauthgen"
#endif
#ifndef DEF_AUTH_NAME
#define DEF_AUTH_NAME "MIT-MAGIC-COOKIE-1"
#endif
#ifndef DEF_AUTH_DIR
#define DEF_AUTH_DIR CDE_CONFIGURATION_TOP
#endif
#ifndef DEF_USER_AUTH_DIR
#define DEF_USER_AUTH_DIR "/tmp"
#endif
#ifndef DEF_KEY_FILE
#define DEF_KEY_FILE CDE_CONFIGURATION_TOP "/Xkeys"
#endif
#ifndef DEF_ACCESS_FILE
#define DEF_ACCESS_FILE ""
#endif
#ifndef DEF_TIMEZONE
#define DEF_TIMEZONE "MST7MDT"
#endif
#ifndef DEF_SYS_PARMS_FILE
# if defined( __hpux )
# define DEF_SYS_PARMS_FILE "/etc/src.sh"
# else
# define DEF_SYS_PARMS_FILE "/etc/TIMEZONE"
# endif
#endif
#define DEF_UDP_PORT "177" /* registered XDMCP port, don't change */
#ifndef DEF_ENV
# ifdef sun /* need to set the environment for Sun OpenWindows */
# define DEF_ENV "OPENWINHOME=/usr/openwin"
# else
# define DEF_ENV ""
# endif
#endif
#ifndef DEF_LANG /* LANG default settings for various architectures */
# ifdef sun /* default language under Solaris */
# define DEF_LANG "C"
# endif
#endif
#ifndef DEF_LANG /* set LANG to NULL if not already defined */
#define DEF_LANG ""
#endif
struct dmResources {
char *name, *class;
int type;
char **dm_value;
char *default_value;
} DmResources[] = {
"servers", "Servers", DM_STRING, &servers,
DEF_SERVER_LINE,
"requestPort", "RequestPort", DM_INT, (char **) &request_port,
DEF_UDP_PORT,
"debugLevel", "DebugLevel", DM_INT, (char **) &debugLevel,
"0",
"errorLogFile", "ErrorLogFile", DM_STRING, &errorLogFile,
"",
"errorLogSize", "ErrorLogSize", DM_INT, (char **) &errorLogSize,
"50",
"daemonMode", "DaemonMode", DM_BOOL, (char **) &daemonMode,
"false",
"quiet", "quiet", DM_BOOL, (char **) &quiet,
"false",
"pidFile", "PidFile", DM_STRING, &pidFile,
"",
"lockPidFile", "LockPidFile", DM_BOOL, (char **) &lockPidFile,
"true",
"authDir", "AuthDir", DM_STRING, &authDir,
DEF_AUTH_DIR,
"autoRescan", "AutoRescan", DM_BOOL, (char **) &autoRescan,
"true",
"removeDomainname","RemoveDomainname",DM_BOOL, (char **) &removeDomainname,
"true",
"keyFile", "KeyFile", DM_STRING, &keyFile,
DEF_KEY_FILE,
"accessFile", "AccessFile", DM_STRING, &accessFile,
DEF_ACCESS_FILE,
/* exportList env var resource RK 08.17.93 */
"exportList", "ExportList", DM_ARGV, (char **) &exportList,
"",
"timeZone", "TimeZone", DM_STRING, &timeZone,
"",
"fontPathHead", "FontPathHead", DM_STRING, &fpHead,
"",
"fontPathTail", "FontPathTail", DM_STRING, &fpTail,
"",
"sysParmsFile", "SysParmsFile", DM_STRING, &sysParmsFile,
DEF_SYS_PARMS_FILE,
"wakeupInterval","WakeupInterval",DM_INT, (char **) &wakeupInterval,
"10",
"langListTimeout","langListTimeout",DM_INT, (char **) &langListTimeout,
"30",
#ifdef DEF_NETWORK_DEV
"networkDevice","NetworkDevice",DM_STRING, &networkDev,
DEF_NETWORK_DEV,
#endif
};
# define NUM_DM_RESOURCES (sizeof DmResources / sizeof DmResources[0])
# define boffset(f) ((char *) &(((struct display *) 0)->f) - (char *) 0)
struct displayResources {
char *name, *class;
int type;
int offset;
char *default_value;
} DisplayResources[] = {
/*
* resources for managing the server...
*/
"serverAttempts","ServerAttempts", DM_INT, boffset(serverAttempts),
"1",
"openDelay", "OpenDelay", DM_INT, boffset(openDelay),
"5",
"openRepeat", "OpenRepeat", DM_INT, boffset(openRepeat),
"5",
"openTimeout", "OpenTimeout", DM_INT, boffset(openTimeout),
"30",
"startAttempts","StartAttempts",DM_INT, boffset(startAttempts),
"4",
"pingInterval", "PingInterval", DM_INT, boffset(pingInterval),
"5",
"pingTimeout", "PingTimeout", DM_INT, boffset(pingTimeout),
"5",
"terminateServer","TerminateServer",DM_BOOL, boffset(terminateServer),
"false",
"grabServer", "GrabServer", DM_BOOL, boffset(grabServer),
"true",
"grabTimeout", "GrabTimeout", DM_INT, boffset(grabTimeout),
"3",
"resetSignal", "Signal", DM_INT, boffset(resetSignal),
"1", /* SIGHUP */
"termSignal", "Signal", DM_INT, boffset(termSignal),
"15", /* SIGTERM */
"resetForAuth", "ResetForAuth", DM_BOOL, boffset(resetForAuth),
"false",
"authorize", "Authorize", DM_BOOL, boffset(authorize),
"true",
"authName", "AuthName", DM_ARGV, boffset(authNames),
DEF_AUTH_NAME,
"authFile", "AuthFile", DM_STRING, boffset(authFile),
"",
#if 0
"gettyLine", "GettyLine", DM_STRING, boffset(gettyLine),
"",
"gettySpeed", "GettySpeed", DM_STRING, boffset(gettySpeed),
"9600",
#endif
/*
* resources which control the session behavior...
*/
"resources", "Resources", DM_STRING, boffset(resources),
"",
"xrdb", "Xrdb", DM_STRING, boffset(xrdb),
XRDB_PROGRAM,
"cpp", "Cpp", DM_STRING, boffset(cpp),
CPP_PROGRAM,
"setup", "Setup", DM_STRING, boffset(setup),
"",
"startup", "Startup", DM_STRING, boffset(startup),
"",
"reset", "Reset", DM_STRING, boffset(reset),
"",
"session", "Session", DM_STRING, boffset(session),
DEF_SESSION,
"userPath", "Path", DM_STRING, boffset(userPath),
DEF_USER_PATH,
"systemPath", "Path", DM_STRING, boffset(systemPath),
DEF_SYSTEM_PATH,
"systemShell", "Shell", DM_STRING, boffset(systemShell),
DEF_SYSTEM_SHELL,
"failsafeClient","FailsafeClient", DM_STRING, boffset(failsafeClient),
DEF_FAILSAFE_CLIENT,
"userAuthDir", "UserAuthDir", DM_STRING, boffset(userAuthDir),
DEF_AUTH_DIR,
"chooser", "Chooser", DM_STRING, boffset(chooser),
DEF_CHOOSER,
"language", "Language", DM_STRING, boffset(language),
DEF_LANG,
"languageList", "LanguageList", DM_STRING, boffset(langList),
"",
"environment", "Environment", DM_STRING, boffset(environStr),
DEF_ENV,
"dtlite", "Dtlite", DM_BOOL, boffset(dtlite),
"false",
"xdmMode", "XdmMode", DM_BOOL, boffset(xdmMode),
"false",
"authenticationName","AuthenticationName", DM_STRING, boffset(verifyName),
"",
"pmSearchPath", "PmSearchPath", DM_STRING, boffset(pmSearchPath),
DEF_PM_SEARCH_PATH,
"bmSearchPath", "bmSearchPath", DM_STRING, boffset(bmSearchPath),
DEF_BM_SEARCH_PATH,
};
# define NUM_DISPLAY_RESOURCES (sizeof DisplayResources/sizeof DisplayResources[0])
XrmDatabase DmResourceDB;
int
GetResource( char *name, char *class, int valueType, char **valuep,
char *default_value )
{
char *type;
XrmValue value;
char *string, *new_string;
char empty[] = "";
char str_buf[50];
int len;
if (DmResourceDB && XrmGetResource (DmResourceDB,
name, class,
&type, &value))
{
string = value.addr;
len = value.size;
}
else
{
if(default_value) {
string = default_value;
len = strlen (string);
} else {
string = empty;
len = 0;
}
}
Debug ("%s/%s value %*.*s\n", name, class, len, len, string);
/*
* check if new resource is the same as old...
*/
if (valueType == DM_STRING && *valuep) {
if (string != NULL && strlen (*valuep) == len && !strncmp (*valuep, string, len))
return 0;
else {
free (*valuep);
*(valuep) = NULL;
}
}
switch (valueType) {
case DM_STRING:
if ( len > 0 ) {
new_string = malloc ((unsigned) (len+1));
if (!new_string) {
LogOutOfMem(
ReadCatalog(MC_LOG_SET,MC_LOG_GET_RSC,MC_DEF_LOG_GET_RSC));
return 0;
}
strncpy (new_string, string, len);
new_string[len] = '\0';
*(valuep) = new_string;
}
break;
case DM_INT:
strncpy (str_buf, string, sizeof (str_buf));
str_buf[sizeof (str_buf)-1] = '\0';
*((int *) valuep) = atoi (str_buf);
break;
case DM_BOOL:
strncpy (str_buf, string, sizeof (str_buf));
str_buf[sizeof (str_buf)-1] = '\0';
XmuCopyISOLatin1Lowered (str_buf, str_buf);
if (!strcmp (str_buf, "true") ||
!strcmp (str_buf, "on") ||
!strcmp (str_buf, "yes"))
*((int *) valuep) = 1;
else if (!strcmp (str_buf, "false") ||
!strcmp (str_buf, "off") ||
!strcmp (str_buf, "no"))
*((int *) valuep) = 0;
break;
case DM_ARGV:
*((char ***) valuep) = parseArgs ((char **) 0, string);
break;
}
return 1;
}
XrmOptionDescRec configTable [] = {
{"-server", NULL, XrmoptionSkipArg, (caddr_t) NULL },
{"-udpPort", NULL, XrmoptionSkipArg, (caddr_t) NULL },
{"-error", NULL, XrmoptionSkipArg, (caddr_t) NULL },
{"-resources", NULL, XrmoptionSkipArg, (caddr_t) NULL },
{"-session", NULL, XrmoptionSkipArg, (caddr_t) NULL },
{"-debug", NULL, XrmoptionSkipArg, (caddr_t) NULL },
{"-xrm", NULL, XrmoptionSkipArg, (caddr_t) NULL },
{"-config", ".configFile", XrmoptionSepArg, (caddr_t) NULL }
};
XrmOptionDescRec optionTable [] = {
{"-server", ".servers", XrmoptionSepArg, (caddr_t) NULL },
{"-udpPort", ".requestPort", XrmoptionSepArg, (caddr_t) NULL },
{"-error", ".errorLogFile", XrmoptionSepArg, (caddr_t) NULL },
{"-resources", "*resources", XrmoptionSepArg, (caddr_t) NULL },
{"-session", "*session", XrmoptionSepArg, (caddr_t) NULL },
{"-debug", "*debugLevel", XrmoptionSepArg, (caddr_t) NULL },
{"-xrm", NULL, XrmoptionResArg, (caddr_t) NULL },
{"-daemon", ".daemonMode", XrmoptionNoArg, "true" },
{"-nodaemon", ".daemonMode", XrmoptionNoArg, "false" },
{"-quiet", ".quiet", XrmoptionNoArg, "true" }
};
static int originalArgc;
static char **originalArgv;
void
InitResources( int argc, char **argv )
{
XrmInitialize ();
originalArgc = argc;
originalArgv = argv;
ReinitResources ();
}
void
ReinitResources( void )
{
int argc;
char **a;
char **argv;
XrmDatabase newDB;
char * configFileName;
char *type;
XrmValue value;
argv = (char **) malloc ((originalArgc + 1) * sizeof (char *));
if (!argv)
LogOutOfMem(
ReadCatalog(MC_LOG_SET,MC_LOG_NO_SPACE,MC_DEF_LOG_NO_SPACE));
for (argc = 0; argc < originalArgc; argc++)
argv[argc] = originalArgv[argc];
argv[argc] = 0;
if (DmResourceDB)
XrmDestroyDatabase (DmResourceDB);
DmResourceDB = XrmGetStringDatabase ("");
/* pre-parse the command line to get the -config option, if any */
XrmParseCommand (&DmResourceDB, configTable,
sizeof (configTable) / sizeof (configTable[0]),
"Dtlogin", &argc, argv);
configFileName = qualifyWithFirst(DEF_XDM_CONFIG,
CDE_CONFIGURATION_TOP "/config:"
CDE_INSTALLATION_TOP "/config");
GetResource ("Dtlogin.configFile", "Dtlogin.ConfigFile",
DM_STRING, &config, configFileName);
free(configFileName);
newDB = XrmGetFileDatabase ( config );
if (newDB)
{
if (DmResourceDB)
XrmDestroyDatabase (DmResourceDB);
DmResourceDB = newDB;
}
else if (argc != originalArgc)
LogError(
ReadCatalog(MC_LOG_SET,MC_LOG_NO_OPENCFG,MC_DEF_LOG_NO_OPENCFG),
config );
/*
* scan the resource database to set the application name...
*/
SetAppName();
XrmParseCommand (&DmResourceDB, optionTable,
sizeof (optionTable) / sizeof (optionTable[0]),
AppName, &argc, argv);
/*
* test to see if the session variable is set.
* for enabling the toggle in the options menu, if it is set..
*/
if((XrmGetResource (DmResourceDB, "Dtlogin*session", "Dtlogin*Session", &type, &value)) == True)
session_set = True;
if (argc > 1)
{
LogError(ReadCatalog(MC_LOG_SET,MC_LOG_EXTRA_ARG,MC_DEF_LOG_EXTRA_ARG));
for (a = argv + 1; *a; a++)
LogError ((unsigned char *)" \"%s\"", *a);
LogError ((unsigned char *)"\n");
}
free (argv);
}
void
LoadDMResources( void )
{
int i;
char name[1024], class[1024];
FILE *fp;
if (servers) {free(servers); servers=NULL;}
if (keyFile) {free(keyFile); keyFile=NULL;}
if (accessFile) {free(accessFile); accessFile=NULL;}
for (i = 0; i < NUM_DM_RESOURCES; i++) {
sprintf (name, "%s.%s", AppName, DmResources[i].name);
sprintf (class, "%s.%s", AppName, DmResources[i].class);
GetResource (name, class, DmResources[i].type,
(char **) DmResources[i].dm_value,
DmResources[i].default_value);
}
servers = getFullFileName(servers, 1, NULL);
keyFile = getFullFileName(keyFile, 0, NULL);
accessFile = getFullFileName(accessFile, 0, NULL);
/* set a TZ default */
if (timeZone == NULL || strlen(timeZone) == 0)
{
/*
* dynamically determine the timeZone resource default value...
*/
GetSysParms(&timeZone,0,0);
}
}
void
CleanUpName( char *src, char *dst, int len )
{
while (*src) {
if (--len <= 0)
break;
switch (*src)
{
case ':':
case '.':
*dst++ = '_';
break;
default:
*dst++ = *src;
}
++src;
}
*dst = '\0';
}
void
LoadDisplayResources( struct display *d )
{
int i;
char name[1024], class[1024];
char dpyName[512], dpyClass[512];
char *lang;
Debug("Loading display resources for %s\n", d->name);
if (d->resources) {free(d->resources); d->resources=NULL;}
if (d->setup) {free(d->setup); d->setup=NULL;}
if (d->startup) {free(d->startup); d->startup=NULL;}
if (d->reset) {free(d->reset); d->reset=NULL;}
if (d->session) {free(d->session); d->session=NULL;}
if (d->failsafeClient) {free(d->failsafeClient); d->failsafeClient=NULL;}
CleanUpName (d->name, dpyName, sizeof (dpyName));
CleanUpName (d->class ? d->class : d->name, dpyClass, sizeof (dpyClass));
if((lang = getenv("LANG")) != NULL)
for (i = NUM_DISPLAY_RESOURCES - 1; i >= 0; i--) {
if(strcmp(DisplayResources[i].name,"language") == 0){
DisplayResources[i].default_value = lang;
break;
}
}
lang = d->language;
d->language = NULL;
for (i = 0; i < NUM_DISPLAY_RESOURCES; i++) {
sprintf (name, "%s.%s.%s", AppName,
dpyName, DisplayResources[i].name);
sprintf (class, "%s.%s.%s", AppName,
dpyClass, DisplayResources[i].class);
GetResource (name, class, DisplayResources[i].type,
(char **) (((char *) d) + DisplayResources[i].offset), DisplayResources[i].default_value);
}
if (!strlen(lang) && d->language && strlen(d->language))
*(strncpy(lang, d->language, LANGUAGESIZE) + LANGUAGESIZE) =
'\0';
free(d->language);
d->language = lang;
#ifdef _AIX
if(d->language == NULL || strlen(d->language) == 0)
SetDefaultLanguage(d);
#endif /* _AIX */
d->resources = getFullFileName(d->resources, 2, d->language);
d->setup = getFullFileName(d->setup, 0, NULL);
d->startup = getFullFileName(d->startup, 0, NULL);
d->reset = getFullFileName(d->reset, 0, NULL);
d->session = getFullFileName(d->session, 0, NULL);
d->failsafeClient = getFullFileName(d->failsafeClient, 0, NULL);
}
/***************************************************************************
*
* SetAppName
*
* Probe the resource database to see whether the config file is using
* "Dtlogin" or "DisplayManager" as the application name.
*
* If it cannot be determined, "Dtlogin" is used.
***************************************************************************/
void
SetAppName( void )
{
int i;
char name[1024], class[1024];
char *type;
XrmValue value;
for (i = 0; i < NUM_DM_RESOURCES; i++) {
/*
* try "Dtlogin" (default) ...
*/
sprintf (name, "%s.%s", DTLOGIN, DmResources[i].name);
sprintf (class, "%s.%s", DTLOGIN, DmResources[i].class);
if (DmResourceDB && XrmGetResource (DmResourceDB, name, class,
&type, &value)) {
strcpy(AppName, DTLOGIN);
break;
}
/*
* try "DisplayManager" ...
*/
sprintf (name, "%s.%s", DISPLAYMANAGER, DmResources[i].name);
sprintf (class, "%s.%s", DISPLAYMANAGER, DmResources[i].class);
if (DmResourceDB && XrmGetResource (DmResourceDB, name, class,
&type, &value)) {
strcpy(AppName, DISPLAYMANAGER);
break;
}
}
}
/***************************************************************************
*
* getFullFileName
*
* Try to produce a fully qualified file name by prepending
* /etc/dt/config or /usr/dt/config to a resource file name.
* There are 2 special cases: servers - which can be a command, and
* resources - which can an imbeded %L.
***************************************************************************/
extern char *_ExpandLang( char *string, char *lang );
static char *
getFullFileName(char *name, int special, char *lang)
{
char * newname;
if (name == NULL)
return(NULL);
/** if the file already starts with a '/' **/
/** then just return a copy of it **/
if (name[0] == '/') {
if ((newname = (char *)malloc((strlen(name)+1)*sizeof(char))) == NULL) {
return (NULL);
} else {
strcpy(newname, name);
return(newname);
}
}
switch (special) {
/*********************/
case 0: /** no special case **/
/*********************/
newname = qualifyWithFirst(name,
CDE_CONFIGURATION_TOP "/config:"
CDE_INSTALLATION_TOP "/config");
return (newname);
/***************************************/
case 1: /** special handling for servers file **/
/***************************************/
if (strchr(name, ':') != NULL) {
/** This is probably a command and not a file name **/
/** so just return a copy of it. **/
if ((newname = (char *)malloc((strlen(name)+1)*sizeof(char)))
== NULL) {
return (NULL);
} else {
strcpy(newname, name);
return(newname);
}
} else {
newname = qualifyWithFirst(name,
CDE_CONFIGURATION_TOP "/config:"
CDE_INSTALLATION_TOP "/config");
return (newname);
}
/********************************************/
case 2: /** special handling for d->resources file **/
/********************************************/
if (strchr(name, '%') == NULL) {
/** no special processing needed **/
newname = qualifyWithFirst(name,
CDE_CONFIGURATION_TOP "/config:"
CDE_INSTALLATION_TOP "/config");
return (newname);
} else {
char *langString;
char *tempName;
int tempLen;
/** need to remember the %L **/
if (lang == NULL)
lang = "C";
langString = _ExpandLang(name, lang);
if ( (tempName = qualifyWithFirst(langString,
CDE_CONFIGURATION_TOP "/config:"
CDE_INSTALLATION_TOP "/config") )
== NULL) {
free(langString);
langString = _ExpandLang(name, "C");
if ( (tempName = qualifyWithFirst(langString,
CDE_CONFIGURATION_TOP "/config:"
CDE_INSTALLATION_TOP "/config") )
== NULL) {
free(langString);
return(NULL);
}
}
/** We have a fully qualified and expanded file name **/
/** but we need to return a fully qualified but NOT **/
/** expanded file name. **/
tempLen = strlen(tempName) - strlen(langString)
+ strlen(name) + 1;
if ((newname = (char *)malloc(tempLen * sizeof(char))) == NULL){
free(langString);
return(tempName);
} else {
tempLen = strlen(tempName) - strlen(langString);
strncpy(newname, tempName, tempLen);
strcpy(newname+tempLen, name);
free (langString);
free (tempName);
return(newname);
}
}
default:
/* special is of an unknown value */
return(NULL);
}
}