variuos changes
This commit is contained in:
373
sicshipadaba.c
373
sicshipadaba.c
@ -381,12 +381,12 @@ typedef struct {
|
|||||||
int internalID;
|
int internalID;
|
||||||
} HdbCBInfo;
|
} HdbCBInfo;
|
||||||
|
|
||||||
static Protocol isJSON(SConnection * pCon)
|
static Protocol isJSON(SConnection * pCon, int notify)
|
||||||
{
|
{
|
||||||
char proName[128];
|
char proName[128];
|
||||||
void *pData;
|
void *pData;
|
||||||
|
|
||||||
if (SCinMacro(pCon)) {
|
if (notify == 0 && SCinMacro(pCon)) {
|
||||||
return normal_protocol;
|
return normal_protocol;
|
||||||
}
|
}
|
||||||
pData = FindCommandData(pServ->pSics, "protocol", "Protocol");
|
pData = FindCommandData(pServ->pSics, "protocol", "Protocol");
|
||||||
@ -604,7 +604,7 @@ static hdbCallbackReturn SICSNotifyCallback(pHdb node, void *userData,
|
|||||||
|
|
||||||
pPath = GetHipadabaPath(node);
|
pPath = GetHipadabaPath(node);
|
||||||
result = CreateDynString(128, 128);
|
result = CreateDynString(128, 128);
|
||||||
if ((protocol = isJSON(cbInfo->pCon)) == 1)
|
if ((protocol = isJSON(cbInfo->pCon, 1)) == 1)
|
||||||
outCode = eHdbEvent;
|
outCode = eHdbEvent;
|
||||||
else
|
else
|
||||||
outCode = eEvent;
|
outCode = eEvent;
|
||||||
@ -733,7 +733,7 @@ static hdbCallbackReturn TreeChangeCallback(pHdb node, void *userData,
|
|||||||
return hdbAbort;
|
return hdbAbort;
|
||||||
}
|
}
|
||||||
path = GetHipadabaPath(node);
|
path = GetHipadabaPath(node);
|
||||||
if ((protocol = isJSON(cbInfo->pCon)) == 1)
|
if ((protocol = isJSON(cbInfo->pCon, 1)) == 1)
|
||||||
outCode = eHdbEvent;
|
outCode = eHdbEvent;
|
||||||
else
|
else
|
||||||
outCode = eEvent;
|
outCode = eEvent;
|
||||||
@ -1487,7 +1487,7 @@ pHdb FindHdbParent(char *rootpath, char *relpath, char **namePtr,
|
|||||||
} else {
|
} else {
|
||||||
iret = snprintf(buffer, sizeof buffer, "%s/%s", rootpath, relpath);
|
iret = snprintf(buffer, sizeof buffer, "%s/%s", rootpath, relpath);
|
||||||
}
|
}
|
||||||
if (iret < 0 || iret >= sizeof(buffer)) {
|
if (iret < 0 || iret >= (int) sizeof(buffer)) {
|
||||||
SCWrite(pCon, "ERROR: path too long", eError);
|
SCWrite(pCon, "ERROR: path too long", eError);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1599,7 +1599,7 @@ int GetHdbPath(pHdb nodeArg, char *path, size_t pathlen)
|
|||||||
len = 0;
|
len = 0;
|
||||||
for (node = nodeArg; node != NULL && node != root; node = node->mama) {
|
for (node = nodeArg; node != NULL && node != root; node = node->mama) {
|
||||||
len += strlen(node->name) + 1;
|
len += strlen(node->name) + 1;
|
||||||
if (len >= pathlen)
|
if (len >= (int) pathlen)
|
||||||
return 0; /* buffer overflow (recursive path?) */
|
return 0; /* buffer overflow (recursive path?) */
|
||||||
parent = node;
|
parent = node;
|
||||||
}
|
}
|
||||||
@ -1616,7 +1616,7 @@ int GetHdbPath(pHdb nodeArg, char *path, size_t pathlen)
|
|||||||
}
|
}
|
||||||
l = strlen(sics);
|
l = strlen(sics);
|
||||||
len += l;
|
len += l;
|
||||||
if (len > pathlen)
|
if (len > (int) pathlen)
|
||||||
return 0; /* buffer overflow */
|
return 0; /* buffer overflow */
|
||||||
strncpy(path, sics, l);
|
strncpy(path, sics, l);
|
||||||
}
|
}
|
||||||
@ -2283,6 +2283,71 @@ static int MakeHdbNode(SConnection * pCon, SicsInterp * pSics, void *pData,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
static int MakeHdbScriptNode(SConnection * pCon, SicsInterp * pSics,
|
||||||
|
void *pData, int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int type = 0, i, length = 0;
|
||||||
|
char *name = NULL;
|
||||||
|
pHdb parent = NULL;
|
||||||
|
pHdb child = NULL;
|
||||||
|
pHdb current = NULL;
|
||||||
|
char *urgv[] = { "5", NULL };
|
||||||
|
char driver[] = { "hdb" };
|
||||||
|
char buffer[512], buffer2[512];
|
||||||
|
|
||||||
|
|
||||||
|
if (!SCMatchRights(pCon, usMugger)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc < 5) {
|
||||||
|
SCWrite(pCon, "ERROR: not enough arguments to MakeHdbNode", eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* convert datatype
|
||||||
|
*/
|
||||||
|
strtolower(argv[4]);
|
||||||
|
type = convertHdbType(argv[4]);
|
||||||
|
if (type >= 7) {
|
||||||
|
SCWrite(pCon,
|
||||||
|
"ERROR: invalid type requested: none, int, float, text, intar, floatar, intvarar, floatvarar supported",
|
||||||
|
eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (type > 2) {
|
||||||
|
if (argc < 6) {
|
||||||
|
SCWrite(pCon, "ERROR: array length missing for array data type",
|
||||||
|
eError);
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
length = atoi(argv[5]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
parent = FindHdbParent(NULL, argv[1], &name, pCon);
|
||||||
|
if (parent == NULL) {
|
||||||
|
return 0; /* error messages written inside FindHdbParent */
|
||||||
|
}
|
||||||
|
child = MakeSICSScriptPar(name, argv[3], argv[2],
|
||||||
|
makeHdbValue(type, length));
|
||||||
|
if (child == NULL) {
|
||||||
|
SCWrite(pCon, "ERROR: out of memory creating node", eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddHipadabaChild(parent, child, pCon);
|
||||||
|
/*
|
||||||
|
* have it polled automatically
|
||||||
|
*/
|
||||||
|
addPollObject(poller, pCon, GetHipadabaPath(child), driver, 1, urgv);
|
||||||
|
|
||||||
|
SCSendOK(pCon);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------------*/
|
||||||
static int isNodeProtected(pHdb node)
|
static int isNodeProtected(pHdb node)
|
||||||
{
|
{
|
||||||
@ -2485,7 +2550,7 @@ static int ZipGetHdbNode(SConnection * pCon, SicsInterp * pSics,
|
|||||||
SCWrite(pCon, "ERROR: out of memory formatting data", eError);
|
SCWrite(pCon, "ERROR: out of memory formatting data", eError);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ((protocol = isJSON(pCon)) == 1)
|
if ((protocol = isJSON(pCon, 0)) == 1)
|
||||||
outCode = eHdbEvent;
|
outCode = eHdbEvent;
|
||||||
else
|
else
|
||||||
outCode = eValue;
|
outCode = eValue;
|
||||||
@ -2541,13 +2606,17 @@ static int GetHdbNode(SConnection * pCon, SicsInterp * pSics, void *pData,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
memset(&newValue, 0, sizeof(hdbValue));
|
memset(&newValue, 0, sizeof(hdbValue));
|
||||||
GetHipadabaPar(targetNode, &newValue, pCon);
|
/* ffr XXX I expect if status=0 then we don't have a valid value
|
||||||
|
Original code was causing a segfault for hdb text nodes
|
||||||
|
*/
|
||||||
|
if (0 == GetHipadabaPar(targetNode, &newValue, pCon))
|
||||||
|
return 0;
|
||||||
parData = formatValue(newValue, targetNode);
|
parData = formatValue(newValue, targetNode);
|
||||||
if (parData == NULL) {
|
if (parData == NULL) {
|
||||||
SCWrite(pCon, "ERROR: out of memory formatting data", eError);
|
SCWrite(pCon, "ERROR: out of memory formatting data", eError);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ((protocol = isJSON(pCon)) == 1)
|
if ((protocol = isJSON(pCon, 0)) == 1)
|
||||||
outCode = eHdbEvent;
|
outCode = eHdbEvent;
|
||||||
else
|
else
|
||||||
outCode = eValue;
|
outCode = eValue;
|
||||||
@ -2585,13 +2654,14 @@ static int GetHdbVal(SConnection * pCon, SicsInterp * pSics, void *pData,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
memset(&newValue, 0, sizeof(hdbValue));
|
memset(&newValue, 0, sizeof(hdbValue));
|
||||||
GetHipadabaPar(targetNode, &newValue, pCon);
|
if (0 == GetHipadabaPar(targetNode, &newValue, pCon))
|
||||||
|
return 0;
|
||||||
parData = formatValue(newValue, targetNode);
|
parData = formatValue(newValue, targetNode);
|
||||||
if (parData == NULL) {
|
if (parData == NULL) {
|
||||||
SCWrite(pCon, "ERROR: out of memory formatting data", eError);
|
SCWrite(pCon, "ERROR: out of memory formatting data", eError);
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
if ((protocol = isJSON(pCon)) == 1)
|
if ((protocol = isJSON(pCon, 0)) == 1)
|
||||||
outCode = eHdbEvent;
|
outCode = eHdbEvent;
|
||||||
else
|
else
|
||||||
outCode = eValue;
|
outCode = eValue;
|
||||||
@ -2897,7 +2967,7 @@ static int ListHdbNode(SConnection * pCon, SicsInterp * pSics, void *pData,
|
|||||||
} else if (strcmp(argv[1], "-cli") == 0) {
|
} else if (strcmp(argv[1], "-cli") == 0) {
|
||||||
listData = formatClientList(node);
|
listData = formatClientList(node);
|
||||||
} else {
|
} else {
|
||||||
if ((protocol = isJSON(pCon)) == 1) {
|
if ((protocol = isJSON(pCon, 0)) == 1) {
|
||||||
listData = formatJSONList(node);
|
listData = formatJSONList(node);
|
||||||
outCode = eHdbEvent;
|
outCode = eHdbEvent;
|
||||||
} else {
|
} else {
|
||||||
@ -2969,6 +3039,62 @@ static int RemoveHdbCallback(SConnection * pCon, SicsInterp * pSics,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static int LinkHdbNode(SConnection * pCon, SicsInterp * pSics, void *pData,
|
||||||
|
int argc, char *argv[])
|
||||||
|
{
|
||||||
|
pHdb node = NULL;
|
||||||
|
char buffer[256];
|
||||||
|
pObjectDescriptor pDes = NULL;
|
||||||
|
|
||||||
|
if (argc < 3) {
|
||||||
|
SCWrite(pCon, "ERROR: need path and object name to link", eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!SCMatchRights(pCon, usMugger)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
node = GetHipadabaNode(root, argv[1]);
|
||||||
|
if (node == NULL) {
|
||||||
|
snprintf(buffer, 255, "ERROR: path %s NOT found!", argv[1]);
|
||||||
|
SCWrite(pCon, buffer, eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pDes = FindCommandDescriptor(pSics, argv[2]);
|
||||||
|
if (pDes == NULL) {
|
||||||
|
snprintf(buffer, 255, "ERROR: failed to find object %s", argv[2]);
|
||||||
|
SCWrite(pCon, buffer, eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (pDes->parNode == NULL) {
|
||||||
|
snprintf(buffer, 255,
|
||||||
|
"ERROR: Object %s does not use Hipadaba natively and thus cannot be linked",
|
||||||
|
argv[2]);
|
||||||
|
SCWrite(pCon, buffer, eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pDes->parNode->mama != NULL) {
|
||||||
|
snprintf(buffer, 255,
|
||||||
|
"ERROR: Object %s is already linked somewhere else", argv[2]);
|
||||||
|
SCWrite(pCon, buffer, eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddHipadabaChild(node, pDes->parNode, pCon);
|
||||||
|
|
||||||
|
if (argc > 3) {
|
||||||
|
if (pDes->parNode->name != NULL) {
|
||||||
|
free(pDes->parNode->name);
|
||||||
|
}
|
||||||
|
pDes->parNode->name = strdup(argv[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
SCSendOK(pCon);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
static int isArrayNode(pHdb node)
|
static int isArrayNode(pHdb node)
|
||||||
{
|
{
|
||||||
@ -3240,9 +3366,9 @@ static hdbCallbackReturn CommandSetCallback(pHdb node, void *userData,
|
|||||||
}
|
}
|
||||||
current = current->next;
|
current = current->next;
|
||||||
}
|
}
|
||||||
SendHdbStatusMessage(node, "start");
|
// SendHdbStatusMessage(node,"start");
|
||||||
status = HDBInvoke(pCon, pServ->pSics, GetCharArray(cmd));
|
status = HDBInvoke(pCon, pServ->pSics, GetCharArray(cmd));
|
||||||
SendHdbStatusMessage(node, "stop");
|
// SendHdbStatusMessage(node,"stop");
|
||||||
DeleteDynString(cmd);
|
DeleteDynString(cmd);
|
||||||
if (status == 1) {
|
if (status == 1) {
|
||||||
return hdbContinue;
|
return hdbContinue;
|
||||||
@ -3273,6 +3399,60 @@ static hdbCallbackReturn CommandGetCallback(pHdb node, void *userData,
|
|||||||
return hdbContinue;
|
return hdbContinue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
static int SicsCommandNode(SConnection * pCon, SicsInterp * pSics,
|
||||||
|
void *pData, int argc, char *argv[])
|
||||||
|
{
|
||||||
|
char *name = NULL;
|
||||||
|
pHdbCallback kalle = NULL;
|
||||||
|
pHdb parent = NULL, node = NULL;
|
||||||
|
|
||||||
|
if (argc < 3) {
|
||||||
|
SCWrite(pCon, "ERROR: insufficent number of arguments to hcommand",
|
||||||
|
eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!SCMatchRights(pCon, usMugger)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
parent = FindHdbParent(NULL, argv[1], &name, pCon);
|
||||||
|
if (parent == NULL) {
|
||||||
|
return 0; /* error message already written */
|
||||||
|
}
|
||||||
|
node = MakeHipadabaNode(name, HIPTEXT, 1);
|
||||||
|
if (node == NULL) {
|
||||||
|
SCWrite(pCon, "ERROR: out of memory in hcommand", eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
node->value.v.text = strdup(argv[2]);
|
||||||
|
node->value.arrayLength = strlen(argv[2]);
|
||||||
|
SetHdbProperty(node, "sicscommand", argv[2]);
|
||||||
|
// Set privillege of the node
|
||||||
|
if (argc > 3) {
|
||||||
|
SetHdbProperty(node, "priv", argv[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
kalle = MakeHipadabaCallback(CommandSetCallback, NULL, NULL);
|
||||||
|
if (kalle == NULL) {
|
||||||
|
SCWrite(pCon, "ERROR: out of memory in hcommand", eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
AppendHipadabaCallback(node, kalle);
|
||||||
|
|
||||||
|
kalle = MakeHipadabaCallback(CommandGetCallback, NULL, NULL);
|
||||||
|
if (kalle == NULL) {
|
||||||
|
SCWrite(pCon, "ERROR: out of memory in hcommand", eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
AppendHipadabaCallback(node, kalle);
|
||||||
|
|
||||||
|
AddHipadabaChild(parent, node, pCon);
|
||||||
|
|
||||||
|
SCSendOK(pCon);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*======================= Property Functions ================================*/
|
/*======================= Property Functions ================================*/
|
||||||
static int SetSICSHdbProperty(SConnection * pCon, SicsInterp * pSics,
|
static int SetSICSHdbProperty(SConnection * pCon, SicsInterp * pSics,
|
||||||
void *pData, int argc, char *argv[])
|
void *pData, int argc, char *argv[])
|
||||||
@ -3322,6 +3502,30 @@ static int DelSICSHdbProperty(SConnection * pCon, SicsInterp * pSics,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
static int HasSICSHdbProperty(SConnection * pCon, SicsInterp * pSics,
|
||||||
|
void *pData, int argc, char *argv[])
|
||||||
|
{
|
||||||
|
pHdb targetNode = NULL;
|
||||||
|
|
||||||
|
if (argc < 3) {
|
||||||
|
SCWrite(pCon, "ERROR: need path key as parameters", eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
targetNode = FindHdbNode(NULL, argv[1], pCon);
|
||||||
|
if (targetNode == NULL) {
|
||||||
|
SCWrite(pCon, "ERROR: node not found", eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (HasHdbProperty(targetNode, argv[2])) {
|
||||||
|
SCPrintf(pCon, eValue, "%s", "true");
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
SCPrintf(pCon, eValue, "%s", "false");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
static int GetSICSHdbProperty(SConnection * pCon, SicsInterp * pSics,
|
static int GetSICSHdbProperty(SConnection * pCon, SicsInterp * pSics,
|
||||||
void *pData, int argc, char *argv[])
|
void *pData, int argc, char *argv[])
|
||||||
@ -3382,10 +3586,13 @@ static int ListSICSHdbProperty(SConnection * pCon, SicsInterp * pSics,
|
|||||||
char buffer[512];
|
char buffer[512];
|
||||||
const char *pKey = NULL;
|
const char *pKey = NULL;
|
||||||
pDynString data = NULL;
|
pDynString data = NULL;
|
||||||
|
int genTclList = 0;
|
||||||
|
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
SCWrite(pCon, "ERROR: need path as parameter", eError);
|
SCWrite(pCon, "ERROR: need path as parameter", eError);
|
||||||
return 0;
|
return 0;
|
||||||
|
} else if (argc == 3) {
|
||||||
|
genTclList = 1;
|
||||||
}
|
}
|
||||||
targetNode = FindHdbNode(NULL, argv[1], pCon);
|
targetNode = FindHdbNode(NULL, argv[1], pCon);
|
||||||
if (targetNode == NULL) {
|
if (targetNode == NULL) {
|
||||||
@ -3400,9 +3607,64 @@ static int ListSICSHdbProperty(SConnection * pCon, SicsInterp * pSics,
|
|||||||
InitHdbPropertySearch(targetNode);
|
InitHdbPropertySearch(targetNode);
|
||||||
while ((pKey = GetNextHdbProperty(targetNode, buffer, 511)) != NULL) {
|
while ((pKey = GetNextHdbProperty(targetNode, buffer, 511)) != NULL) {
|
||||||
DynStringConcat(data, (char *) pKey);
|
DynStringConcat(data, (char *) pKey);
|
||||||
DynStringConcat(data, "=");
|
if (genTclList) {
|
||||||
DynStringConcat(data, buffer);
|
DynStringConcat(data, " ");
|
||||||
DynStringConcat(data, "\n");
|
DynStringConcat(data, "{");
|
||||||
|
DynStringConcat(data, buffer);
|
||||||
|
DynStringConcat(data, "}");
|
||||||
|
DynStringConcat(data, " ");
|
||||||
|
} else {
|
||||||
|
DynStringConcat(data, "=");
|
||||||
|
DynStringConcat(data, buffer);
|
||||||
|
DynStringConcat(data, "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SCWrite(pCon, GetCharArray(data), eValue);
|
||||||
|
DeleteDynString(data);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ANSTO_ListSICSHdbProperty(SConnection * pCon,
|
||||||
|
SicsInterp * pSics, void *pData,
|
||||||
|
int argc, char *argv[])
|
||||||
|
{
|
||||||
|
pHdb targetNode = NULL;
|
||||||
|
char buffer[512], *globPtr = NULL;
|
||||||
|
int cmpSize = 0;
|
||||||
|
const char *pKey = NULL;
|
||||||
|
pDynString data = NULL;
|
||||||
|
|
||||||
|
if (argc < 3) {
|
||||||
|
SCWrite(pCon, "ERROR: need path and search string as parameters",
|
||||||
|
eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
targetNode = FindHdbNode(NULL, argv[1], pCon);
|
||||||
|
if (targetNode == NULL) {
|
||||||
|
SCWrite(pCon, "ERROR: node not found", eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
data = CreateDynString(64, 64);
|
||||||
|
if (data == NULL) {
|
||||||
|
SCWrite(pCon, "ERROR: out of memory in ListSICSHdbProperty", eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
InitHdbPropertySearch(targetNode);
|
||||||
|
|
||||||
|
/* Allow simple glob matches with '*' as a suffix
|
||||||
|
Eg hfindprop /hpath @*
|
||||||
|
*/
|
||||||
|
if ((globPtr = index(argv[2], '*')) != NULL) {
|
||||||
|
*globPtr = '\0';
|
||||||
|
}
|
||||||
|
cmpSize = strlen(argv[2]);
|
||||||
|
while ((pKey = GetNextHdbProperty(targetNode, buffer, 511)) != NULL) {
|
||||||
|
if (strncasecmp(argv[2], pKey, cmpSize) == 0) {
|
||||||
|
DynStringConcat(data, (char *) pKey);
|
||||||
|
DynStringConcat(data, " ");
|
||||||
|
DynStringConcat(data, buffer);
|
||||||
|
DynStringConcat(data, "\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
SCWrite(pCon, GetCharArray(data), eValue);
|
SCWrite(pCon, GetCharArray(data), eValue);
|
||||||
DeleteDynString(data);
|
DeleteDynString(data);
|
||||||
@ -3410,23 +3672,46 @@ static int ListSICSHdbProperty(SConnection * pCon, SicsInterp * pSics,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static pHdb matchHdbProp(pHdb root, char *propname, char *buffer)
|
static pHdb matchHdbProp(pHdb root, char *propname, char *buffer,
|
||||||
|
pDynString result, int invertmatch)
|
||||||
{
|
{
|
||||||
char value[1024];
|
char value[1024], *path = NULL;
|
||||||
pHdb current = NULL, search;
|
pHdb current = NULL, search;
|
||||||
|
|
||||||
memset(value, 0, 1024);
|
memset(value, 0, 1024);
|
||||||
if (GetHdbProperty(root, propname, value, 1023) == 1) {
|
if (strcmp(buffer, "*") == 0) {
|
||||||
|
if (GetHdbProperty(root, propname, value, 1023) == 1) {
|
||||||
|
if (!invertmatch) {
|
||||||
|
path = GetHipadabaPath(root);
|
||||||
|
DynStringConcat(result, path);
|
||||||
|
DynStringConcat(result, "\n");
|
||||||
|
free(path);
|
||||||
|
}
|
||||||
|
} else if (invertmatch) {
|
||||||
|
path = GetHipadabaPath(root);
|
||||||
|
DynStringConcat(result, path);
|
||||||
|
DynStringConcat(result, "\n");
|
||||||
|
free(path);
|
||||||
|
}
|
||||||
|
} else if (GetHdbProperty(root, propname, value, 1023) == 1) {
|
||||||
if (strstr(buffer, value) != NULL) {
|
if (strstr(buffer, value) != NULL) {
|
||||||
return root;
|
if (!invertmatch) {
|
||||||
|
path = GetHipadabaPath(root);
|
||||||
|
DynStringConcat(result, path);
|
||||||
|
DynStringConcat(result, "\n");
|
||||||
|
free(path);
|
||||||
|
}
|
||||||
|
} else if (invertmatch) {
|
||||||
|
path = GetHipadabaPath(root);
|
||||||
|
DynStringConcat(result, path);
|
||||||
|
DynStringConcat(result, "\n");
|
||||||
|
free(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
current = root->child;
|
current = root->child;
|
||||||
while (current != NULL) {
|
while (current != NULL) {
|
||||||
search = matchHdbProp(current, propname, buffer);
|
search =
|
||||||
if (search != NULL) {
|
matchHdbProp(current, propname, buffer, result, invertmatch);
|
||||||
return search;
|
|
||||||
}
|
|
||||||
current = current->next;
|
current = current->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3440,6 +3725,8 @@ static int MatchHdbProperty(SConnection * pCon, SicsInterp * pSics,
|
|||||||
pHdb root = NULL;
|
pHdb root = NULL;
|
||||||
pHdb foundNode = NULL;
|
pHdb foundNode = NULL;
|
||||||
char buffer[1024], *path = NULL;
|
char buffer[1024], *path = NULL;
|
||||||
|
int node = 1, prop = 2, propval = 3, invertmatch = 0;
|
||||||
|
pDynString matchList = NULL;
|
||||||
|
|
||||||
if (argc < 4) {
|
if (argc < 4) {
|
||||||
SCWrite(pCon,
|
SCWrite(pCon,
|
||||||
@ -3447,25 +3734,29 @@ static int MatchHdbProperty(SConnection * pCon, SicsInterp * pSics,
|
|||||||
eError);
|
eError);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
if (argc >= 5) {
|
||||||
|
if (strcasecmp(argv[1], "invert") == 0) {
|
||||||
|
invertmatch = 1;
|
||||||
|
node++;
|
||||||
|
prop++;
|
||||||
|
propval++;
|
||||||
|
}
|
||||||
|
}
|
||||||
memset(buffer, 0, 1024);
|
memset(buffer, 0, 1024);
|
||||||
Arg2Text(argc - 3, &argv[3], buffer, 1023);
|
Arg2Text(argc - propval, &argv[propval], buffer, 1023);
|
||||||
root = GetHipadabaNode(GetHipadabaRoot(), argv[1]);
|
root = GetHipadabaNode(GetHipadabaRoot(), argv[node]);
|
||||||
if (root == NULL) {
|
if (root == NULL) {
|
||||||
SCWrite(pCon, "ERROR: start node for search not found", eError);
|
SCWrite(pCon, "ERROR: start node for search not found", eError);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
strtolower(argv[2]);
|
strtolower(argv[prop]);
|
||||||
strtolower(buffer);
|
strtolower(buffer);
|
||||||
foundNode = matchHdbProp(root, argv[2], buffer);
|
matchList = CreateDynString(128, 128);
|
||||||
|
foundNode =
|
||||||
if (foundNode == NULL) {
|
matchHdbProp(root, argv[prop], buffer, matchList, invertmatch);
|
||||||
SCWrite(pCon, "NONE", eValue);
|
SCWrite(pCon, GetCharArray(matchList), eValue);
|
||||||
} else {
|
DeleteDynString(matchList);
|
||||||
path = GetHipadabaPath(foundNode);
|
|
||||||
SCWrite(pCon, path, eValue);
|
|
||||||
free(path);
|
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3486,7 +3777,9 @@ int InstallSICSHipadaba(SConnection * pCon, SicsInterp * pSics,
|
|||||||
{
|
{
|
||||||
|
|
||||||
root = MakeHipadabaNode("/", HIPNONE, 0);
|
root = MakeHipadabaNode("/", HIPNONE, 0);
|
||||||
|
AddCommand(pSics, "hmake", MakeHdbNode, NULL, NULL);
|
||||||
AddCommand(pSics, "hfactory", HdbNodeFactory, NULL, NULL);
|
AddCommand(pSics, "hfactory", HdbNodeFactory, NULL, NULL);
|
||||||
|
AddCommand(pSics, "hmakescript", MakeHdbScriptNode, NULL, NULL);
|
||||||
AddCommand(pSics, "hattach", SICSHdbAdapter, NULL, NULL);
|
AddCommand(pSics, "hattach", SICSHdbAdapter, NULL, NULL);
|
||||||
AddCommand(pSics, "hsubsamplehm", HdbSubSample, NULL, NULL);
|
AddCommand(pSics, "hsubsamplehm", HdbSubSample, NULL, NULL);
|
||||||
AddCommand(pSics, "hdel", DeleteHdbNode, NULL, NULL);
|
AddCommand(pSics, "hdel", DeleteHdbNode, NULL, NULL);
|
||||||
@ -3498,16 +3791,20 @@ int InstallSICSHipadaba(SConnection * pCon, SicsInterp * pSics,
|
|||||||
AddCommand(pSics, "hlist", ListHdbNode, NULL, NULL);
|
AddCommand(pSics, "hlist", ListHdbNode, NULL, NULL);
|
||||||
AddCommand(pSics, "hnotify", AutoNotifyHdbNode, NULL, NULL);
|
AddCommand(pSics, "hnotify", AutoNotifyHdbNode, NULL, NULL);
|
||||||
AddCommand(pSics, "hdelcb", RemoveHdbCallback, NULL, NULL);
|
AddCommand(pSics, "hdelcb", RemoveHdbCallback, NULL, NULL);
|
||||||
|
AddCommand(pSics, "hlink", LinkHdbNode, NULL, NULL);
|
||||||
AddCommand(pSics, "hinfo", HdbNodeInfo, NULL, NULL);
|
AddCommand(pSics, "hinfo", HdbNodeInfo, NULL, NULL);
|
||||||
AddCommand(pSics, "hval", HdbNodeVal, NULL, NULL);
|
AddCommand(pSics, "hval", HdbNodeVal, NULL, NULL);
|
||||||
AddCommand(pSics, "hchain", ChainHdbNode, NULL, NULL);
|
AddCommand(pSics, "hchain", ChainHdbNode, NULL, NULL);
|
||||||
|
AddCommand(pSics, "hcommand", SicsCommandNode, NULL, NULL);
|
||||||
AddCommand(pSics, "harray", HdbArrayNode, NULL, NULL);
|
AddCommand(pSics, "harray", HdbArrayNode, NULL, NULL);
|
||||||
AddCommand(pSics, "hsetprop", SetSICSHdbProperty, NULL, NULL);
|
AddCommand(pSics, "hsetprop", SetSICSHdbProperty, NULL, NULL);
|
||||||
AddCommand(pSics, "hdelprop", DelSICSHdbProperty, NULL, NULL);
|
AddCommand(pSics, "hdelprop", DelSICSHdbProperty, NULL, NULL);
|
||||||
AddCommand(pSics, "hgetprop", GetSICSHdbProperty, NULL, NULL);
|
AddCommand(pSics, "hgetprop", GetSICSHdbProperty, NULL, NULL);
|
||||||
AddCommand(pSics, "hgetpropval", GetSICSHdbPropertyVal, NULL, NULL);
|
AddCommand(pSics, "hgetpropval", GetSICSHdbPropertyVal, NULL, NULL);
|
||||||
AddCommand(pSics, "hmatchprop", MatchHdbProperty, NULL, NULL);
|
AddCommand(pSics, "hmatchprop", MatchHdbProperty, NULL, NULL);
|
||||||
|
AddCommand(pSics, "hpropexists", HasSICSHdbProperty, NULL, NULL);
|
||||||
AddCommand(pSics, "hlistprop", ListSICSHdbProperty, NULL, NULL);
|
AddCommand(pSics, "hlistprop", ListSICSHdbProperty, NULL, NULL);
|
||||||
|
AddCommand(pSics, "hfindprop", ANSTO_ListSICSHdbProperty, NULL, NULL);
|
||||||
|
|
||||||
InstallSICSPoll(pCon, pSics, pData, argc, argv);
|
InstallSICSPoll(pCon, pSics, pData, argc, argv);
|
||||||
poller = (pSicsPoll) FindCommandData(pSics, "sicspoll", "SicsPoll");
|
poller = (pSicsPoll) FindCommandData(pSics, "sicspoll", "SicsPoll");
|
||||||
|
Reference in New Issue
Block a user