7 |
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
8 |
*/ |
*/ |
9 |
|
|
10 |
/* BB_AUDIT SUSv3 compliant */ |
/* BB_AUDIT SUSv4 compliant */ |
11 |
/* http://www.opengroup.org/onlinepubs/007904975/utilities/tty.html */ |
/* http://www.opengroup.org/onlinepubs/9699919799/utilities/tty.html */ |
12 |
|
|
13 |
#include "libbb.h" |
#include "libbb.h" |
14 |
|
|
15 |
int tty_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
int tty_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
16 |
int tty_main(int argc, char **argv SKIP_INCLUDE_SUSv2(UNUSED_PARAM)) |
int tty_main(int argc UNUSED_PARAM, char **argv) |
17 |
{ |
{ |
18 |
const char *s; |
const char *s; |
19 |
USE_INCLUDE_SUSv2(int silent;) /* Note: No longer relevant in SUSv3. */ |
IF_INCLUDE_SUSv2(int silent;) /* Note: No longer relevant in SUSv3. */ |
20 |
int retval; |
int retval; |
21 |
|
|
22 |
xfunc_error_retval = 2; /* SUSv3 requires > 1 for error. */ |
xfunc_error_retval = 2; /* SUSv3 requires > 1 for error. */ |
23 |
|
|
24 |
USE_INCLUDE_SUSv2(silent = getopt32(argv, "s");) |
IF_INCLUDE_SUSv2(silent = getopt32(argv, "s");) |
25 |
USE_INCLUDE_SUSv2(argc -= optind;) |
IF_INCLUDE_SUSv2(argv += optind;) |
26 |
SKIP_INCLUDE_SUSv2(argc -= 1;) |
IF_NOT_INCLUDE_SUSv2(argv += 1;) |
27 |
|
|
28 |
/* gnu tty outputs a warning that it is ignoring all args. */ |
/* gnu tty outputs a warning that it is ignoring all args. */ |
29 |
bb_warn_ignoring_args(argc); |
bb_warn_ignoring_args(argv[0]); |
30 |
|
|
31 |
retval = 0; |
retval = EXIT_SUCCESS; |
32 |
|
|
33 |
s = ttyname(0); |
s = xmalloc_ttyname(STDIN_FILENO); |
34 |
if (s == NULL) { |
if (s == NULL) { |
35 |
/* According to SUSv3, ttyname can fail with EBADF or ENOTTY. |
/* According to SUSv3, ttyname can fail with EBADF or ENOTTY. |
36 |
* We know the file descriptor is good, so failure means not a tty. */ |
* We know the file descriptor is good, so failure means not a tty. */ |
37 |
s = "not a tty"; |
s = "not a tty"; |
38 |
retval = 1; |
retval = EXIT_FAILURE; |
39 |
} |
} |
40 |
USE_INCLUDE_SUSv2(if (!silent) puts(s);) |
IF_INCLUDE_SUSv2(if (!silent) puts(s);) |
41 |
SKIP_INCLUDE_SUSv2(puts(s);) |
IF_NOT_INCLUDE_SUSv2(puts(s);) |
42 |
|
|
43 |
fflush_stdout_and_exit(retval); |
fflush_stdout_and_exit(retval); |
44 |
} |
} |