]> The Tcpdump Group git mirrors - tcpdump/commitdiff
Add a status exit code to the function ndo_error()
authorFrancois-Xavier Le Bail <[email protected]>
Sun, 25 Feb 2018 10:04:39 +0000 (11:04 +0100)
committerFrancois-Xavier Le Bail <[email protected]>
Sun, 25 Feb 2018 19:58:27 +0000 (20:58 +0100)
The status are defined in an enum in status-exit-codes.h.

Moreover:
Use ndo_error() instead of ndo_warning() for malloc() errors in print-esp.c.

Makefile.in
addrtoname.c
netdissect.h
print-atalk.c
print-decnet.c
print-esp.c
print-tcp.c
print.c
status-exit-codes.h [new file with mode: 0644]
tcpdump.c

index 9f4f2f4e3e515481b61bf5e98c74c98948a8de4d..67ee328139154155621bbd6de7f6e4b014a046d9 100644 (file)
@@ -293,6 +293,7 @@ HDR = \
        signature.h \
        slcompress.h \
        smb.h \
+       status-exit-codes.h \
        strtoaddr.h \
        tcp.h \
        timeval-operations.h \
index f488dde0806256e899528fa0aa1b811c76a66aae..d43daac81f6bbb4590ffa5b40bd446a4b89f22b8 100644 (file)
 /*
  * hash tables for whatever-to-name translations
  *
- * ndo_error() called on strdup(3) failure
+ * ndo_error() called on strdup(3) failure with S_ERR_ND_MEM_ALLOC status
  */
 
 #define HASHNAMESIZE 4096
@@ -319,8 +319,8 @@ ipaddr_string(netdissect_options *ndo, const u_char *ap)
 
                        p->name = strdup(hp->h_name);
                        if (p->name == NULL)
-                               (*ndo->ndo_error)(ndo,
-                                                 "ipaddr_string: strdup(hp->h_name)");
+                               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                       "ipaddr_string: strdup(hp->h_name)");
                        if (ndo->ndo_Nflag) {
                                /* Remove domain qualifications */
                                dotp = strchr(p->name, '.');
@@ -332,7 +332,8 @@ ipaddr_string(netdissect_options *ndo, const u_char *ap)
        }
        p->name = strdup(intoa(addr));
        if (p->name == NULL)
-               (*ndo->ndo_error)(ndo, "ipaddr_string: strdup(intoa(addr))");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                 "ipaddr_string: strdup(intoa(addr))");
        return (p->name);
 }
 
@@ -381,8 +382,8 @@ ip6addr_string(netdissect_options *ndo, const u_char *ap)
 
                        p->name = strdup(hp->h_name);
                        if (p->name == NULL)
-                               (*ndo->ndo_error)(ndo,
-                                                 "ip6addr_string: strdup(hp->h_name)");
+                               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                       "ip6addr_string: strdup(hp->h_name)");
                        if (ndo->ndo_Nflag) {
                                /* Remove domain qualifications */
                                dotp = strchr(p->name, '.');
@@ -395,7 +396,8 @@ ip6addr_string(netdissect_options *ndo, const u_char *ap)
        cp = addrtostr6(ap, ntop_buf, sizeof(ntop_buf));
        p->name = strdup(cp);
        if (p->name == NULL)
-               (*ndo->ndo_error)(ndo, "ip6addr_string: strdup(cp)");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                 "ip6addr_string: strdup(cp)");
        return (p->name);
 }
 
@@ -429,7 +431,7 @@ lookup_emem(netdissect_options *ndo, const u_char *ep)
        tp->e_addr2 = k;
        tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp));
        if (tp->e_nxt == NULL)
-               (*ndo->ndo_error)(ndo, "lookup_emem: calloc");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "lookup_emem: calloc");
 
        return tp;
 }
@@ -474,13 +476,15 @@ lookup_bytestring(netdissect_options *ndo, const u_char *bs,
 
        tp->bs_bytes = (u_char *) calloc(1, nlen);
        if (tp->bs_bytes == NULL)
-               (*ndo->ndo_error)(ndo, "lookup_bytestring: calloc");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                 "lookup_bytestring: calloc");
 
        memcpy(tp->bs_bytes, bs, nlen);
        tp->bs_nbytes = nlen;
        tp->bs_nxt = (struct bsnamemem *)calloc(1, sizeof(*tp));
        if (tp->bs_nxt == NULL)
