cdesktopenv/cde/lib/DtHelp/Helpos.c

405 lines
10 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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 librararies and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/* $TOG: Helpos.c /main/13 1998/07/30 12:08:32 mgreess $ */
/************************************<+>*************************************
****************************************************************************
**
** File: Dtos.c
**
** Project: Rivers Project
**
** Description: All system/os dependent calls are placed in here.
**
**
** WARNING: Do NOT put any Xt or Xm dependencies in this code.
**
** (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 Hewlett-Packard Company
**
** (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.
****************************************************************************
************************************<+>*************************************/
#include <sys/param.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define X_INCLUDE_PWD_H
#define XOS_USE_XT_LOCKING
#include <X11/Xos_r.h>
#include <unistd.h>
#ifndef _SUN_OS /* don't need the nl_types.h file */
# include <nl_types.h>
#endif /* ! _SUN_OS */
#include <X11/Intrinsic.h>
#include <X11/Shell.h>
#include <Xm/Xm.h>
/* Dt Includes */
#include <Dt/Help.h>
#include <Dt/DtNlUtils.h>
#include "HelpP.h"
#include "HelpI.h"
#include "HelposI.h"
#include "Lock.h"
#ifndef NL_CAT_LOCALE
static const int NL_CAT_LOCALE = 0;
#endif
/* Global Message Catalog file names */
static char *CatFileName=NULL;
/*****************************************************************************
* Function: Boolean _DtHelpOSGetHomeDirName(
*
*
* Parameters: Output string, size of output string
*
* Return Value: String.
*
*
* Description:
*
*****************************************************************************/
void _DtHelpOSGetHomeDirName(
String outptr,
size_t len)
/* outptr is allocated outside this function, just filled here. */
/* this solution leads to less change in the current (mwm) code */
{
int uid;
static char *ptr = NULL;
_Xgetpwparams pwd_buf;
struct passwd * pwd_ret;
_DtHelpProcessLock();
if (ptr == NULL) {
if((ptr = (char *)getenv("HOME")) == NULL) {
if((ptr = (char *)getenv("USER")) != NULL)
pwd_ret = _XGetpwnam(ptr, pwd_buf);
else {
uid = getuid();
pwd_ret = _XGetpwuid(uid, pwd_buf);
}
if (pwd_ret != NULL)
ptr = pwd_ret->pw_dir;
else
ptr = NULL;
}
}
if (ptr) {
strncpy(outptr, ptr, len);
outptr[len-1] = '\0'; /* Make sure it is Null terminated */
}
else
outptr[0] = '\0' ;
_DtHelpProcessUnlock();
}
/*****************************************************************************
* Function: _DtHelpGetUserSearchPath(
*
*
* Parameters:
*
* Return Value: String, owned by caller.
*
*
* Description:
* Gets the user search path for use
* when searching for a volume.
* Takes path from the environment,
* or uses the default path.
*
*****************************************************************************/
String _DtHelpGetUserSearchPath(void)
{
String path;
char homedir[MAXPATHLEN];
String localPath;
extern char * _DtCliSrvGetDtUserSession(); /* in libCliSrv */
localPath = (char *)getenv (DtUSER_FILE_SEARCH_ENV);
if (localPath == NULL)
{
char * session;
/* Use our default path */
_DtHelpOSGetHomeDirName(homedir, sizeof(homedir));
session = _DtCliSrvGetDtUserSession();
path = calloc(1, 3*strlen(session) + 6*strlen(homedir) +
strlen(DtDEFAULT_USER_PATH_FORMAT));
sprintf(path, DtDEFAULT_USER_PATH_FORMAT,
homedir, session, homedir, session, homedir, session,
homedir, homedir, homedir);
free(session);
/* homedir is a local array */
/* Return our expanded default path */
return(path);
}
else
{
/* Make a local copy for us */
localPath = strdup(localPath);
/* Just Use our local path */
return (localPath);
}
}
/*****************************************************************************
* Function: _DtHelpGetSystemSearchPath(
*
*
* Parameters:
*
* Return Value: String, owned by caller.
*
*
* Description:
* Gets the system search path for use
* when searching for a volume.
* Takes path from the environment,
* or uses the default path.
*
*****************************************************************************/
String _DtHelpGetSystemSearchPath(void)
{
char * path;
/* try to retrieve env var value */
path = getenv(DtSYS_FILE_SEARCH_ENV);
/* if fail, use default */
if (NULL == path)
path = DtDEFAULT_SYSTEM_PATH;
return strdup(path);
}
/*****************************************************************************
* Function: void DtHelpSetCatalogName(char *catFile);
*
*
* Parameters: catFile Specifies the name of the message catalog file
* to use.
*
* Return Value: void
*
*
* Description: This function will set the name of the message catalog file
* within the Dt help system environment.
*
* The new name must be of the format <name>.cat and the file
* must be installed such that the NLS search path can find it.
*
* If this function is not called then the default value of
* Dt.cat will be used.
*
*
*****************************************************************************/
void DtHelpSetCatalogName(
char* catFile)
{
int len;
_DtHelpProcessLock();
/* Setup our Message Catalog file names */
if (catFile == NULL)
{
/* Setup the short and long versions */
#ifdef __ultrix
CatFileName = strdup("DtHelp.cat");
#else
CatFileName = strdup("DtHelp");
#endif
}
else
{
#ifdef __ultrix
/* If we have a full path, just use it */
if (*catFile == '/')
CatFileName = strdup(catFile);
else
{
/* We don't have a full path, and the ultirx os needs the
* ".cat" extention so let's make sure its there.
*/
if (strcmp(&catFile[strlen(catFile) -4], ".cat") == 0)
CatFileName = strdup(catFile);
else
{
/* Create our CatFileName with the extention */
CatFileName = malloc (strlen(catFile) + 5);
/* +5, 1 for NULL, 4 for ".cat" */
strcpy(CatFileName, catFile);
strcat(CatFileName, ".cat");
}
}
#else
/* If we have a full path, just use it */
if (*catFile == '/')
CatFileName = strdup(catFile);
else
{
/* hp-ux os does not work with the ".cat" extention, so
* if one exists, remove it.
*/
if (strcmp(&catFile[strlen(catFile) -4], ".cat") != 0)
CatFileName = strdup(catFile);
else
{
/* Create our CatFileName with out the extention */
len = strlen(catFile) -4;
CatFileName = malloc(len +1);
strncpy (CatFileName, catFile, len);
CatFileName[len]= '\0';
}
}
#endif
}
_DtHelpProcessUnlock();
}
#ifndef NO_MESSAGE_CATALOG
/*****************************************************************************
* Function: Boolean _DtHelpGetMessage(
*
*
* Parameters:
*
* Return Value: char *
*
*
* Description: This function will retreive the requested message from the
* cache proper cache creek message catalog file.
*
*****************************************************************************/
char *_DtHelpGetMessage(
int set,
int n,
char *s)
{
char *msg;
char *loc;
nl_catd catopen();
char *catgets();
static int first = 1;
static nl_catd nlmsg_fd;
_DtHelpProcessLock();
if ( first )
{
/* Setup our default message catalog names if none have been set! */
if (CatFileName == NULL)
{
/* Setup the short and long versions */
#ifdef __ultrix
CatFileName = strdup("DtHelp.cat");
#else
CatFileName = strdup("DtHelp");
#endif
}
loc = _DtHelpGetLocale();
if (!loc || !(strcmp (loc, "C")))
/*
* If LANG is not set or if LANG=C, then there
* is no need to open the message catalog - just
* return the built-in string "s".
*/
nlmsg_fd = (nl_catd) -1;
else
nlmsg_fd = catopen(CatFileName, NL_CAT_LOCALE);
first = 0;
}
msg=catgets(nlmsg_fd,set,n,s);
_DtHelpProcessUnlock();
return (msg);
}
#endif
/*****************************************************************************
* Function: char * _DtHelpGetLocale(
*
*
* Parameters:
*
* Return Value: char *
*
*
* Description: Returns the value of LC_MESSAGES from the environ.
* If that is NULL, returns the value of LANG form the environ.
* If that is NULL, returns NULL.
*
*****************************************************************************/
char *_DtHelpGetLocale()
{
char *loc;
loc = setlocale(LC_MESSAGES, NULL);
if (NULL == loc || '\0' == loc[0]) loc = getenv("LANG");
if (NULL == loc || '\0' == loc[0]) return NULL;
loc = strdup(loc); /* getenv() returns ptr to private memory */
return loc;
}