annotate lib/ptsname_r.c @ 16940:f0c9b2dc0596

ptsname_r: Fix test failures on IRIX, Solaris. * m4/ptsname_r.m4 (gl_PREREQ_PTSNAME_R): Test whether isatty sets errno when it fails. Define ISATTY_FAILS_WITHOUT_SETTING_ERRNO accordingly. * lib/ptsname_r.c: Include <fcntl.h>. (__ptsname_r): When isatty returned false, then on IRIX, Solaris set errno if fd is invalid. * tests/test-isatty.c (main): Update comments.
author Bruno Haible <bruno@clisp.org>
date Sun, 24 Jun 2012 17:05:25 +0200
parents 8250f2777afc
children 17843e284264
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16067
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
1 /* Determine name of the slave side of a pseudo-terminal.
16201
8250f2777afc maint: update all copyright year number ranges
Jim Meyering <meyering@redhat.com>
parents: 16067
diff changeset
2 Copyright (C) 1998, 2002, 2010-2012 Free Software Foundation, Inc.
16067
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
3
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
4 This program is free software: you can redistribute it and/or modify
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
6 the Free Software Foundation; either version 3 of the License, or
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
7 (at your option) any later version.
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
8
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
12 GNU General Public License for more details.
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
13
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
16
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
17 #include <config.h>
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
18
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
19 #include <stdlib.h>
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
20
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
21 #include <errno.h>
16940
f0c9b2dc0596 ptsname_r: Fix test failures on IRIX, Solaris.
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
22 #include <fcntl.h>
16067
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
23 #include <string.h>
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
24 #include <sys/stat.h>
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
25 #include <unistd.h>
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
26
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
27 #ifdef _LIBC
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
28 # include <paths.h>
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
29 #else
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
30 # ifndef _PATH_TTY
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
31 # define _PATH_TTY "/dev/tty"
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
32 # endif
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
33 # ifndef _PATH_DEV
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
34 # define _PATH_DEV "/dev/"
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
35 # endif
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
36
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
37 # define __set_errno(e) errno = (e)
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
38 # define __isatty isatty
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
39 # define __stat stat
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
40 # define __ttyname_r ttyname_r
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
41 # define __ptsname_r ptsname_r
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
42
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
43 #endif
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
44
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
45
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
46 /* Store at most BUFLEN characters of the pathname of the slave pseudo
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
47 terminal associated with the master FD is open on in BUF.
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
48 Return 0 on success, otherwise an error number. */
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
49 int
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
50 __ptsname_r (int fd, char *buf, size_t buflen)
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
51 {
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
52 int save_errno = errno;
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
53 int err;
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
54 struct stat st;
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
55
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
56 if (buf == NULL)
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
57 {
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
58 __set_errno (EINVAL);
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
59 return EINVAL;
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
60 }
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
61
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
62 if (!__isatty (fd))
16940
f0c9b2dc0596 ptsname_r: Fix test failures on IRIX, Solaris.
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
63 {
f0c9b2dc0596 ptsname_r: Fix test failures on IRIX, Solaris.
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
64 #if ISATTY_FAILS_WITHOUT_SETTING_ERRNO && defined F_GETFL /* IRIX, Solaris */
f0c9b2dc0596 ptsname_r: Fix test failures on IRIX, Solaris.
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
65 /* Set errno. */
f0c9b2dc0596 ptsname_r: Fix test failures on IRIX, Solaris.
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
66 if (fcntl (fd, F_GETFL) != -1)
f0c9b2dc0596 ptsname_r: Fix test failures on IRIX, Solaris.
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
67 errno = ENOTTY;
f0c9b2dc0596 ptsname_r: Fix test failures on IRIX, Solaris.
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
68 #else
f0c9b2dc0596 ptsname_r: Fix test failures on IRIX, Solaris.
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
69 /* We rely on isatty to set errno properly (i.e. EBADF or ENOTTY). */
f0c9b2dc0596 ptsname_r: Fix test failures on IRIX, Solaris.
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
70 #endif
f0c9b2dc0596 ptsname_r: Fix test failures on IRIX, Solaris.
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
71 return errno;
f0c9b2dc0596 ptsname_r: Fix test failures on IRIX, Solaris.
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
72 }
16067
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
73
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
74 if (buflen < strlen (_PATH_TTY) + 3)
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
75 {
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
76 __set_errno (ERANGE);
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
77 return ERANGE;
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
78 }
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
79
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
80 err = __ttyname_r (fd, buf, buflen);
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
81 if (err != 0)
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
82 {
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
83 __set_errno (err);
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
84 return errno;
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
85 }
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
86
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
87 buf[sizeof (_PATH_DEV) - 1] = 't';
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
88
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
89 if (__stat (buf, &st) < 0)
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
90 return errno;
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
91
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
92 __set_errno (save_errno);
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
93 return 0;
c4b6df81c7b3 ptsname_r: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
94 }