83 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* $Id$ */
 | |
| #ifdef __USG
 | |
| /*	system V, so no /etc/ttys file. In this case, scan the
 | |
| 	/etc/utmp file
 | |
| */
 | |
| struct utmp {
 | |
| 	char ut_name[8];
 | |
| 	char ut_id[4];
 | |
| 	char ut_line[12];
 | |
| 	short ut_pid;
 | |
| 	short ut_type;
 | |
| 	struct exit_status {
 | |
| 		short e_termination;
 | |
| 		short e_exit;
 | |
| 	} ut_exit;
 | |
| 	long ut_time;
 | |
| };
 | |
| #define FILENAME "/etc/utmp"
 | |
| #else
 | |
| #define FILENAME "/etc/ttys"
 | |
| #endif
 | |
| 
 | |
| char    *ttyname();
 | |
| char    *rindex();
 | |
| 
 | |
| ttyslot()
 | |
| {
 | |
| 	register char *tp, *p;
 | |
| 	int fd;
 | |
| 	int retval = 1;
 | |
| #ifdef __USG
 | |
| 	struct utmp buf;
 | |
| #else
 | |
| 	char buf[32];
 | |
| #endif
 | |
| 
 | |
| 	if (! (tp=ttyname(0)) && ! (tp=ttyname(1)) && !(tp=ttyname(2)))
 | |
| 		return 0;
 | |
| 	if (! (p = rindex(tp, '/')))
 | |
| 		p = tp;
 | |
| 	else
 | |
| 		p++;
 | |
| 	if ((fd = open(FILENAME, 0)) < 0) return 0;
 | |
| #ifdef __USG
 | |
| 	while (read(fd, (char *) &buf, sizeof(buf)) == sizeof(buf)) {
 | |
| 		/* processes associated with a terminal ...
 | |
| 		   unfortunately we cannot use the include file because
 | |
| 		   some systems have a different one ...
 | |
| 		   INIT_PROCESS, DEAD_PROCESS, USER_PROCESS, LOGIN_PROCESS
 | |
| 		*/
 | |
| 		if ((buf.ut_type >= 5 && buf.ut_type <= 8) &&
 | |
| 		    ! strncmp(buf.ut_line, p, sizeof(buf.ut_line))) {
 | |
| 			close(fd);
 | |
| 			return retval;
 | |
| 		}
 | |
| 		retval++;
 | |
| 	}
 | |
| 	close(fd);
 | |
| 	return 0;
 | |
| #else
 | |
| 	for (;;) {
 | |
| 		tp = buf;
 | |
| 		for (;;tp++) {
 | |
| 			if (read(fd, tp, 1) != 1) {
 | |
| 				close(fd);
 | |
| 				return 0;
 | |
| 			}
 | |
| 			if (*tp == '\n' || tp >= &buf[31]) {
 | |
| 				*tp = 0;
 | |
| 				if (tp < buf+2) buf[2] = '\0';
 | |
| 				tp = buf+2;
 | |
| 				break;
 | |
| 			}
 | |
| 		}
 | |
| 		if (! strcmp(p, tp)) {
 | |
| 			close(fd);
 | |
| 			return retval;
 | |
| 		}
 | |
| 		retval++;
 | |
| 	}
 | |
| 	/*NOTREACHED*/
 | |
| #endif
 | |
| }
 |