Fixed iocsh stream redirection for several commands

Eric provided the fixes to iocsh (empty commands would not reset
redirected streams), I fixed various commands.
This commit is contained in:
Andrew Johnson
2013-12-11 17:50:29 -06:00
parent b0cf5c256a
commit 197e992241
8 changed files with 148 additions and 120 deletions
+12
View File
@@ -14,6 +14,18 @@
<!-- Insert new items immediately below here ... -->
<h3>Fixed iocsh stream redirection for several commands</h3>
<p>A number of iocsh commands did not respond correctly to redirection of their
output using the iocsh '>file' or '2>error-file' syntax, and redirecting an
empty command could create files with garbage names. There may still be a few
commands that do not properly redirect their output, please notify the core
developers if you discover any. Thanks to Eric Norum for the iocsh changes.</p>
<p>For externally developed commands, the simplest way to support redirection in
your C/C++ code is to <tt>#include "epicsStdioRedirect.h"</tt> instead of
<tt>stdio.h</tt>.</p>
<h3>Fixed crash loading record instance of unknown type</h3>
<p>Fixed segfault when dbLoadRecords tried to load a record of a type that was
+1 -1
View File
@@ -22,12 +22,12 @@
#include <ctype.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include "envDefs.h"
#include "epicsAssert.h"
#include "epicsStdioRedirect.h"
#include "errlog.h"
#include "osiWireFormat.h"
+1 -1
View File
@@ -14,7 +14,7 @@
* simple stub for testing monitors
*/
#include <stdio.h>
#include "epicsStdioRedirect.h"
#define epicsExportSharedSymbols
#include "cadef.h"
+11 -9
View File
@@ -9,8 +9,7 @@
/* $Revision-Id$ */
/* Author: Marty Kraimer Date: 04-07-94 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stddef.h>
@@ -18,6 +17,7 @@
#define epicsExportSharedSymbols
#include "cantProceed.h"
#include "epicsMutex.h"
#include "epicsStdioRedirect.h"
#include "epicsString.h"
#include "dbDefs.h"
#include "ellLib.h"
@@ -34,13 +34,14 @@ typedef struct gphPvt {
#define MIN_SIZE 256
#define DEFAULT_SIZE 512
#define MAX_SIZE 65536
void epicsShareAPI gphInitPvt(gphPvt **ppvt, int size)
{
gphPvt *pgphPvt;
if (size & (size - 1)) {
printf("gphInitPvt: %d is not a power of 2\n", size);
fprintf(stderr, "gphInitPvt: %d is not a power of 2\n", size);
size = DEFAULT_SIZE;
}
@@ -88,7 +89,7 @@ GPHENTRY * epicsShareAPI gphFind(gphPvt *pgphPvt, const char *name, void *pvtid)
epicsMutexUnlock(pgphPvt->lock);
return pgphNode;
}
GPHENTRY * epicsShareAPI gphAdd(gphPvt *pgphPvt, const char *name, void *pvtid)
{
ELLLIST **paplist;
@@ -127,7 +128,7 @@ GPHENTRY * epicsShareAPI gphAdd(gphPvt *pgphPvt, const char *name, void *pvtid)
epicsMutexUnlock(pgphPvt->lock);
return (pgphNode);
}
void epicsShareAPI gphDelete(gphPvt *pgphPvt, const char *name, void *pvtid)
{
ELLLIST **paplist;
@@ -161,7 +162,7 @@ void epicsShareAPI gphDelete(gphPvt *pgphPvt, const char *name, void *pvtid)
epicsMutexUnlock(pgphPvt->lock);
return;
}
void epicsShareAPI gphFreeMem(gphPvt *pgphPvt)
{
ELLLIST **paplist;
@@ -203,9 +204,10 @@ void epicsShareAPI gphDumpFP(FILE *fp, gphPvt *pgphPvt)
ELLLIST **paplist;
int h;
if (pgphPvt == NULL) return;
if (pgphPvt == NULL)
return;
printf("Hash table has %d buckets", pgphPvt->size);
fprintf(fp, "Hash table has %d buckets", pgphPvt->size);
paplist = pgphPvt->paplist;
for (h = 0; h < pgphPvt->size; h++) {
+113 -99
View File
@@ -3,8 +3,7 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/* iocsh.cpp */
@@ -68,6 +67,7 @@ struct iocshRedirect {
const char *mode;
FILE *fp;
FILE *oldFp;
int mustRestore;
};
/*
@@ -101,7 +101,8 @@ iocshTableUnlock (void)
/*
* Register a command
*/
void epicsShareAPI iocshRegister (const iocshFuncDef *piocshFuncDef, iocshCallFunc func)
void epicsShareAPI iocshRegister (const iocshFuncDef *piocshFuncDef,
iocshCallFunc func)
{
struct iocshCommand *l, *p, *n;
int i;
@@ -118,7 +119,8 @@ void epicsShareAPI iocshRegister (const iocshFuncDef *piocshFuncDef, iocshCallFu
if (i < 0)
break;
}
n = (struct iocshCommand *)callocMustSucceed (1, sizeof *n, "iocshRegister");
n = (struct iocshCommand *) callocMustSucceed (1, sizeof *n,
"iocshRegister");
if (!registryAdd(iocshCmdID, piocshFuncDef->name, (void *)n)) {
free (n);
iocshTableUnlock ();
@@ -162,7 +164,8 @@ void epicsShareAPI iocshRegisterVariable (const iocshVarDef *piocshVarDef)
for (l = NULL, p = iocshVariableHead ; p != NULL ; l = p, p = p->next) {
i = strcmp (piocshVarDef->name, p->pVarDef->name);
if (i == 0) {
errlogPrintf("Warning -- iocshRegisterVariable redefining %s.\n", piocshVarDef->name);
errlogPrintf("Warning: iocshRegisterVariable redefining %s.\n",
piocshVarDef->name);
p->pVarDef = piocshVarDef;
found = 1;
break;
@@ -171,11 +174,13 @@ void epicsShareAPI iocshRegisterVariable (const iocshVarDef *piocshVarDef)
break;
}
if (!found) {
n = (struct iocshVariable *)callocMustSucceed(1, sizeof *n, "iocshRegisterVariable");
n = (struct iocshVariable *) callocMustSucceed(1, sizeof *n,
"iocshRegisterVariable");
if (!registryAdd(iocshVarID, piocshVarDef->name, (void *)n)) {
free(n);
iocshTableUnlock();
errlogPrintf("iocshRegisterVariable failed to add %s.\n", piocshVarDef->name);
errlogPrintf("iocshRegisterVariable failed to add %s.\n",
piocshVarDef->name);
return;
}
if (l == NULL) {
@@ -225,14 +230,15 @@ showError (const char *filename, int lineno, const char *msg, ...)
va_start (ap, msg);
if (filename)
fprintf (stderr, "%s -- Line %d -- ", filename, lineno);
vfprintf (stderr, msg, ap);
fputc ('\n', stderr);
fprintf(epicsGetStderr(), "%s line %d: ", filename, lineno);
vfprintf (epicsGetStderr(), msg, ap);
fputc ('\n', epicsGetStderr());
va_end (ap);
}
static int
cvtArg (const char *filename, int lineno, char *arg, iocshArgBuf *argBuf, const iocshArg *piocshArg)
cvtArg (const char *filename, int lineno, char *arg, iocshArgBuf *argBuf,
const iocshArg *piocshArg)
{
char *endp;
@@ -245,12 +251,13 @@ cvtArg (const char *filename, int lineno, char *arg, iocshArgBuf *argBuf, const
errno = 0;
argBuf->ival = strtoul (arg, &endp, 0);
if (errno == ERANGE) {
showError (filename, lineno, "Integer '%s' out of range", arg);
showError(filename, lineno, "Integer '%s' out of range",
arg);
return 0;
}
}
if (*endp) {
showError (filename, lineno, "Illegal integer '%s'", arg);
showError(filename, lineno, "Illegal integer '%s'", arg);
return 0;
}
}
@@ -263,7 +270,7 @@ cvtArg (const char *filename, int lineno, char *arg, iocshArgBuf *argBuf, const
if (arg && *arg) {
argBuf->dval = epicsStrtod (arg, &endp);
if (*endp) {
showError (filename, lineno, "Illegal double '%s'", arg);
showError(filename, lineno, "Illegal double '%s'", arg);
return 0;
}
}
@@ -279,7 +286,7 @@ cvtArg (const char *filename, int lineno, char *arg, iocshArgBuf *argBuf, const
case iocshArgPersistentString:
argBuf->sval = epicsStrDup(arg);
if (argBuf->sval == NULL) {
showError (filename, lineno, "Out of memory");
showError(filename, lineno, "Out of memory");
return 0;
}
break;
@@ -288,17 +295,18 @@ cvtArg (const char *filename, int lineno, char *arg, iocshArgBuf *argBuf, const
/* Argument must be missing or 0 or pdbbase */
if(!arg || !*arg || (*arg == '0') || (strcmp(arg, "pdbbase") == 0)) {
if(!iocshPpdbbase || !*iocshPpdbbase) {
showError (filename, lineno, "pdbbase not present");
showError(filename, lineno, "pdbbase not present");
return 0;
}
argBuf->vval = *iocshPpdbbase;
break;
}
showError (filename, lineno, "Expecting 'pdbbase' got '%s'", arg);
showError(filename, lineno, "Expecting 'pdbbase' got '%s'", arg);
return 0;
default:
showError (filename, lineno, "Illegal argument type %d", piocshArg->type);
showError(filename, lineno, "Illegal argument type %d",
piocshArg->type);
return 0;
}
return 1;
@@ -329,6 +337,7 @@ openRedirect(const char *filename, int lineno, struct iocshRedirect *redirect)
}
return -1;
}
redirect->mustRestore = 0;
}
}
return 0;
@@ -349,14 +358,17 @@ startRedirect(const char * /*filename*/, int /*lineno*/,
case 0:
redirect->oldFp = epicsGetThreadStdin();
epicsSetThreadStdin(redirect->fp);
redirect->mustRestore = 1;
break;
case 1:
redirect->oldFp = epicsGetThreadStdout();
epicsSetThreadStdout(redirect->fp);
redirect->mustRestore = 1;
break;
case 2:
redirect->oldFp = epicsGetThreadStderr();
epicsSetThreadStderr(redirect->fp);
redirect->mustRestore = 1;
break;
}
}
@@ -377,10 +389,12 @@ stopRedirect(const char *filename, int lineno, struct iocshRedirect *redirect)
showError(filename, lineno, "Error closing \"%s\": %s.",
redirect->name, strerror(errno));
redirect->fp = NULL;
switch(i) {
case 0: epicsSetThreadStdin(redirect->oldFp); break;
case 1: epicsSetThreadStdout(redirect->oldFp); break;
case 2: epicsSetThreadStderr(redirect->oldFp); break;
if (redirect->mustRestore) {
switch(i) {
case 0: epicsSetThreadStdin(redirect->oldFp); break;
case 1: epicsSetThreadStdout(redirect->oldFp); break;
case 2: epicsSetThreadStderr(redirect->oldFp); break;
}
}
}
redirect->name = NULL;
@@ -404,30 +418,31 @@ static void helpCallFunc(const iocshArgBuf *args)
if (argc == 1) {
int l, col = 0;
printf ("Type 'help command_name' to get more information about a particular command.\n");
fprintf(epicsGetStdout(),
"Type 'help <command>' to see the arguments of <command>.\n");
iocshTableLock ();
for (pcmd = iocshCommandHead ; pcmd != NULL ; pcmd = pcmd->next) {
piocshFuncDef = pcmd->pFuncDef;
l = strlen (piocshFuncDef->name);
if ((l + col) >= 79) {
fputc ('\n', stdout);
fputc('\n', epicsGetStdout());
col = 0;
}
fputs (piocshFuncDef->name, stdout);
fputs(piocshFuncDef->name, epicsGetStdout());
col += l;
if (col >= 64) {
fputc ('\n', stdout);
fputc('\n', epicsGetStdout());
col = 0;
}
else {
do {
fputc (' ', stdout);
fputc(' ', epicsGetStdout());
col++;
} while ((col % 16) != 0);
}
}
if (col)
fputc ('\n', stdout);
fputc('\n', epicsGetStdout());
iocshTableUnlock ();
}
else {
@@ -435,18 +450,18 @@ static void helpCallFunc(const iocshArgBuf *args)
for (pcmd = iocshCommandHead ; pcmd != NULL ; pcmd = pcmd->next) {
piocshFuncDef = pcmd->pFuncDef;
if (epicsStrGlobMatch(piocshFuncDef->name, argv[iarg]) != 0) {
fputs (piocshFuncDef->name, stdout);
fputs(piocshFuncDef->name, epicsGetStdout());
for (int a = 0 ; a < piocshFuncDef->nargs ; a++) {
const char *cp = piocshFuncDef->arg[a]->name;
if ((piocshFuncDef->arg[a]->type == iocshArgArgv)
|| (strchr (cp, ' ') == NULL)) {
fprintf (stdout, " %s", cp);
fprintf(epicsGetStdout(), " %s", cp);
}
else {
fprintf (stdout, " '%s'", cp);
fprintf(epicsGetStdout(), " '%s'", cp);
}
}
fprintf (stdout,"\n");;
fprintf(epicsGetStdout(),"\n");;
}
}
}
@@ -478,7 +493,6 @@ iocshBody (const char *pathname, const char *commandLine)
iocshArgBuf *argBuf = NULL;
int argBufCapacity = 0;
struct iocshCommand *found;
struct iocshFuncDef const *piocshFuncDef;
void *readlineContext = NULL;
int wasOkToBlock;
@@ -493,7 +507,8 @@ iocshBody (const char *pathname, const char *commandLine)
else {
fp = fopen (pathname, "r");
if (fp == NULL) {
fprintf (stderr, "Can't open %s: %s\n", pathname, strerror (errno));
fprintf(epicsGetStderr(), "Can't open %s: %s\n", pathname,
strerror (errno));
return -1;
}
if ((filename = strrchr (pathname, '/')) == NULL)
@@ -507,7 +522,7 @@ iocshBody (const char *pathname, const char *commandLine)
* Create a command-line input context
*/
if ((readlineContext = epicsReadlineBegin(fp)) == NULL) {
fprintf(stderr, "Can't allocate command-line object.\n");
fprintf(epicsGetStderr(), "Can't allocate command-line object.\n");
if (fp)
fclose(fp);
return -1;
@@ -519,7 +534,7 @@ iocshBody (const char *pathname, const char *commandLine)
*/
redirects = (struct iocshRedirect *)calloc(NREDIRECTS, sizeof *redirects);
if (redirects == NULL) {
printf ("Out of memory!\n");
fprintf(epicsGetStderr(), "Out of memory!\n");
return -1;
}
@@ -604,7 +619,7 @@ iocshBody (const char *pathname, const char *commandLine)
argvCapacity += 50;
av = (char **)realloc (argv, argvCapacity * sizeof *argv);
if (av == NULL) {
printf ("Out of memory!\n");
fprintf (epicsGetStderr(), "Out of memory!\n");
argc = -1;
break;
}
@@ -699,17 +714,17 @@ iocshBody (const char *pathname, const char *commandLine)
backslash = 0;
}
if (redirect != NULL) {
showError (filename, lineno, "Illegal redirection.");
showError(filename, lineno, "Illegal redirection.");
continue;
}
if (argc < 0)
break;
if (quote != EOF) {
showError (filename, lineno, "Unbalanced quote.");
showError(filename, lineno, "Unbalanced quote.");
continue;
}
if (backslash) {
showError (filename, lineno, "Trailing backslash.");
showError(filename, lineno, "Trailing backslash.");
continue;
}
if (inword)
@@ -730,73 +745,68 @@ iocshBody (const char *pathname, const char *commandLine)
stopRedirect(filename, lineno, redirects);
continue;
}
if (openRedirect(filename, lineno, redirects) < 0)
continue;
/*
* Look up command
* Special command?
*/
if (argc) {
/*
* Special command?
*/
if (strncmp (argv[0], "exit", 4) == 0)
break;
if ((strcmp (argv[0], "?") == 0)
|| (strncmp (argv[0], "help", 4) == 0)) {
}
if ((argc > 0) && (strcmp(argv[0], "exit") == 0))
break;
/*
* Set up redirection
*/
if ((openRedirect(filename, lineno, redirects) == 0) && (argc > 0)) {
/*
* Look up command
*/
found = (iocshCommand *)registryFind (iocshCmdID, argv[0]);
if (!found) {
showError (filename, lineno, "Command %s not found.", argv[0]);
continue;
}
piocshFuncDef = found->pFuncDef;
/*
* Process arguments and call function
*/
for (int iarg = 0 ; ; ) {
if (iarg == piocshFuncDef->nargs) {
startRedirect(filename, lineno, redirects);
(*found->func)(argBuf);
stopRedirect(filename, lineno, redirects);
break;
}
if (iarg >= argBufCapacity) {
void *np;
argBufCapacity += 20;
np = realloc (argBuf, argBufCapacity * sizeof *argBuf);
if (np == NULL) {
fprintf (stderr, "Out of memory!\n");
argBufCapacity -= 20;
if (found) {
/*
* Process arguments and call function
*/
struct iocshFuncDef const *piocshFuncDef = found->pFuncDef;
for (int iarg = 0 ; ; ) {
if (iarg == piocshFuncDef->nargs) {
startRedirect(filename, lineno, redirects);
(*found->func)(argBuf);
break;
}
argBuf = (iocshArgBuf *)np;
if (iarg >= argBufCapacity) {
void *np;
argBufCapacity += 20;
np = realloc (argBuf, argBufCapacity * sizeof *argBuf);
if (np == NULL) {
fprintf (epicsGetStderr(), "Out of memory!\n");
argBufCapacity -= 20;
break;
}
argBuf = (iocshArgBuf *)np;
}
if (piocshFuncDef->arg[iarg]->type == iocshArgArgv) {
argBuf[iarg].aval.ac = argc-iarg;
argBuf[iarg].aval.av = argv+iarg;
iarg = piocshFuncDef->nargs;
}
else {
if (!cvtArg (filename, lineno,
((iarg < argc) ? argv[iarg+1] : NULL),
&argBuf[iarg], piocshFuncDef->arg[iarg]))
break;
iarg++;
}
}
if (piocshFuncDef->arg[iarg]->type == iocshArgArgv) {
argBuf[iarg].aval.ac = argc-iarg;
argBuf[iarg].aval.av = argv+iarg;
iarg = piocshFuncDef->nargs;
}
else {
if (!cvtArg (filename, lineno,
((iarg < argc) ? argv[iarg+1] : NULL),
&argBuf[iarg], piocshFuncDef->arg[iarg]))
break;
iarg++;
if ((prompt != NULL) && (strcmp(argv[0], "epicsEnvSet") == 0)) {
const char *newPrompt;
if ((newPrompt = envGetConfigParamPtr(&IOCSH_PS1)) != NULL)
prompt = newPrompt;
}
}
if((prompt != NULL) && (strcmp(argv[0], "epicsEnvSet") == 0)) {
const char *newPrompt;
if ((newPrompt = envGetConfigParamPtr(&IOCSH_PS1)) != NULL)
prompt = newPrompt;
else {
showError(filename, lineno, "Command %s not found.", argv[0]);
}
}
stopRedirect(filename, lineno, redirects);
}
if (fp && (fp != stdin))
fclose (fp);
@@ -840,7 +850,8 @@ static void varHandler(const iocshVarDef *v, const char *setString)
{
switch(v->type) {
default:
printf("Can't handle variable %s of type %d.\n", v->name, v->type);
fprintf(epicsGetStderr(), "Can't handle variable %s of type %d.\n",
v->name, v->type);
return;
case iocshArgInt: break;
case iocshArgDouble: break;
@@ -849,10 +860,10 @@ static void varHandler(const iocshVarDef *v, const char *setString)
switch(v->type) {
default: break;
case iocshArgInt:
printf("%s = %d\n", v->name, *(int *)v->pval);
fprintf(epicsGetStdout(), "%s = %d\n", v->name, *(int *)v->pval);
break;
case iocshArgDouble:
printf("%s = %g\n", v->name, *(double *)v->pval);
fprintf(epicsGetStdout(), "%s = %g\n", v->name, *(double *)v->pval);
break;
}
}
@@ -866,7 +877,8 @@ static void varHandler(const iocshVarDef *v, const char *setString)
if((*setString != '\0') && (*endp == '\0'))
*(int *)v->pval = ltmp;
else
printf("Invalid value -- value of %s not changed.\n", v->name);
fprintf(epicsGetStderr(),
"Invalid integer value. Var %s not changed.\n", v->name);
break;
}
case iocshArgDouble:
@@ -876,7 +888,8 @@ static void varHandler(const iocshVarDef *v, const char *setString)
if((*setString != '\0') && (*endp == '\0'))
*(double *)v->pval = dtmp;
else
printf("Invalid value -- value of %s not changed.\n", v->name);
fprintf(epicsGetStderr(),
"Invalid double value. Var %s not changed.\n", v->name);
break;
}
}
@@ -893,7 +906,7 @@ static void varCallFunc(const iocshArgBuf *args)
else {
v = (iocshVariable *)registryFind(iocshVarID, args[0].sval);
if (v == NULL) {
printf("%s -- no such variable.\n", args[0].sval);
fprintf(epicsGetStderr(), "Var %s not found.\n", args[0].sval);
}
else {
varHandler(v->pVarDef, args[1].sval);
@@ -916,7 +929,8 @@ static void iocshCmdCallFunc(const iocshArgBuf *args)
*/
/* comment */
static const iocshArg commentArg0 = { "newline-terminated comment",iocshArgArgv};
static const iocshArg commentArg0 = { "newline-terminated comment",
iocshArgArgv};
static const iocshArg *commentArgs[1] = {&commentArg0};
static const iocshFuncDef commentFuncDef = {"#",1,commentArgs};
static void commentCallFunc(const iocshArgBuf *)
+8 -8
View File
@@ -9,10 +9,10 @@
\*************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#define epicsExportSharedSymbols
#include "iocsh.h"
#include "epicsStdioRedirect.h"
#include "epicsTime.h"
#include "epicsThread.h"
#include "epicsMutex.h"
@@ -60,7 +60,7 @@ static void chdirCallFunc(const iocshArgBuf *args)
int status;
status = chdir(args[0].sval);
if (status) {
printf ("Invalid directory path ignored\n");
fprintf(stderr, "Invalid directory path, ignored\n");
}
}
@@ -86,11 +86,11 @@ static void epicsEnvSetCallFunc(const iocshArgBuf *args)
char *value = args[1].sval;
if (name == NULL) {
printf ("Missing environment variable name argument.\n");
fprintf(stderr, "Missing environment variable name argument.\n");
return;
}
if (value == NULL) {
printf ("Missing environment variable value argument.\n");
fprintf(stderr, "Missing environment variable value argument.\n");
return;
}
epicsEnvSet (name, value);
@@ -231,7 +231,7 @@ static void threadCallFunc(const iocshArgBuf *args)
if (*endp) {
tid = epicsThreadGetId (cp);
if (!tid) {
printf ("\t'%s' is not a known thread name\n", cp);
fprintf(stderr, "\t'%s' is not a known thread name\n", cp);
continue;
}
}
@@ -299,7 +299,7 @@ static void epicsThreadResumeCallFunc(const iocshArgBuf *args)
if (*endp) {
tid = epicsThreadGetId(cp);
if (!tid) {
printf("*** argument %d (%s) is not a valid thread name ***\n", i, cp);
fprintf(stderr, "'%s' is not a valid thread name\n", cp);
continue;
}
}
@@ -307,13 +307,13 @@ static void epicsThreadResumeCallFunc(const iocshArgBuf *args)
tid =(epicsThreadId)ltmp;
epicsThreadGetName(tid, nameBuf, sizeof nameBuf);
if (nameBuf[0] == '\0') {
printf("*** argument %d (%s) is not a valid thread id ***\n", i, cp);
fprintf(stderr, "'%s' is not a valid thread id\n", cp);
continue;
}
}
if (!epicsThreadIsSuspended(tid)) {
printf("*** Thread %s is not suspended ***\n", cp);
fprintf(stderr, "Thread %s is not suspended\n", cp);
continue;
}
epicsThreadResume(tid);
+1 -1
View File
@@ -9,7 +9,6 @@
/* Original Authors: David H. Thompson & Sheng Peng (ORNL) */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@@ -19,6 +18,7 @@
#include "epicsMutex.h"
#include "epicsMessageQueue.h"
#include "epicsString.h"
#include "epicsStdioRedirect.h"
#include "epicsThread.h"
#include "epicsTime.h"
#include "epicsTimer.h"
+1 -1
View File
@@ -22,7 +22,7 @@
#include "dbDefs.h"
#include "epicsEvent.h"
#include "epicsExit.h"
#include "epicsStdio.h"
#include "epicsStdioRedirect.h"
#include "epicsThread.h"
#include "epicsMutex.h"
#include "errlog.h"