static int iocBuild_1(void) { if (iocState != iocVirgin && iocState != iocStopped) { errlogPrintf("iocBuild: IOC can only be initialized from uninitialized or stopped state\n"); return -1; } errlogInit(0); initHookAnnounce(initHookAtIocBuild); if (!epicsThreadIsOkToBlock()) { epicsThreadSetOkToBlock(1); } errlogPrintf("Starting iocInit\n"); if (checkDatabase(pdbbase)) { errlogPrintf("iocBuild: Aborting, bad database definition (DBD)!\n"); return -1; } epicsSignalInstallSigHupIgnore(); initHookAnnounce(initHookAtBeginning); coreRelease(); iocState = iocBuilding; taskwdInit(); callbackInit(); initHookAnnounce(initHookAfterCallbackInit); return 0; }
epicsShareFunc int errlogSevVprintf( const errlogSevEnum severity,const char *pFormat,va_list pvar) { char *pnext; int nchar; int totalChar = 0; int isOkToBlock; if (epicsInterruptIsInterruptContext()) { epicsInterruptContextMessage ("errlogSevVprintf called from interrupt level\n"); return 0; } errlogInit(0); if (pvtData.atExit) return 0; isOkToBlock = epicsThreadIsOkToBlock(); pnext = msgbufGetFree(isOkToBlock); if (!pnext) return 0; nchar = sprintf(pnext, "sevr=%s ", errlogGetSevEnumString(severity)); pnext += nchar; totalChar += nchar; nchar = tvsnPrint(pnext, pvtData.maxMsgSize - totalChar - 1, pFormat, pvar); pnext += nchar; totalChar += nchar; if (pnext[-1] != '\n') { strcpy(pnext,"\n"); totalChar++; } msgbufSetSize(totalChar); return nchar; }
epicsShareFunc int errlogSevPrintf( const errlogSevEnum severity,const char *pFormat, ...) { va_list pvar; int nchar; int isOkToBlock; if (epicsInterruptIsInterruptContext()) { epicsInterruptContextMessage ("errlogSevPrintf called from interrupt level\n"); return 0; } errlogInit(0); if (pvtData.sevToLog > severity) return 0; isOkToBlock = epicsThreadIsOkToBlock(); if (pvtData.atExit || (isOkToBlock && pvtData.toConsole)) { fprintf(pvtData.console, "sevr=%s ", errlogGetSevEnumString(severity)); va_start(pvar, pFormat); vfprintf(pvtData.console, pFormat, pvar); va_end(pvar); fflush(pvtData.console); } va_start(pvar, pFormat); nchar = errlogSevVprintf(severity, pFormat, pvar); va_end(pvar); return nchar; }
epicsShareFunc int errlogVprintf( const char *pFormat,va_list pvar) { int nchar; char *pbuffer; int isOkToBlock; if (epicsInterruptIsInterruptContext()) { epicsInterruptContextMessage ("errlogVprintf called from interrupt level\n"); return 0; } errlogInit(0); if (pvtData.atExit) return 0; isOkToBlock = epicsThreadIsOkToBlock(); pbuffer = msgbufGetFree(isOkToBlock); if (!pbuffer) { vfprintf(pvtData.console, pFormat, pvar); fflush(pvtData.console); return 0; } nchar = tvsnPrint(pbuffer, pvtData.maxMsgSize, pFormat?pFormat:"", pvar); if (pvtData.atExit || (isOkToBlock && pvtData.toConsole)) { fprintf(pvtData.console, "%s", pbuffer); fflush(pvtData.console); } msgbufSetSize(nchar); return nchar; }
/* * The body of the command interpreter */ static int iocshBody (const char *pathname, const char *commandLine) { FILE *fp = NULL; const char *filename = NULL; int icin, icout; char c; int quote, inword, backslash; const char *raw = NULL;; char *line = NULL; int lineno = 0; int argc; char **argv = NULL; int argvCapacity = 0; struct iocshRedirect *redirects = NULL; struct iocshRedirect *redirect = NULL; int sep; const char *prompt = NULL; const char *ifs = " \t(),\r"; iocshArgBuf *argBuf = NULL; int argBufCapacity = 0; struct iocshCommand *found; void *readlineContext = NULL; int wasOkToBlock; /* * See if command interpreter is interactive */ if (commandLine == NULL) { if ((pathname == NULL) || (strcmp (pathname, "<telnet>") == 0)) { if ((prompt = envGetConfigParamPtr(&IOCSH_PS1)) == NULL) prompt = "epics> "; } else { fp = fopen (pathname, "r"); if (fp == NULL) { fprintf(epicsGetStderr(), "Can't open %s: %s\n", pathname, strerror (errno)); return -1; } if ((filename = strrchr (pathname, '/')) == NULL) filename = pathname; else filename++; prompt = NULL; } /* * Create a command-line input context */ if ((readlineContext = epicsReadlineBegin(fp)) == NULL) { fprintf(epicsGetStderr(), "Can't allocate command-line object.\n"); if (fp) fclose(fp); return -1; } } /* * Set up redirection */ redirects = (struct iocshRedirect *)calloc(NREDIRECTS, sizeof *redirects); if (redirects == NULL) { fprintf(epicsGetStderr(), "Out of memory!\n"); return -1; } /* * Read commands till EOF or exit */ argc = 0; wasOkToBlock = epicsThreadIsOkToBlock(); epicsThreadSetOkToBlock(1); for (;;) { /* * Read a line */ if (commandLine) { if (raw != NULL) break; raw = commandLine; } else { if ((raw = epicsReadline(prompt, readlineContext)) == NULL) break; } lineno++; /* * Skip leading white-space */ icin = 0; while ((c = raw[icin]) && isspace(c)) { icin++; } /* * Ignore comment lines other than to echo * them if they came from a script. This * avoids macLib errors from comments. */ if (c == '#') { if ((prompt == NULL) && (commandLine == NULL)) puts(raw); continue; } /* * Expand macros */ free(line); if ((line = macEnvExpand(raw)) == NULL) continue; /* * Skip leading white-space coming from a macro */ while ((c = line[icin]) && isspace(c)) { icin++; } /* * Echo non-empty lines read from a script */ if ((prompt == NULL) && *line && (commandLine == NULL)) puts(line); /* * Ignore lines that became a comment or empty after macro expansion */ if (!c || c == '#') continue; /* * Break line into words */ icout = 0; inword = 0; argc = 0; quote = EOF; backslash = 0; redirect = NULL; for (;;) { if (argc >= argvCapacity) { char **av; argvCapacity += 50; av = (char **)realloc (argv, argvCapacity * sizeof *argv); if (av == NULL) { fprintf (epicsGetStderr(), "Out of memory!\n"); argc = -1; break; } argv = av; } c = line[icin++]; if (c == '\0') break; if ((quote == EOF) && !backslash && (strchr (ifs, c))) sep = 1; else sep = 0; if ((quote == EOF) && !backslash) { int redirectFd = 1; if (c == '\\') { backslash = 1; continue; } if (c == '<') { if (redirect != NULL) { break; } redirect = &redirects[0]; sep = 1; redirect->mode = "r"; } if ((c >= '1') && (c <= '9') && (line[icin] == '>')) { redirectFd = c - '0'; c = '>'; icin++; } if (c == '>') { if (redirect != NULL) break; if (redirectFd >= NREDIRECTS) { redirect = &redirects[1]; break; } redirect = &redirects[redirectFd]; sep = 1; if (line[icin] == '>') { icin++; redirect->mode = "a"; } else { redirect->mode = "w"; } } } if (inword) { if (c == quote) { quote = EOF; } else { if ((quote == EOF) && !backslash) { if (sep) { inword = 0; line[icout++] = '\0'; } else if ((c == '"') || (c == '\'')) { quote = c; } else { line[icout++] = c; } } else { line[icout++] = c; } } } else { if (!sep) { if (((c == '"') || (c == '\'')) && !backslash) quote = c; if (redirect != NULL) { if (redirect->name != NULL) { argc = -1; break; } redirect->name = line + icout; redirect = NULL; } else { argv[argc++] = line + icout; } if (quote == EOF) line[icout++] = c; inword = 1; } } backslash = 0; } if (redirect != NULL) { showError(filename, lineno, "Illegal redirection."); continue; } if (argc < 0) break; if (quote != EOF) { showError(filename, lineno, "Unbalanced quote."); continue; } if (backslash) { showError(filename, lineno, "Trailing backslash."); continue; } if (inword) line[icout++] = '\0'; argv[argc] = NULL; /* * Special case -- Redirected input but no command * Treat as if 'iocsh filename'. */ if ((argc == 0) && (redirects[0].name != NULL)) { const char *commandFile = redirects[0].name; redirects[0].name = NULL; if (openRedirect(filename, lineno, redirects) < 0) continue; startRedirect(filename, lineno, redirects); iocshBody(commandFile, NULL); stopRedirect(filename, lineno, redirects); continue; } /* * Special command? */ 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) { /* * 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; } 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 ((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); if (redirects != NULL) { stopRedirect(filename, lineno, redirects); free (redirects); } free(line); free (argv); free (argBuf); errlogFlush(); if (readlineContext) epicsReadlineEnd(readlineContext); epicsThreadSetOkToBlock( wasOkToBlock); return 0; }
epicsShareFunc void errPrintf(long status, const char *pFileName, int lineno, const char *pformat, ...) { va_list pvar; char *pnext; int nchar; int totalChar=0; int isOkToBlock; char name[256]; if (epicsInterruptIsInterruptContext()) { epicsInterruptContextMessage("errPrintf called from interrupt level\n"); return; } errlogInit(0); isOkToBlock = epicsThreadIsOkToBlock(); if (status == 0) status = errno; if (status > 0) { errSymLookup(status, name, sizeof(name)); } if (pvtData.atExit || (isOkToBlock && pvtData.toConsole)) { if (pFileName) fprintf(pvtData.console, "filename=\"%s\" line number=%d\n", pFileName, lineno); if (status > 0) fprintf(pvtData.console, "%s ", name); va_start(pvar, pformat); vfprintf(pvtData.console, pformat, pvar); va_end(pvar); fputc('\n', pvtData.console); fflush(pvtData.console); } if (pvtData.atExit) return; pnext = msgbufGetFree(isOkToBlock); if (!pnext) return; if (pFileName) { nchar = sprintf(pnext,"filename=\"%s\" line number=%d\n", pFileName, lineno); pnext += nchar; totalChar += nchar; } if (status > 0) { nchar = sprintf(pnext,"%s ",name); pnext += nchar; totalChar += nchar; } va_start(pvar, pformat); nchar = tvsnPrint(pnext, pvtData.maxMsgSize - totalChar - 1, pformat, pvar); va_end(pvar); if (nchar>0) { pnext += nchar; totalChar += nchar; } strcpy(pnext, "\n"); totalChar++ ; /*include the \n */ msgbufSetSize(totalChar); }