-               (*ndo->ndo_error)(ndo, "lookup_bytestring: calloc");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                 "lookup_bytestring: calloc");
 
        return tp;
 }
@@ -520,12 +524,12 @@ lookup_nsap(netdissect_options *ndo, const u_char *nsap,
        tp->e_addr2 = k;
        tp->e_nsap = (u_char *)malloc(nsap_length + 1);
        if (tp->e_nsap == NULL)
-               (*ndo->ndo_error)(ndo, "lookup_nsap: malloc");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "lookup_nsap: malloc");
        tp->e_nsap[0] = (u_char)nsap_length;    /* guaranteed < ISONSAP_MAX_LENGTH */
        memcpy((char *)&tp->e_nsap[1], (const char *)nsap, nsap_length);
        tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp));
        if (tp->e_nxt == NULL)
-               (*ndo->ndo_error)(ndo, "lookup_nsap: calloc");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "lookup_nsap: calloc");
 
        return tp;
 }
@@ -553,7 +557,7 @@ lookup_protoid(netdissect_options *ndo, const u_char *pi)
        tp->p_proto = j;
        tp->p_nxt = (struct protoidmem *)calloc(1, sizeof(*tp));
        if (tp->p_nxt == NULL)
-               (*ndo->ndo_error)(ndo, "lookup_protoid: calloc");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "lookup_protoid: calloc");
 
        return tp;
 }
@@ -577,8 +581,8 @@ etheraddr_string(netdissect_options *ndo, const u_char *ep)
                if (ether_ntohost(buf2, (const struct ether_addr *)ep) == 0) {
                        tp->e_name = strdup(buf2);
                        if (tp->e_name == NULL)
-                               (*ndo->ndo_error)(ndo,
-                                                 "etheraddr_string: strdup(buf2)");
+                               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                       "etheraddr_string: strdup(buf2)");
                        return (tp->e_name);
                }
        }
@@ -600,7 +604,8 @@ etheraddr_string(netdissect_options *ndo, const u_char *ep)
                *cp = '\0';
        tp->e_name = strdup(buf);
        if (tp->e_name == NULL)
-               (*ndo->ndo_error)(ndo, "etheraddr_string: strdup(buf)");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                 "etheraddr_string: strdup(buf)");
        return (tp->e_name);
 }
 
@@ -629,7 +634,8 @@ le64addr_string(netdissect_options *ndo, const u_char *ep)
 
        tp->bs_name = strdup(buf);
        if (tp->bs_name == NULL)
-               (*ndo->ndo_error)(ndo, "le64addr_string: strdup(buf)");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                 "le64addr_string: strdup(buf)");
 
        return (tp->bs_name);
 }
@@ -657,7 +663,8 @@ linkaddr_string(netdissect_options *ndo, const u_char *ep,
 
        tp->bs_name = cp = (char *)malloc(len*3);
        if (tp->bs_name == NULL)
-               (*ndo->ndo_error)(ndo, "linkaddr_string: malloc");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                 "linkaddr_string: malloc");
        *cp++ = hex[*ep >> 4];
        *cp++ = hex[*ep++ & 0xf];
        for (i = len-1; i > 0 ; --i) {
@@ -693,7 +700,8 @@ etherproto_string(netdissect_options *ndo, u_short port)
        *cp++ = '\0';
        tp->name = strdup(buf);
        if (tp->name == NULL)
-               (*ndo->ndo_error)(ndo, "etherproto_string: strdup(buf)");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                 "etherproto_string: strdup(buf)");
        return (tp->name);
 }
 
