mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			167 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * PROJECT C Library, X68000 PROGRAMMING INTERFACE DEFINITION
 | |
|  * --------------------------------------------------------------------
 | |
|  * This file is written by the Project C Library Group,  and completely
 | |
|  * in public domain. You can freely use, copy, modify, and redistribute
 | |
|  * the whole contents, without this notice.
 | |
|  * --------------------------------------------------------------------
 | |
|  * $Id$
 | |
|  */
 | |
| 
 | |
| #ifndef __IOCS_INLINE__
 | |
| #define __IOCS_INLINE__
 | |
| #define __DOS_INLINE__
 | |
| #define __DOS_DOSCALL__
 | |
| #endif
 | |
| 
 | |
| /* System headers */
 | |
| #include <errno.h>
 | |
| #include <fcntl.h>
 | |
| #include <string.h>
 | |
| #include <sys/dos.h>
 | |
| #include <sys/iocs.h>
 | |
| #include <sys/time.h>
 | |
| #include <sys/types.h>
 | |
| #if 0
 | |
| #include <sys/select.h>
 | |
| #include <sys/xsocket.h>
 | |
| #endif
 | |
| #include <sys/xunistd.h>
 | |
| 
 | |
| /* Macros */
 | |
| #define XFD_ISSET(fd,fds) ((fds) && FD_ISSET ((fd), (fds)))
 | |
| #define isreadable(mode)  ((mode) == O_RDONLY || (mode) == O_RDWR)
 | |
| #define iswritable(mode)  ((mode) == O_WRONLY || (mode) == O_RDWR)
 | |
| #ifndef _POSIX_FD_SETSIZE
 | |
| #define _POSIX_FD_SETSIZE OPEN_MAX
 | |
| #endif
 | |
| 
 | |
| /* Functions */
 | |
| int
 | |
| select (int fds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *timeout)
 | |
| {
 | |
|   fd_set oread, owrite, oexcept;
 | |
|   int ticks, start;
 | |
|   int nfds;
 | |
| 
 | |
|   if (fds > _POSIX_FD_SETSIZE)
 | |
|     {
 | |
|       errno = EINVAL;
 | |
|       return -1;
 | |
|     }
 | |
| 
 | |
|   FD_ZERO (&oread);
 | |
|   FD_ZERO (&owrite);
 | |
|   FD_ZERO (&oexcept);
 | |
| 
 | |
|   nfds = 0;
 | |
|   ticks = -1;
 | |
| 
 | |
|   if (timeout)
 | |
|     {
 | |
|       ticks = timeout->tv_sec * 100 + timeout->tv_usec / 10000;
 | |
|       if (ticks < 0)
 | |
| 	{
 | |
| 	  errno = EINVAL;
 | |
| 	  return -1;
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|   start = _iocs_ontime ();
 | |
|   for (;;)
 | |
|     {
 | |
|       {
 | |
| 	int fd;
 | |
| 	
 | |
| 	for (fd = 0; fd < fds; fd++)
 | |
| 	  {
 | |
| 	    int accmode;
 | |
| 	    
 | |
| 	    if (_fddb[fd].inuse == _FD_NOTUSED)
 | |
| 	      continue;
 | |
| 	    
 | |
| 	    accmode = _fddb[fd].oflag & O_ACCMODE;
 | |
| 	    
 | |
| 	    if (isatty (fd))
 | |
| 	      {
 | |
| 		if (XFD_ISSET (fd, rfds) && isreadable (accmode) && _dos_k_keysns ())
 | |
| 		  {
 | |
| 		    FD_SET (fd, &oread);
 | |
| 		    nfds++;
 | |
| 		  }
 | |
| 		
 | |
| 		if (XFD_ISSET (fd, wfds) && iswritable (accmode))
 | |
| 		  {
 | |
| 		    FD_SET (fd, &owrite);
 | |
| 		    nfds++;
 | |
| 		  }
 | |
| 	      }
 | |
| #if 0
 | |
| 	    else if (_fddb[fd].sockno >= 0)
 | |
| 	      {
 | |
| 		if (XFD_ISSET (fd, rfds) && _socklen (_fddb[fd].sockno, 0))
 | |
| 		  {
 | |
| 		    FD_SET (fd, &oread);
 | |
| 		    nfds++;
 | |
| 		  }
 | |
| 
 | |
| 		if (XFD_ISSET (fd, wfds) /* && _socklen (_fddb[fd].sockno, 1) == 0 */)
 | |
| 		  {
 | |
| 		    FD_SET (fd, &owrite);
 | |
| 		    nfds++;
 | |
| 		  }
 | |
| 	      }
 | |
| #endif
 | |
| 	    else
 | |
| 	      {
 | |
| 		if (XFD_ISSET (fd, rfds) && isreadable (accmode) && _dos_ioctrlis (fd))
 | |
| 		  {
 | |
| 		    FD_SET (fd, &oread);
 | |
| 		    nfds++;
 | |
| 		  }
 | |
| 		
 | |
| 		if (XFD_ISSET (fd, wfds) && iswritable (accmode) && _dos_ioctrlos (fd))
 | |
| 		  {
 | |
| 		    FD_SET (fd, &owrite);
 | |
| 		    nfds++;
 | |
| 		  }
 | |
| 	      }
 | |
| 	  }
 | |
|       }
 | |
| 
 | |
|       {
 | |
| 	int rest;
 | |
| 	
 | |
| 	if ((rest = (_iocs_ontime () - start) % 8640000) < 0)
 | |
| 	  rest += 8640000;
 | |
| 	
 | |
| 	if (nfds != 0)
 | |
| 	  {
 | |
| 	    if (ticks >= 0)
 | |
| 	      {
 | |
| 		int left;
 | |
| 		
 | |
| 		if ((left = ticks - rest) < 0)
 | |
| 		  left = 0;
 | |
| 		
 | |
| 		timeout->tv_sec = left / 100;
 | |
| 		timeout->tv_usec = (left % 100) * 10000;
 | |
| 	      }
 | |
| 	    
 | |
| 	    if (rfds)
 | |
| 	      *rfds = oread;
 | |
| 	    if (wfds)
 | |
| 	      *wfds = owrite;
 | |
| 	    if (efds)
 | |
| 	      *efds = oexcept;
 | |
| 	    
 | |
| 	    return nfds;
 | |
| 	  }
 | |
| 	
 | |
| 	if (ticks >= 0 && rest > ticks)
 | |
| 	  return 0;
 | |
|       }
 | |
| 
 | |
|       _dos_change_pr ();
 | |
|     }
 | |
| }
 | 
