diff --git a/print-arcnet.c b/print-arcnet.c
index abc19b8..5f6aaf9 100644
--- a/print-arcnet.c
+++ b/print-arcnet.c
@@ -24,10 +24,10 @@
 /* \summary: Attached Resource Computer NETwork (ARCNET) printer */
 
 #ifdef HAVE_CONFIG_H
-#include "config.h"
+#include <config.h>
 #endif
 
-#include <netdissect-stdinc.h>
+#include "netdissect-stdinc.h"
 
 #include "netdissect.h"
 #include "extract.h"
@@ -41,22 +41,22 @@
  * as given to interface code.
  */
 struct	arc_header {
-	uint8_t  arc_shost;
-	uint8_t  arc_dhost;
-	uint8_t  arc_type;
+	nd_uint8_t  arc_shost;
+	nd_uint8_t  arc_dhost;
+	nd_uint8_t  arc_type;
 	/*
 	 * only present for newstyle encoding with LL fragmentation.
 	 * Don't use sizeof(anything), use ARC_HDR{,NEW}LEN instead.
 	 */
-	uint8_t  arc_flag;
-	uint16_t arc_seqid;
+	nd_uint8_t  arc_flag;
+	nd_uint16_t arc_seqid;
 
 	/*
 	 * only present in exception packets (arc_flag == 0xff)
 	 */
-	uint8_t  arc_type2;	/* same as arc_type */
-	uint8_t  arc_flag2;	/* real flag value */
-	uint16_t arc_seqid2;	/* real seqid value */
+	nd_uint8_t  arc_type2;	/* same as arc_type */
+	nd_uint8_t  arc_flag2;	/* real flag value */
+	nd_uint16_t arc_seqid2;	/* real seqid value */
 };
 
 #define	ARC_HDRLEN		3
@@ -85,17 +85,17 @@
  * never presents packets that look like exception frames.
  */
 struct	arc_linux_header {
-	uint8_t  arc_shost;
-	uint8_t  arc_dhost;
-	uint16_t arc_offset;
-	uint8_t  arc_type;
+	nd_uint8_t  arc_shost;
+	nd_uint8_t  arc_dhost;
+	nd_uint16_t arc_offset;
+	nd_uint8_t  arc_type;
 	/*
 	 * only present for newstyle encoding with LL fragmentation.
 	 * Don't use sizeof(anything), use ARC_LINUX_HDR{,NEW}LEN
 	 * instead.
 	 */
-	uint8_t  arc_flag;
-	uint16_t arc_seqid;
+	nd_uint8_t  arc_flag;
+	nd_uint16_t arc_seqid;
 };
 
 #define	ARC_LINUX_HDRLEN	5
@@ -115,54 +115,61 @@
 	{ ARCTYPE_IPX,		"ipx" },
 	{ ARCTYPE_INET6,	"ipv6" },
 	{ ARCTYPE_DIAGNOSE,	"diag" },
-	{ 0, 0 }
+	{ 0, NULL }
 };
 