@@ -715,7 +723,8 @@ isonsap_string(netdissect_options *ndo, const u_char *nsap,
 
        tp->e_name = cp = (char *)malloc(sizeof("xx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xx"));
        if (cp == NULL)
-               (*ndo->ndo_error)(ndo, "isonsap_string: malloc");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                 "isonsap_string: malloc");
 
        for (nsap_idx = 0; nsap_idx < nsap_length; nsap_idx++) {
                *cp++ = hex[*nsap >> 4];
@@ -746,7 +755,8 @@ tcpport_string(netdissect_options *ndo, u_short port)
        (void)nd_snprintf(buf, sizeof(buf), "%u", i);
        tp->name = strdup(buf);
        if (tp->name == NULL)
-               (*ndo->ndo_error)(ndo, "tcpport_string: strdup(buf)");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                 "tcpport_string: strdup(buf)");
        return (tp->name);
 }
 
@@ -767,7 +777,8 @@ udpport_string(netdissect_options *ndo, u_short port)
        (void)nd_snprintf(buf, sizeof(buf), "%u", i);
        tp->name = strdup(buf);
        if (tp->name == NULL)
-               (*ndo->ndo_error)(ndo, "udpport_string: strdup(buf)");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                 "udpport_string: strdup(buf)");
        return (tp->name);
 }
 
@@ -795,7 +806,8 @@ ipxsap_string(netdissect_options *ndo, u_short port)
        *cp++ = '\0';
        tp->name = strdup(buf);
        if (tp->name == NULL)
-               (*ndo->ndo_error)(ndo, "ipxsap_string: strdup(buf)");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                 "ipxsap_string: strdup(buf)");
        return (tp->name);
 }
 
@@ -825,7 +837,8 @@ init_servarray(netdissect_options *ndo)
                } else
                        table->name = strdup(sv->s_name);
                if (table->name == NULL)
-                       (*ndo->ndo_error)(ndo, "init_servarray: strdup");
+                       (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                         "init_servarray: strdup");
 
                table->addr = port;
                table->nxt = newhnamemem(ndo);
@@ -911,8 +924,8 @@ init_protoidarray(netdissect_options *ndo)
                tp = lookup_protoid(ndo, protoid);
                tp->p_name = strdup(eproto_db[i].s);
                if (tp->p_name == NULL)
-                       (*ndo->ndo_error)(ndo,
-                                         "init_protoidarray: strdup(eproto_db[i].s)");
+                       (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                               "init_protoidarray: strdup(eproto_db[i].s)");
        }
        /* Hardwire some SNAP proto ID names */
        for (pl = protoidlist; pl->name != NULL; ++pl) {
@@ -965,8 +978,8 @@ init_etherarray(netdissect_options *ndo)
                        tp = lookup_emem(ndo, ep->addr);
                        tp->e_name = strdup(ep->name);
                        if (tp->e_name == NULL)
-                               (*ndo->ndo_error)(ndo,
-                                                 "init_etherarray: strdup(ep->addr)");
+                               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                       "init_etherarray: strdup(ep->addr)");
                }
                (void)fclose(fp);
        }
@@ -986,8 +999,8 @@ init_etherarray(netdissect_options *ndo)
                if (ether_ntohost(name, (const struct ether_addr *)el->addr) == 0) {
                        tp->e_name = strdup(name);
                        if (tp->e_name == NULL)
-                               (*ndo->ndo_error)(ndo,
-                                                 "init_etherarray: strdup(name)");
+                               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                       "init_etherarray: strdup(name)");
                        continue;
                }
 #endif
@@ -1287,7 +1300,8 @@ newhnamemem(netdissect_options *ndo)
                num = 64;
                ptr = (struct hnamemem *)calloc(num, sizeof (*ptr));
                if (ptr == NULL)
-                       (*ndo->ndo_error)(ndo, "newhnamemem: calloc");
+                       (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                         "newhnamemem: calloc");
        }
        --num;
        p = ptr++;
@@ -1306,7 +1320,8 @@ newh6namemem(netdissect_options *ndo)
                num = 64;
                ptr = (struct h6namemem *)calloc(num, sizeof (*ptr));
                if (ptr == NULL)
-                       (*ndo->ndo_error)(ndo, "newh6namemem: calloc");
+                       (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                         "newh6namemem: calloc");
        }
        --num;
        p = ptr++;
