CodeCompass
143 строки · 2.7 Кб
1#include <stdlib.h>2#include <assert.h>3
4#include "ldlogger-tool.h"5
6#define PROG_LIST_SEPARATOR ":"7
8extern char** environ;9
10/**
11* Reads a colon separated list from the given environment variable and tries
12* to match to the given program name. If one program matches (from the list)
13* to the given program name, then it will return a non zero value.
14*
15* On any error or mismatch the function returns 0.
16*
17* @param envVar_ the name of environment variable.
18* @param progName_ program name to match.
19* @return non zero on match, 0 otherwise
20*/
21static int matchToProgramList(22const char* envVar_,23const char* progName_)24{
25char* progList;26char* token;27const char* progListVar = getenv(envVar_);28if (!progListVar)29{30return 0;31}32
33progList = loggerStrDup(progListVar);34if (!progList)35{36return 0;37}38
39token = strtok(progList, PROG_LIST_SEPARATOR);40while (token)41{42if (strstr(progName_, token))43{44/* Match! */45free(progList);46return 1;47}48
49token = strtok(NULL, PROG_LIST_SEPARATOR);50}51
52free(progList);53return 0;54}
55
56/**
57* Disable / enable recursive logging.
58*/
59static void turnLogging(int on)60{
61int i;62for (i = 0; environ[i]; ++i)63{64if (strstr(environ[i], "LD_PRELOAD="))65{66environ[i][0] = on ? 'L' : 'X';67}68}69}
70
71LoggerFile* loggerFileInitFromPath(LoggerFile* file_, const char* path_)72{
73assert(file_ && "file_ must be not NULL!");74
75if (!loggerMakePathAbs(path_, file_->path, 0))76{77/* fallback to the given path */78strcpy(file_->path, path_);79}80
81return file_;82}
83
84LoggerAction* loggerActionNew(char const* toolName_)85{
86LoggerAction* act = (LoggerAction*) malloc(sizeof(LoggerAction));87if (!act)88{89return NULL;90}91
92loggerFileInitFromPath(&act->output, "./_noobj");93loggerVectorInit(&act->arguments);94loggerVectorInit(&act->sources);95strcpy(act->toolName, toolName_);96
97return act;98}
99
100void loggerActionFree(LoggerAction* act_)101{
102if (!act_)103{104return;105}106
107loggerVectorClear(&act_->arguments);108loggerVectorClear(&act_->sources);109free(act_);110}
111
112int loggerCollectActionsByProgName(113const char* prog_,114const char* const argv_[],115LoggerVector* actions_)116{
117const char* toolName = strrchr(prog_, '/');118if (toolName)119{120/* It was a path -> now its a program name */121++toolName;122}123else124{125/* Its a program name */126toolName = prog_;127}128
129if (matchToProgramList("CC_LOGGER_GCC_LIKE", toolName))130{131int ret;132turnLogging(0);133ret = loggerGccParserCollectActions(prog_, toolName, argv_, actions_);134turnLogging(1);135return ret;136}137else if (matchToProgramList("CC_LOGGER_JAVAC_LIKE", toolName))138{139return loggerJavacParserCollectActions(prog_, toolName, argv_, actions_);140}141
142return 0;143}
144