More tweaks to how windows deals with directory paths.
This commit is contained in:
@@ -398,6 +398,7 @@ E const char *const monexplain[], invisexplain[], *const oclass_names[];
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
E char *fqn_prefix[PREFIX_COUNT];
|
E char *fqn_prefix[PREFIX_COUNT];
|
||||||
|
E boolean fqn_prefix_locked[PREFIX_COUNT];
|
||||||
#ifdef PREFIXES_IN_USE
|
#ifdef PREFIXES_IN_USE
|
||||||
E char *fqn_prefix_names[PREFIX_COUNT];
|
E char *fqn_prefix_names[PREFIX_COUNT];
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -286,6 +286,10 @@ char *fqn_prefix[PREFIX_COUNT] = { (char *) 0, (char *) 0, (char *) 0,
|
|||||||
(char *) 0, (char *) 0, (char *) 0,
|
(char *) 0, (char *) 0, (char *) 0,
|
||||||
(char *) 0, (char *) 0, (char *) 0,
|
(char *) 0, (char *) 0, (char *) 0,
|
||||||
(char *) 0 };
|
(char *) 0 };
|
||||||
|
boolean fqn_prefix_locked[PREFIX_COUNT] = { FALSE, FALSE, FALSE,
|
||||||
|
FALSE, FALSE, FALSE,
|
||||||
|
FALSE, FALSE, FALSE,
|
||||||
|
FALSE };
|
||||||
|
|
||||||
#ifdef PREFIXES_IN_USE
|
#ifdef PREFIXES_IN_USE
|
||||||
char *fqn_prefix_names[PREFIX_COUNT] = {
|
char *fqn_prefix_names[PREFIX_COUNT] = {
|
||||||
|
|||||||
+6
-1
@@ -2158,6 +2158,8 @@ int prefixid;
|
|||||||
|
|
||||||
if (!bufp)
|
if (!bufp)
|
||||||
return;
|
return;
|
||||||
|
if (fqn_prefix_locked[prefixid])
|
||||||
|
return;
|
||||||
/* Backward compatibility, ignore trailing ;n */
|
/* Backward compatibility, ignore trailing ;n */
|
||||||
if ((ptr = index(bufp, ';')) != 0)
|
if ((ptr = index(bufp, ';')) != 0)
|
||||||
*ptr = '\0';
|
*ptr = '\0';
|
||||||
@@ -3196,7 +3198,7 @@ fopen_sym_file()
|
|||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
fp = fopen_datafile(SYMBOLS, "r", HACKPREFIX);
|
fp = fopen_datafile(SYMBOLS, "r", CONFIGPREFIX);
|
||||||
|
|
||||||
return fp;
|
return fp;
|
||||||
}
|
}
|
||||||
@@ -3861,6 +3863,9 @@ assure_syscf_file()
|
|||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
|
/* We are checking that the sysconf exists ... lock the path */
|
||||||
|
fqn_prefix_locked[SYSCONFPREFIX] = TRUE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* All we really care about is the end result - can we read the file?
|
* All we really care about is the end result - can we read the file?
|
||||||
* So just check that directly.
|
* So just check that directly.
|
||||||
|
|||||||
+58
-57
@@ -97,13 +97,16 @@ void
|
|||||||
build_known_folder_path(
|
build_known_folder_path(
|
||||||
const KNOWNFOLDERID * folder_id,
|
const KNOWNFOLDERID * folder_id,
|
||||||
char * path,
|
char * path,
|
||||||
size_t path_size)
|
size_t path_size,
|
||||||
|
boolean versioned)
|
||||||
{
|
{
|
||||||
get_known_folder_path(folder_id, path, path_size);
|
get_known_folder_path(folder_id, path, path_size);
|
||||||
strcat(path, "\\NetHack\\");
|
strcat(path, "\\NetHack\\");
|
||||||
create_directory(path);
|
create_directory(path);
|
||||||
strcat(path, "3.6\\");
|
if (versioned) {
|
||||||
create_directory(path);
|
strcat(path, "3.6\\");
|
||||||
|
create_directory(path);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -190,51 +193,37 @@ set_default_prefix_locations(const char *programPath)
|
|||||||
char *envp = NULL;
|
char *envp = NULL;
|
||||||
char *sptr = NULL;
|
char *sptr = NULL;
|
||||||
|
|
||||||
static char hack_path[MAX_PATH];
|
|
||||||
static char executable_path[MAX_PATH];
|
static char executable_path[MAX_PATH];
|
||||||
static char nethack_profile_path[MAX_PATH];
|
static char profile_path[MAX_PATH];
|
||||||
static char nethack_per_user_data_path[MAX_PATH];
|
static char versioned_profile_path[MAX_PATH];
|
||||||
static char nethack_global_data_path[MAX_PATH];
|
static char versioned_user_data_path[MAX_PATH];
|
||||||
static char sysconf_path[MAX_PATH];
|
static char versioned_global_data_path[MAX_PATH];
|
||||||
|
|
||||||
strcpy(executable_path, get_executable_path());
|
strcpy(executable_path, get_executable_path());
|
||||||
append_slash(executable_path);
|
append_slash(executable_path);
|
||||||
|
|
||||||
build_environment_path("NETHACKDIR", NULL, hack_path, sizeof(hack_path));
|
build_known_folder_path(&FOLDERID_Profile, profile_path,
|
||||||
|
sizeof(profile_path), FALSE);
|
||||||
|
|
||||||
if (hack_path[0] == '\0')
|
build_known_folder_path(&FOLDERID_Profile, versioned_profile_path,
|
||||||
build_environment_path("HACKDIR", NULL, hack_path, sizeof(hack_path));
|
sizeof(profile_path), TRUE);
|
||||||
|
|
||||||
build_known_folder_path(&FOLDERID_Profile, nethack_profile_path,
|
|
||||||
sizeof(nethack_profile_path));
|
|
||||||
|
|
||||||
build_known_folder_path(&FOLDERID_LocalAppData,
|
build_known_folder_path(&FOLDERID_LocalAppData,
|
||||||
nethack_per_user_data_path, sizeof(nethack_per_user_data_path));
|
versioned_user_data_path, sizeof(versioned_user_data_path), TRUE);
|
||||||
|
|
||||||
build_known_folder_path(&FOLDERID_ProgramData,
|
build_known_folder_path(&FOLDERID_ProgramData,
|
||||||
nethack_global_data_path, sizeof(nethack_global_data_path));
|
versioned_global_data_path, sizeof(versioned_global_data_path), TRUE);
|
||||||
|
|
||||||
if (hack_path[0] == '\0')
|
fqn_prefix[LEVELPREFIX] = versioned_user_data_path;
|
||||||
strcpy(hack_path, nethack_profile_path);
|
fqn_prefix[SAVEPREFIX] = versioned_user_data_path;
|
||||||
|
fqn_prefix[BONESPREFIX] = versioned_global_data_path;
|
||||||
fqn_prefix[LEVELPREFIX] = nethack_per_user_data_path;
|
|
||||||
fqn_prefix[SAVEPREFIX] = nethack_per_user_data_path;
|
|
||||||
fqn_prefix[BONESPREFIX] = nethack_global_data_path;
|
|
||||||
fqn_prefix[DATAPREFIX] = executable_path;
|
fqn_prefix[DATAPREFIX] = executable_path;
|
||||||
fqn_prefix[SCOREPREFIX] = nethack_global_data_path;
|
fqn_prefix[SCOREPREFIX] = versioned_global_data_path;
|
||||||
fqn_prefix[LOCKPREFIX] = nethack_global_data_path;
|
fqn_prefix[LOCKPREFIX] = versioned_global_data_path;
|
||||||
fqn_prefix[CONFIGPREFIX] = nethack_profile_path;
|
fqn_prefix[CONFIGPREFIX] = profile_path;
|
||||||
|
fqn_prefix[HACKPREFIX] = versioned_profile_path;
|
||||||
fqn_prefix[HACKPREFIX] = hack_path;
|
fqn_prefix[TROUBLEPREFIX] = versioned_profile_path;
|
||||||
fqn_prefix[TROUBLEPREFIX] = hack_path;
|
fqn_prefix[SYSCONFPREFIX] = versioned_global_data_path;
|
||||||
|
|
||||||
build_environment_path("COMMONPROGRAMFILES", "NetHack\\3.6", sysconf_path,
|
|
||||||
sizeof(sysconf_path));
|
|
||||||
|
|
||||||
if(!folder_file_exists(sysconf_path, SYSCF_FILE))
|
|
||||||
strcpy(sysconf_path, hack_path);
|
|
||||||
|
|
||||||
fqn_prefix[SYSCONFPREFIX] = sysconf_path;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -300,43 +289,51 @@ update_file(
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void copy_config_content()
|
void copy_sysconf_content()
|
||||||
{
|
{
|
||||||
/* Keep templates up to date */
|
/* Using the SYSCONFPREFIX path, lock it so that it does not change */
|
||||||
/* TODO: Update the package to store config file as .nethackrc */
|
fqn_prefix_locked[SYSCONFPREFIX] = TRUE;
|
||||||
update_file(fqn_prefix[CONFIGPREFIX], CONFIG_TEMPLATE,
|
|
||||||
fqn_prefix[DATAPREFIX], CONFIG_TEMPLATE, FALSE);
|
|
||||||
update_file(fqn_prefix[SYSCONFPREFIX], SYSCF_TEMPLATE,
|
update_file(fqn_prefix[SYSCONFPREFIX], SYSCF_TEMPLATE,
|
||||||
fqn_prefix[DATAPREFIX], SYSCF_TEMPLATE, FALSE);
|
fqn_prefix[DATAPREFIX], SYSCF_TEMPLATE, FALSE);
|
||||||
|
|
||||||
|
/* If the required early game file does not exist, copy it */
|
||||||
|
copy_file(fqn_prefix[SYSCONFPREFIX], SYSCF_FILE,
|
||||||
|
fqn_prefix[DATAPREFIX], SYSCF_TEMPLATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void copy_config_content()
|
||||||
|
{
|
||||||
|
/* Using the CONFIGPREFIX path, lock it so that it does not change */
|
||||||
|
fqn_prefix_locked[CONFIGPREFIX] = TRUE;
|
||||||
|
|
||||||
|
/* Keep templates up to date */
|
||||||
|
update_file(fqn_prefix[CONFIGPREFIX], CONFIG_TEMPLATE,
|
||||||
|
fqn_prefix[DATAPREFIX], CONFIG_TEMPLATE, FALSE);
|
||||||
|
|
||||||
|
update_file(fqn_prefix[CONFIGPREFIX], SYMBOLS_TEMPLATE,
|
||||||
|
fqn_prefix[DATAPREFIX], SYMBOLS_TEMPLATE, FALSE);
|
||||||
|
|
||||||
/* If the required early game file does not exist, copy it */
|
/* If the required early game file does not exist, copy it */
|
||||||
/* NOTE: We never replace .nethackrc or sysconf */
|
/* NOTE: We never replace .nethackrc or sysconf */
|
||||||
copy_file(fqn_prefix[CONFIGPREFIX], CONFIG_FILE,
|
copy_file(fqn_prefix[CONFIGPREFIX], CONFIG_FILE,
|
||||||
fqn_prefix[DATAPREFIX], CONFIG_TEMPLATE);
|
fqn_prefix[DATAPREFIX], CONFIG_TEMPLATE);
|
||||||
copy_file(fqn_prefix[SYSCONFPREFIX], SYSCF_FILE,
|
|
||||||
fqn_prefix[DATAPREFIX], SYSCF_TEMPLATE);
|
|
||||||
|
|
||||||
/* Update symbols and save a copy if we are replacing */
|
update_file(fqn_prefix[CONFIGPREFIX], SYMBOLS,
|
||||||
/* TODO: Can't HACKDIR be changed during option parsing
|
|
||||||
causing us to perhaps be checking options against the wrong
|
|
||||||
symbols file? */
|
|
||||||
update_file(fqn_prefix[HACKPREFIX], SYMBOLS,
|
|
||||||
fqn_prefix[DATAPREFIX], SYMBOLS_TEMPLATE, TRUE);
|
fqn_prefix[DATAPREFIX], SYMBOLS_TEMPLATE, TRUE);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
copy_hack_content()
|
copy_hack_content()
|
||||||
{
|
{
|
||||||
|
nhassert(fqn_prefix_locked[HACKPREFIX]);
|
||||||
|
|
||||||
/* Keep Guidebook and opthelp up to date */
|
/* Keep Guidebook and opthelp up to date */
|
||||||
update_file(fqn_prefix[HACKPREFIX], GUIDEBOOK_FILE,
|
update_file(fqn_prefix[HACKPREFIX], GUIDEBOOK_FILE,
|
||||||
fqn_prefix[DATAPREFIX], GUIDEBOOK_FILE, FALSE);
|
fqn_prefix[DATAPREFIX], GUIDEBOOK_FILE, FALSE);
|
||||||
update_file(fqn_prefix[HACKPREFIX], OPTIONFILE,
|
update_file(fqn_prefix[HACKPREFIX], OPTIONFILE,
|
||||||
fqn_prefix[DATAPREFIX], OPTIONFILE, FALSE);
|
fqn_prefix[DATAPREFIX], OPTIONFILE, FALSE);
|
||||||
|
|
||||||
/* Keep templates up to date */
|
|
||||||
update_file(fqn_prefix[HACKPREFIX], SYMBOLS_TEMPLATE,
|
|
||||||
fqn_prefix[DATAPREFIX], SYMBOLS_TEMPLATE, FALSE);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -407,22 +404,26 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/
|
|||||||
chdir(fqn_prefix[HACKPREFIX]);
|
chdir(fqn_prefix[HACKPREFIX]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
copy_config_content();
|
|
||||||
|
|
||||||
if (GUILaunched || IsDebuggerPresent())
|
if (GUILaunched || IsDebuggerPresent())
|
||||||
getreturn_enabled = TRUE;
|
getreturn_enabled = TRUE;
|
||||||
|
|
||||||
check_recordfile((char *) 0);
|
check_recordfile((char *) 0);
|
||||||
iflags.windowtype_deferred = TRUE;
|
iflags.windowtype_deferred = TRUE;
|
||||||
|
copy_sysconf_content();
|
||||||
initoptions();
|
initoptions();
|
||||||
|
copy_config_content();
|
||||||
|
process_options(argc, argv);
|
||||||
|
|
||||||
|
/* Finished processing options, lock all directory paths */
|
||||||
|
for(int i = 0; i < PREFIX_COUNT; i++)
|
||||||
|
fqn_prefix_locked[i] = TRUE;
|
||||||
|
|
||||||
if (!validate_prefix_locations(failbuf)) {
|
if (!validate_prefix_locations(failbuf)) {
|
||||||
raw_printf("Some invalid directory locations were specified:\n\t%s\n",
|
raw_printf("Some invalid directory locations were specified:\n\t%s\n",
|
||||||
failbuf);
|
failbuf);
|
||||||
nethack_exit(EXIT_FAILURE);
|
nethack_exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
process_options(argc, argv);
|
|
||||||
|
|
||||||
copy_hack_content();
|
copy_hack_content();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user