home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 9 / FreshFishVol9-CD2.bin / bbs / gnu / libnix-0.8-src.lha / libnix-0.8 / sources / nix / stdio / open.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-18  |  2.8 KB  |  127 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <fcntl.h>
  4. #include <unistd.h>
  5. #include <limits.h>
  6. #include <errno.h>
  7. #undef LONGBITS
  8. #undef BITSPERBYTE
  9. #undef MAXINT
  10. #undef MININT
  11. #include <dos/dos.h>
  12. #define DEVICES_TIMER_H
  13. #include <dos/dosextens.h>
  14. #ifdef __GNUC__
  15. #include <inline/exec.h>
  16. #include <inline/dos.h>
  17. #endif
  18. #include <stabs.h>
  19.  
  20. extern void __seterrno(void);
  21. extern char *__amigapath(const char *path);
  22. extern struct WBStartup *_WBenchMsg;
  23.  
  24. unsigned long *__stdfiledes;
  25. static unsigned long stdfilesize=3;
  26. static long stderrdes=0; /* The normal Amiga shell sets no process->pr_CES stream -
  27.                           * we use Open("*",MODE_NEWFILE) in this case
  28.                           */
  29.  
  30. void __initstdio(void)
  31. { unsigned long *sfd;
  32.  
  33.   if((sfd=__stdfiledes=(unsigned long *)malloc(3*sizeof(unsigned long)))==NULL)
  34.     exit(20);
  35.   sfd[STDIN_FILENO ]=Input();
  36.   sfd[STDOUT_FILENO]=Output();
  37.   if(!(sfd[STDERR_FILENO]=((struct Process *)FindTask(NULL))->pr_CES))
  38.     if(_WBenchMsg!=NULL||!(sfd[STDERR_FILENO]=stderrdes=Open("*",MODE_OLDFILE)))
  39.       sfd[STDERR_FILENO]=sfd[STDOUT_FILENO];
  40. }
  41.  
  42. /* Call our private constructor */
  43. ADD2INIT(__initstdio,-30);
  44.  
  45. void __exitstdio(void)
  46. { long file,*sfd;
  47.   int i,max;
  48.  
  49.   for(sfd=&__stdfiledes[3],max=stdfilesize,i=3;i<max;i++)
  50.     if((file=*sfd++))
  51.       Close(file);
  52.  
  53.   if((file=stderrdes))
  54.     Close(file);
  55. }
  56.  
  57. /* Call our private destructor at cleanup */
  58. ADD2EXIT(__exitstdio,-30);
  59.  
  60. int open(const char *path,int flags,...)
  61. { unsigned long *sfd;
  62.   int file,max;
  63.  
  64. #ifdef IXPATHS
  65.   if((path=__amigapath(path))==NULL)
  66.     return -1;
  67. #endif
  68.  
  69.   for(sfd=__stdfiledes,max=stdfilesize,file=0;file<max;file++)
  70.     if(!sfd[file])
  71.       break;
  72.  
  73.   if(file>SHRT_MAX)
  74.   { errno=EMFILE;
  75.     return -1; }
  76.  
  77.   if(file==max)
  78.   { if((sfd=realloc(sfd,(file+1)*sizeof(unsigned long)))==NULL)
  79.     { errno=ENOMEM;
  80.       return -1; }
  81.     __stdfiledes=sfd;
  82.     stdfilesize++;
  83.   }
  84.  
  85.   if((sfd[file]=Open((char *)path,flags&O_TRUNC?MODE_NEWFILE:
  86.                      flags&(O_WRONLY|O_RDWR)?MODE_READWRITE:MODE_OLDFILE)))
  87.     return file;
  88.   __seterrno();
  89.   return -1;
  90. }
  91.  
  92. int close(int d)
  93. { int ret=-1;
  94.   if(d>2)
  95.   { ret=Close(__stdfiledes[d])?0:-1;
  96.     __stdfiledes[d]=0; }
  97.   return ret;
  98. }
  99.  
  100. off_t lseek(int d,off_t offset,int whence)
  101. { long r,file=__stdfiledes[d];
  102.   r=Seek(file,offset,whence==SEEK_SET?OFFSET_BEGINNING:
  103.          whence==SEEK_END?OFFSET_END:OFFSET_CURRENT);
  104.   if(r==EOF)
  105.     return r;
  106.   return Seek(file,0,OFFSET_CURRENT);
  107. }
  108.  
  109. ssize_t read(int d,void *buf,size_t nbytes)
  110. { long r;
  111.   r=Read(__stdfiledes[d],buf,nbytes);
  112.   if(r<0)
  113.     __seterrno();
  114.   return r;
  115. }
  116.  
  117. ssize_t write(int d,const void *buf,size_t nbytes)
  118. { long r;
  119.   r=Write(__stdfiledes[d],(char *)buf,nbytes);
  120.   if(r<0)
  121.     __seterrno();
  122.   return r;
  123. }
  124.  
  125. int isatty(int d)
  126. { return IsInteractive(__stdfiledes[d]); }
  127.