svn commit: r367512 - in stable/11: include lib/libc/stdlib

Xin LI delphij at FreeBSD.org
Mon Nov 9 01:56:07 UTC 2020


Author: delphij
Date: Mon Nov  9 01:56:06 2020
New Revision: 367512
URL: https://svnweb.freebsd.org/changeset/base/367512

Log:
  MFC r366781, r366866: Implement ptsname_r.

Modified:
  stable/11/include/stdlib.h
  stable/11/lib/libc/stdlib/Makefile.inc
  stable/11/lib/libc/stdlib/Symbol.map
  stable/11/lib/libc/stdlib/ptsname.3
  stable/11/lib/libc/stdlib/ptsname.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/include/stdlib.h
==============================================================================
--- stable/11/include/stdlib.h	Mon Nov  9 01:55:30 2020	(r367511)
+++ stable/11/include/stdlib.h	Mon Nov  9 01:56:06 2020	(r367512)
@@ -205,7 +205,6 @@ double	 drand48(void);
 double	 erand48(unsigned short[3]);
 /* char	*fcvt(double, int, int * __restrict, int * __restrict); */
 /* char	*gcvt(double, int, int * __restrict, int * __restrict); */
-int	 grantpt(int);
 char	*initstate(unsigned long /* XSI requires u_int */, char *, long);
 long	 jrand48(unsigned short[3]);
 char	*l64a(long);
@@ -217,8 +216,6 @@ char	*mktemp(char *);
 #endif
 long	 mrand48(void);
 long	 nrand48(unsigned short[3]);
-int	 posix_openpt(int);
-char	*ptsname(int);
 int	 putenv(char *);
 long	 random(void);
 unsigned short
@@ -230,8 +227,18 @@ int	 setkey(const char *);
 char	*setstate(/* const */ char *);
 void	 srand48(long);
 void	 srandom(unsigned long);
+#endif /* __XSI_VISIBLE */
+
+#if __XSI_VISIBLE
+int	 grantpt(int);
+int	 posix_openpt(int);
+char	*ptsname(int);
 int	 unlockpt(int);
 #endif /* __XSI_VISIBLE */
+#if __BSD_VISIBLE
+/* ptsname_r will be included in POSIX issue 8 */
+int	 ptsname_r(int, char *, size_t);
+#endif
 
 #if __BSD_VISIBLE
 extern const char *malloc_conf;

Modified: stable/11/lib/libc/stdlib/Makefile.inc
==============================================================================
--- stable/11/lib/libc/stdlib/Makefile.inc	Mon Nov  9 01:55:30 2020	(r367511)
+++ stable/11/lib/libc/stdlib/Makefile.inc	Mon Nov  9 01:56:06 2020	(r367512)
@@ -50,7 +50,7 @@ MLINKS+=hcreate.3 hdestroy.3 hcreate.3 hsearch.3
 MLINKS+=hcreate.3 hcreate_r.3 hcreate.3 hdestroy_r.3 hcreate.3 hsearch_r.3
 MLINKS+=insque.3 remque.3
 MLINKS+=lsearch.3 lfind.3
-MLINKS+=ptsname.3 grantpt.3 ptsname.3 unlockpt.3
+MLINKS+=ptsname.3 grantpt.3 ptsname.3 ptsname_r.3 ptsname.3 unlockpt.3
 MLINKS+=qsort.3 heapsort.3 qsort.3 mergesort.3 qsort.3 qsort_r.3
 MLINKS+=rand.3 rand_r.3 rand.3 srand.3 rand.3 sranddev.3
 MLINKS+=random.3 initstate.3 random.3 setstate.3 random.3 srandom.3 \

Modified: stable/11/lib/libc/stdlib/Symbol.map
==============================================================================
--- stable/11/lib/libc/stdlib/Symbol.map	Mon Nov  9 01:55:30 2020	(r367511)
+++ stable/11/lib/libc/stdlib/Symbol.map	Mon Nov  9 01:56:06 2020	(r367512)
@@ -124,6 +124,10 @@ FBSD_1.5 {
 	set_constraint_handler_s;
 };
 