index 7aed8313c19636635e298c85cb1e4fbff88d44f8..73fec2e2505ababc009b84650b9c635be24ece16 100644 (file)
@@ -29,6 +29,7 @@
 #include "os-proto.h"
 #endif
 #include <sys/types.h>
+#include "status-exit-codes.h"
 
 /*
  * Data types corresponding to multi-byte integral values within data
@@ -213,8 +214,9 @@ struct netdissect_options {
                     PRINTFLIKE_FUNCPTR(2, 3);
   /* pointer to function to output errors */
   void NORETURN_FUNCPTR (*ndo_error)(netdissect_options *,
+                                    status_exit_codes_t status,
                                     const char *fmt, ...)
-                                    PRINTFLIKE_FUNCPTR(2, 3);
+                                    PRINTFLIKE_FUNCPTR(3, 4);
   /* pointer to function to output warnings */
   void (*ndo_warning)(netdissect_options *,
                      const char *fmt, ...)
index 25a1801a9cba0748c2e081b0a40467e37697a2ee..3cd04177b4f276f62a7cf66b4ca384a15014d628 100644 (file)
@@ -608,8 +608,8 @@ ataddr_string(netdissect_options *ndo,
                        tp->nxt = newhnamemem(ndo);
                        tp->name = strdup(nambuf);
                        if (tp->name == NULL)
-                               (*ndo->ndo_error)(ndo,
-                                                 "ataddr_string: strdup(nambuf)");
+                               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                       "ataddr_string: strdup(nambuf)");
                }
                fclose(fp);
        }
@@ -628,8 +628,8 @@ ataddr_string(netdissect_options *ndo,
                            tp2->name, athost);
                        tp->name = strdup(nambuf);
                        if (tp->name == NULL)
-                               (*ndo->ndo_error)(ndo,
-                                                 "ataddr_string: strdup(nambuf)");
+                               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                       "ataddr_string: strdup(nambuf)");
                        return (tp->name);
                }
 
@@ -641,7 +641,8 @@ ataddr_string(netdissect_options *ndo,
                (void)nd_snprintf(nambuf, sizeof(nambuf), "%u", atnet);
        tp->name = strdup(nambuf);
        if (tp->name == NULL)
-               (*ndo->ndo_error)(ndo, "ataddr_string: strdup(nambuf)");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                 "ataddr_string: strdup(nambuf)");
 
        return (tp->name);
 }
index ef610767e961784af672414076b17cdf8aba6115..253d133d9cd076ace4e071ccf74858c96ee05f67 100644 (file)
@@ -1246,7 +1246,7 @@ dnnum_string(netdissect_options *ndo, u_short dnaddr)
        /* malloc() return used by the 'dnaddrtable' hash table: do not free() */
        str = (char *)malloc(siz = sizeof("00.0000"));
        if (str == NULL)
-               (*ndo->ndo_error)(ndo, "dnnum_string: malloc");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "dnnum_string: malloc");
        nd_snprintf(str, siz, "%u.%u", area, node);
        return(str);
 }
index fbe99ad2394e685ed58bcb53a57d30790e608f84..094b9f7f3b109ca178d44658943149d5e8b05d85 100644 (file)
@@ -236,7 +236,8 @@ int esp_print_decrypt_buffer_by_ikev2(netdissect_options *ndo,
        output_buffer_size = len + (block_size - len % block_size);
        output_buffer = (u_char *)malloc(output_buffer_size);
        if (output_buffer == NULL) {
-               (*ndo->ndo_warning)(ndo, "can't allocate memory for decryption buffer");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                       "can't allocate memory for decryption buffer");
                EVP_CIPHER_CTX_free(ctx);
                return 0;
        }
@@ -266,7 +267,8 @@ static void esp_print_addsa(netdissect_options *ndo,
 
        nsa = (struct sa_list *)malloc(sizeof(struct sa_list));
        if (nsa == NULL)
-               (*ndo->ndo_error)(ndo, "ran out of memory to allocate sa structure");
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                 "esp_print_addsa: malloc");
 
        *nsa = *sa;
 
