static MetisContentStoreInterface * _createLRUContentStore(size_t capacity) { PARCLogReporter *reporter = parcLogReporterTextStdout_Create(); MetisLogger *logger = metisLogger_Create(reporter, parcClock_Wallclock()); parcLogReporter_Release(&reporter); metisLogger_SetLogLevel(logger, MetisLoggerFacility_Processor, PARCLogLevel_Debug); MetisContentStoreConfig config = { .objectCapacity = capacity, }; MetisContentStoreInterface *store = metisLRUContentStore_Create(&config, logger); metisLogger_Release(&logger); return store; }
int main(int argc, const char *argv[]) { header(); uint16_t port = PORT_NUMBER; uint16_t configurationPort = 2001; bool daemon = false; int capacity = -1; const char *configFileName = NULL; char *logfile = NULL; if (argc == 2 && strcasecmp(argv[1], "-h") == 0) { _usage(EXIT_SUCCESS); } int logLevelArray[MetisLoggerFacility_END]; for (int i = 0; i < MetisLoggerFacility_END; i++) { logLevelArray[i] = -1; } for (int i = 0; i < argc; i++) { if (argv[i][0] == '-') { if (strcmp(argv[i], "--config") == 0) { configFileName = argv[i + 1]; i++; } else if (strcmp(argv[i], "--port") == 0) { port = atoi(argv[i + 1]); i++; } else if (strcmp(argv[i], "--daemon") == 0) { daemon = true; } else if (strcmp(argv[i], "--capacity") == 0 || strcmp(argv[i], "-c") == 0) { capacity = atoi(argv[i + 1]); i++; } else if (strcmp(argv[i], "--log") == 0) { _setLogLevel(logLevelArray, argv[i + 1]); i++; } else if (strcmp(argv[i], "--log-file") == 0) { if (logfile) { // error cannot repeat fprintf(stderr, "Cannot specify --log-file more than once\n"); _usage(EXIT_FAILURE); } logfile = parcMemory_StringDuplicate(argv[i + 1], strlen(argv[i + 1])); i++; } else { _usage(EXIT_FAILURE); } } } // set restrictive umask, in case we create any files umask(027); if (daemon && (logfile == NULL)) { fprintf(stderr, "Must specify a logfile when running in daemon mode\n"); _usage(EXIT_FAILURE); } if (daemon) { // inside this call, parent will EXIT_SUCCESS and child will continue _daemonize(); } MetisLogger *logger = NULL; if (logfile) { logger = _createLogfile(logfile); parcMemory_Deallocate((void **) &logfile); } else { PARCLogReporter *stdoutReporter = parcLogReporterTextStdout_Create(); logger = metisLogger_Create(stdoutReporter, parcClock_Wallclock()); parcLogReporter_Release(&stdoutReporter); } for (int i = 0; i < MetisLoggerFacility_END; i++) { if (logLevelArray[i] > -1) { metisLogger_SetLogLevel(logger, i, logLevelArray[i]); } } // this will update the clock to the tick clock MetisForwarder *metis = metisForwarder_Create(logger); MetisConfiguration *configuration = metisForwarder_GetConfiguration(metis); if (capacity > -1) { metisConfiguration_SetObjectStoreSize(configuration, capacity); } metisConfiguration_StartCLI(configuration, configurationPort); if (configFileName) { metisForwarder_SetupFromConfigFile(metis, configFileName); } else { // NULL to not setup AF_UNIX metisForwarder_SetupAllListeners(metis, port, NULL); } MetisDispatcher *dispatcher = metisForwarder_GetDispatcher(metis); metisLogger_Log(logger, MetisLoggerFacility_Core, PARCLogLevel_Alert, "daemon", "metis running port %d configuration-port %d", port, configurationPort); metisDispatcher_Run(dispatcher); metisLogger_Log(logger, MetisLoggerFacility_Core, PARCLogLevel_Alert, "daemon", "metis exiting port %d", port); metisForwarder_Destroy(&metis); sleep(2); metisLogger_Release(&logger); return 0; }