-static inline void
+static void
 arcnet_print(netdissect_options *ndo, const u_char *bp, u_int length, int phds,
-             int flag, u_int seqid)
+             u_int flag, u_int seqid)
 {
 	const struct arc_header *ap;
 	const char *arctypename;
 
-
+	ndo->ndo_protocol = "arcnet";
 	ap = (const struct arc_header *)bp;
 
-
 	if (ndo->ndo_qflag) {
-		ND_PRINT((ndo, "%02x %02x %d: ",
-			     ap->arc_shost,
-			     ap->arc_dhost,
-			     length));
+		ND_PRINT("%02x %02x %u: ",
+			     GET_U_1(ap->arc_shost),
+			     GET_U_1(ap->arc_dhost),
+			     length);
 		return;
 	}
 
-	arctypename = tok2str(arctypemap, "%02x", ap->arc_type);
+	arctypename = tok2str(arctypemap, "%02x", GET_U_1(ap->arc_type));
 
 	if (!phds) {
-		ND_PRINT((ndo, "%02x %02x %s %d: ",
-			     ap->arc_shost, ap->arc_dhost, arctypename,
-			     length));
-			     return;
+		ND_PRINT("%02x %02x %s %u: ",
+			     GET_U_1(ap->arc_shost),
+			     GET_U_1(ap->arc_dhost),
+			     arctypename,
+			     length);
+		return;
 	}
 
 	if (flag == 0) {
-		ND_PRINT((ndo, "%02x %02x %s seqid %04x %d: ",
-			ap->arc_shost, ap->arc_dhost, arctypename, seqid,
-			length));
-			return;
+		ND_PRINT("%02x %02x %s seqid %04x %u: ",
+			GET_U_1(ap->arc_shost),
+			GET_U_1(ap->arc_dhost),
+			arctypename, seqid,
+			length);
+		return;
 	}
 
 	if (flag & 1)
-		ND_PRINT((ndo, "%02x %02x %s seqid %04x "
-			"(first of %d fragments) %d: ",
-			ap->arc_shost, ap->arc_dhost, arctypename, seqid,
-			(flag + 3) / 2, length));
+		ND_PRINT("%02x %02x %s seqid %04x "
+			"(first of %u fragments) %u: ",
+			GET_U_1(ap->arc_shost),
+			GET_U_1(ap->arc_dhost),
+			arctypename, seqid,
+			(flag + 3) / 2, length);
 	else
-		ND_PRINT((ndo, "%02x %02x %s seqid %04x "
-			"(fragment %d) %d: ",
-			ap->arc_shost, ap->arc_dhost, arctypename, seqid,
-			flag/2 + 1, length));
+		ND_PRINT("%02x %02x %s seqid %04x "
+			"(fragment %u) %u: ",
+			GET_U_1(ap->arc_shost),
+			GET_U_1(ap->arc_dhost),
+			arctypename, seqid,
+			flag/2 + 1, length);
 }
 
 /*
@@ -171,24 +178,26 @@
  * 'h->len' is the length of the packet off the wire, and 'h->caplen'
  * is the number of bytes actually captured.
  */