@@ -287,7 +289,8 @@ static u_int hexdigit(netdissect_options *ndo, char hex)
        else if (hex >= 'a' && hex <= 'f')
                return (hex - 'a' + 10);
        else {
-               (*ndo->ndo_error)(ndo, "invalid hex digit %c in espsecret\n", hex);
+               (*ndo->ndo_error)(ndo, S_ERR_ND_ESP_SECRET,
+                                 "invalid hex digit %c in espsecret\n", hex);
                return 0;
        }
 }
@@ -520,8 +523,9 @@ static void esp_print_decode_onesecret(netdissect_options *ndo, char *line,
 
                secretfile = fopen(filename, FOPEN_READ_TXT);
                if (secretfile == NULL) {
-                       (*ndo->ndo_error)(ndo, "print_esp: can't open %s: %s\n",
-                           filename, strerror(errno));
+                       (*ndo->ndo_error)(ndo, S_ERR_ND_OPEN_FILE,
+                                         "print_esp: can't open %s: %s\n",
+                                         filename, strerror(errno));
                        return;
                }
 
@@ -787,7 +791,8 @@ esp_print(netdissect_options *ndo,
                        output_buffer_size = len + (block_size - len % block_size);
                        output_buffer = (u_char *)malloc(output_buffer_size);
                        if (output_buffer == NULL) {
-                               (*ndo->ndo_warning)(ndo, "can't allocate memory for decryption buffer");
+                               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                                       "esp_print: malloc decryption buffer");
                                EVP_CIPHER_CTX_free(ctx);
                                return -1;
                        }
index 66e87492a1b178325f0c82a9ee899371b1a1a43c..ab3dbbf3e6533d2a4ef367d82baac874b8e89f9c 100644 (file)
@@ -295,7 +295,8 @@ tcp_print(netdissect_options *ndo,
                                                 calloc(1, sizeof(*th));
                                         if (th->nxt == NULL)
                                                 (*ndo->ndo_error)(ndo,
-                                                                 "tcp_print: calloc");
+                                                       S_ERR_ND_MEM_ALLOC,
+                                                       "tcp_print: calloc");
                                 }
                                 th->addr = tha;
                                 if (rev)
@@ -352,7 +353,8 @@ tcp_print(netdissect_options *ndo,
                                                 calloc(1, sizeof(*th));
                                         if (th->nxt == NULL)
                                                 (*ndo->ndo_error)(ndo,
-                                                                 "tcp_print: calloc");
+                                                       S_ERR_ND_MEM_ALLOC,
+                                                       "tcp_print: calloc");
                                 }
                                 th->addr = tha;
                                 if (rev)
diff --git a/print.c b/print.c
index 274ac202b6fd49f411c27fec05881ae6865c8b9e..fd95b5125b4c1d7abf26cd662cb603429eedd8a7 100644 (file)
--- a/print.c
+++ b/print.c
@@ -225,8 +225,9 @@ static void ndo_default_print(netdissect_options *ndo, const u_char *bp,
                    u_int length);
 
 static void NORETURN ndo_error(netdissect_options *ndo,
+                    status_exit_codes_t status,
                     FORMAT_STRING(const char *fmt), ...)
-                    PRINTFLIKE(2, 3);
+                    PRINTFLIKE(3, 4);
 static void    ndo_warning(netdissect_options *ndo,
                    FORMAT_STRING(const char *fmt), ...)
                    PRINTFLIKE(2, 3);
