From 88407b93212275759e8a54f5d43f4cf7da67fcdf Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Mon, 30 Sep 2013 13:36:26 +0200 Subject: nologin: add new command Currently it's maintained as distro specific (or people use impolite /bin/false way). Signed-off-by: Karel Zak --- login-utils/nologin.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 login-utils/nologin.c (limited to 'login-utils/nologin.c') diff --git a/login-utils/nologin.c b/login-utils/nologin.c new file mode 100644 index 000000000..a4fb82db6 --- /dev/null +++ b/login-utils/nologin.c @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2013 Karel Zak + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "c.h" +#include "nls.h" +#include "pathnames.h" + +/* + * Always return EXIT_FAILURE (1), don't try to be smart! + */ + +static void __attribute__((__noreturn__)) usage(FILE *out) +{ + fputs(USAGE_HEADER, out); + + fprintf(out, + _(" %s [options]\n"), program_invocation_short_name); + + fputs(USAGE_OPTIONS, out); + fputs(USAGE_HELP, out); + fputs(USAGE_VERSION, out); + + fprintf(out, USAGE_MAN_TAIL("nologin(8)")); + exit(EXIT_FAILURE); +} + +int main(int argc, char *argv[]) +{ + int c, fd; + static const struct option longopts[] = { + { "help", 0, 0, 'h' }, + { "version", 0, 0, 'V' }, + { NULL, 0, 0, 0 } + }; + + setlocale(LC_ALL, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); + + while ((c = getopt_long(argc, argv, "hV", longopts, NULL)) != -1) { + switch (c) { + case 'h': + usage(stdout); + break; + case 'V': + printf(UTIL_LINUX_VERSION); + return EXIT_FAILURE; + default: + usage(stderr); + break; + } + } + + fd = open(_PATH_NOLOGIN_TXT, O_RDONLY); + if (fd >= 0) { + char buf[BUFSIZ]; + ssize_t rd; + + while ((rd = read(fd, buf, sizeof(buf))) > 0) + ignore_result( write(STDOUT_FILENO, buf, rd) ); + close(fd); + } else + fprintf(stdout, _("This account is currently not available.\n")); + + return EXIT_FAILURE; +} -- cgit v1.2.3-55-g7522