aboutsummaryrefslogtreecommitdiff
path: root/gdb/go32-nat.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2001-07-15 10:28:13 +0000
committerEli Zaretskii <eliz@gnu.org>2001-07-15 10:28:13 +0000
commit150985e3a1738a7781371d98ab5a0be9f46148de (patch)
treeb20ed571015978006f8806bd86fcfb3f6c6c53c2 /gdb/go32-nat.c
parent96fe9e8c46b260068c06a81f92b9272ca067df40 (diff)
downloadgdb-150985e3a1738a7781371d98ab5a0be9f46148de.zip
gdb-150985e3a1738a7781371d98ab5a0be9f46148de.tar.gz
gdb-150985e3a1738a7781371d98ab5a0be9f46148de.tar.bz2
* go32-nat.c (go32_create_inferior): Support command lines longer
than 126 characters.
Diffstat (limited to 'gdb/go32-nat.c')
-rw-r--r--gdb/go32-nat.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/gdb/go32-nat.c b/gdb/go32-nat.c
index c9d02d1..56ab8cb 100644
--- a/gdb/go32-nat.c
+++ b/gdb/go32-nat.c
@@ -588,6 +588,7 @@ go32_create_inferior (char *exec_file, char *args, char **env)
jmp_buf start_state;
char *cmdline;
char **env_save = environ;
+ size_t cmdlen;
/* If no exec file handed to us, get it from the exec-file command -- with
a good, common error message if none is specified. */
@@ -622,10 +623,24 @@ go32_create_inferior (char *exec_file, char *args, char **env)
else
child_cmd.command = xstrdup (args);
- cmdline = (char *) alloca (strlen (args) + 4);
- cmdline[0] = strlen (args);
+ cmdlen = strlen (args);
+ /* v2loadimage passes command lines via DOS memory, so it cannot
+ possibly handle commands longer than 1MB. */
+ if (cmdlen > 1024*1024)
+ error ("Command line too long.");
+
+ cmdline = xmalloc (cmdlen + 4);
strcpy (cmdline + 1, args);
- cmdline[strlen (args) + 1] = 13;
+ /* If the command-line length fits into DOS 126-char limits, use the
+ DOS command tail format; otherwise, tell v2loadimage to pass it
+ through a buffer in conventional memory. */
+ if (cmdlen < 127)
+ {
+ cmdline[0] = strlen (args);
+ cmdline[cmdlen + 1] = 13;
+ }
+ else
+ cmdline[0] = 0xff; /* signal v2loadimage it's a long command */
environ = env;
@@ -636,6 +651,7 @@ go32_create_inferior (char *exec_file, char *args, char **env)
exit (1);
}
environ = env_save;
+ free (cmdline);
edi_init (start_state);
#if __DJGPP_MINOR__ < 3