Create os-specific versions of routines to set and

display environment variables.
This commit is contained in:
W. Eric Norum
2001-05-07 16:11:57 +00:00
parent 01311de271
commit 3ec821a74a
6 changed files with 174 additions and 122 deletions
+27 -43
View File
@@ -93,57 +93,41 @@ static void showCallFunc(const ioccrfArgBuf *args)
}
}
/* putenv */
static const ioccrfArg putenvArg0 = { "environment_variable=name",ioccrfArgString};
static const ioccrfArg * const putenvArgs[1] = {&putenvArg0};
static const ioccrfFuncDef putenvFuncDef = {"putenv",1,putenvArgs};
static void putenvCallFunc(const ioccrfArgBuf *args)
/* epicsEnvSet */
static const ioccrfArg epicsEnvSetArg0 = { "name",ioccrfArgString};
static const ioccrfArg epicsEnvSetArg1 = { "value",ioccrfArgString};
static const ioccrfArg * const epicsEnvSetArgs[2] = {&epicsEnvSetArg0,&epicsEnvSetArg1};
static const ioccrfFuncDef epicsEnvSetFuncDef = {"epicsEnvSet",2,epicsEnvSetArgs};
static void epicsEnvSetCallFunc(const ioccrfArgBuf *args)
{
char *arg0 = args[0].sval;
char *cp;
char *name = args[0].sval;
char *value = args[1].sval;
/*
* Some versions of putenv set the environment to
* point to the string that is passed so we have
* to make a copy before stashing it.
* Yes, this will cause memory leaks if the same variable is
* placed in the environment more than once.
*/
if (!arg0)
if (name == NULL) {
printf ("Missing environment variable name argument.\n");
return;
cp = calloc(strlen(arg0)+1,sizeof(char));
strcpy(cp,arg0);
if ((cp == NULL) || putenv (cp)) {
free (cp);
printf ("putenv(%s) failed.\n", args[0].sval);
}
if (value == NULL) {
printf ("Missing environment variable value argument.\n");
return;
}
epicsEnvSet (name, value);
}
/* epicsPrtEnvParams */
static const ioccrfFuncDef epicsPrtEnvParamsFuncDef = {"epicsPrtEnvParams",0,NULL};
static void epicsPrtEnvParamsCallFunc(const ioccrfArgBuf *args)
/* epicsParamShow */
static const ioccrfFuncDef epicsParamShowFuncDef = {"epicsParamShow",0,NULL};
static void epicsParamShowCallFunc(const ioccrfArgBuf *args)
{
epicsPrtEnvParams ();
}
/* printEnv */
static const ioccrfArg printEnvArg0 = { "name ...", ioccrfArgArgv};
static const ioccrfArg * const printEnvArgs[1] = {&printEnvArg0};
static const ioccrfFuncDef printEnvFuncDef = {"printEnv",1,printEnvArgs};
static void printEnvCallFunc(const ioccrfArgBuf *args)
/* epicsEnvShow */
static const ioccrfArg epicsEnvShowArg0 = { "[name ...]", ioccrfArgArgv};
static const ioccrfArg * const epicsEnvShowArgs[1] = {&epicsEnvShowArg0};
static const ioccrfFuncDef epicsEnvShowFuncDef = {"epicsEnvShow",1,epicsEnvShowArgs};
static void epicsEnvShowCallFunc(const ioccrfArgBuf *args)
{
int i = 1;
const char *cp;
int argc = args[0].aval.ac;
char **argv = args[0].aval.av;
for (i = 1 ; i < argc ; i++) {
cp = getenv (argv[i]);
if (cp == NULL)
printf ("%s is not an environment variable.\n", argv[i]);
else
printf ("%s\n", cp);
}
epicsEnvShow (args[0].aval.ac, args[0].aval.av);
}
/* iocLogInit */
@@ -159,8 +143,8 @@ void epicsShareAPI iocUtilRegister(void)
ioccrfRegister(&chdirFuncDef,chdirCallFunc);
ioccrfRegister(&pwdFuncDef,pwdCallFunc);
ioccrfRegister(&showFuncDef,showCallFunc);
ioccrfRegister(&putenvFuncDef,putenvCallFunc);
ioccrfRegister(&epicsPrtEnvParamsFuncDef,epicsPrtEnvParamsCallFunc);
ioccrfRegister(&printEnvFuncDef,printEnvCallFunc);
ioccrfRegister(&epicsEnvSetFuncDef,epicsEnvSetCallFunc);
ioccrfRegister(&epicsParamShowFuncDef,epicsParamShowCallFunc);
ioccrfRegister(&epicsEnvShowFuncDef,epicsEnvShowCallFunc);
ioccrfRegister(&iocLogInitFuncDef,iocLogInitCallFunc);
}
+1
View File
@@ -160,6 +160,7 @@ SRCS += osdAssert.c
SRCS += osdFindSymbol.c
SRCS += osdInterrupt.c
SRCS += osdPoolStatus.c
SRCS += osdEnv.c
SRCS += osdThread.c
SRCS += osdMutex.c
+4 -3
View File
@@ -111,8 +111,6 @@ epicsShareFunc const char * epicsShareAPI
envGetConfigParamPtr(const ENV_PARAM *pParam);
epicsShareFunc long epicsShareAPI
envPrtConfigParam(const ENV_PARAM *pParam);
epicsShareFunc long epicsShareAPI
envSetConfigParam(const ENV_PARAM *pParam, char *value);
epicsShareFunc long epicsShareAPI
envGetInetAddrConfigParam(const ENV_PARAM *pParam, struct in_addr *pAddr);
epicsShareFunc long epicsShareAPI
@@ -124,16 +122,19 @@ epicsShareFunc const char * epicsShareAPI
epicsShareFunc unsigned short epicsShareAPI envGetInetPortConfigParam
(const ENV_PARAM *pEnv, unsigned short defaultPort);
epicsShareFunc long epicsShareAPI epicsPrtEnvParams(void);
epicsShareFunc void epicsShareAPI epicsEnvSet (char *name, char *value);
epicsShareFunc void epicsShareAPI epicsEnvShow (int argc, char **argv);
#else
epicsShareFunc char * epicsShareAPI envGetConfigParam();
epicsShareFunc char * epicsShareAPI envGetConfigParamPtr();
epicsShareFunc long epicsShareAPI envPrtConfigParam();
epicsShareFunc long epicsShareAPI envSetConfigParam();
epicsShareFunc long epicsShareAPI envGetInetAddrConfigParam();
epicsShareFunc long epicsShareAPI envGetDoubleConfigParam();
epicsShareFunc long epicsShareAPI envGetLongConfigParam();
epicsShareFunc char * epicsShareAPI envGetConfigParamPtr();
epicsShareFunc unsigned short epicsShareAPI envGetInetPortConfigParam();
epicsShareFunc void epicsShareAPI epicsEnvSet ();
epicsShareFunc void epicsShareAPI epicsEnvShow ();
#endif
#ifdef __cplusplus
-76
View File
@@ -64,7 +64,6 @@
* long envGetDoubleConfigParam( pParam, pDouble )
* long envGetInetAddrConfigParam( pParam, pAddr )
* long envPrtConfigParam( pParam )
* long envSetConfigParam( pParam, valueString )
*
* SEE ALSO
* $epics/share/bin/envSetupParams, envDefs.h
@@ -385,81 +384,6 @@ const ENV_PARAM *pParam) /* pointer to config param structure */
return 0;
}
/*+/subr**********************************************************************
* NAME envSetConfigParam - set value of a configuration parameter
*
* DESCRIPTION
* Sets the value of a configuration parameter.
*
* RETURNS
* 0
*
* NOTES
* 1. Performs a useful function only under VxWorks.
*
* EXAMPLE
* 1. Set the value for the EPICS-defined environment parameter
* EPICS_TS_MIN_WEST to 360, for USA central time zone.
*
* Under UNIX:
*
* % setenv EPICS_TS_MIN_WEST 360
*
* In a program running under VxWorks:
*
* #include "envDefs.h"
*
* envSetConfigParam(&EPICS_TS_MIN_WEST, "360");
*
* Under the VxWorks command shell:
*
* envSetConfigParam &EPICS_TS_MIN_WEST,"360"
*
*-*/
long epicsShareAPI envSetConfigParam (
const ENV_PARAM *pParam, /* I pointer to config param structure */
char *value /* I pointer to value string */
)
{
long retCode = 0;
int status;
char *pEnv;
/*
* space for two strings, an '=' character,
* and a null termination
*/
pEnv = malloc (strlen (pParam->name) + strlen (value) + 2);
if (!pEnv) {
errPrintf(
-1L,
__FILE__,
__LINE__,
"Failed to set environment parameter \"%s\" to \"%s\" because \"%s\"\n",
pParam->name,
value,
strerror (errno));
return -1L;
}
strcpy (pEnv, pParam->name);
strcat (pEnv, "=");
strcat (pEnv, value);
status = putenv (pEnv);
if (status<0) {
errPrintf(
-1L,
__FILE__,
__LINE__,
"Failed to set environment parameter \"%s\" to \"%s\" because \"%s\"\n",
pParam->name,
value,
strerror (errno));
retCode = -1L;
}
return retCode;
}
/*+/subr**********************************************************************
* NAME epicsPrtEnvParams - print value of all configuration parameters
*
+73
View File
@@ -0,0 +1,73 @@
/* osdEnv.c */
/*
* $Id$
*
* Author: Eric Norum
* Date: May 7, 2001
*
* Routines to modify/display environment variables and EPICS parameters
*
*/
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <errlog.h>
#include <envDefs.h>
#include <cantProceed.h>
#define epicsExportSharedSymbols
#include "epicsFindSymbol.h"
/*
* Set the value of an environment variable
* Leaks memory, but the assumption is that this routine won't be
* called often enough for the leak to be a problem.
*/
epicsShareFunc void epicsShareAPI epicsEnvSet (char *name, char *value)
{
char *cp;
cp = mallocMustSucceed (strlen (name) + strlen (value) + 2, "epicsEnvSet");
strcpy (cp, name);
strcat (cp, "=");
strcat (cp, value);
if (putenv (cp) < 0) {
errPrintf(
-1L,
__FILE__,
__LINE__,
"Failed to set environment parameter \"%s\" to \"%s\": %s\n",
name,
value,
strerror (errno));
free (cp);
}
}
/*
* Show the value of the specified, or all, environment variables
*/
epicsShareFunc void epicsShareAPI epicsEnvShow (int argc, char **argv)
{
if (argc <= 1) {
extern char **environ;
char **sp;
for (sp = environ ; (sp != NULL) && (*sp != NULL) ; sp++)
printf ("%s\n", *sp);
}
else {
int i;
for (i = 1 ; i < argc ; i++) {
const char *cp = getenv (argv[i]);
if (cp == NULL)
printf ("%s is not an environment variable.\n", argv[i]);
else
printf ("%s=%s\n", argv[i], cp);
}
}
}
+69
View File
@@ -0,0 +1,69 @@
/* osdEnv.c */
/*
* $Id$
*
* Author: Eric Norum
* Date: May 7, 2001
*
* Routines to modify/display environment variables and EPICS parameters
*
*/
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <errlog.h>
#include <envDefs.h>
#include <cantProceed.h>
#define epicsExportSharedSymbols
#include "epicsFindSymbol.h"
/*
* Set the value of an environment variable
* Leaks memory, but the assumption is that this routine won't be
* called often enough for the leak to be a problem.
*/
epicsShareFunc void epicsShareAPI epicsEnvSet (char *name, char *value)
{
char *cp;
cp = mallocMustSucceed (strlen (name) + strlen (value) + 2, "epicsEnvSet");
strcpy (cp, name);
strcat (cp, "=");
strcat (cp, value);
if (putenv (cp) < 0) {
errPrintf(
-1L,
__FILE__,
__LINE__,
"Failed to set environment parameter \"%s\" to \"%s\": %s\n",
name,
value,
strerror (errno));
free (cp);
}
}
/*
* Show the value of the specified, or all, environment variables
*/
epicsShareFunc void epicsShareAPI epicsEnvShow (int argc, char **argv)
{
if (argc <= 1) {
envShow (0);
}
else {
int i;
for (i = 1 ; i < argc ; i++) {
const char *cp = getenv (argv[i]);
if (cp == NULL)
printf ("%s is not an environment variable.\n", argv[i]);
else
printf ("%s=%s\n", argv[i], cp);
}
}
}