
/******************************************************************************
 *
 * RCS ID
 * $Id: os_file,v 1.2 1999/11/23 22:03:48 david Exp $
 *
 * HISTORY
 * $Log: os_file,v $
 * Revision 1.2  1999/11/23 22:03:48  david
 * Updates file long filename support.
 * Increased filename length to MAXPATHLEN
 * Add stuff to treat an archive as a file and not a directory
 * if a flags is not set (useful for when !sparkfs laaded)
 * os_file - updated to be a C replacement for s._os
 *
 * Revision 1.1  1999/05/16 12:00:08  david
 * Initial revision
 *
 *
 *****************************************************************************/

#include "includes.h"
#include "swis.h"
#include "kernel.h"

_kernel_oserror *myos_file(int action, char *fname, int *regs)
{
  _kernel_oserror *e;

  regs[0] = action;
  regs[1] = (int)fname;

  e = _kernel_swi(OS_File, (_kernel_swi_regs*)regs, (_kernel_swi_regs*)regs);
                                                  
  return e;
}                                                     

      
_kernel_oserror *myos_swi(int swi, int *regs)
{
  _kernel_oserror *e;

  e = _kernel_swi(swi, (_kernel_swi_regs*)regs, (_kernel_swi_regs*)regs);

  return e;
}

_kernel_oserror *myos_fsctrl(int r0, char *name, int r2, int r3)
{
  _kernel_swi_regs rin,rout;
  _kernel_oserror *e;
  int i;
                                
  rin.r[0] = r0;
  rin.r[1] = (int) name;
  rin.r[2] = r2;
  rin.r[3] = r3;
  
  for (i=4;i<10;i++)
    rin.r[i]=0;

  e = _kernel_swi(OS_FSControl, &rin, &rout);

  return e;

}

_kernel_oserror *myos_fclose(int handle)
{
  _kernel_swi_regs rin,rout;
 
  rin.r[0]=0;
  rin.r[1]=handle;

  return _kernel_swi(OS_Find, &rin, &rout);      
}

_kernel_oserror *myos_args(int r0, int r1, int r2, int *regs)
{
  _kernel_swi_regs rin;
 
  rin.r[0]=r0;
  rin.r[1]=r1;
  rin.r[2]=r2;

  return _kernel_swi(OS_Args, &rin, (_kernel_swi_regs*)regs);  
}                                                          

_kernel_oserror *myos_fopen(int mode, char *fname, int *fd )
{
  _kernel_swi_regs rin,rout;
  _kernel_oserror *e;
 
  rin.r[0]=mode;
  rin.r[1]=(int)fname;
  rin.r[2]=NULL;

  e = _kernel_swi(OS_Find, &rin, &rout);
 
  *fd = rout.r[0];

  return e;
}

_kernel_oserror *myos_fread(int fd ,void *buffer ,int count ,int *regs )
{
#if 1
  _kernel_swi_regs rin;

  rin.r[0]=4;
  rin.r[1]=fd;
  rin.r[2]=(int)buffer;
  rin.r[3]=count;

  return _kernel_swi(OS_GBPB, &rin, (_kernel_swi_regs*)regs); 
#else
  /* this code doesn't work! - the comments in kernel.h are poor */
  _kernel_osgbpb_block osblock;
  int result;

  osblock.dataptr=buffer;
  osblock.nbytes =count;
  osblock.fileptr=0;
  osblock.buf_len=count;
  osblock.wild_fld=NULL;

  result=_kernel_osgbpb(4, fd, &osblock);
  
  if (result==0)
  {
    regs[3]=osblock.nbytes;
    return NULL;
  }             
  else
  {
    return _kernel_last_oserror();
  }

#endif 
}

_kernel_oserror *myos_fwrite(int fd,void *buffer,int count,int *regs) 
{
  _kernel_swi_regs rin;

  rin.r[0]=2;
  rin.r[1]=fd;
  rin.r[2]=(int)buffer;
  rin.r[3]=count;

  return _kernel_swi(OS_GBPB, &rin, (_kernel_swi_regs*)regs);  
}
 
