source: nanoscale/trunk/configparser.c

Last change on this file was 6573, checked in by ldelgass, 8 years ago

Disable trace logging by default

  • Property svn:eol-style set to native
File size: 6.4 KB
Line 
1/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2/* ======================================================================
3 *  Copyright (c) 2016  HUBzero Foundation, LLC
4 * ----------------------------------------------------------------------
5 *  See the file "license.terms" for information on usage and
6 *  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
7 * ======================================================================
8 */
9#include <stdio.h>
10#include <stdlib.h>
11#include <string.h>
12
13#include "server.h"
14static char argBuf[4096];
15
16static int
17ParseSwitches(RenderServer *serverPtr)
18{
19    while (1) {
20        const char *flag;
21        const char *token;
22        char c;
23
24        flag = strtok(NULL, " ");
25        if (flag == NULL || flag[0] != '-') {
26            TRACE("End parsing switches");
27            break;
28        }
29        TRACE("switch: \"%s\"", flag);
30        c = flag[1];
31        if ((c == 'i') && (strcmp(flag, "-input") == 0)) {
32            int f;
33
34            token = strtok(NULL, " ");
35            if (token == NULL || sscanf(token, "%d", &f) != 1) {
36                ERROR("Bad -input value");
37                return FALSE;
38            }
39            TRACE("%s: %d", flag, f);
40            serverPtr->inputFd = f;
41        } else if ((c == 'o') && (strcmp(flag, "-output") == 0)) {
42            int f;
43
44            token = strtok(NULL, " ");
45            if (token == NULL || sscanf(token, "%d", &f) != 1) {
46                ERROR("Bad -output value");
47                return FALSE;
48            }
49            TRACE("%s: %d", flag, f);
50            serverPtr->outputFd = f;
51        } else if ((c == 'l') && (strcmp(flag, "-logstdout") == 0)) {
52            int state;
53
54            token = strtok(NULL, " ");
55            if (token == NULL || sscanf(token, "%d", &state) != 1) {
56                ERROR("Bad -logstdout value");
57                return FALSE;
58            }
59            TRACE("%s: %d", flag, state);
60            serverPtr->logStdout = state;
61        } else if ((c == 'l') && (strcmp(flag, "-logstderr") == 0)) {
62            int state;
63
64            token = strtok(NULL, " ");
65            if (token == NULL || sscanf(token, "%d", &state) != 1) {
66                ERROR("Bad -logstderr value");
67                return FALSE;
68            }
69            TRACE("%s: %d", flag, state);
70            serverPtr->logStderr = state;
71        } else if ((c == 'c') && (strcmp(flag, "-combinelogs") == 0)) {
72            int state;
73
74            token = strtok(NULL, " ");
75            if (token == NULL || sscanf(token, "%d", &state) != 1) {
76                ERROR("Bad -combinelogs value");
77                return FALSE;
78            }
79            TRACE("%s: %d", flag, state);
80            serverPtr->combineLogs = state;
81        } else {
82            ERROR("unknown switch \"%s\"", flag);
83            return FALSE;
84        }
85    }
86
87    return TRUE;
88}
89
90char *MergeArgs(int numCmdArgs, char *const *cmdArgs)
91{
92    int i;
93    int pos = 0;
94    memset(argBuf, 0, sizeof(argBuf));
95    for (i = 0; i < numCmdArgs; i++) {
96        strcpy(argBuf + pos, cmdArgs[i]);
97        pos += strlen(cmdArgs[i]) + 1;
98        if (i < numCmdArgs - 1) {
99            argBuf[pos-1] = ' ';
100        }
101    }
102    return argBuf;
103}
104
105void FreeArgs(char *cmd)
106{
107    memset(argBuf, 0, sizeof(argBuf));
108    return;
109}
110
111int
112ParseServersFile(const char *fileName, int *numServers, RenderServer **serverTable)
113{
114    char line[4096];
115    char *token;
116    FILE *filep;
117    int ret;
118    RenderServer *entry;
119
120    filep = fopen(fileName, "r");
121    if (filep == NULL)
122        return FALSE;
123
124    entry = NULL;
125    while (fgets(line, sizeof(line), filep) != NULL) {
126        if (line[0] == '#' || line[0] == '\n')
127            continue;
128        TRACE("line: \"%s\"\n", line);
129        token = strtok(line, " ");
130        if (strncmp(token, "server", 6) == 0) {
131            char name[256];
132            int port;
133
134            token = strtok(NULL, " ");
135            ret = sscanf(token, "%s", name);
136            if (ret != 1) {
137                ERROR("Bad server line: \"%s\"", line);
138                fclose(filep);
139                return FALSE;
140            }
141            token = strtok(NULL, " ");
142            ret = sscanf(token, "%d", &port);
143            if (ret != 1) {
144                ERROR("Bad server line: \"%s\"", line);
145                fclose(filep);
146                return FALSE;
147            }
148            name[sizeof(name)-1] = '\0';
149            if (*numServers+1 >= MAX_SERVERS) {
150                ERROR("Too many servers in configuration");
151                fclose(filep);
152                return FALSE;
153            }
154            (*numServers)++;
155            entry = NewServer(name);
156            serverTable[*numServers-1] = entry;
157            entry->port = port;
158            INFO("Registering server: \"%s\" on port %d", name, port);
159            if (!ParseSwitches(entry)) {
160                ERROR("Failed to parse switches");
161                fclose(filep);
162                return FALSE;
163            }
164        } else if (entry != NULL && strncmp(token, "cmd", 3) == 0) {
165            char *cmdArg;
166
167             while ((cmdArg = strtok(NULL, " \n")) != NULL) {
168                TRACE("Arg %d: \"%s\"", entry->numCmdArgs, cmdArg);
169                entry->numCmdArgs++;
170                entry->cmdArgs = (char *const *)realloc((char **)entry->cmdArgs, sizeof(char *)*(entry->numCmdArgs+1));
171                ((char **)(entry->cmdArgs))[entry->numCmdArgs-1] = strdup(cmdArg);
172                ((char **)(entry->cmdArgs))[entry->numCmdArgs] = NULL;
173            }
174        } else if (entry != NULL && strncmp(token, "env", 3) == 0) {
175            char *varName;
176
177            while ((varName = strtok(NULL, " \n")) != NULL) {
178                entry->numEnvArgs += 2;
179                entry->envArgs = (char *const *)realloc((char **)entry->envArgs, sizeof(char *)*(entry->numEnvArgs));
180                ((char **)(entry->envArgs))[entry->numEnvArgs-2] = strdup(varName);
181                ((char **)(entry->envArgs))[entry->numEnvArgs-1] = NULL;
182                char *value = strtok(NULL, " \n");
183                if (value == NULL) {
184                    ERROR("Missing value for env var \"%s\"", varName);
185                    return FALSE;
186                }
187                TRACE("Env %s=\"%s\"", varName, value);
188                ((char **)(entry->envArgs))[entry->numEnvArgs-1] = strdup(value);
189            }
190        } else {
191            ERROR("Unknown entry: \"%s\"", line);
192            fclose(filep);
193            return FALSE;
194        }
195    }
196    fclose(filep);
197    return TRUE;
198}
Note: See TracBrowser for help on using the repository browser.