]> err.no Git - moreutils/commitdiff
Add errno program
authorLars Wirzenius <liw@liw.fi>
Mon, 4 Jun 2012 13:14:08 +0000 (14:14 +0100)
committerLars Wirzenius <liw@liw.fi>
Mon, 4 Jun 2012 13:14:08 +0000 (14:14 +0100)
Makefile
errno.c [new file with mode: 0644]
errnos [new file with mode: 0755]

index 3ffd56231826cbcd789361282c329344f54a4f6a..501701faa71cbb25c4e9bcd8b7150675620e7de1 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -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" $< > $@;
diff --git a/errno.c b/errno.c
new file mode 100644 (file)
index 0000000..aa5307b
--- /dev/null
+++ b/errno.c
@@ -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;
+}
diff --git a/errnos b/errnos
new file mode 100755 (executable)
index 0000000..62a0429
--- /dev/null
+++ b/errnos
@@ -0,0 +1,6 @@
+#!/usr/bin/awk -f
+
+/^#define E/ {
+    printf "{\"%s\",%d},\n", $2, $3
+}
+