-u_int
+void
 arcnet_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
 {
 	u_int caplen = h->caplen;
 	u_int length = h->len;
 	const struct arc_header *ap;
 
-	int phds, flag = 0, archdrlen = 0;
+	int phds;
+	u_int flag = 0, archdrlen = 0;
 	u_int seqid = 0;
 	u_char arc_type;
 
-	if (caplen < ARC_HDRLEN || length < ARC_HDRLEN) {
-		ND_PRINT((ndo, "[|arcnet]"));
-		return (caplen);
+	ndo->ndo_protocol = "arcnet";
+	if (caplen < ARC_HDRLEN) {
+		ndo->ndo_ll_hdr_len += caplen;
+		nd_trunc_longjmp(ndo);
 	}
 
 	ap = (const struct arc_header *)p;
-	arc_type = ap->arc_type;
+	arc_type = GET_U_1(ap->arc_type);
 
 	switch (arc_type) {
 	default:
@@ -203,24 +212,26 @@
 	}
 
 	if (phds) {
-		if (caplen < ARC_HDRNEWLEN || length < ARC_HDRNEWLEN) {
+		if (caplen < ARC_HDRNEWLEN) {
 			arcnet_print(ndo, p, length, 0, 0, 0);
-			ND_PRINT((ndo, "[|phds]"));
-			return (caplen);
+			ND_PRINT(" phds");
+			ndo->ndo_ll_hdr_len += caplen;
+			nd_trunc_longjmp(ndo);
 		}
 
-		if (ap->arc_flag == 0xff) {
-			if (caplen < ARC_HDRNEWLEN_EXC || length < ARC_HDRNEWLEN_EXC) {
+		flag = GET_U_1(ap->arc_flag);
+		if (flag == 0xff) {
+			if (caplen < ARC_HDRNEWLEN_EXC) {
 				arcnet_print(ndo, p, length, 0, 0, 0);
-				ND_PRINT((ndo, "[|phds extended]"));
-				return (caplen);
+				ND_PRINT(" phds extended");
+				ndo->ndo_ll_hdr_len += caplen;
+				nd_trunc_longjmp(ndo);
 			}
-			flag = ap->arc_flag2;
-			seqid = EXTRACT_16BITS(&ap->arc_seqid2);
+			flag = GET_U_1(ap->arc_flag2);
+			seqid = GET_BE_U_2(ap->arc_seqid2);
 			archdrlen = ARC_HDRNEWLEN_EXC;
 		} else {
-			flag = ap->arc_flag;
-			seqid = EXTRACT_16BITS(&ap->arc_seqid);
+			seqid = GET_BE_U_2(ap->arc_seqid);
 			archdrlen = ARC_HDRNEWLEN;
 		}
 	}
@@ -240,13 +251,14 @@
 		/*
 		 * This is a middle fragment.
 		 */
-		return (archdrlen);
+		ndo->ndo_ll_hdr_len += archdrlen;
+		return;
 	}
 
 	if (!arcnet_encap_print(ndo, arc_type, p, length, caplen))
 		ND_DEFAULTPRINT(p, caplen);
 
-	return (archdrlen);
+	ndo->ndo_ll_hdr_len += archdrlen;
 }
 
 /*
@@ -259,7 +271,7 @@
  * reassembled packets rather than raw frames, and headers have an
  * extra "offset" field between the src/dest and packet type.
  */
-u_int
+void
 arcnet_linux_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
 {
 	u_int caplen = h->caplen;
@@ -269,20 +281,21 @@
 	int archdrlen = 0;
 	u_char arc_type;
 
-	if (caplen < ARC_LINUX_HDRLEN || length < ARC_LINUX_HDRLEN) {
-		ND_PRINT((ndo, "[|arcnet]"));
-		return (caplen);
+	ndo->ndo_protocol = "arcnet_linux";
+	if (caplen < ARC_LINUX_HDRLEN) {
+		ndo->ndo_ll_hdr_len += caplen;
+		nd_trunc_longjmp(ndo);
 	}
 
 	ap = (const struct arc_linux_header *)p;
-	arc_type = ap->arc_type;
+	arc_type = GET_U_1(ap->arc_type);
 
 	switch (arc_type) {
 	default:
 		archdrlen = ARC_LINUX_HDRNEWLEN;
-		if (caplen < ARC_LINUX_HDRNEWLEN || length < ARC_LINUX_HDRNEWLEN) {
-			ND_PRINT((ndo, "[|arcnet]"));
-			return (caplen);
+		if (caplen < ARC_LINUX_HDRNEWLEN) {
+			ndo->ndo_ll_hdr_len += caplen;
+			nd_trunc_longjmp(ndo);
 		}
 		break;
 	case ARCTYPE_IP_OLD:
@@ -305,7 +318,7 @@
 	if (!arcnet_encap_print(ndo, arc_type, p, length, caplen))
 		ND_DEFAULTPRINT(p, caplen);
 
-	return (archdrlen);
+	ndo->ndo_ll_hdr_len += archdrlen;
 }
 
 /*
@@ -339,7 +352,7 @@
 
 	case ARCTYPE_ATALK:	/* XXX was this ever used? */
 		if (ndo->ndo_vflag)
-			ND_PRINT((ndo, "et1 "));
+			ND_PRINT("et1 ");
 		atalk_print(ndo, p, length);
 		return (1);
 
@@ -351,10 +364,3 @@
 		return (0);
 	}
 }
-
-/*
- * Local Variables:
- * c-style: bsd
- * End:
- */
-
