diff options
author | Lars Wirzenius <liw@liw.fi> | 2012-06-04 14:14:08 +0100 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2012-06-04 14:14:08 +0100 |
commit | 9433d2b803644098ce690a52e1205c541d09eba5 (patch) | |
tree | dddd9c829bec59decdc9937124a9edf8ef901a47 | |
parent | d6ef4a470f5ba8b7b36d39cd1cb2418d58257fc0 (diff) | |
download | moreutils-9433d2b803644098ce690a52e1205c541d09eba5.tar.gz |
Add errno program
-rw-r--r-- | Makefile | 10 | ||||
-rw-r--r-- | errno.c | 74 | ||||
-rwxr-xr-x | errnos | 6 |
3 files changed, 88 insertions, 2 deletions
@@ -1,4 +1,4 @@ -BINS=isutf8 ifdata ifne pee sponge mispipe lckdo parallel +BINS=isutf8 ifdata ifne pee sponge mispipe lckdo parallel errno PERLSCRIPTS=vidir vipe ts combine zrun chronic MANS=sponge.1 vidir.1 vipe.1 isutf8.1 ts.1 combine.1 ifdata.1 ifne.1 pee.1 zrun.1 chronic.1 mispipe.1 lckdo.1 parallel.1 CFLAGS=-O2 -g -Wall @@ -10,7 +10,7 @@ DOCBOOK2XMAN=docbook2x-man all: $(BINS) $(MANS) clean: - rm -f $(BINS) $(MANS) + rm -f $(BINS) $(MANS) dump.c errnos.h errno.o install: mkdir -p $(DESTDIR)$(PREFIX)/bin @@ -46,6 +46,12 @@ lckdo.1: lckdo.docbook parallel.1: parallel.docbook $(DOCBOOK2XMAN) $< + +errno.o: errnos.h +errnos.h: + echo '#include <errno.h>' > dump.c + $(CC) -E -dD dump.c | ./errnos > errnos.h + rm -f dump.c %.1: % pod2man --center=" " --release="moreutils" $< > $@; @@ -0,0 +1,74 @@ +#include <ctype.h> +#include <errno.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + + +static struct { + const char *name; + int code; +} errnos[] = { + #include "errnos.h" +}; +static const int num_errnos = sizeof(errnos) / sizeof(errnos[0]); + + +static void +report(const char *name, int code) +{ + printf("%s %d %s\n", name, code, strerror(code)); +} + + +static bool +report_from_name(const char *name) +{ + int i; + for (i = 0; i < num_errnos; ++i) { + if (strcasecmp(errnos[i].name, name) == 0) { + report(errnos[i].name, errnos[i].code); + return true; + } + } + return false; +} + + +static bool +report_from_code(int code) +{ + int i; + for (i = 0; i < num_errnos; ++i) { + if (errnos[i].code == code) { + report(errnos[i].name, code); + return true; + } + } + return false; +} + + +int +main(int argc, char **argv) +{ + int i; + int exit_code; + + exit_code = EXIT_SUCCESS; + for (i = 1; i < argc; ++i) { + const char *arg = argv[i]; + if (toupper(arg[0]) == 'E') { + if (!report_from_name(arg)) + exit_code = EXIT_FAILURE; + } else if (isdigit(arg[0])) { + if (!report_from_code(atoi(arg))) + exit_code = EXIT_FAILURE; + } else { + fprintf(stderr, "ERROR: Not understood: %s\n", arg); + exit_code = EXIT_FAILURE; + } + } + return exit_code; +} @@ -0,0 +1,6 @@ +#!/usr/bin/awk -f + +/^#define E/ { + printf "{\"%s\",%d},\n", $2, $3 +} + |