executor/src/desperate.c

154 lines
3.6 KiB
C

/* Copyright 1996 by Abacus Research and
* Development, Inc. All rights reserved.
*/
#if !defined (OMIT_RCSID_STRINGS)
char ROMlib_rcsid_desperate[] =
"$Id: desperate.c 63 2004-12-24 18:19:43Z ctm $";
#endif
#include "rsys/common.h"
#include "rsys/file.h"
#include "rsys/desperate.h"
#include "OSUtil.h"
static int
desperate_switch_index (int argc, char **argv)
{
int i;
for (i = 0; i < argc; i++)
if (!strcmp ("-desperate", argv[i]))
return i;
return -1;
}
static void
print_cmd_line_arg (const char *str)
{
char *c;
c = alloca (strlen (str) + 1);
strcpy (c, str);
#if defined (MSDOS)
convert_slashs_to_backslashs (c);
#endif
if (c[0] == '\0' || strchr (c, ' ') || strchr (c, '\t'))
printf (" \"%s\"", c);
else
printf (" %s", c);
}
/* FIXME - these should be moved to configuration files somehow. */
#if defined (MSDOS)
static const char *desperate_switches[] = {
"-vga",
"-oldtimer",
"-nosound",
"-skipaspi",
"-nofilescheck",
"-noautorefresh",
"-memory",
"2M",
"-macdrives",
"",
"-dosdrives",
""
};
#elif defined (LINUX)
static const char *desperate_switches[] = {
"-nosound",
"-nodrivesearch",
"-memory",
"2M",
};
#else
static const char *desperate_switches[] = {
"-nosound",
"-memory",
"2M",
};
#endif
/* Searches for an occurrence of "-desperate" in the command line.
* If it finds one, it is replaced with a list of command-line
* switches whose purpose is to put Executor into "desperate" mode,
* where it uses as few system features as possible. If such
* a switch is found, *argcp and *argvp are modified to reflect
* the new command line switches.
*
* Returns TRUE except in case of a parsing error (right now that
* can only happen with duplicate "-desperate" switches).
*/
boolean_t
handle_desperate_switch (int *argcp, char ***argvp)
{
boolean_t success_p;
char **argv, **new_argv;
int i, s, argc, new_argc;
argc = *argcp;
argv = *argvp;
/* See if the "-desperate" switch is in the list. */
s = desperate_switch_index (argc, argv);
if (s == -1)
{
success_p = TRUE;
goto done;
}
/* See if the "-desperate" switch is in the list twice. */
if (desperate_switch_index (argc - s - 1, argv + s + 1) != -1)
{
fprintf (stderr, "Duplicate \"-desperate\" switch.\n");
success_p = FALSE;
goto done;
}
/* Construct the new list by replacing the "-desperate" switch
* with all of the switches it implies. There is a small memory
* leak here since we'll never reclaim this memory.
*/
new_argc = argc + NELEM (desperate_switches) - 1;
new_argv = malloc ((new_argc + 1) * sizeof new_argv[0]);
memcpy (new_argv, argv, s * sizeof new_argv[0]);
memcpy (new_argv + s, desperate_switches, sizeof desperate_switches);
memcpy (new_argv + s + NELEM (desperate_switches),
argv + s + 1, (argc - s - 1) * sizeof new_argv[0]);
new_argv[new_argc] = NULL;
puts (
"Executor is now entering desperation mode and attempting to use as few\n"
"system features as possible. This is useful if you find that Executor\n"
"won't start for you, a problem usually caused by driver conflicts. If\n"
"you find that this \"desperation mode\" works, you can experiment and\n"
"see which of these command-line switches are necessary for you to get\n"
"Executor to work:\n"
);
for (i = 0; i < new_argc; i++)
print_cmd_line_arg (new_argv[i]);
fputs ("\n\nWaiting ten seconds...", stdout);
fflush (stdout);
#if !defined (CYGWIN32)
sleep (10);
#else
Delay (60 * 10, (LONGINT *) 0);
#endif
puts ("done.");
fflush (stdout);
*argcp = new_argc;
*argvp = new_argv;
success_p = TRUE;
done:
return success_p;
}