+FBSD_1.6 {
+	ptsname_r;
+};
+
 FBSDprivate_1.0 {
 	__system;
 	_system;

Modified: stable/11/lib/libc/stdlib/ptsname.3
==============================================================================
--- stable/11/lib/libc/stdlib/ptsname.3	Mon Nov  9 01:55:30 2020	(r367511)
+++ stable/11/lib/libc/stdlib/ptsname.3	Mon Nov  9 01:56:06 2020	(r367512)
@@ -31,12 +31,13 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd August 20, 2008
+.Dd October 17, 2020
 .Dt PTSNAME 3
 .Os
 .Sh NAME
 .Nm grantpt ,
 .Nm ptsname ,
+.Nm ptsname_r ,
 .Nm unlockpt
 .Nd pseudo-terminal access functions
 .Sh LIBRARY
@@ -47,6 +48,8 @@
 .Fn grantpt "int fildes"
 .Ft "char *"
 .Fn ptsname "int fildes"
+.Ft "int"
+.Fn ptsname_r "int fildes" "char *buffer" "size_t buflen"
 .Ft int
 .Fn unlockpt "int fildes"
 .Sh DESCRIPTION
@@ -87,12 +90,23 @@ and
 have been called.
 .Pp
 The
+.Fn ptsname_r
+function is the thread-safe version of
+.Fn ptsname .
+The caller must provide storage for the results of the full pathname of
+the slave device in the
+.Fa buffer
+and
+.Fa bufsize
+arguments.
+.Pp
+The
 .Fn unlockpt
 function clears the lock held on the pseudo-terminal pair
 for the master device specified with
 .Fa fildes .
 .Sh RETURN VALUES
-.Rv -std grantpt unlockpt
+.Rv -std grantpt ptsname_r unlockpt
 .Pp
 The
 .Fn ptsname
@@ -103,7 +117,8 @@ pointer is returned.
 .Sh ERRORS
 The
 .Fn grantpt ,
-.Fn ptsname
+.Fn ptsname ,
+.Fn ptsname_r
 and
 .Fn unlockpt
 functions may fail and set
@@ -116,6 +131,16 @@ is not a valid open file descriptor.
 .It Bq Er EINVAL
 .Fa fildes
 is not a master pseudo-terminal device.
+.El
+.Pp
+In addition, the
+.Fn ptsname_r
+function may set
+.Va errno
+to:
+.Bl -tag -width Er
+.It Bq Er ERANGE
+The buffer was too small.
 .El
 .Pp
 In addition, the

Modified: stable/11/lib/libc/stdlib/ptsname.c
==============================================================================
--- stable/11/lib/libc/stdlib/ptsname.c	Mon Nov  9 01:55:30 2020	(r367511)
+++ stable/11/lib/libc/stdlib/ptsname.c	Mon Nov  9 01:56:06 2020	(r367512)
@@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
 #include <errno.h>
 #include <paths.h>
 #include <stdlib.h>
+#include <string.h>
 #include "un-namespace.h"
 
 /*
@@ -69,23 +70,48 @@ __strong_reference(__isptmaster, grantpt);
 __strong_reference(__isptmaster, unlockpt);
 
 /*
+ * ptsname_r(): return the pathname of the slave pseudo-terminal device
+ *              associated with the specified master.
+ */
+int
+__ptsname_r(int fildes, char *buffer, size_t buflen)
+{
+
+	if (buflen <= sizeof(_PATH_DEV)) {
+		errno = ERANGE;
+		return (-1);
+	}
+
+	/* Make sure fildes points to a master device. */
+	if (__isptmaster(fildes) != 0)
+		return (-1);
+
+	memcpy(buffer, _PATH_DEV, sizeof(_PATH_DEV));
+	buffer += sizeof(_PATH_DEV) - 1;
+	buflen -= sizeof(_PATH_DEV) - 1;
+
+	if (fdevname_r(fildes, buffer, buflen) == NULL) {
+		if (errno == EINVAL)
+			errno = ERANGE;
+		return (-1);
+	}
+
+	return (0);
+}
+
+__strong_reference(__ptsname_r, ptsname_r);
+
+/*
  * ptsname():  return the pathname of the slave pseudo-terminal device
  *             associated with the specified master.
  */
 char *
 ptsname(int fildes)
 {
-	static char pt_slave[sizeof _PATH_DEV + SPECNAMELEN] = _PATH_DEV;
-	char *ret = NULL;
+	static char pt_slave[sizeof(_PATH_DEV) + SPECNAMELEN];
 
-	/* Make sure fildes points to a master device. */
-	if (__isptmaster(fildes) != 0)
-		goto done;
+	if (__ptsname_r(fildes, pt_slave, sizeof(pt_slave)) == 0)
+		return (pt_slave);
 
-	if (fdevname_r(fildes, pt_slave + (sizeof _PATH_DEV - 1),
-	    sizeof pt_slave - (sizeof _PATH_DEV - 1)) != NULL)
-		ret = pt_slave;
-
-done:
-	return (ret);
+	return (NULL);
 }


More information about the svn-src-all mailing list