diff --git a/utils/.gitignore b/utils/.gitignore index d98bf221..c728d71d 100644 --- a/utils/.gitignore +++ b/utils/.gitignore @@ -49,6 +49,7 @@ time touch tr true +tty type uname uniq diff --git a/utils/Makefile b/utils/Makefile index 72ef8944..057e88a0 100644 --- a/utils/Makefile +++ b/utils/Makefile @@ -60,6 +60,7 @@ time \ touch \ tr \ true \ +tty \ type \ uname \ uniq \ diff --git a/utils/tty.c b/utils/tty.c new file mode 100644 index 00000000..48bbdd3d --- /dev/null +++ b/utils/tty.c @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2014, 2015 Jonas 'Sortie' Termansen. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * tty.c + * Print terminal's name. + */ + +#include +#include +#include +#include +#include + +static void compact_arguments(int* argc, char*** argv) +{ + for ( int i = 0; i < *argc; i++ ) + { + while ( i < *argc && !(*argv)[i] ) + { + for ( int n = i; n < *argc; n++ ) + (*argv)[n] = (*argv)[n+1]; + (*argc)--; + } + } +} + +int main(int argc, char* argv[]) +{ + for ( int i = 1; i < argc; i++ ) + { + const char* arg = argv[i]; + if ( arg[0] != '-' || !arg[1] ) + continue; + argv[i] = NULL; + if ( !strcmp(arg, "--") ) + break; + if ( arg[1] != '-' ) + { + char c; + while ( (c = *++arg) ) switch ( c ) + { + default: + errx(2, "unknown option -- '%c'", c); + } + } + else + errx(2, "unknown option: %s", arg); + } + + compact_arguments(&argc, &argv); + + if ( 1 < argc ) + errx(1, "unexpected extra operand"); + + char* name = ttyname(0); + if ( !name && errno != ENOTTY ) + err(2, "ttyname"); + puts(name ? name : "not a tty"); + if ( ferror(stdout) || fflush(stdout) == EOF ) + return 2; + return name ? 1 : 0; +}