X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=ced73a837cff9f80921172c23e6eefa2419bda85;hp=562152961c32009cb61133db36eeb424b1c0e160;hb=17c100ba4bca1cf8475905b6eeb502e581489c5c;hpb=2e95647b2bd7e2fb71e052441638742e89b6aaf1 diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 56215296..ced73a83 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -133,15 +133,25 @@ static char *getUserLevelDir(char *level_subdir) static char *getScoreDir(char *level_subdir) { static char *score_dir = NULL; - char *data_dir = getCommonDataDir(); + static char *score_level_dir = NULL; char *score_subdir = SCORES_DIRECTORY; - checked_free(score_dir); + if (score_dir == NULL) + { + if (program.global_scores) + score_dir = getPath2(getCommonDataDir(), score_subdir); + else + score_dir = getPath2(getUserGameDataDir(), score_subdir); + } if (level_subdir != NULL) - score_dir = getPath3(data_dir, score_subdir, level_subdir); - else - score_dir = getPath2(data_dir, score_subdir); + { + checked_free(score_level_dir); + + score_level_dir = getPath2(score_dir, level_subdir); + + return score_level_dir; + } return score_dir; } @@ -393,6 +403,29 @@ inline static char *getLevelArtworkDir(int type) return LEVELDIR_ARTWORK_PATH(leveldir_current, type); } +char *getProgramConfigFilename(char *command_filename_ptr) +{ + char *command_filename_1 = getStringCopy(command_filename_ptr); + + // strip trailing executable suffix from command filename + if (strSuffix(command_filename_1, ".exe")) + command_filename_1[strlen(command_filename_1) - 4] = '\0'; + + char *command_basepath = getBasePath(command_filename_ptr); + char *command_basename = getBaseNameNoSuffix(command_filename_ptr); + char *command_filename_2 = getPath2(command_basepath, command_basename); + + char *config_filename_1 = getStringCat2(command_filename_1, ".conf"); + char *config_filename_2 = getStringCat2(command_filename_2, ".conf"); + + // 1st try: look for config file that exactly matches the binary filename + if (fileExists(config_filename_1)) + return config_filename_1; + + // 2nd try: return config filename that matches binary filename without suffix + return config_filename_2; +} + char *getTapeFilename(int nr) { static char *filename = NULL; @@ -456,6 +489,11 @@ char *getSetupFilename() return filename; } +char *getDefaultSetupFilename() +{ + return program.config_filename; +} + char *getEditorSetupFilename() { static char *filename = NULL; @@ -659,18 +697,20 @@ char *getCustomImageFilename(char *basename) if (fileExists(filename)) return filename; -#if defined(CREATE_SPECIAL_EDITION) - free(filename); + if (!strEqual(GFX_FALLBACK_FILENAME, UNDEFINED_FILENAME)) + { + free(filename); - if (options.debug) - Error(ERR_WARN, "cannot find artwork file '%s' (using fallback)", basename); + if (options.debug) + Error(ERR_WARN, "cannot find artwork file '%s' (using fallback)", + basename); - /* 6th try: look for fallback artwork in old default artwork directory */ - /* (needed to prevent errors when trying to access unused artwork files) */ - filename = getImg2(options.graphics_directory, GFX_FALLBACK_FILENAME); - if (fileExists(filename)) - return filename; -#endif + /* 6th try: look for fallback artwork in old default artwork directory */ + /* (needed to prevent errors when trying to access unused artwork files) */ + filename = getImg2(options.graphics_directory, GFX_FALLBACK_FILENAME); + if (fileExists(filename)) + return filename; + } return NULL; /* cannot find specified artwork file anywhere */ } @@ -730,18 +770,20 @@ char *getCustomSoundFilename(char *basename) if (fileExists(filename)) return filename; -#if defined(CREATE_SPECIAL_EDITION) - free(filename); + if (!strEqual(SND_FALLBACK_FILENAME, UNDEFINED_FILENAME)) + { + free(filename); - if (options.debug) - Error(ERR_WARN, "cannot find artwork file '%s' (using fallback)", basename); + if (options.debug) + Error(ERR_WARN, "cannot find artwork file '%s' (using fallback)", + basename); - /* 6th try: look for fallback artwork in old default artwork directory */ - /* (needed to prevent errors when trying to access unused artwork files) */ - filename = getPath2(options.sounds_directory, SND_FALLBACK_FILENAME); - if (fileExists(filename)) - return filename; -#endif + /* 6th try: look for fallback artwork in old default artwork directory */ + /* (needed to prevent errors when trying to access unused artwork files) */ + filename = getPath2(options.sounds_directory, SND_FALLBACK_FILENAME); + if (fileExists(filename)) + return filename; + } return NULL; /* cannot find specified artwork file anywhere */ } @@ -801,18 +843,20 @@ char *getCustomMusicFilename(char *basename) if (fileExists(filename)) return filename; -#if defined(CREATE_SPECIAL_EDITION) - free(filename); + if (!strEqual(MUS_FALLBACK_FILENAME, UNDEFINED_FILENAME)) + { + free(filename); - if (options.debug) - Error(ERR_WARN, "cannot find artwork file '%s' (using fallback)", basename); + if (options.debug) + Error(ERR_WARN, "cannot find artwork file '%s' (using fallback)", + basename); - /* 6th try: look for fallback artwork in old default artwork directory */ - /* (needed to prevent errors when trying to access unused artwork files) */ - filename = getPath2(options.music_directory, MUS_FALLBACK_FILENAME); - if (fileExists(filename)) - return filename; -#endif + /* 6th try: look for fallback artwork in old default artwork directory */ + /* (needed to prevent errors when trying to access unused artwork files) */ + filename = getPath2(options.music_directory, MUS_FALLBACK_FILENAME); + if (fileExists(filename)) + return filename; + } return NULL; /* cannot find specified artwork file anywhere */ } @@ -910,9 +954,15 @@ void InitTapeDirectory(char *level_subdir) void InitScoreDirectory(char *level_subdir) { - createDirectory(getCommonDataDir(), "common data", PERMS_PUBLIC); - createDirectory(getScoreDir(NULL), "main score", PERMS_PUBLIC); - createDirectory(getScoreDir(level_subdir), "level score", PERMS_PUBLIC); + int permissions = (program.global_scores ? PERMS_PUBLIC : PERMS_PRIVATE); + + if (program.global_scores) + createDirectory(getCommonDataDir(), "common data", permissions); + else + createDirectory(getUserGameDataDir(), "user data", permissions); + + createDirectory(getScoreDir(NULL), "main score", permissions); + createDirectory(getScoreDir(level_subdir), "level score", permissions); } static void SaveUserLevelInfo(); @@ -1262,14 +1312,17 @@ void sortTreeInfo(TreeInfo **node_first) #define MODE_X_ALL (S_IXUSR | S_IXGRP | S_IXOTH) #define MODE_W_PRIVATE (S_IWUSR) -#define MODE_W_PUBLIC (S_IWUSR | S_IWGRP) +#define MODE_W_PUBLIC_FILE (S_IWUSR | S_IWGRP) #define MODE_W_PUBLIC_DIR (S_IWUSR | S_IWGRP | S_ISGID) #define DIR_PERMS_PRIVATE (MODE_R_ALL | MODE_X_ALL | MODE_W_PRIVATE) #define DIR_PERMS_PUBLIC (MODE_R_ALL | MODE_X_ALL | MODE_W_PUBLIC_DIR) +#define DIR_PERMS_PUBLIC_ALL (MODE_R_ALL | MODE_X_ALL | MODE_W_ALL) #define FILE_PERMS_PRIVATE (MODE_R_ALL | MODE_W_PRIVATE) -#define FILE_PERMS_PUBLIC (MODE_R_ALL | MODE_W_PUBLIC) +#define FILE_PERMS_PUBLIC (MODE_R_ALL | MODE_W_PUBLIC_FILE) +#define FILE_PERMS_PUBLIC_ALL (MODE_R_ALL | MODE_W_ALL) + char *getHomeDir() { @@ -1347,7 +1400,10 @@ char *getUserGameDataDir(void) #if defined(PLATFORM_ANDROID) if (user_game_data_dir == NULL) - user_game_data_dir = (char *)SDL_AndroidGetInternalStoragePath(); + user_game_data_dir = (char *)(SDL_AndroidGetExternalStorageState() & + SDL_ANDROID_EXTERNAL_STORAGE_WRITE ? + SDL_AndroidGetExternalStoragePath() : + SDL_AndroidGetInternalStoragePath()); #else if (user_game_data_dir == NULL) user_game_data_dir = getPath2(getPersonalDataDir(), @@ -1357,30 +1413,6 @@ char *getUserGameDataDir(void) return user_game_data_dir; } -void updateUserGameDataDir() -{ -#if defined(PLATFORM_MACOSX) - char *userdata_dir_old = getPath2(getHomeDir(), program.userdata_subdir_unix); - char *userdata_dir_new = getUserGameDataDir(); /* do not free() this */ - - /* convert old Unix style game data directory to Mac OS X style, if needed */ - if (directoryExists(userdata_dir_old) && !directoryExists(userdata_dir_new)) - { - if (rename(userdata_dir_old, userdata_dir_new) != 0) - { - Error(ERR_WARN, "cannot move game data directory '%s' to '%s'", - userdata_dir_old, userdata_dir_new); - - /* continue using Unix style data directory -- this should not happen */ - program.userdata_path = getPath2(getPersonalDataDir(), - program.userdata_subdir_unix); - } - } - - free(userdata_dir_old); -#endif -} - char *getSetupDir() { return getUserGameDataDir(); @@ -1415,6 +1447,9 @@ static boolean posix_process_running_setgid() void createDirectory(char *dir, char *text, int permission_class) { + if (directoryExists(dir)) + return; + /* leave "other" permissions in umask untouched, but ensure group parts of USERDATA_DIR_MODE are not masked */ mode_t dir_mode = (permission_class == PERMS_PRIVATE ? @@ -1423,18 +1458,20 @@ void createDirectory(char *dir, char *text, int permission_class) mode_t group_umask = ~(dir_mode & S_IRWXG); int running_setgid = posix_process_running_setgid(); - /* if we're setgid, protect files against "other" */ - /* else keep umask(0) to make the dir world-writable */ + if (permission_class == PERMS_PUBLIC) + { + /* if we're setgid, protect files against "other" */ + /* else keep umask(0) to make the dir world-writable */ - if (running_setgid) - posix_umask(last_umask & group_umask); - else - dir_mode |= MODE_W_ALL; + if (running_setgid) + posix_umask(last_umask & group_umask); + else + dir_mode = DIR_PERMS_PUBLIC_ALL; + } - if (!directoryExists(dir)) - if (posix_mkdir(dir, dir_mode) != 0) - Error(ERR_WARN, "cannot create %s directory '%s': %s", - text, dir, strerror(errno)); + if (posix_mkdir(dir, dir_mode) != 0) + Error(ERR_WARN, "cannot create %s directory '%s': %s", + text, dir, strerror(errno)); if (permission_class == PERMS_PUBLIC && !running_setgid) chmod(dir, dir_mode); @@ -1454,7 +1491,7 @@ void SetFilePermissions(char *filename, int permission_class) FILE_PERMS_PRIVATE : FILE_PERMS_PUBLIC); if (permission_class == PERMS_PUBLIC && !running_setgid) - perms |= MODE_W_ALL; + perms = FILE_PERMS_PUBLIC_ALL; chmod(filename, perms); } @@ -3626,12 +3663,13 @@ void LoadLevelSetup_LastSeries() /* always start with reliable default values */ leveldir_current = getFirstValidTreeInfoEntry(leveldir_first); -#if defined(CREATE_SPECIAL_EDITION_RND_JUE) - leveldir_current = getTreeInfoFromIdentifier(leveldir_first, - "jue_start"); - if (leveldir_current == NULL) - leveldir_current = getFirstValidTreeInfoEntry(leveldir_first); -#endif + if (!strEqual(DEFAULT_LEVELSET, UNDEFINED_LEVELSET)) + { + leveldir_current = getTreeInfoFromIdentifier(leveldir_first, + DEFAULT_LEVELSET); + if (leveldir_current == NULL) + leveldir_current = getFirstValidTreeInfoEntry(leveldir_first); + } if ((level_setup_hash = loadSetupFileHash(filename))) { @@ -3739,7 +3777,7 @@ void LoadLevelSetup_SeriesInfo() LevelStats_setSolved(i, 0); } - checkSeriesInfo(leveldir_current); + checkSeriesInfo(); /* ----------------------------------------------------------------------- */ /* ~/./levelsetup//levelsetup.conf */