1/*
2 * This file and its contents are supplied under the terms of the
3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 * You may only use this file in accordance with the terms of version
5 * 1.0 of the CDDL.
6 *
7 * A full copy of the text of the CDDL should have accompanied this
8 * source.  A copy of the CDDL is also available via the Internet at
9 * http://www.illumos.org/license/CDDL.
10 */
11
12/*
13 * Copyright 2019 Robert Mustacchi
14 */
15
16#include <unistd.h>
17#include <err.h>
18#include <sys/types.h>
19#include <unistd.h>
20#include <stdlib.h>
21#include <pwd.h>
22#include <libgen.h>
23#include <locale.h>
24#include <libintl.h>
25
26int
27main(int argc, char *argv[])
28{
29	char *name;
30	char uidbuf[32];
31
32	(void) setlocale(LC_ALL, "");
33#if !defined(TEXT_DOMAIN)
34#define	TEXT_DOMAIN "SYS_TEST"
35#endif
36	(void) textdomain(TEXT_DOMAIN);
37
38	if (argc != 1) {
39		warnx(gettext("illegal arguments"));
40		(void) fprintf(stderr, gettext("Usage: %s\n"),
41		    basename(argv[0]));
42		return (1);
43	}
44
45	/*
46	 * In some cases getlogin() can fail. The most common case is due to
47	 * something like using script(1). Deal with that by falling back to the
48	 * current user ID, which is as accurate as we can be. This is what the
49	 * ksh93 version used to do.
50	 */
51	name = getlogin();
52	if (name == NULL) {
53		uid_t uid;
54		struct passwd *pass;
55
56		uid = getuid();
57		pass = getpwuid(uid);
58		if (pass != NULL) {
59			name = pass->pw_name;
60		} else {
61			(void) snprintf(uidbuf, sizeof (uidbuf), "%u", uid);
62			name = uidbuf;
63		}
64	}
65
66	if (printf("%s\n", name) == -1) {
67		err(EXIT_FAILURE, gettext("failed to write out login name"));
68	}
69
70	return (0);
71}
72