build: atInit module moved to libcom.

This commit is contained in:
Jerzy Jamroz
2025-02-04 13:52:49 +01:00
committed by Andrew Johnson
parent 41f19bd798
commit 8752372af1
7 changed files with 25 additions and 22 deletions
+2 -1
View File
@@ -2,7 +2,7 @@
# Copyright (c) 2010 UChicago Argonne LLC, as Operator of Argonne
# National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
# in file LICENSE that is included with this distribution.
#*************************************************************************
# This is a Makefile fragment, see src/libCom/Makefile.
@@ -16,6 +16,7 @@ Com_SRCS += iocsh.cpp
Com_SRCS += initHooks.c
Com_SRCS += registry.c
Com_SRCS += libComRegister.c
Com_SRCS += atInit.c
iocsh_CXXFLAGS += -DEPICS_COMMANDLINE_LIBRARY=EPICS_COMMANDLINE_LIBRARY_$(COMMANDLINE_LIBRARY)
iocsh_INCLUDES += $(INCLUDES_$(COMMANDLINE_LIBRARY))
+124
View File
@@ -0,0 +1,124 @@
/* Copyright (C) 2020 Dirk Zimoch */
/* Copyright (C) 2020-2025 European Spallation Source, ERIC
* Maintainer: Jerzy Jamroz
*/
#include <cantProceed.h>
#include <ellLib.h>
#include <epicsStdio.h>
#include <errlog.h>
#include <errno.h>
#include <initHooks.h>
#include <iocsh.h>
#include <string.h>
#include "atInit.h"
#define __AT_INIT_LOG(svr) svr " atInit: "
// Version within the message
static const char helpMessage[] =
"atInit version 2.1.1\n"
"Allows you to define commands to be run after the iocInit\n"
"Example commands:\n"
" atInit \"dbpf <PV> <VAL>\"\n"
" atInit \"date\"\n";
struct cmditem
{
ELLNODE node;
char* cmd;
};
static ELLLIST s_cmdlist = {};
static int s_initendflag = 0; // Defines the end of the initialization
static void atInitHook(initHookState state)
{
if(state != initHookAfterIocRunning)
return;
struct cmditem* item = NULL;
while(item = (struct cmditem*)ellGet(&s_cmdlist))
{
epicsStdoutPrintf("%s\n", item->cmd);
if(iocshCmd(item->cmd))
epicsStdoutPrintf(__AT_INIT_LOG(ERL_ERROR) "command '%s' failed to run\n", item->cmd);
free(item);
}
s_initendflag = 1;
}
static struct cmditem* newItem(char* cmd)
{
struct cmditem* item = mallocMustSucceed(sizeof(struct cmditem) + strlen(cmd) + 1,
__AT_INIT_LOG(ERL_ERROR) "failed to allocate memory for cmditem");
item->cmd = (char*)(item + 1);
strcpy(item->cmd, cmd);
if(item->cmd == NULL)
{
free(item);
errno = ENOMEM;
return NULL;
}
ellAdd(&s_cmdlist, &item->node);
return item;
}
static const iocshFuncDef atInitDef = {
"atInit",
1,
(const iocshArg*[]){&(iocshArg){"command (before iocInit)", iocshArgString}},
helpMessage};
static void atInitFunc(const iocshArgBuf* args)
{
static int first_time = 1;
char* cmd = args[0].sval;
if(s_initendflag)
{
epicsStdoutPrintf(__AT_INIT_LOG(ERL_WARNING) "can only be used before iocInit (check help)\n");
return;
}
if(!cmd || !cmd[0])
{
epicsStdoutPrintf(__AT_INIT_LOG(ERL_WARNING) "received an empty argument (check help)\n");
return;
}
if(first_time)
{
first_time = 0;
if(initHookRegister(atInitHook) < 0)
{
errno = ENOMEM;
epicsStdoutPrintf(__AT_INIT_LOG(ERL_ERROR) "initHookRegister memory allocation failure %s\n", strerror(errno));
}
}
struct cmditem* item = newItem(cmd);
if(!item)
epicsStdoutPrintf(__AT_INIT_LOG(ERL_ERROR) "failed to add the command '%s' %s\n", cmd, strerror(errno));
}
void atInitRegister(void)
{
static int first_time = 1;
if(first_time)
{
first_time = 0;
iocshRegister(&atInitDef, atInitFunc);
}
}
#undef __AT_INIT_LOG
+6
View File
@@ -0,0 +1,6 @@
#ifndef INC_atInit_H
#define INC_atInit_H
void atInitRegister(void);
#endif /* INC_atInit_H */
+3 -1
View File
@@ -27,7 +27,7 @@
#include "epicsGeneralTime.h"
#include "freeList.h"
#include "libComRegister.h"
#include "atInit.h"
/* Register the PWD environment variable when the cd IOC shell function is
* registered. This variable contains the current directory path.
*/
@@ -512,6 +512,8 @@ void epicsStdCall libComRegister(void)
iocshRegister(&generalTimeReportFuncDef,generalTimeReportCallFunc);
iocshRegister(&installLastResortEventProviderFuncDef, installLastResortEventProviderCallFunc);
atInitRegister();
comDefs[0].pval = &asCheckClientIP;
comDefs[1].pval = &freeListBypass;
iocshRegisterVariable(comDefs);