Loading...
stdlib/FreeBSD/grantpt.c.patch /dev/null Libc-391
--- /dev/null
+++ Libc/Libc-391/stdlib/FreeBSD/grantpt.c.patch
@@ -0,0 +1,71 @@
+--- grantpt.c.orig	2004-09-14 19:06:46.000000000 -0700
++++ grantpt.c	2004-09-14 19:11:31.000000000 -0700
+@@ -54,18 +54,16 @@
+ #include <unistd.h>
+ #include "un-namespace.h"
+ 
+-#define PTM_MAJOR	6	/* pseudo tty master major */
+-#define PTS_MAJOR	5	/* pseudo tty slave major */
+ #define PTM_PREFIX	"pty"	/* pseudo tty master naming convention */
+ #define PTS_PREFIX	"tty"	/* pseudo tty slave naming convention */
+ 
+ /*
+  * The following are range values for pseudo TTY devices.  Pseudo TTYs have a
+- * name of /dev/[pt]ty[p-sP-S][0-9a-v], yielding 256 combinations per major.
++ * name of /dev/[pt]ty[p-w][0-9a-f], yielding 128 combinations per major.
+  */
+-#define PT_MAX		256
+-#define	PT_DEV1		"pqrsPQRS"
+-#define PT_DEV2		"0123456789abcdefghijklmnopqrstuv"
++#define PT_MAX		128
++#define	PT_DEV1		"pqrstuvw"
++#define PT_DEV2		"0123456789abcdef"
+ 
+ /*
+  * grantpt(3) support utility.
+@@ -73,11 +71,32 @@
+ #define _PATH_PTCHOWN	"/usr/libexec/pt_chown"
+ 
+ /*
++ * On Mac OS X, the major device number may not be the same between reboots.
++ * So we need to determine the major device number the first time.
++ */
++#define	_PATH_A_PTY	(_PATH_DEV PTM_PREFIX "p0")
++
++static int _ptm_major = -1;
++
++static int
++_init_major(void)
++{
++	struct stat st;
++
++	if (_ptm_major >= 0)
++		return _ptm_major;
++	if (stat(_PATH_A_PTY, &st) < 0)
++		return -1; /* should never happen */
++	_ptm_major = major(st.st_rdev);
++	return _ptm_major;
++}
++/*
+  * ISPTM(x) returns 0 for struct stat x if x is not a pty master.
+  * The bounds checking may be unnecessary but it does eliminate doubt.
+  */
+-#define ISPTM(x)	(S_ISCHR((x).st_mode) && 			\
+-			 major((x).st_rdev) == PTM_MAJOR &&		\
++#define ISPTM(x)	(_init_major() >= 0 &&				\
++			 S_ISCHR((x).st_mode) && 			\
++			 major((x).st_rdev) == _ptm_major &&		\
+ 			 minor((x).st_rdev) >= 0 &&			\
+ 			 minor((x).st_rdev) < PT_MAX)
+ 
+@@ -227,8 +246,8 @@
+ 			errno = EINVAL;
+ 		else {
+ 			(void)sprintf(slave, _PATH_DEV PTS_PREFIX "%c%c",
+-				      PT_DEV1[minor(sbuf.st_rdev) / 32],
+-				      PT_DEV2[minor(sbuf.st_rdev) % 32]);
++				      PT_DEV1[minor(sbuf.st_rdev) / 16],
++				      PT_DEV2[minor(sbuf.st_rdev) % 16]);
+ 			retval = slave;
+ 		}
+ 	}