[comp.sys.amiga.programmer] Does Execute

baxter_a@wehi.dn.mu.oz (06/26/91)

I am having a little trouble debugging something for the A3000.
I don't have one, so identifying the crook code is dificult, but
I think I've found it. To prevent the Lattice window opening
if starting from WB, I do:

if (argc == 0)          /* running under workbench      */                 
        {                                                                  
        _ufbs[0].ufbfh = NULL;                                             
        _ufbs[1].ufbfh = _ufbs[0].ufbfh;                                   
        _ufbs[1].ufbflg = UFB_NC;                                          
        _ufbs[2].ufbfh = _ufbs[0].ufbfh;                                   
        _ufbs[2].ufbflg = UFB_NC;                                          
        handle = (struct FileHandle *)(_ufbs[0].ufbfh << 2);               
        process = (struct Process *)FindTask(0);                           
        process->pr_ConsoleTask = (APTR)handle->fh_Type;                   
        x = 0;                                                             
        }                                                                  
else                    /* running under CLI            */                 
        {                                                                  
        _ufbs[0].ufbfh = Input();                                          
        _ufbs[1].ufbfh = Output();                                         
        _ufbs[2].ufbfh = Open("*", MODE_OLDFILE);                          
        x = UFB_NC;                     /* do not close CLI defaults    */ 
        }                                                                  
                                                                           
_ufbs[0].ufbflg |= UFB_RA | O_RAW | x;                                     
_ufbs[1].ufbflg |= UFB_WA | O_RAW | x;                                     
_ufbs[2].ufbflg |= UFB_RA | UFB_WA | O_RAW;

Which replaces the similar code from Lattice umain.c.

This works fine on my A500, and has no problem when later I use:

   Execute("failat >Nil: <Nil: 20 \n mount >Nil: <Nil: plt:",0,0);

However, on the A3000, under 1.3 or 2.0, it crashes.

Is this expected behaviour? Do I have to go back to having the little
window?

Regards Alan

carolyn@cbmvax.commodore.com (Carolyn Scheppner - CATS) (06/27/91)

In article <1991Jun25.224054.24632@wehi.dn.mu.oz> baxter_a@wehi.dn.mu.oz writes:
>I am having a little trouble debugging something for the A3000.
>I don't have one, so identifying the crook code is dificult, but
>I think I've found it. To prevent the Lattice window opening
>if starting from WB, I do:
>
>if (argc == 0)          /* running under workbench      */                 
>        {                                                                  
>        _ufbs[0].ufbfh = NULL;                                             
>        _ufbs[1].ufbfh = _ufbs[0].ufbfh;                                   
>        _ufbs[1].ufbflg = UFB_NC;                                          
>        _ufbs[2].ufbfh = _ufbs[0].ufbfh;                                   
>        _ufbs[2].ufbflg = UFB_NC;                                          
>        handle = (struct FileHandle *)(_ufbs[0].ufbfh << 2);               
>        process = (struct Process *)FindTask(0);                           
>        process->pr_ConsoleTask = (APTR)handle->fh_Type;                   
>        x = 0;                                                             
>        }                                                                  

Blah - I skimmed that pretty fast but it looks to me like you are
referencing off NULL POINTERS into low memory which is different on
every model and OS version.  Yuck.

PLEASE - Either use the mechanism PROVIDED BY Lattice (ie - compile
_main.c with the -dTINY flag and link with it) OR use
Open("NIL:",MODE_OLDFILE) and place the returned handle in 
that first place where you are placing NULL !!!!!!!!!!!!!!!!!!!!!!

Thanks you.  BTW - If you had an 020/MMU or '030 and Enforcer, you
woulda been beeping !

-- 
==========================================================================
 Carolyn Scheppner -- Tech. Mgr. CATS - Commodore Amiga Technical Support
 PHONE 215-431-9180 {uunet,rutgers}!cbmvax!carolyn  carolyn@commodore.com

 Signed characters are xenophobic.  
==========================================================================

nix@rainbow.oulu.fi (Tero Manninen) (06/27/91)

On 25 Jun 91 22:40:54 GMT,
baxter_a@wehi.dn.mu.oz said:

[...]
baxter> if (argc == 0)          /* running under workbench      */
baxter>         {
1.
baxter>         _ufbs[0].ufbfh = NULL;
baxter>         _ufbs[1].ufbfh = _ufbs[0].ufbfh;
baxter>         _ufbs[1].ufbflg = UFB_NC;
baxter>         _ufbs[2].ufbfh = _ufbs[0].ufbfh;
baxter>         _ufbs[2].ufbflg = UFB_NC;
2.
baxter>         handle = (struct FileHandle *)(_ufbs[0].ufbfh << 2);
baxter>         process = (struct Process *)FindTask(0);
3.
baxter>         process->pr_ConsoleTask = (APTR)handle->fh_Type;
baxter>         x = 0;
baxter>         }
baxter> else                    /* running under CLI            */
[...]
baxter> Which replaces the similar code from Lattice umain.c.
baxter> This works fine on my A500, and has no problem when later I use:
baxter>    Execute("failat >Nil: <Nil: 20 \n mount >Nil: <Nil: plt:",0,0);
baxter> However, on the A3000, under 1.3 or 2.0, it crashes.

I don't know about the cli part of your startup code, but clearly
in the workbench part you have an illegal memory reference:
- at point 1 you set stdin handle to zero
- at point 2 handle is set to (zero << 2) which is a null pointer.
- at point 3 you try to get pr_ConsoleTask from null filehandle
	     [ (struct FileHandle * 0)->fh_Type; ] !!

++Tero