changed creating directories with private permissions only
[rocksndiamonds.git] / src / libgame / setup.c
index 464e91293967c9521a2fa1ca210f4a5889ee2558..1c3a5dc73ea3429abc4b7f16e84bf2fefe5a36ac 100644 (file)
@@ -85,7 +85,7 @@ static void WarnUsingFallback(char *filename)
   {
     setHashEntry(missing_file_hash, filename, "");
 
-    Warn("cannot find artwork file '%s' (using fallback)", filename);
+    Debug("setup", "cannot find artwork file '%s' (using fallback)", filename);
   }
 }
 
@@ -516,7 +516,7 @@ char *getProgramMainDataPath(char *command_filename, char *base_path)
      set the current working directory to the program package directory) */
   char *main_data_path = getBasePath(command_filename);
 
-#if defined(PLATFORM_MACOSX)
+#if defined(PLATFORM_MAC)
   if (strSuffix(main_data_path, MAC_APP_BINARY_SUBDIR))
   {
     char *main_data_path_old = main_data_path;
@@ -593,6 +593,34 @@ char *getProgramConfigFilename(char *command_filename)
   return config_filename_3;
 }
 
+static char *getPlatformConfigFilename(char *config_filename)
+{
+  static char *platform_config_filename = NULL;
+  static boolean initialized = FALSE;
+
+  if (!initialized)
+  {
+    char *config_basepath = getBasePath(config_filename);
+    char *config_basename = getBaseNameNoSuffix(config_filename);
+    char *config_filename_prefix = getPath2(config_basepath, config_basename);
+    char *platform_string_lower = getStringToLower(PLATFORM_STRING);
+    char *platform_suffix = getStringCat2("-", platform_string_lower);
+
+    platform_config_filename = getStringCat3(config_filename_prefix,
+                                            platform_suffix, ".conf");
+
+    checked_free(config_basepath);
+    checked_free(config_basename);
+    checked_free(config_filename_prefix);
+    checked_free(platform_string_lower);
+    checked_free(platform_suffix);
+
+    initialized = TRUE;
+  }
+
+  return platform_config_filename;
+}
+
 char *getTapeFilename(int nr)
 {
   static char *filename = NULL;
@@ -749,6 +777,11 @@ char *getDefaultSetupFilename(void)
   return program.config_filename;
 }
 
