home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / TELECOM / OS9_Unix.lzh / RSHSRC / _open.c next >
Text File  |  1992-09-30  |  2KB  |  59 lines

  1. /* _open() --- UNIX three argument open function
  2.     ip Sept 92 ... derived from os9lib and gnutar "port" versions
  3. */
  4.  
  5. #include <strings.h>
  6. #include <sys/fcntl.h>
  7.  
  8. #define ERROR -1
  9. #define NULL 0
  10. int _open(name,oflag,mode )
  11. char *name;
  12. int oflag, mode;
  13. {
  14.     int    path;
  15.     char    *cp, *getenv();
  16.  
  17.     if (strcmp(name, "/dev/null") == NULL)
  18.         name = "/nil";
  19.     else
  20.     if (strncmp(name, "/dev/tty", 8) == 0 && (cp = getenv("PORT")) != NULL)
  21.         name = cp;
  22.  
  23.     if ( oflag == 0 )    /* Unix numerical argument perhaps */
  24.         oflag = O_RDONLY;
  25.  
  26.     if (oflag & O_WRONLY) {
  27.         if (oflag & O_CREAT)
  28.             if (oflag & O_EXCL) {
  29.                 if (mode&0xf00)    return(_errmsg(-1,
  30.                     "_open.c suspect Unix numerical mode argument to open()"));
  31.                 return (create(name, oflag & O_RDWR, mode));
  32.             } else
  33.                 return(creat(name, oflag & O_RDWR));
  34.         else {
  35.             path = open(name, oflag & O_RDWR);
  36. /* however Unix open doesn't stop access to directories, so .. */
  37.             if(path <0) path=open(name, (oflag & O_RDWR) | S_IFDIR);
  38.             if ( path >= 0  &&  oflag & O_APPEND )
  39.                     if (lseek(path, 0, 2) < 0)    /* to EOF */
  40.                     return ERROR;
  41.             return(path);
  42.         }
  43.     }
  44.  
  45.     if ( oflag & O_RDONLY ) {
  46.         path = open(name, S_IREAD);
  47. /* however Unix open doesn't stop access to directories, so .. */
  48.         if(path <0) path=open(name, S_IREAD | S_IFDIR);
  49.         if ( path >= 0  && oflag & O_APPEND )
  50.             if (lseek(path, 2, 0) < 0 )    /* to EOF */
  51.                 return ERROR;
  52.         return(path);
  53.       
  54.        }
  55.     _errmsg(0,"_open.c: unknown oflag code 0x%x in open()",oflag) ;
  56.     return ERROR;
  57. }
  58.             
  59.