@@ -298,11 +299,11 @@ get_if_printer(netdissect_options *ndo, int type)
        if (printer == NULL) {
                dltname = pcap_datalink_val_to_name(type);
                if (dltname != NULL)
-                       (*ndo->ndo_error)(ndo,
+                       (*ndo->ndo_error)(ndo, S_ERR_ND_NO_PRINTER,
                                          "packet printing is not supported for link type %s: use -w",
                                          dltname);
                else
-                       (*ndo->ndo_error)(ndo,
+                       (*ndo->ndo_error)(ndo, S_ERR_ND_NO_PRINTER,
                                          "packet printing is not supported for link type %d: use -w", type);
        }
        return printer;
@@ -460,7 +461,8 @@ ndo_default_print(netdissect_options *ndo, const u_char *bp, u_int length)
 
 /* VARARGS */
 static void
-ndo_error(netdissect_options *ndo, const char *fmt, ...)
+ndo_error(netdissect_options *ndo, status_exit_codes_t status,
+         const char *fmt, ...)
 {
        va_list ap;
 
@@ -475,7 +477,7 @@ ndo_error(netdissect_options *ndo, const char *fmt, ...)
                        (void)fputc('\n', stderr);
        }
        nd_cleanup();
-       exit(1);
+       exit(status);
        /* NOTREACHED */
 }
 
@@ -509,7 +511,8 @@ ndo_printf(netdissect_options *ndo, const char *fmt, ...)
        va_end(args);
 
        if (ret < 0)
-               ndo_error(ndo, "Unable to write output: %s", pcap_strerror(errno));
+               ndo_error(ndo, S_ERR_ND_WRITE_FILE,
+                         "Unable to write output: %s", pcap_strerror(errno));
        return (ret);
 }
 
diff --git a/status-exit-codes.h b/status-exit-codes.h
new file mode 100644 (file)
index 0000000..87872da
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2018 The TCPDUMP project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that: (1) source code
+ * distributions retain the above copyright notice and this paragraph
+ * in its entirety, and (2) distributions including binary code include
+ * the above copyright notice and this paragraph in its entirety in
+ * the documentation or other materials provided with the distribution.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+ * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
+ * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE.
+ */
+
+#ifndef status_exit_codes_h
+#define status_exit_codes_h
+
+/* S_ERR_ND_* are libnetdissect status */
+
+typedef enum {
+       S_SUCCESS           = 0, /* not a libnetdissect status */
+       S_ERR_HOST_PROGRAM  = 1, /* not a libnetdissect status */
+       S_ERR_ND_NO_PRINTER = 2,
+       S_ERR_ND_MEM_ALLOC  = 3,
+       S_ERR_ND_OPEN_FILE  = 4,
+       S_ERR_ND_WRITE_FILE = 5,
+       S_ERR_ND_ESP_SECRET = 6
+} status_exit_codes_t;
+
+#endif /* status_exit_codes_h */
index f0505fe2a30e2ba4f22bf64785204fef64443ab7..4ab2c2493b4e30795b9d5a800900671950eb3ea5 100644 (file)
--- a/tcpdump.c
+++ b/tcpdump.c
@@ -338,7 +338,7 @@ error(const char *fmt, ...)
                if (fmt[-1] != '\n')
                        (void)fputc('\n', stderr);
        }
-       exit_tcpdump(1);
+       exit_tcpdump(S_ERR_HOST_PROGRAM);
        /* NOTREACHED */
 }
 
@@ -382,7 +382,7 @@ show_tstamp_types_and_exit(pcap_t *pc, const char *device)
        if (n_tstamp_types == 0) {
                fprintf(stderr, "Time stamp type cannot be set for %s\n",
                    device);
-               exit_tcpdump(0);
+               exit_tcpdump(S_SUCCESS);
        }
        fprintf(stderr, "Time stamp types for %s (use option -j to set):\n",
            device);
@@ -396,7 +396,7 @@ show_tstamp_types_and_exit(pcap_t *pc, const char *device)
                }
        }
        pcap_free_tstamp_types(tstamp_types);
-       exit_tcpdump(0);
+       exit_tcpdump(S_SUCCESS);
 }
 #endif
 
@@ -449,7 +449,7 @@ show_dlts_and_exit(pcap_t *pc, const char *device)
 #ifdef HAVE_PCAP_FREE_DATALINKS
        pcap_free_datalinks(dlts);
 #endif
-       exit_tcpdump(0);
+       exit_tcpdump(S_SUCCESS);
 }
 
 #ifdef HAVE_PCAP_FINDALLDEVS
@@ -471,7 +471,7 @@ show_devices_and_exit(void)
                printf("\n");
        }
        pcap_freealldevs(devlist);
-       exit_tcpdump(0);
+       exit_tcpdump(S_SUCCESS);
 }
 #endif /* HAVE_PCAP_FINDALLDEVS */
 
@@ -495,7 +495,7 @@ show_remote_devices_and_exit(void)
                printf("\n");
        }
        pcap_freealldevs(devlist);