+char *getPlatformSetupFilename(void)
+{
+  return getPlatformConfigFilename(program.config_filename);
+}
+
 char *getEditorSetupFilename(void)
 {
   static char *filename = NULL;
@@ -939,7 +972,7 @@ char *getProgramInfoFilename(int nr)
   static char *filename = NULL;
 
   if (info_subdir == NULL)
-    info_subdir = getPath2(DOCS_DIRECTORY, INFO_DIRECTORY);
+    info_subdir = getPath2(DOCS_DIRECTORY, PROGRAM_INFO_DIRECTORY);
 
   checked_free(filename);
 
@@ -1293,9 +1326,9 @@ void InitTapeDirectory(char *level_subdir)
 {
   boolean new_tape_dir = !directoryExists(getTapeDir(level_subdir));
 
-  createDirectory(getUserGameDataDir(), "user data", PERMS_PRIVATE);
-  createDirectory(getTapeDir(NULL), "main tape", PERMS_PRIVATE);
-  createDirectory(getTapeDir(level_subdir), "level tape", PERMS_PRIVATE);
+  createDirectory(getUserGameDataDir(), "user data");
+  createDirectory(getTapeDir(NULL), "main tape");
+  createDirectory(getTapeDir(level_subdir), "level tape");
 
   if (new_tape_dir)
     MarkTapeDirectoryUploadsAsComplete(level_subdir);
@@ -1303,31 +1336,31 @@ void InitTapeDirectory(char *level_subdir)
 
 void InitScoreDirectory(char *level_subdir)
 {
-  createDirectory(getMainUserGameDataDir(), "main user data", PERMS_PRIVATE);
-  createDirectory(getScoreDir(NULL), "main score", PERMS_PRIVATE);
-  createDirectory(getScoreDir(level_subdir), "level score", PERMS_PRIVATE);
+  createDirectory(getMainUserGameDataDir(), "main user data");
+  createDirectory(getScoreDir(NULL), "main score");
+  createDirectory(getScoreDir(level_subdir), "level score");
 }
 
 void InitScoreCacheDirectory(char *level_subdir)
 {
-  createDirectory(getMainUserGameDataDir(), "main user data", PERMS_PRIVATE);
-  createDirectory(getCacheDir(), "cache data", PERMS_PRIVATE);
-  createDirectory(getScoreCacheDir(NULL), "main score", PERMS_PRIVATE);
-  createDirectory(getScoreCacheDir(level_subdir), "level score", PERMS_PRIVATE);
+  createDirectory(getMainUserGameDataDir(), "main user data");
+  createDirectory(getCacheDir(), "cache data");
+  createDirectory(getScoreCacheDir(NULL), "main score");
+  createDirectory(getScoreCacheDir(level_subdir), "level score");
 }
 
 void InitScoreTapeDirectory(char *level_subdir, int nr)
 {
   InitScoreDirectory(level_subdir);
 
-  createDirectory(getScoreTapeDir(level_subdir, nr), "score tape", PERMS_PRIVATE);
+  createDirectory(getScoreTapeDir(level_subdir, nr), "score tape");
 }
 
 void InitScoreCacheTapeDirectory(char *level_subdir, int nr)
 {
   InitScoreCacheDirectory(level_subdir);
 
-  createDirectory(getScoreCacheTapeDir(level_subdir, nr), "score tape", PERMS_PRIVATE);
+  createDirectory(getScoreCacheTapeDir(level_subdir, nr), "score tape");
 }
 
 static void SaveUserLevelInfo(void);
@@ -1336,9 +1369,9 @@ void InitUserLevelDirectory(char *level_subdir)
 {
   if (!directoryExists(getUserLevelDir(level_subdir)))
   {
-    createDirectory(getMainUserGameDataDir(), "main user data", PERMS_PRIVATE);
-    createDirectory(getUserLevelDir(NULL), "main user level", PERMS_PRIVATE);
-    createDirectory(getUserLevelDir(level_subdir), "user level", PERMS_PRIVATE);
+    createDirectory(getMainUserGameDataDir(), "main user data");
+    createDirectory(getUserLevelDir(NULL), "main user level");
+    createDirectory(getUserLevelDir(level_subdir), "user level");
 
     if (setup.internal.create_user_levelset)
       SaveUserLevelInfo();
@@ -1349,24 +1382,24 @@ void InitNetworkLevelDirectory(char *level_subdir)
 {
   if (!directoryExists(getNetworkLevelDir(level_subdir)))
   {
-    createDirectory(getMainUserGameDataDir(), "main user data", PERMS_PRIVATE);
-    createDirectory(getNetworkDir(), "network data", PERMS_PRIVATE);
-    createDirectory(getNetworkLevelDir(NULL), "main network level", PERMS_PRIVATE);
-    createDirectory(getNetworkLevelDir(level_subdir), "network level", PERMS_PRIVATE);
+    createDirectory(getMainUserGameDataDir(), "main user data");
+    createDirectory(getNetworkDir(), "network data");
+    createDirectory(getNetworkLevelDir(NULL), "main network level");
+    createDirectory(getNetworkLevelDir(level_subdir), "network level");
   }
 }
 
 void InitLevelSetupDirectory(char *level_subdir)
 {
-  createDirectory(getUserGameDataDir(), "user data", PERMS_PRIVATE);
-  createDirectory(getLevelSetupDir(NULL), "main level setup", PERMS_PRIVATE);
-  createDirectory(getLevelSetupDir(level_subdir), "level setup", PERMS_PRIVATE);
+  createDirectory(getUserGameDataDir(), "user data");
+  createDirectory(getLevelSetupDir(NULL), "main level setup");
+  createDirectory(getLevelSetupDir(level_subdir), "level setup");
 }
 
 static void InitCacheDirectory(void)
 {
-  createDirectory(getMainUserGameDataDir(), "main user data", PERMS_PRIVATE);
-  createDirectory(getCacheDir(), "cache data", PERMS_PRIVATE);
+  createDirectory(getMainUserGameDataDir(), "main user data");
+  createDirectory(getCacheDir(), "cache data");
 }
 
 
@@ -1752,7 +1785,7 @@ void sortTreeInfo(TreeInfo **node_first)
 // some stuff from "files.c"
 // ============================================================================
 
-#if defined(PLATFORM_WIN32)
+#if defined(PLATFORM_WINDOWS)
 #ifndef S_IRGRP
 #define S_IRGRP S_IRUSR
 #endif
@@ -1777,7 +1810,7 @@ void sortTreeInfo(TreeInfo **node_first)
 #ifndef S_ISGID
 #define S_ISGID 0
 #endif
-#endif // PLATFORM_WIN32
+#endif // PLATFORM_WINDOWS
 
 // file permissions for newly written files
 #define MODE_R_ALL             (S_IRUSR | S_IRGRP | S_IROTH)
@@ -1801,7 +1834,7 @@ char *getHomeDir(void)
 {
   static char *dir = NULL;
 
-#if defined(PLATFORM_WIN32)
+#if defined(PLATFORM_WINDOWS)
   if (dir == NULL)
   {
     dir = checked_malloc(MAX_PATH + 1);
@@ -1835,7 +1868,7 @@ char *getPersonalDataDir(void)
 {
   static char *personal_data_dir = NULL;
 
-#if defined(PLATFORM_MACOSX)
+#if defined(PLATFORM_MAC)
   if (personal_data_dir == NULL)
     personal_data_dir = getPath2(getHomeDir(), "Documents");
 #else
@@ -1889,7 +1922,7 @@ static mode_t posix_umask(mode_t mask)
 
 static int posix_mkdir(const char *pathname, mode_t mode)
 {
-#if defined(PLATFORM_WIN32)
+#if defined(PLATFORM_WINDOWS)
   return mkdir(pathname);
 #else
   return mkdir(pathname, mode);
@@ -1905,13 +1938,14 @@ static boolean posix_process_running_setgid(void)
 #endif
 }
 
-void createDirectory(char *dir, char *text, int permission_class)
+void createDirectory(char *dir, char *text)
 {
   if (directoryExists(dir))
     return;
 
   // leave "other" permissions in umask untouched, but ensure group parts
   // of USERDATA_DIR_MODE are not masked
+  int permission_class = PERMS_PRIVATE;
   mode_t dir_mode = (permission_class == PERMS_PRIVATE ?
                     DIR_PERMS_PRIVATE : DIR_PERMS_PUBLIC);
   mode_t last_umask = posix_umask(0);
@@ -1940,17 +1974,17 @@ void createDirectory(char *dir, char *text, int permission_class)
 
 void InitMainUserDataDirectory(void)
 {
-  createDirectory(getMainUserGameDataDir(), "main user data", PERMS_PRIVATE);
+  createDirectory(getMainUserGameDataDir(), "main user data");
 }
 
 void InitUserDataDirectory(void)
 {
-  createDirectory(getMainUserGameDataDir(), "main user data", PERMS_PRIVATE);
+  createDirectory(getMainUserGameDataDir(), "main user data");
 
   if (user.nr != 0)
   {
-    createDirectory(getUserDir(-1), "users", PERMS_PRIVATE);
-    createDirectory(getUserDir(user.nr), "user data", PERMS_PRIVATE);
+    createDirectory(getUserDir(-1), "users");
+    createDirectory(getUserDir(user.nr), "user data");
   }
 }
 
@@ -4609,7 +4643,7 @@ boolean CreateUserLevelSet(char *level_subdir, char *level_name,
   int i;
 
   // create user level sub-directory, if needed
-  createDirectory(getUserLevelDir(level_subdir), "user level", PERMS_PRIVATE);
+  createDirectory(getUserLevelDir(level_subdir), "user level");
 
   filename = getPath2(getUserLevelDir(level_subdir), LEVELINFO_FILENAME);