Work around problem with iocsh redirection from within vxWorks scripts.

This commit is contained in:
W. Eric Norum
2005-01-10 15:09:26 +00:00
parent 7a3d887fb2
commit cd4b7ba067
5 changed files with 87 additions and 57 deletions

View File

@@ -7,6 +7,18 @@
</head>
<body lang="en">
<h1 align="center">EPICS Base Release 3.14.8<br>
?? ??Month?? 2005</h1>
<h2 align="center">Changes since 3.14.7</h2>
<h4>iocsh</h4>
<p>I/O redirection from vxWorks startup scripts now works.</p>
<h1 align="center">EPICS Base Release 3.14.7<br>
7 December 2004</h1>

View File

@@ -318,6 +318,13 @@ openRedirect(const char *filename, int lineno, struct iocshRedirect *redirect)
if (redirect->fp == NULL) {
showError(filename, lineno, "Can't open \"%s\": %s.",
redirect->name, strerror(errno));
while (i--) {
redirect--;
if (redirect->fp) {
fclose(redirect->fp);
redirect->fp = NULL;
}
}
return -1;
}
}
@@ -337,16 +344,16 @@ startRedirect(const char *filename, int lineno, struct iocshRedirect *redirect)
if (redirect->fp != NULL) {
switch(i) {
case 0:
redirect->oldFp = epicsGetStdin();
epicsSetStdin(redirect->fp);
redirect->oldFp = epicsGetThreadStdin();
epicsSetThreadStdin(redirect->fp);
break;
case 1:
redirect->oldFp = epicsGetStdout();
epicsSetStdout(redirect->fp);
redirect->oldFp = epicsGetThreadStdout();
epicsSetThreadStdout(redirect->fp);
break;
case 2:
redirect->oldFp = epicsGetStderr();
epicsSetStderr(redirect->fp);
redirect->oldFp = epicsGetThreadStderr();
epicsSetThreadStderr(redirect->fp);
break;
}
}
@@ -368,9 +375,9 @@ stopRedirect(const char *filename, int lineno, struct iocshRedirect *redirect)
redirect->name, strerror(errno));
redirect->fp = NULL;
switch(i) {
case 0: epicsSetStdin(redirect->oldFp); break;
case 1: epicsSetStdout(redirect->oldFp); break;
case 2: epicsSetStderr(redirect->oldFp); break;
case 0: epicsSetThreadStdin(redirect->oldFp); break;
case 1: epicsSetThreadStdout(redirect->oldFp); break;
case 2: epicsSetThreadStderr(redirect->oldFp); break;
}
}
redirect->name = NULL;
@@ -504,6 +511,15 @@ iocshBody (const char *pathname, const char *commandLine)
}
}
/*
* Set up redirection
*/
redirects = (struct iocshRedirect *)calloc(NREDIRECTS, sizeof *redirects);
if (redirects == NULL) {
printf ("Out of memory!\n");
return -1;
}
/*
* Read commands till EOF or exit
*/
@@ -511,19 +527,6 @@ iocshBody (const char *pathname, const char *commandLine)
wasOkToBlock = epicsThreadIsOkToBlock();
epicsThreadSetOkToBlock(1);
for (;;) {
/*
* Undo redirection
*/
if (redirects == NULL) {
redirects = (struct iocshRedirect *)calloc(NREDIRECTS, sizeof *redirects);
if (redirects == NULL) {
printf ("Out of memory!\n");
break;
}
}
stopRedirect(filename, lineno, redirects);
/*
* Read a line
*/
@@ -699,6 +702,7 @@ iocshBody (const char *pathname, const char *commandLine)
continue;
startRedirect(filename, lineno, redirects);
iocshBody(commandFile, NULL);
stopRedirect(filename, lineno, redirects);
continue;
}
if (openRedirect(filename, lineno, redirects) < 0)
@@ -734,6 +738,7 @@ iocshBody (const char *pathname, const char *commandLine)
if (iarg == piocshFuncDef->nargs) {
startRedirect(filename, lineno, redirects);
(*found->func)(argBuf);
stopRedirect(filename, lineno, redirects);
break;
}
if (iarg >= argBufCapacity) {

View File

@@ -36,47 +36,56 @@ static void once(void *junk)
FILE * epicsShareAPI epicsGetStdin(void)
{
FILE *fp;
epicsThreadOnce(&onceId,once,0);
fp = epicsThreadPrivateGet(stdinThreadPrivateId);
FILE *fp = epicsGetThreadStdin();
if(!fp) fp = stdin;
return fp;
}
void epicsShareAPI epicsSetStdin(FILE *fp)
FILE * epicsShareAPI epicsGetStdout(void)
{
FILE *fp = epicsGetThreadStdout();
if(!fp) fp = stdout;
return fp;
}
FILE * epicsShareAPI epicsGetStderr(void)
{
FILE *fp = epicsGetThreadStderr();
if(!fp) fp = stderr;
return fp;
}
FILE * epicsShareAPI epicsGetThreadStdin(void)
{
epicsThreadOnce(&onceId,once,0);
return epicsThreadPrivateGet(stdinThreadPrivateId);
}
FILE * epicsShareAPI epicsGetThreadStdout(void)
{
epicsThreadOnce(&onceId,once,0);
return epicsThreadPrivateGet(stdoutThreadPrivateId);
}
FILE * epicsShareAPI epicsGetThreadStderr(void)
{
epicsThreadOnce(&onceId,once,0);
return epicsThreadPrivateGet(stderrThreadPrivateId);
}
void epicsShareAPI epicsSetThreadStdin(FILE *fp)
{
epicsThreadOnce(&onceId,once,0);
epicsThreadPrivateSet(stdinThreadPrivateId,fp);
}
FILE * epicsShareAPI epicsGetStdout(void)
{
FILE *fp;
epicsThreadOnce(&onceId,once,0);
fp = epicsThreadPrivateGet(stdoutThreadPrivateId);
if(!fp) fp = stdout;
return fp;
}
void epicsShareAPI epicsSetStdout(FILE *fp)
void epicsShareAPI epicsSetThreadStdout(FILE *fp)
{
epicsThreadOnce(&onceId,once,0);
epicsThreadPrivateSet(stdoutThreadPrivateId,fp);
}
FILE * epicsShareAPI epicsGetStderr(void)
{
FILE *fp;
epicsThreadOnce(&onceId,once,0);
fp = epicsThreadPrivateGet(stderrThreadPrivateId);
if(!fp) fp = stderr;
return fp;
}
void epicsShareAPI epicsSetStderr(FILE *fp)
void epicsShareAPI epicsSetThreadStderr(FILE *fp)
{
epicsThreadOnce(&onceId,once,0);
epicsThreadPrivateSet(stderrThreadPrivateId,fp);

View File

@@ -43,13 +43,17 @@ epicsShareFunc FILE * epicsShareAPI epicsTempFile ();
enum TF_RETURN {TF_OK=0, TF_ERROR=1};
epicsShareFunc enum TF_RETURN epicsShareAPI truncateFile ( const char *pFileName, unsigned size );
/*The followig are for redirecting stdin,stdout,stderr */
/* The following are for redirecting stdin,stdout,stderr */
epicsShareFunc FILE * epicsShareAPI epicsGetStdin(void);
epicsShareFunc FILE * epicsShareAPI epicsGetStdout(void);
epicsShareFunc FILE * epicsShareAPI epicsGetStderr(void);
epicsShareFunc void epicsShareAPI epicsSetStdin(FILE *);
epicsShareFunc void epicsShareAPI epicsSetStdout(FILE *);
epicsShareFunc void epicsShareAPI epicsSetStderr(FILE *);
/* These are intended for iocsh only */
epicsShareFunc FILE * epicsShareAPI epicsGetThreadStdin(void);
epicsShareFunc FILE * epicsShareAPI epicsGetThreadStdout(void);
epicsShareFunc FILE * epicsShareAPI epicsGetThreadStderr(void);
epicsShareFunc void epicsShareAPI epicsSetThreadStdin(FILE *);
epicsShareFunc void epicsShareAPI epicsSetThreadStdout(FILE *);
epicsShareFunc void epicsShareAPI epicsSetThreadStderr(FILE *);
epicsShareFunc int epicsShareAPI epicsStdoutPrintf(
const char *pformat, ...) EPICS_PRINTF_STYLE(1,2);

View File

@@ -66,7 +66,7 @@ int epicsStdioTest (const char *report)
memset(buffer,'*',sizeof(buffer)-1);
rtn = epicsSnprintf(buffer,size,"%d",value);
printf("size %d rtn %d value %d buffer |%s|\n",size,rtn,value,buffer);
printf("\nTest epicsSetStdout/epicsGetStdout stdout %p epicsGetStdout %p\n",
printf("\nTest epicsSetThreadStdout/epicsGetStdout stdout %p epicsGetStdout %p\n",
stdout,epicsGetStdout());
if(report && strlen(report)>0) {
int fd;
@@ -82,8 +82,8 @@ int epicsStdioTest (const char *report)
fprintf(stderr,"%s could not be opened for output %s\n",
report,strerror(errno));
} else {
epicsSetStdout(stream);
printf("After epicsSetStdout stream %p epicsGetStdout %p\n",
epicsSetThreadStdout(stream);
printf("After epicsSetThreadStdout stream %p epicsGetStdout %p\n",
stream,epicsGetStdout());
}
}
@@ -92,7 +92,7 @@ int epicsStdioTest (const char *report)
printf("\nThis is second and last line of sample report\n");
errno = 0;
if(stream) {
epicsSetStdout(0);
epicsSetThreadStdout(0);
if(fclose(stream)) {
fprintf(stderr,"fclose failed %s\n",strerror(errno));
}