summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/pathnames.h2
-rw-r--r--include/ttyutils.h1
-rw-r--r--lib/ttyutils.c27
3 files changed, 21 insertions, 9 deletions
diff --git a/include/pathnames.h b/include/pathnames.h
index bd29b640a..ee470ee4b 100644
--- a/include/pathnames.h
+++ b/include/pathnames.h
@@ -95,6 +95,8 @@
#define _PATH_PROC_GIDMAP "/proc/self/gid_map"
#define _PATH_PROC_SETGROUPS "/proc/self/setgroups"
+#define _PATH_PROC_FDDIR "/proc/self/fd"
+
#define _PATH_PROC_ATTR_CURRENT "/proc/self/attr/current"
#define _PATH_PROC_ATTR_EXEC "/proc/self/attr/exec"
#define _PATH_PROC_CAPLASTCAP "/proc/sys/kernel/cap_last_cap"
diff --git a/include/ttyutils.h b/include/ttyutils.h
index af979159a..f164a580f 100644
--- a/include/ttyutils.h
+++ b/include/ttyutils.h
@@ -81,6 +81,7 @@ struct chardata {
extern int get_terminal_dimension(int *cols, int *lines);
extern int get_terminal_width(int default_width);
extern int get_terminal_type(const char **type);
+extern int get_terminal_stdfd(void);
extern int get_terminal_name(const char **path, const char **name,
const char **number);
diff --git a/lib/ttyutils.c b/lib/ttyutils.c
index 00a7903ca..166e49e11 100644
--- a/lib/ttyutils.c
+++ b/lib/ttyutils.c
@@ -69,6 +69,18 @@ int get_terminal_width(int default_width)
return width > 0 ? width : default_width;
}
+int get_terminal_stdfd(void)
+{
+ if (isatty(STDIN_FILENO))
+ return STDIN_FILENO;
+ else if (isatty(STDOUT_FILENO))
+ return STDOUT_FILENO;
+ else if (isatty(STDERR_FILENO))
+ return STDERR_FILENO;
+
+ return -EINVAL;
+}
+
int get_terminal_name(const char **path,
const char **name,
const char **number)
@@ -85,21 +97,18 @@ int get_terminal_name(const char **path,
if (number)
*number = NULL;
- if (isatty(STDIN_FILENO))
- fd = STDIN_FILENO;
- else if (isatty(STDOUT_FILENO))
- fd = STDOUT_FILENO;
- else if (isatty(STDERR_FILENO))
- fd = STDERR_FILENO;
- else
- return -1;
+ fd = get_terminal_stdfd();
+ if (fd < 0)
+ return fd; /* error */
tty = ttyname(fd);
if (!tty)
return -1;
+
if (path)
*path = tty;
- tty = strncmp(tty, "/dev/", 5) == 0 ? tty + 5 : tty;
+ if (name || number)
+ tty = strncmp(tty, "/dev/", 5) == 0 ? tty + 5 : tty;
if (name)
*name = tty;
if (number) {