function old new delta xgetpty 91 81 -10 ptsname 33 - -33 text data bss dec hex filename 793828 592 6692 801112 c3958 busybox_old 793796 592 6660 801048 c3918 busybox_unstripped
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* vi: set sw=4 ts=4: */
 | 
						|
/*
 | 
						|
 * Mini getpty implementation for busybox
 | 
						|
 * Bjorn Wesen, Axis Communications AB (bjornw@axis.com)
 | 
						|
 *
 | 
						|
 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
 | 
						|
 */
 | 
						|
 | 
						|
#include "libbb.h"
 | 
						|
 | 
						|
#define DEBUG 0
 | 
						|
 | 
						|
int FAST_FUNC xgetpty(char *line)
 | 
						|
{
 | 
						|
	int p;
 | 
						|
 | 
						|
#if ENABLE_FEATURE_DEVPTS
 | 
						|
	p = open("/dev/ptmx", O_RDWR);
 | 
						|
	if (p > 0) {
 | 
						|
		grantpt(p); /* chmod+chown corresponding slave pty */
 | 
						|
		unlockpt(p); /* (what does this do?) */
 | 
						|
#if 0 /* if ptsname_r is not available... */
 | 
						|
		const char *name;
 | 
						|
		name = ptsname(p); /* find out the name of slave pty */
 | 
						|
		if (!name) {
 | 
						|
			bb_perror_msg_and_die("ptsname error (is /dev/pts mounted?)");
 | 
						|
		}
 | 
						|
		safe_strncpy(line, name, GETPTY_BUFSIZE);
 | 
						|
#else
 | 
						|
		/* find out the name of slave pty */
 | 
						|
		if (ptsname_r(p, line, GETPTY_BUFSIZE-1) != 0) {
 | 
						|
			bb_perror_msg_and_die("ptsname error (is /dev/pts mounted?)");
 | 
						|
		}
 | 
						|
		line[GETPTY_BUFSIZE-1] = '\0';
 | 
						|
#endif
 | 
						|
		return p;
 | 
						|
	}
 | 
						|
#else
 | 
						|
	struct stat stb;
 | 
						|
	int i;
 | 
						|
	int j;
 | 
						|
 | 
						|
	strcpy(line, "/dev/ptyXX");
 | 
						|
 | 
						|
	for (i = 0; i < 16; i++) {
 | 
						|
		line[8] = "pqrstuvwxyzabcde"[i];
 | 
						|
		line[9] = '0';
 | 
						|
		if (stat(line, &stb) < 0) {
 | 
						|
			continue;
 | 
						|
		}
 | 
						|
		for (j = 0; j < 16; j++) {
 | 
						|
			line[9] = j < 10 ? j + '0' : j - 10 + 'a';
 | 
						|
			if (DEBUG)
 | 
						|
				fprintf(stderr, "Trying to open device: %s\n", line);
 | 
						|
			p = open(line, O_RDWR | O_NOCTTY);
 | 
						|
			if (p >= 0) {
 | 
						|
				line[5] = 't';
 | 
						|
				return p;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
#endif /* FEATURE_DEVPTS */
 | 
						|
	bb_error_msg_and_die("can't find free pty");
 | 
						|
}
 |