home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / sps3 / part02 / inittty.c < prev    next >
C/C++ Source or Header  |  1992-05-08  |  4KB  |  143 lines

  1. # ifndef lint
  2. static char SccsId[] =  "@(#)inittty.c    1.1\t10/1/88" ;
  3. # endif
  4.  
  5. # include       "sps.h"
  6. # include       <h/conf.h>
  7. # include       <h/ioctl.h>
  8. # ifdef SUNOS40
  9. # include       <h/stream.h>
  10. # else
  11. # include       <h/tty.h>
  12. # endif
  13. # include       <sys/stat.h>
  14. # include       <stdio.h>
  15.  
  16. /* INITTTY - Initialise the tty part of the info structure */
  17. inittty ()
  18. {
  19.     register struct ttyline *lp ;
  20. # ifdef BSD42
  21.     register struct direct  *dp ;
  22.     DIR                     *dfd ;
  23. # else
  24.     struct direct           dir ;
  25.     FILE                    *dfd ;
  26. # endif
  27.     struct stat             statbuf ;
  28.     static char             filedev[] = FILE_DEV ;
  29.     extern struct info      Info ;
  30. # ifdef BSD42
  31.     DIR                     *opendir() ;
  32.     struct direct           *readdir() ;
  33. # else
  34.     FILE                    *fopen() ;
  35. # endif
  36.  
  37.     lp = Info.i_ttyline ;
  38. # ifdef BSD42
  39.     if ( !(dfd = opendir( filedev )) )
  40. # else
  41.     if ( !(dfd = fopen( filedev, "r" )) )
  42. # endif
  43.         prexit( "Can't open %s\n", filedev ) ;
  44.     if ( chdir( filedev ) < 0 )
  45.         prexit( "sps - Can't chdir to %s\n", filedev ) ;
  46. # ifdef BSD42
  47.     /* Read all entries in the device directory, looking for ttys */
  48.     while ( dp = readdir( dfd ) )
  49.     {       /* Skip entries that do not match "tty" or "console" */
  50.         if ( strncmp( "tty", dp->d_name, 3 )
  51.         &&   strcmp( "console", dp->d_name ) )
  52.             continue ;
  53.         /* Skip "tty" itself */
  54.         if ( dp->d_namlen == 3 )
  55.             continue ;
  56. # ifdef CHAOS
  57.         /* Skip chaos ttys ; they are accessed during ttystatus() */
  58.         if ( dp->d_namelen > 3 &&
  59.         dp->d_name[ sizeof( "tty" ) - 1 ] == 'C' )
  60.             continue ;
  61. # endif
  62.         if ( lp >= &Info.i_ttyline[ MAXTTYS ] )
  63.             prexit( "sps - Too many ttys in %s\n", filedev ) ;
  64.         /* Copy the tty name into the information entry */
  65.         if ( !strcmp( dp->d_name, "console" ) )
  66.         {
  67.             lp->l_name[0] = 'c' ;
  68.             lp->l_name[1] = 'o' ;
  69.         }
  70.         else
  71.         {
  72.             lp->l_name[0] = dp->d_name[3] ;
  73.             lp->l_name[1] = dp->d_name[4] ;
  74.         }
  75.         /* Ensure that this tty is actually a valid character device */
  76.         if ( stat( dp->d_name, &statbuf ) < 0 )
  77.             continue ;
  78. # else
  79.     /* Read all entries in the device directory, looking for ttys */
  80.     while ( fread( (char*)&dir, sizeof( struct direct ), 1, dfd ) == 1 )
  81.     {       /* Skip entries that do not match "tty" or "console" */
  82.         if ( strncmp( "tty", dir.d_name, 3 )
  83.         &&   strcmp( "console", dir.d_name ) )
  84.             continue ;
  85.         /* Skip "tty" itself */
  86.         if ( dir.d_name[3] == '\0' )
  87.             continue ;
  88. # ifdef CHAOS
  89.         /* Skip chaos ttys ; they are accessed during ttystatus() */
  90.         if ( dir.d_name[ sizeof( "tty" ) - 1 ] == 'C' )
  91.             continue ;
  92. # endif
  93.         if ( lp >= &Info.i_ttyline[ MAXTTYS ] )
  94.             prexit( "sps - Too many ttys in %s\n", filedev ) ;
  95.         /* Copy the tty name into the information entry */
  96.         if ( !strcmp( dir.d_name, "console" ) )
  97.         {
  98.             lp->l_name[0] = 'c' ;
  99.             lp->l_name[1] = 'o' ;
  100.         }
  101.         else
  102.         {
  103.             lp->l_name[0] = dir.d_name[3] ;
  104.             lp->l_name[1] = dir.d_name[4] ;
  105.         }
  106.         /* Ensure that this tty is actually a valid character device */
  107.         if ( stat( dir.d_name, &statbuf ) < 0 )
  108.             continue ;
  109. # endif
  110.         if ( (statbuf.st_mode & S_IFMT) != S_IFCHR )
  111.             continue ;
  112.         /* Find the device # of the tty and the address of its
  113.            associated struct tty in /dev/kmem. */
  114.         lp->l_dev = statbuf.st_rdev ;
  115.         if ( getkmem ( (long)&Info.i_cdevsw[ major( statbuf.st_rdev ) ]
  116. # ifdef SUNOS40
  117.             .d_str,
  118. # else
  119.             .d_ttys,
  120. # endif
  121.         (char*)&lp->l_addr, sizeof( lp->l_addr ) )
  122.         != sizeof( lp->l_addr ) )
  123.         {
  124.             fprintf( stderr, "sps - Can't read struct tty for %s\n",
  125. # ifdef BSD42
  126.                 dp->d_name ) ;
  127. # else
  128.                 dir.d_name ) ;
  129. # endif
  130.             continue ;
  131.         }
  132. # ifndef SUNOS40
  133.         lp->l_addr += (int)minor( statbuf.st_rdev ) ;
  134. # endif
  135.         lp++ ;
  136.     }
  137. # ifdef BSD42
  138.     (void)closedir( dfd ) ;
  139. # else
  140.     (void)fclose( dfd ) ;
  141. # endif
  142. }
  143.