home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 1 / RISC_DISC_1.iso / pd_share / code / unixlib / !UnixLib / src / unix / c / open < prev    next >
Encoding:
Text File  |  1994-09-30  |  1.4 KB  |  87 lines

  1. static char sccs_id[] = "@(#) open.c 1.4 " __DATE__ " HJR";
  2.  
  3. /* open.c (c) Copyright 1990 H.Rogers */
  4.  
  5. #include <stdarg.h>
  6. #include <errno.h>
  7.  
  8. #include "fcntl.h"
  9.  
  10. #include "sys/unix.h"
  11. #include "sys/dev.h"
  12.  
  13. struct sfile __sfile[] =
  14. {
  15.   {"tty", makedev (DEV_TTY, 0)},
  16.   {"console", makedev (DEV_TTY, 0)},
  17.   {"rs423", makedev (DEV_TTY, 0)},
  18.   {"null", makedev (DEV_NULL, 0)},
  19.   {0, makedev (DEV_RISCOS, 0)}};    /* table terminator */
  20.  
  21. char *
  22. ttyname (void)
  23. {
  24.   return ("/dev/tty");
  25. }
  26.  
  27. int
  28. open (register char *file, int oflag,...)
  29. {
  30.   register struct file *f;
  31.   va_list ap;
  32.   register int mode;
  33.   int fd;
  34.   dev_t dev;
  35.  
  36. /* __uname() is called by __fsopen() */
  37.  
  38.   if (oflag & O_CREAT)
  39.     {
  40.       va_start (ap, oflag);
  41.       mode = va_arg (ap, int);
  42.       va_end (ap);
  43.     }
  44.   else
  45.     mode = 0777;
  46.  
  47.   if ((fd = __fdalloc ()) < 0)
  48.     return (-1);
  49.  
  50.   f = __u->file + fd;
  51.   f->oflag = oflag;
  52.  
  53.   if (file[0] == '/' && file[1] == 'd' && file[2] == 'e' &&
  54.       file[3] == 'v' && file[4] == '/')
  55.     {
  56.       register struct sfile *s = __sfile;
  57.       register char *s1, *s2;
  58.  
  59.       while (s1 = s->name)
  60.     {
  61.       s2 = file + 5;
  62.  
  63.       while (*s1 && *s2 && *s1 == *s2)
  64.         s1++, s2++;
  65.       if (*s1 == *s2)
  66.         break;
  67.       s++;
  68.     }
  69.       dev = s->dev;
  70.     }
  71.   else
  72.     dev = makedev (DEV_RISCOS, 0);
  73.  
  74.   {
  75.     register int i;
  76.  
  77.     if ((i = (*(__dev[major (dev)].open)) (file, mode, f)) < 0)
  78.       return (-1);
  79.     f->dev = makedev (major (dev), i);
  80.   }
  81.  
  82.   f->dup = f;
  83.   f->pid = __u->pid;
  84.  
  85.   return (fd);
  86. }
  87.