svn commit: r367510 - in stable/12: include lib/libc/stdlib
Xin LI
delphij at FreeBSD.org
Mon Nov 9 01:52:17 UTC 2020
Author: delphij
Date: Mon Nov 9 01:52:15 2020
New Revision: 367510
URL: https://svnweb.freebsd.org/changeset/base/367510
Log:
MFC r366781, r366866: Implement ptsname_r.
Modified:
stable/12/include/stdlib.h
stable/12/lib/libc/stdlib/Makefile.inc
stable/12/lib/libc/stdlib/Symbol.map
stable/12/lib/libc/stdlib/ptsname.3
stable/12/lib/libc/stdlib/ptsname.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/include/stdlib.h
==============================================================================
--- stable/12/include/stdlib.h Mon Nov 9 01:41:55 2020 (r367509)
+++ stable/12/include/stdlib.h Mon Nov 9 01:52:15 2020 (r367510)
@@ -207,7 +207,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 int, char *, size_t);
long jrand48(unsigned short[3]);
char *l64a(long);
@@ -219,8 +218,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
@@ -228,8 +225,18 @@ unsigned short
char *setstate(/* const */ char *);
void srand48(long);
void srandom(unsigned int);
+#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/12/lib/libc/stdlib/Makefile.inc
==============================================================================
--- stable/12/lib/libc/stdlib/Makefile.inc Mon Nov 9 01:41:55 2020 (r367509)
+++ stable/12/lib/libc/stdlib/Makefile.inc Mon Nov 9 01:52:15 2020 (r367510)
@@ -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/12/lib/libc/stdlib/Symbol.map
==============================================================================
--- stable/12/lib/libc/stdlib/Symbol.map Mon Nov 9 01:41:55 2020 (r367509)
+++ stable/12/lib/libc/stdlib/Symbol.map Mon Nov 9 01:52:15 2020 (r367510)
@@ -124,6 +124,10 @@ FBSD_1.5 {
set_constraint_handler_s;
};
+FBSD_1.6 {
+ ptsname_r;
+};
+
FBSDprivate_1.0 {
__system;
_system;
Modified: stable/12/lib/libc/stdlib/ptsname.3
==============================================================================
--- stable/12/lib/libc/stdlib/ptsname.3 Mon Nov 9 01:41:55 2020 (r367509)
+++ stable/12/lib/libc/stdlib/ptsname.3 Mon Nov 9 01:52:15 2020 (r367510)
@@ -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/12/lib/libc/stdlib/ptsname.c
==============================================================================
--- stable/12/lib/libc/stdlib/ptsname.c Mon Nov 9 01:41:55 2020 (r367509)
+++ stable/12/lib/libc/stdlib/ptsname.c Mon Nov 9 01:52:15 2020 (r367510)
@@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$");
#include <errno.h>
#include <paths.h>
#include <stdlib.h>
+#include <string.h>
#include "un-namespace.h"
/*
@@ -71,23 +72,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-stable-12
mailing list