#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;
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);
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)
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;
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);
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
cmds = cmdst;
while (cmds->next) {
-#ifdef LPGETSTATUS
if (cmds->op == LPGETSTATUS) {
status = 0xdeadbeef;
retval = ioctl(fd, LPGETSTATUS - offset, &status);
printf("\n");
}
} else
-#endif /* LPGETSTATUS */
if (ioctl(fd, cmds->op - offset, cmds->val) < 0)
warn(_("ioctl failed"));
cmdst = cmds;