void AddPath(const char *pPath) { if(m_NumPaths >= MAX_PATHS || !pPath[0]) return; if(!str_comp(pPath, "$USERDIR")) { if(m_aUserdir[0]) { str_copy(m_aaStoragePaths[m_NumPaths++], m_aUserdir, MAX_PATH_LENGTH); dbg_msg("storage", "added path '$USERDIR' ('%s')", m_aUserdir); } } else if(!str_comp(pPath, "$DATADIR")) { if(m_aDatadir[0]) { str_copy(m_aaStoragePaths[m_NumPaths++], m_aDatadir, MAX_PATH_LENGTH); dbg_msg("storage", "added path '$DATADIR' ('%s')", m_aDatadir); } } else if(!str_comp(pPath, "$CURRENTDIR")) { m_aaStoragePaths[m_NumPaths++][0] = 0; dbg_msg("storage", "added path '$CURRENTDIR' ('%s')", m_aCurrentdir); } else { if(fs_is_dir(pPath)) { str_copy(m_aaStoragePaths[m_NumPaths++], pPath, MAX_PATH_LENGTH); dbg_msg("storage", "added path '%s'", pPath); } } }
int main(int argc, const char *argv[]) { int RetVal; dbg_logger_stdout(); #if defined(CONF_FAMILY_UNIX) signal(SIGINT, ExitFunc); signal(SIGTERM, ExitFunc); signal(SIGQUIT, ExitFunc); signal(SIGHUP, ReloadFunc); #endif char aUsage[128]; CConfig Config; str_format(aUsage, sizeof(aUsage), "%s [options]", argv[0]); const char *pConfigFile = 0; const char *pWebDir = 0; const char *pBindAddr = 0; struct argparse_option aOptions[] = { OPT_HELP(), OPT_BOOLEAN('v', "verbose", &Config.m_Verbose, "Verbose output", 0), OPT_STRING('c', "config", &pConfigFile, "Config file to use", 0), OPT_STRING('d', "web-dir", &pWebDir, "Location of the web directory", 0), OPT_STRING('b', "bind", &pBindAddr, "Bind to address", 0), OPT_INTEGER('p', "port", &Config.m_Port, "Listen on port", 0), OPT_END(), }; struct argparse Argparse; argparse_init(&Argparse, aOptions, aUsage, 0); argc = argparse_parse(&Argparse, argc, argv); if(pConfigFile) str_copy(Config.m_aConfigFile, pConfigFile, sizeof(Config.m_aConfigFile)); if(pWebDir) str_copy(Config.m_aWebDir, pWebDir, sizeof(Config.m_aWebDir)); if(pBindAddr) str_copy(Config.m_aBindAddr, pBindAddr, sizeof(Config.m_aBindAddr)); if(Config.m_aWebDir[strlen(Config.m_aWebDir)-1] != '/') str_append(Config.m_aWebDir, "/", sizeof(Config.m_aWebDir)); if(!fs_is_dir(Config.m_aWebDir)) { dbg_msg("main", "ERROR: Can't find web directory: %s", Config.m_aWebDir); return 1; } char aTmp[1024]; str_format(aTmp, sizeof(aTmp), "%s%s", Config.m_aWebDir, Config.m_aJSONFile); str_copy(Config.m_aJSONFile, aTmp, sizeof(Config.m_aJSONFile)); CMain Main(Config); RetVal = Main.Run(); return RetVal; }
void FindDatadir(const char *pArgv0) { // 1) use data-dir in PWD if present if(fs_is_dir("data/mapres")) { str_copy(m_aDatadir, "data", sizeof(m_aDatadir)); str_copy(m_aBinarydir, "", sizeof(m_aBinarydir)); return; } #if defined(DATA_DIR) // 2) use compiled-in data-dir if present if(fs_is_dir(DATA_DIR "/mapres")) { str_copy(m_aDatadir, DATA_DIR, sizeof(m_aDatadir)); #if defined(BINARY_DIR) str_copy(m_aBinarydir, BINARY_DIR, sizeof(m_aBinarydir)); #else str_copy(m_aBinarydir, DATA_DIR "/..", sizeof(m_aBinarydir)); #endif return; } #endif // 3) check for usable path in argv[0] { unsigned int Pos = ~0U; for(unsigned i = 0; pArgv0[i]; i++) if(pArgv0[i] == '/' || pArgv0[i] == '\\') Pos = i; if(Pos < MAX_PATH_LENGTH) { char aBuf[MAX_PATH_LENGTH]; str_copy(m_aBinarydir, pArgv0, Pos+1); str_format(aBuf, sizeof(aBuf), "%s/data/mapres", m_aBinarydir); if(fs_is_dir(aBuf)) { str_format(m_aDatadir, sizeof(m_aDatadir), "%s/data", m_aBinarydir); return; } else m_aBinarydir[0] = 0; } } #if defined(CONF_FAMILY_UNIX) // 4) check for all default locations { const char *aDirs[] = { "/usr/share/ddnet", "/usr/share/games/ddnet", "/usr/local/share/ddnet", "/usr/local/share/games/ddnet", "/usr/pkg/share/ddnet", "/usr/pkg/share/games/ddnet", "/opt/ddnet" }; const int DirsCount = sizeof(aDirs) / sizeof(aDirs[0]); int i; for (i = 0; i < DirsCount; i++) { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "%s/data/mapres", aDirs[i]); if(fs_is_dir(aBuf)) { str_copy(m_aBinarydir, aDirs[i], sizeof(m_aDatadir)); str_format(m_aDatadir, sizeof(m_aDatadir), "%s/data", aDirs[i]); return; } } } #endif // no data-dir found dbg_msg("storage", "warning no data directory found"); }
int FindDatadir(const char *pArgv0) { // 1) use provided data-dir override if(m_aDatadir[0]) { if(fs_is_dir(m_aDatadir)) return 0; else { dbg_msg("engine/datadir", "specified data-dir '%s' does not exist", m_aDatadir); return -1; } } // 2) use data-dir in PWD if present if(fs_is_dir("data/mapres")) { str_copy(m_aDatadir, "data", sizeof(m_aDatadir)); return 0; } // 3) use compiled-in data-dir if present if (fs_is_dir(DATA_DIR "/mapres")) { str_copy(m_aDatadir, DATA_DIR, sizeof(m_aDatadir)); return 0; } // 4) check for usable path in argv[0] { unsigned int Pos = ~0U; for(unsigned i = 0; pArgv0[i]; i++) if(pArgv0[i] == '/') Pos = i; if (Pos < sizeof(m_aDatadir)) { char aBaseDir[sizeof(m_aDatadir)]; str_copy(aBaseDir, pArgv0, Pos); aBaseDir[Pos] = '\0'; str_format(m_aDatadir, sizeof(m_aDatadir), "%s/data", aBaseDir); if (fs_is_dir(m_aDatadir)) return 0; } } #if defined(CONF_FAMILY_UNIX) // 5) check for all default locations { const char *aDirs[] = { "/usr/share/teeworlds/data", "/usr/share/games/teeworlds/data", "/usr/local/share/teeworlds/data", "/usr/local/share/games/teeworlds/data", "/opt/teeworlds/data" }; const int DirsCount = sizeof(aDirs) / sizeof(aDirs[0]); int i; for (i = 0; i < DirsCount; i++) { if (fs_is_dir(aDirs[i])) { str_copy(m_aDatadir, aDirs[i], sizeof(m_aDatadir)); return 0; } } } #endif // no data-dir found dbg_msg("engine/datadir", "warning no data directory found"); return -1; }
static int engine_find_datadir(char *argv0) { /* 1) use provided data-dir override */ if(datadir[0]) { if(fs_is_dir(datadir)) return 0; else { dbg_msg("engine/datadir", "specified data-dir '%s' does not exist", datadir); return -1; } } /* 2) use data-dir in PWD if present */ if(fs_is_dir("data")) { strcpy(datadir, "data"); return 0; } /* 3) use compiled-in data-dir if present */ if (fs_is_dir(DATA_DIR)) { strcpy(datadir, DATA_DIR); return 0; } /* 4) check for usable path in argv[0] */ { unsigned int pos = strrchr(argv0, '/') - argv0; if (pos < sizeof(datadir)) { char basedir[sizeof(datadir)]; strncpy(basedir, argv0, pos); basedir[pos] = '\0'; str_format(datadir, sizeof(datadir), "%s/data", basedir); if (fs_is_dir(datadir)) return 0; } } #if defined(CONF_FAMILY_UNIX) /* 5) check for all default locations */ { const char *sdirs[] = { "/usr/share/teeworlds", "/usr/local/share/teeworlds" "/opt/teeworlds" }; const int sdirs_count = sizeof(sdirs) / sizeof(sdirs[0]); int i; for (i = 0; i < sdirs_count; i++) { if (fs_is_dir(sdirs[i])) { strcpy(datadir, sdirs[i]); return 0; } } } #endif /* no data-dir found */ dbg_msg("engine/datadir", "warning no data directory found"); return -1; }