diff --git a/rtl/emx/dos.pas b/rtl/emx/dos.pas index a000a78aed..4a42ab66ae 100644 --- a/rtl/emx/dos.pas +++ b/rtl/emx/dos.pas @@ -92,6 +92,7 @@ Type execwinflags=(efdefault,efminimize,efmaximize,effullscreen, efwindowed); + {OS/2 specific functions} function GetEnvPChar (EnvVar: string): PChar; @@ -336,15 +337,6 @@ procedure exec(const path:pathstr;const comline:comstr); {Execute a program.} -begin - LastDosExitCode := Exec (Path, ExecRunFlags (ExecFlags), efdefault, comline); -end; - -function exec(path:pathstr;runflags:execrunflags;winflags:execwinflags; - const comline:comstr):longint; - -{Execute a program. More suitable for OS/2 than the exec above.} - type bytearray=array[0..8191] of byte; Pbytearray=^bytearray; @@ -359,11 +351,12 @@ type bytearray=array[0..8191] of byte; sizearg : word; { size of arguments } numenv : word; { number of env strings } sizeenv:word; { size of environment } - mode1,mode2:byte; { mode byte } + mode:word; { mode word } end; var args:Pbytearray; env:Pbytearray; + Path2:PByteArray; i,argsize:word; es:execstruc; esadr:pointer; @@ -378,6 +371,7 @@ const begin getmem(args,ArgsSize); GetMem(env, envc*sizeof(pchar)+16384); + GetMem (Path2, 260); {Now setup the arguments. The first argument should be the program name without directory and extension.} fsplit(path,d,n,e); @@ -445,25 +439,16 @@ begin es.argofs:=args; es.envofs:=env; es.numenv:=envc; - { set an error - path is too long } - { since we must add a zero to the } - { end. } - if length(path) > 254 then - begin - exec := 8; - exit; - end; - path[length(path)+1] := #0; - es.nameofs:=pointer(longint(@path)+1); + Move (Path [1], Path2^, Length (Path)); + Path2^ [Length (Path)] := 0; + es.nameofs := Path2; asm movw %ss,es.argseg movw %ss,es.envseg movw %ss,es.nameseg end; es.sizearg:=argsize; - {Typecasting of sets in FPC is a bit hard.} - es.mode1:=byte(runflags); - es.mode2:=byte(winflags); + es.mode := word (ExecFlags); {Now exec the program.} asm @@ -477,11 +462,12 @@ begin decl %eax .Lexprg1: movw %di,doserror - movl %eax,__RESULT + movl %eax, LastDosExitCode end ['eax', 'ebx', 'ecx', 'edx', 'esi', 'edi']; - freemem(args,ArgsSize); + FreeMem (Path2, 260); FreeMem(env, envc*sizeof(pchar)+16384); + freemem(args,ArgsSize); {Phew! That's it. This was the most sophisticated procedure to call a system function I ever wrote!} end; @@ -1217,7 +1203,10 @@ begin end. { $Log$ - Revision 1.13 2004-02-22 15:01:49 hajny + Revision 1.14 2004-03-08 22:31:00 hajny + * exec fix + + Revision 1.13 2004/02/22 15:01:49 hajny * lots of fixes (regcall, THandle, string operations in sysutils, longint2cardinal according to OS/2 docs, dosh.inc, ...) Revision 1.12 2004/02/17 17:37:26 daniel