Page MenuHomeFreeBSD

D26647.id78340.diff
No OneTemporary

D26647.id78340.diff

Index: head/include/stdlib.h
===================================================================
--- head/include/stdlib.h
+++ head/include/stdlib.h
@@ -225,6 +225,7 @@
long nrand48(unsigned short[3]);
int posix_openpt(int);
char *ptsname(int);
+int ptsname_r(int, char *, size_t);
int putenv(char *);
long random(void);
unsigned short
Index: head/lib/libc/stdlib/Makefile.inc
===================================================================
--- head/lib/libc/stdlib/Makefile.inc
+++ head/lib/libc/stdlib/Makefile.inc
@@ -50,7 +50,7 @@
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 \
qsort.3 qsort_s.3
MLINKS+=rand.3 rand_r.3 rand.3 srand.3
Index: head/lib/libc/stdlib/Symbol.map
===================================================================
--- head/lib/libc/stdlib/Symbol.map
+++ head/lib/libc/stdlib/Symbol.map
@@ -125,6 +125,7 @@
qsort_s;
rand;
srand;
+ ptsname_r;
};
FBSDprivate_1.0 {
Index: head/lib/libc/stdlib/ptsname.3
===================================================================
--- head/lib/libc/stdlib/ptsname.3
+++ head/lib/libc/stdlib/ptsname.3
@@ -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 @@
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 @@
.Sh ERRORS
The
.Fn grantpt ,
-.Fn ptsname
+.Fn ptsname ,
+.Fn ptsname_r
and
.Fn unlockpt
functions may fail and set
@@ -116,6 +131,16 @@
.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
Index: head/lib/libc/stdlib/ptsname.c
===================================================================
--- head/lib/libc/stdlib/ptsname.c
+++ head/lib/libc/stdlib/ptsname.c
@@ -41,6 +41,7 @@
#include <errno.h>
#include <paths.h>
#include <stdlib.h>
+#include <string.h>
#include "un-namespace.h"
/*
@@ -71,23 +72,46 @@
__strong_reference(__isptmaster, unlockpt);
/*
- * ptsname(): return the pathname of the slave pseudo-terminal device
- * associated with the specified master.
+ * ptsname_r(): return the pathname of the slave pseudo-terminal device
+ * associated with the specified master.
*/
-char *
-ptsname(int fildes)
+int
+ptsname_r(int fildes, char *buffer, size_t buflen)
{
- static char pt_slave[sizeof _PATH_DEV + SPECNAMELEN] = _PATH_DEV;
- char *ret = NULL;
+ if (buflen <= sizeof(_PATH_DEV)) {
+ errno = ERANGE;
+ return (-1);
+ }
+
/* Make sure fildes points to a master device. */
if (__isptmaster(fildes) != 0)
- goto done;
+ return (-1);
- if (fdevname_r(fildes, pt_slave + (sizeof _PATH_DEV - 1),
- sizeof pt_slave - (sizeof _PATH_DEV - 1)) != NULL)
- ret = pt_slave;
+ memcpy(buffer, _PATH_DEV, sizeof(_PATH_DEV));
+ buffer += sizeof(_PATH_DEV) - 1;
+ buflen -= sizeof(_PATH_DEV) - 1;
-done:
- return (ret);
+ if (fdevname_r(fildes, buffer, buflen) == NULL) {
+ if (errno == EINVAL)
+ errno = ERANGE;
+ return (-1);
+ }
+
+ return (0);
+}
+
+/*
+ * 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];
+
+ if (ptsname_r(fildes, pt_slave, sizeof(pt_slave)) == 0)
+ return (pt_slave);
+ else
+ return (NULL);
}

File Metadata

Mime Type
text/plain
Expires
Wed, Nov 19, 4:02 AM (4 h, 58 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25591821
Default Alt Text
D26647.id78340.diff (4 KB)

Event Timeline