]> git.ipfire.org Git - thirdparty/util-linux.git/blobdiff - sys-utils/tunelp.c
docs: update year in libs docs
[thirdparty/util-linux.git] / sys-utils / tunelp.c
index 7beb8a721ab1573bd2445a53d67ccfea92a03097..b1e7f75df5655f73890d0fd95a2de4028eafe1ef 100644 (file)
 #include <sys/types.h>
 #include <unistd.h>
 
-#include "lp.h"
+#include <linux/lp.h>
+
 #include "nls.h"
-#include "xalloc.h"
 #include "closestream.h"
+#include "strutils.h"
+
+#define EXIT_LP_MALLOC         2
+#define EXIT_LP_BADVAL         3
+#define EXIT_LP_IO_ERR         4
 
-#define EXIT_BAD_VALUE 3
-#define EXIT_LP_IO_ERR 4
+#define XALLOC_EXIT_CODE EXIT_LP_MALLOC
+#include "xalloc.h"
 
 struct command {
        long op;
@@ -83,11 +88,15 @@ struct command {
        struct command *next;
 };
 
-static void __attribute__((__noreturn__)) print_usage(FILE *out)
+static void __attribute__((__noreturn__)) usage(void)
 {
+       FILE *out = stdout;
        fputs(USAGE_HEADER, out);
        fprintf(out, _(" %s [options] <device>\n"), program_invocation_short_name);
 
+       fputs(USAGE_SEPARATOR, out);
+       fputs(_("Set various parameters for the line printer.\n"), out);
+
        fputs(USAGE_OPTIONS, out);
        fputs(_(" -i, --irq <num>              specify parallel port irq\n"), out);
        fputs(_(" -t, --time <ms>              driver wait time in milliseconds\n"), out);
@@ -100,30 +109,13 @@ static void __attribute__((__noreturn__)) print_usage(FILE *out)
        fputs(_(" -o, --check-status <on|off>  check printer status before printing\n"), out);
        fputs(_(" -C, --careful <on|off>       extra checking to status check\n"), out);
        fputs(_(" -s, --status                 query printer status\n"), out);
-       fputs(_(" -T, --trust-irq <on|off>     make driver to trust irq\n"), out);
        fputs(_(" -r, --reset                  reset the port\n"), out);
        fputs(_(" -q, --print-irq <on|off>     display current irq setting\n"), out);
        fputs(USAGE_SEPARATOR, out);
-       fputs(USAGE_HELP, out);
-       fputs(USAGE_VERSION, out);
-       fprintf(out, USAGE_MAN_TAIL("tunelp(8)"));
+       printf(USAGE_HELP_OPTIONS(30));
+       printf(USAGE_MAN_TAIL("tunelp(8)"));
 
-       exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
-}
-
-static long get_val(char *val)
-{
-       long ret;
-       if (!(sscanf(val, "%ld", &ret) == 1))
-               errx(EXIT_BAD_VALUE, _("bad value"));
-       return ret;
-}
-
-static long get_onoff(char *val)
-{
-       if (!strncasecmp("on", val, 2))
-               return 1;
-       return 0;
+       exit(EXIT_SUCCESS);
 }
 
 int main(int argc, char **argv)
@@ -152,76 +144,72 @@ int main(int argc, char **argv)
        setlocale(LC_ALL, "");
        bindtextdomain(PACKAGE, LOCALEDIR);
        textdomain(PACKAGE);
-       atexit(close_stdout);
+       close_stdout_atexit();
 
-       if (argc < 2)
-               print_usage(stderr);
+       strutils_set_exitcode(EXIT_LP_BADVAL);
+
+       if (argc < 2) {
+               warnx(_("not enough arguments"));
+               errtryhelp(EXIT_FAILURE);
+       }
 
        cmdst = cmds = xmalloc(sizeof(struct command));
-       cmds->next = 0;
+       cmds->next = NULL;
 
        show_irq = 1;
        while ((c = getopt_long(argc, argv, "t:c:w:a:i:ho:C:sq:rT:vV", longopts, NULL)) != -1) {
                switch (c) {
-               case 'h':
-                       print_usage(stdout);
-                       break;
                case 'i':
                        cmds->op = LPSETIRQ;
-                       cmds->val = get_val(optarg);
+                       cmds->val = strtol_or_err(optarg, _("argument error"));
                        cmds->next = xmalloc(sizeof(struct command));
                        cmds = cmds->next;
-                       cmds->next = 0;
+                       cmds->next = NULL;
                        break;
                case 't':
                        cmds->op = LPTIME;
-                       cmds->val = get_val(optarg);
+                       cmds->val = strtol_or_err(optarg, _("argument error"));
                        cmds->next = xmalloc(sizeof(struct command));
                        cmds = cmds->next;
-                       cmds->next = 0;
+                       cmds->next = NULL;
                        break;
                case 'c':
                        cmds->op = LPCHAR;
-                       cmds->val = get_val(optarg);
+                       cmds->val = strtol_or_err(optarg, _("argument error"));
                        cmds->next = xmalloc(sizeof(struct command));
                        cmds = cmds->next;
-                       cmds->next = 0;
+                       cmds->next = NULL;
                        break;
                case 'w':
                        cmds->op = LPWAIT;
-                       cmds->val = get_val(optarg);
+                       cmds->val = strtol_or_err(optarg, _("argument error"));
                        cmds->next = xmalloc(sizeof(struct command));
                        cmds = cmds->next;
-                       cmds->next = 0;
+                       cmds->next = NULL;
                        break;
                case 'a':
                        cmds->op = LPABORT;
-                       cmds->val = get_onoff(optarg);
+                       cmds->val = parse_switch(optarg, _("argument error"), "on", "off", NULL);
                        cmds->next = xmalloc(sizeof(struct command));
                        cmds = cmds->next;
-                       cmds->next = 0;
+                       cmds->next = NULL;
                        break;
                case 'q':
-                       if (get_onoff(optarg)) {
-                               show_irq = 1;
-                       } else {
-                               show_irq = 0;
-                       }
+                       show_irq = parse_switch(optarg, _("argument error"), "on", "off", NULL);
                        break;
-#ifdef LPGETSTATUS
                case 'o':
                        cmds->op = LPABORTOPEN;
-                       cmds->val = get_onoff(optarg);
+                       cmds->val = parse_switch(optarg, _("argument error"), "on", "off", NULL);
                        cmds->next = xmalloc(sizeof(struct command));
                        cmds = cmds->next;
-                       cmds->next = 0;
+                       cmds->next = NULL;
                        break;
                case 'C':
                        cmds->op = LPCAREFUL;
-                       cmds->val = get_onoff(optarg);
+                       cmds->val = parse_switch(optarg, _("argument error"), "on", "off", NULL);
                        cmds->next = xmalloc(sizeof(struct command));
                        cmds = cmds->next;
-                       cmds->next = 0;
+                       cmds->next = NULL;
                        break;
                case 's':
                        show_irq = 0;
@@ -229,42 +217,30 @@ int main(int argc, char **argv)
                        cmds->val = 0;
                        cmds->next = xmalloc(sizeof(struct command));
                        cmds = cmds->next;
-                       cmds->next = 0;
+                       cmds->next = NULL;
                        break;
-#endif
-#ifdef LPRESET
                case 'r':
                        cmds->op = LPRESET;
                        cmds->val = 0;
                        cmds->next = xmalloc(sizeof(struct command));
                        cmds = cmds->next;
-                       cmds->next = 0;
+                       cmds->next = NULL;
                        break;
-#endif
-#ifdef LPTRUSTIRQ
-               case 'T':
-                       /* Note: this will do the wrong thing on
-                        * 2.0.36 when compiled under 2.2.x
-                        */
-                       cmds->op = LPTRUSTIRQ;
-                       cmds->val = get_onoff(optarg);
-                       cmds->next = xmalloc(sizeof(struct command));
-                       cmds = cmds->next;
-                       cmds->next = 0;
-                       break;
-#endif
+
+               case 'h':
+                       usage();
                case 'v':
                case 'V':
-                       printf(_("%s from %s\n"),
-                              program_invocation_short_name, PACKAGE_STRING);
-                       return EXIT_SUCCESS;
+                       print_version(EXIT_SUCCESS);
                default:
-                       print_usage(stderr);
+                       errtryhelp(EXIT_FAILURE);
                }
        }
 
-       if (optind != argc - 1)
-               print_usage(stderr);
+       if (optind != argc - 1) {
+               warnx(_("no device specified"));
+               errtryhelp(EXIT_FAILURE);
+       }
 
        filename = xstrdup(argv[optind]);
        fd = open(filename, O_WRONLY | O_NONBLOCK, 0);
@@ -280,7 +256,7 @@ int main(int argc, char **argv)
 
        if (!S_ISCHR(statbuf.st_mode)) {
                warnx(_("%s not an lp device"), filename);
-               print_usage(stderr);
+               errtryhelp(EXIT_FAILURE);
        }
        /* Allow for binaries compiled under a new kernel to work on
         * the old ones The irq argument to ioctl isn't touched by
@@ -294,7 +270,6 @@ int main(int argc, char **argv)
 
        cmds = cmdst;
        while (cmds->next) {
-#ifdef LPGETSTATUS
                if (cmds->op == LPGETSTATUS) {
                        status = 0xdeadbeef;
                        retval = ioctl(fd, LPGETSTATUS - offset, &status);
@@ -318,7 +293,6 @@ int main(int argc, char **argv)
                                printf("\n");
                        }
                } else
-#endif /* LPGETSTATUS */
                if (ioctl(fd, cmds->op - offset, cmds->val) < 0)
                        warn(_("ioctl failed"));
                cmdst = cmds;