rnd-20020320-1-src
[rocksndiamonds.git] / src / libgame / misc.c
index b3edef75f1bbf367d8a8d244ad6ef3b67a3ac8c8..e8e34e0bc6fd6df546194864b0a970d17fdc8770 100644 (file)
@@ -425,6 +425,7 @@ void GetOptions(char *argv[])
   options.ro_base_directory = RO_BASE_PATH;
   options.rw_base_directory = RW_BASE_PATH;
   options.level_directory = RO_BASE_PATH "/" LEVELS_DIRECTORY;
+  options.graphics_directory = RO_BASE_PATH "/" GRAPHICS_DIRECTORY;
   options.serveronly = FALSE;
   options.network = FALSE;
   options.verbose = FALSE;
@@ -471,8 +472,9 @@ void GetOptions(char *argv[])
             "  -d, --display machine:0       X server display\n"
             "  -b, --basepath directory      alternative base directory\n"
             "  -l, --level directory         alternative level directory\n"
-            "  -s, --serveronly              only start network server\n"
+            "  -g, --graphics directory      alternative graphics directory\n"
             "  -n, --network                 network multiplayer game\n"
+            "  -s, --serveronly              only start network server\n"
             "  -v, --verbose                 verbose mode\n"
             "      --debug                   display debugging information\n",
             program.command_basename);
@@ -511,6 +513,15 @@ void GetOptions(char *argv[])
       if (option_arg == next_option)
        options_left++;
     }
+    else if (strncmp(option, "-graphics", option_len) == 0)
+    {
+      if (option_arg == NULL)
+       Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str);
+
+      options.graphics_directory = option_arg;
+      if (option_arg == next_option)
+       options_left++;
+    }
     else if (strncmp(option, "-network", option_len) == 0)
     {
       options.network = TRUE;
@@ -1306,6 +1317,12 @@ inline void swap_number_pairs(int *x1, int *y1, int *x2, int *y2)
 #ifndef S_IXOTH
 #define S_IXOTH S_IXUSR
 #endif
+#ifndef S_IRWXG
+#define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP)
+#endif
+#ifndef S_ISGID
+#define S_ISGID 0
+#endif
 #endif /* PLATFORM_WIN32 */
 
 /* file permissions for newly written files */
@@ -1343,29 +1360,39 @@ char *getSetupDir()
   return getUserDataDir();
 }
 
-void createDirectory(char *dir, char *text, int permission_class)
+static mode_t posix_umask(mode_t mask)
 {
 #if defined(PLATFORM_UNIX)
+  return umask(mask);
+#else
+  return 0;
+#endif
+}
+
+static int posix_mkdir(const char *pathname, mode_t mode)
+{
+#if defined(PLATFORM_WIN32)
+  return mkdir(pathname);
+#else
+  return mkdir(pathname, mode);
+#endif
+}
+
+void createDirectory(char *dir, char *text, int permission_class)
+{
   /* 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 ?
                     DIR_PERMS_PRIVATE : DIR_PERMS_PUBLIC);
-  mode_t normal_umask = umask(0);
+  mode_t normal_umask = posix_umask(0);
   mode_t group_umask = ~(dir_mode & S_IRWXG);
-  umask(normal_umask & group_umask);
-#endif
+  posix_umask(normal_umask & group_umask);
 
   if (access(dir, F_OK) != 0)
-#if defined(PLATFORM_WIN32)
-    if (mkdir(dir) != 0)
-#else
-    if (mkdir(dir, dir_mode) != 0)
-#endif
+    if (posix_mkdir(dir, dir_mode) != 0)
       Error(ERR_WARN, "cannot create %s directory '%s'", text, dir);
 
-#if defined(PLATFORM_UNIX)
-  umask(normal_umask);         /* reset normal umask */
-#endif
+  posix_umask(normal_umask);           /* reset normal umask */
 }
 
 void InitUserDataDirectory()