From b352d773bd52eac1d486b68bfd5b0545b0857073 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 8 Jun 2021 01:27:08 +0200 Subject: [PATCH] ptsname_r: Add support for DragonFly BSD 6.0. * lib/ptsname_r.c (__ptsname_r): Add implementation for DragonFly BSD. * tests/test-ptsname_r.c (main): Treat Dragonfly BSD like Solaris. --- ChangeLog | 6 ++++++ lib/ptsname_r.c | 34 ++++++++++++++++++++++++++++++++++ tests/test-ptsname_r.c | 5 +++-- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index f1eaf5bd39..6ca3a6c1ae 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2021-06-07 Bruno Haible + + ptsname_r: Add support for DragonFly BSD 6.0. + * lib/ptsname_r.c (__ptsname_r): Add implementation for DragonFly BSD. + * tests/test-ptsname_r.c (main): Treat Dragonfly BSD like Solaris. + 2021-06-07 Bruno Haible Avoid some test failures on DragonFly BSD 6.0. diff --git a/lib/ptsname_r.c b/lib/ptsname_r.c index fc93912426..4043916374 100644 --- a/lib/ptsname_r.c +++ b/lib/ptsname_r.c @@ -70,6 +70,10 @@ # include #endif +#if defined __DragonFly__ +/* Get fdevname_r(). */ +# include +#endif /* Store at most BUFLEN characters of the pathname of the slave pseudo terminal associated with the master FD is open on in BUF. @@ -84,6 +88,36 @@ __ptsname_r (int fd, char *buf, size_t buflen) return 0; else return errno; +#elif defined __DragonFly__ + int save_errno = errno; + char tmpbuf[5 + 4 + 10 + 1]; + int ret; + int n; + if (buf == NULL) + { + errno = EINVAL; + return errno; + } + /* The result of fdevname_r is typically of the form ptm/N. */ + ret = fdevname_r (fd, tmpbuf + 5, sizeof (tmpbuf) - 5); + if (ret < 0 || strncmp (tmpbuf + 5, "ptm/", 4) != 0) + { + errno = ENOTTY; + return errno; + } + /* Turn it into /dev/pts/N. */ + memcpy (tmpbuf, "/dev/pts/", 5 + 4); + n = strlen (tmpbuf); + if (n >= buflen) + { + errno = ERANGE; + return errno; + } + memcpy (buf, tmpbuf, n + 1); + /* Don't do a final stat(), since the file name /dev/pts/N does not actually + exist. */ + errno = save_errno; + return 0; #else int save_errno = errno; struct stat st; diff --git a/tests/test-ptsname_r.c b/tests/test-ptsname_r.c index 21551d2e99..73d8c41cec 100644 --- a/tests/test-ptsname_r.c +++ b/tests/test-ptsname_r.c @@ -151,9 +151,10 @@ main (void) close (fd); } -#if defined __sun +#if defined __sun || defined __DragonFly__ /* Solaris has BSD-style /dev/pty[p-r][0-9a-f] files, but the function - ptsname() does not work on them. */ + ptsname() does not work on them. + DragonFly BSD has only /dev/ptmx. */ { int fd; char buffer[256]; -- 2.39.5