From 057609ee6c99e8f5884363feffce1f30f1e5c643 Mon Sep 17 00:00:00 2001 From: Nicholas De Nova Date: Sun, 16 Oct 2016 11:27:35 -0500 Subject: [PATCH] Add logname(1). --- utils/.gitignore | 1 + utils/Makefile | 2 ++ utils/logname.1 | 17 ++++++++++ utils/logname.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 102 insertions(+) create mode 100644 utils/logname.1 create mode 100644 utils/logname.c diff --git a/utils/.gitignore b/utils/.gitignore index cdcca689..d98bf221 100644 --- a/utils/.gitignore +++ b/utils/.gitignore @@ -25,6 +25,7 @@ help kernelinfo kill ln +logname ls memstat mkdir diff --git a/utils/Makefile b/utils/Makefile index fb58a6e8..72ef8944 100644 --- a/utils/Makefile +++ b/utils/Makefile @@ -36,6 +36,7 @@ id \ kernelinfo \ kill \ ln \ +logname \ ls \ memstat \ mkdir \ @@ -74,6 +75,7 @@ xinstall MANPAGES1=\ chkblayout.1 \ kernelinfo.1 \ +logname.1 \ memstat.1 \ pager.1 \ passwd.1 \ diff --git a/utils/logname.1 b/utils/logname.1 new file mode 100644 index 00000000..05194eb2 --- /dev/null +++ b/utils/logname.1 @@ -0,0 +1,17 @@ +.Dd October 13, 2016 +.Dt LOGNAME 1 +.Os +.Sh NAME +.Nm logname +.Nd print login name +.Sh SYNOPSIS +.Nm +.Sh DESCRIPTION +.Nm +prints the login name of the session. +.Sh EXIT STATUS +.Nm +will exit with 0 on success and non-zero otherwise. +.Sh SEE ALSO +.Xr id 1 , +.Xr getlogin 3 diff --git a/utils/logname.c b/utils/logname.c new file mode 100644 index 00000000..c4ae9c16 --- /dev/null +++ b/utils/logname.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2016 Nicholas De Nova. + * + * Permission to use, copy, modify, and/or 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. + * + * logname.c + * Print login 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(1, "unknown option -- '%c'", c); + } + } + else + errx(1, "unknown option: %s", arg); + } + + compact_arguments(&argc, &argv); + + if ( 1 < argc ) + errx(1, "unexpected extra operand"); + + char* login_name = getlogin(); + if ( !login_name ) + { + if ( errno ) + err(1, "could not get login name"); + else + errx(1, "could not get login name"); + } + + printf("%s\n", login_name); + if ( ferror(stdout) || fflush(stdout) == EOF ) + err(1, "stdout"); + + return 0; +}