Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F136521707
D26647.id78340.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D26647.id78340.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D26647: Implement ptsname_r.
Attached
Detach File
Event Timeline
Log In to Comment