Projekt

Allgemein

Profil

Herunterladen (5,23 KB) Statistiken
| Zweig: | Markierung: | Revision:
/***************************************************************************
begin : Mon Feb 08 2021
copyright : (C) 2021 by Martin Preuss
email : martin@libchipcard.de

***************************************************************************
* Please see toplevel file COPYING for license details *
***************************************************************************/

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif


#include "gwenbuild/parser/p_checkheaders.h"
#include "gwenbuild/parser/parser.h"

#include <gwenhywfar/debug.h>
#include <gwenhywfar/directory.h>



static int _parseChildNodes(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode);
static int _parseProg(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode);
static int _determineProgPath(GWEN_DB_NODE *db, const char *sCmd, const char *sId,
const GWEN_STRINGLIST *slAltNames, const GWEN_STRINGLIST *slPaths);
static int _determineNamePath(GWEN_DB_NODE *db, const char *sCmd, const char *sId, const GWEN_STRINGLIST *slPaths);






int GWB_ParseCheckProgs(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
{
int rv;

rv=_parseChildNodes(project, currentContext, xmlNode);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
return rv;
}

return 0;
}



int _parseChildNodes(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
{
GWEN_XMLNODE *n;

n=GWEN_XMLNode_GetFirstTag(xmlNode);
while (n) {
const char *name;

name=GWEN_XMLNode_GetData(n);
if (name && *name) {
int rv;

DBG_DEBUG(NULL, "Handling element \"%s\"", name);

if (strcasecmp(name, "prog")==0)
rv=_parseProg(project, currentContext, n);
else {
DBG_INFO(NULL, "Element not handled");
rv=0;
}
if (rv<0) {
DBG_ERROR(GWEN_LOGDOMAIN, "Error in element \"%s\", aborting", name);
return rv;
}
}

n=GWEN_XMLNode_GetNextTag(n);
}

return 0;
}



int _parseProg(GWEN_UNUSED GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
{
int rv;
const char *sCmd;
const char *sId;
GWEN_XMLNODE *n;
GWEN_DB_NODE *db;
GWEN_STRINGLIST *slAltNames=NULL;
GWEN_STRINGLIST *slPaths=NULL;


db=GWB_Context_GetVars(currentContext);

rv=GWEN_XMLNode_ExpandProperties(xmlNode, db);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
return rv;
}

sCmd=GWEN_XMLNode_GetProperty(xmlNode, "cmd", NULL);
if (!(sCmd && *sCmd)) {
DBG_ERROR(NULL, "No cmd in <prog>");
return GWEN_ERROR_GENERIC;
}

sId=GWEN_XMLNode_GetProperty(xmlNode, "id", NULL);
if (!(sId && *sId)) {
DBG_ERROR(NULL, "No id in <prog>");
return GWEN_ERROR_GENERIC;
}

n=GWEN_XMLNode_FindFirstTag(xmlNode, "alternativeNames", NULL, NULL);
if (n)
slAltNames=GWB_Parser_ReadXmlDataIntoStringList(GWB_Context_GetVars(currentContext), n);

n=GWEN_XMLNode_FindFirstTag(xmlNode, "paths", NULL, NULL);
if (n)
slPaths=GWB_Parser_ReadXmlDataIntoStringList(GWB_Context_GetVars(currentContext), n);
else {
slPaths=GWBUILD_GetPathFromEnvironment();
if (slPaths==NULL)
slPaths=GWEN_StringList_fromString("/usr/local/bin:/usr/bin:/bin", ": ", 0);
}

rv=_determineProgPath(GWB_Context_GetVars(currentContext), sCmd, sId, slAltNames, slPaths);
if (rv==1) {
GWB_Parser_SetItemValue(db, sId, "_EXISTS", "TRUE");
fprintf(stdout, " prog %s: found\n", sCmd);
}
else {
GWB_Parser_SetItemValue(GWB_Context_GetVars(currentContext), sId, "_EXISTS", "FALSE");
fprintf(stdout, " prog %s: not found\n", sCmd);
}
return 0;
}



/* Result <0: ERROR, ==0: Not found, >0; Found */
int _determineProgPath(GWEN_DB_NODE *db, const char *sCmd, const char *sId,
const GWEN_STRINGLIST *slAltNames, const GWEN_STRINGLIST *slPaths)
{
int rv;

rv=_determineNamePath(db, sCmd, sId, slPaths);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
return rv;
}
else if (rv==1) {
DBG_DEBUG(NULL, "Found path for prog \"%s\"", sCmd);
return 1;
}
else {
if (slAltNames) {
const GWEN_STRINGLISTENTRY *se;
se=GWEN_StringList_FirstEntry(slAltNames);
while(se) {
const char *s;
s=GWEN_StringListEntry_Data(se);
if (s && *s) {
rv=_determineNamePath(db, sCmd, sId, slPaths);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
return rv;
}
else if (rv>0) {
DBG_DEBUG(NULL, "Found path for prog \"%s\"", sCmd);
return 1;
}
}
se=GWEN_StringListEntry_Next(se);
}
}
}

return 0;
}



/* Result <0: ERROR, ==0: Not found, >0; Found */
int _determineNamePath(GWEN_DB_NODE *db, const char *sCmd, const char *sId, const GWEN_STRINGLIST *slPaths)
{
GWEN_BUFFER *dbuf;
int rv;

dbuf=GWEN_Buffer_new(0, 256, 0, 1);
rv=GWEN_Directory_FindFileInPaths(slPaths, sCmd, dbuf);
if (rv<0) {
if (rv==GWEN_ERROR_NOT_FOUND) {
DBG_DEBUG(NULL, "Command \"%s\" not found", sCmd);
GWEN_Buffer_free(dbuf);
return 0;
}
else {
DBG_DEBUG(NULL, "ERROR on GWEN_Directory_FindFileInPaths(\"%s\"): %d", sCmd, rv);
GWEN_Buffer_free(dbuf);
return rv;
}
}

GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, sId, GWEN_Buffer_GetStart(dbuf));
GWEN_Buffer_free(dbuf);
return 1;
}






(10-10/21)