fix ptsname_r to conform to the upcoming posix requirements
authorRich Felker <dalias@aerifal.cx>
Wed, 20 Jun 2012 19:11:27 +0000 (15:11 -0400)
committerRich Felker <dalias@aerifal.cx>
Wed, 20 Jun 2012 19:11:27 +0000 (15:11 -0400)
it should return the error code rather than 0/-1 and setting errno.

src/misc/ptsname.c
src/misc/pty.c

index 4f56781..a347792 100644 (file)
@@ -1,9 +1,15 @@
 #include <stdlib.h>
+#include <errno.h>
 
 int __ptsname_r(int, char *, size_t);
 
 char *ptsname(int fd)
 {
        static char buf[9 + sizeof(int)*3 + 1];
-       return __ptsname_r(fd, buf, sizeof buf) < 0 ? 0 : buf;
+       int err = __ptsname_r(fd, buf, sizeof buf);
+       if (err) {
+               errno = err;
+               return 0;
+       }
+       return buf;
 }
index 6ca33e3..9e201ef 100644 (file)
@@ -2,7 +2,9 @@
 #include <sys/ioctl.h>
 #include <stdio.h>
 #include <fcntl.h>
+#include <errno.h>
 #include "libc.h"
+#include "syscall.h"
 
 int posix_openpt(int flags)
 {
@@ -22,10 +24,11 @@ int unlockpt(int fd)
 
 int __ptsname_r(int fd, char *buf, size_t len)
 {
-       int pty;
+       int pty, err;
        if (!buf) len = 0;
-       return -( ioctl (fd, TIOCGPTN, &pty) < 0
-               || snprintf(buf, len, "/dev/pts/%d", pty) >= len );
+       if ((err = __syscall(SYS_ioctl, fd, TIOCGPTN, &pty))) return err;
+       if (snprintf(buf, len, "/dev/pts/%d", pty) >= len) return ERANGE;
+       return 0;
 }
 
 weak_alias(__ptsname_r, ptsname_r);