-       exit_tcpdump(0);
+       exit_tcpdump(S_SUCCESS);
 }
 #endif /* HAVE_PCAP_FINDALLDEVS */
 
@@ -679,7 +679,7 @@ droproot(const char *username, const char *chroot_dir)
        if (chroot_dir && !username) {
                fprintf(stderr, "%s: Chroot without dropping root is insecure\n",
                        program_name);
-               exit_tcpdump(1);
+               exit_tcpdump(S_ERR_HOST_PROGRAM);
        }
 
        pw = getpwnam(username);
@@ -688,7 +688,7 @@ droproot(const char *username, const char *chroot_dir)
                        if (chroot(chroot_dir) != 0 || chdir ("/") != 0) {
                                fprintf(stderr, "%s: Couldn't chroot/chdir to '%.64s': %s\n",
                                        program_name, chroot_dir, pcap_strerror(errno));
-                               exit_tcpdump(1);
+                               exit_tcpdump(S_ERR_HOST_PROGRAM);
                        }
                }
 #ifdef HAVE_LIBCAP_NG
@@ -708,7 +708,7 @@ droproot(const char *username, const char *chroot_dir)
                                (unsigned long)pw->pw_uid,
                                (unsigned long)pw->pw_gid,
                                pcap_strerror(errno));
-                       exit_tcpdump(1);
+                       exit_tcpdump(S_ERR_HOST_PROGRAM);
                }
                else {
                        fprintf(stderr, "dropped privs to %s\n", username);
@@ -718,7 +718,7 @@ droproot(const char *username, const char *chroot_dir)
        else {
                fprintf(stderr, "%s: Couldn't find user '%.32s'\n",
                        program_name, username);
-               exit_tcpdump(1);
+               exit_tcpdump(S_ERR_HOST_PROGRAM);
        }
 #ifdef HAVE_LIBCAP_NG
        /* We don't need CAP_SETUID, CAP_SETGID and CAP_SYS_CHROOT any more. */
@@ -1472,7 +1472,7 @@ main(int argc, char **argv)
 
                case 'h':
                        print_usage();
-                       exit_tcpdump(0);
+                       exit_tcpdump(S_SUCCESS);
                        break;
 
                case 'H':
@@ -1706,7 +1706,7 @@ main(int argc, char **argv)
 
                case OPTION_VERSION:
                        print_version();
-                       exit_tcpdump(0);
+                       exit_tcpdump(S_SUCCESS);
                        break;
 
 #ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
@@ -1729,7 +1729,7 @@ main(int argc, char **argv)
 
                default:
                        print_usage();
-                       exit_tcpdump(1);
+                       exit_tcpdump(S_ERR_HOST_PROGRAM);
                        /* NOTREACHED */
                }
 
@@ -2002,7 +2002,7 @@ main(int argc, char **argv)
                pcap_close(pd);
                free(cmdbuf);
                pcap_freecode(&fcode);
-               exit_tcpdump(0);
+               exit_tcpdump(S_SUCCESS);
        }
 
 #ifdef HAVE_CASPER
@@ -2461,7 +2461,7 @@ cleanup(int signo _U_)
                (void)fflush(stdout);
                info(1);
        }
-       exit_tcpdump(0);
+       exit_tcpdump(S_SUCCESS);
 #endif
 }
 
@@ -2561,9 +2561,9 @@ compress_savefile(const char *filename)
                        filename,
                        pcap_strerror(errno));
 #ifdef HAVE_FORK
-       exit(1);
+       exit(S_ERR_HOST_PROGRAM);
 #else
-       _exit(1);
+       _exit(S_ERR_HOST_PROGRAM);
 #endif
 }
 #else  /* HAVE_FORK && HAVE_VFORK */
@@ -2635,7 +2635,7 @@ dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *s
                                (void)fprintf(stderr, "Maximum file limit reached: %d\n",
                                    Wflag);
                                info(1);
-                               exit_tcpdump(0);
+                               exit_tcpdump(S_SUCCESS);
                                /* NOTREACHED */
                        }
                        if (dump_info->CurrentFileName != NULL)