]> git.ipfire.org Git - thirdparty/util-linux.git/blobdiff - login-utils/nologin.c
wipefs: add --lock and LOCK_BLOCK_DEVICE
[thirdparty/util-linux.git] / login-utils / nologin.c
index 2e897cc722764f52447db4500bd31ab9d3d8e5b4..f38a3aab022d4774378e07e33a3f9ba69dc9ab9a 100644 (file)
@@ -19,8 +19,9 @@
  * Always return EXIT_FAILURE (1), don't try to be smart!
  */
 
-static void __attribute__((__noreturn__)) usage(FILE *out)
+static void __attribute__((__noreturn__)) usage(void)
 {
+       FILE *out = stdout;
        fputs(USAGE_HEADER, out);
        fprintf(out,
                _(" %s [options]\n"), program_invocation_short_name);
@@ -29,20 +30,36 @@ static void __attribute__((__noreturn__)) usage(FILE *out)
        fputs(_("Politely refuse a login.\n"), out);
 
        fputs(USAGE_OPTIONS, out);
-       fputs(USAGE_HELP, out);
-       fputs(USAGE_VERSION, out);
+       fputs(_(" -c, --command <command>  does nothing (for compatibility with su -c)\n"), out);
+       printf(USAGE_HELP_OPTIONS(26));
 
-       fprintf(out, USAGE_MAN_TAIL("nologin(8)"));
+       printf(USAGE_MAN_TAIL("nologin(8)"));
        exit(EXIT_FAILURE);
 }
 
 int main(int argc, char *argv[])
 {
-       int c, fd;
+       int c, fd = -1;
        struct stat st;
+       enum {
+               OPT_INIT_FILE = CHAR_MAX + 1,
+               OPT_NOPROFILE,
+               OPT_NORC,
+               OPT_POSIX,
+               OPT_RCFILE
+       };
        static const struct option longopts[] = {
-               { "help",    0, NULL, 'h' },
-               { "version", 0, NULL, 'V' },
+               { "command",     required_argument, NULL, 'c'           },
+               { "init-file",   required_argument, NULL, OPT_INIT_FILE },
+               { "interactive", no_argument,       NULL, 'i'           },
+               { "login",       no_argument,       NULL, 'l'           },
+               { "noprofile",   no_argument,       NULL, OPT_NOPROFILE },
+               { "norc",        no_argument,       NULL, OPT_NORC      },
+               { "posix",       no_argument,       NULL, OPT_POSIX     },
+               { "rcfile",      required_argument, NULL, OPT_RCFILE    },
+               { "restricted",  no_argument,       NULL, 'r'           },
+               { "help",        no_argument,       NULL, 'h'           },
+               { "version",     no_argument,       NULL, 'V'           },
                { NULL, 0, NULL, 0 }
        };
 
@@ -50,30 +67,49 @@ int main(int argc, char *argv[])
        bindtextdomain(PACKAGE, LOCALEDIR);
        textdomain(PACKAGE);
 
-       while ((c = getopt_long(argc, argv, "hV", longopts, NULL)) != -1) {
+       while ((c = getopt_long(argc, argv, "c:ilrhV", longopts, NULL)) != -1) {
                switch (c) {
-               case 'h':
-                       usage(stdout);
+               case 'c':
+               case OPT_INIT_FILE:
+               case 'i':
+               case 'l':
+               case OPT_NOPROFILE:
+               case OPT_NORC:
+               case OPT_POSIX:
+               case OPT_RCFILE:
+               case 'r':
+                       /* Ignore well known shell command-line options */
                        break;
+               case 'h':
+                       usage();
                case 'V':
-                       printf(UTIL_LINUX_VERSION);
-                       return EXIT_FAILURE;
+                       print_version(EXIT_FAILURE);    /* yes FAILURE! */
                default:
                        errtryhelp(EXIT_FAILURE);
                }
        }
 
        fd = open(_PATH_NOLOGIN_TXT, O_RDONLY);
+       if (fd < 0)
+               goto dflt;
+
        c = fstat(fd, &st);
-       if (fd >= 0 && !c && S_ISREG(st.st_mode)) {
+       if (c < 0 || !S_ISREG(st.st_mode))
+               goto dflt;
+       else {
                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;
+       }
 
+dflt:
+       if (fd >= 0)
+               close(fd);
+       fprintf(stdout, _("This account is currently not available.\n"));
        return EXIT_FAILURE;
 }