acpi: Narrow workaround for broken interrupt settings
[dragonfly.git] / contrib / tcpdump / netdissect.c
blob7e46d6aa3d3176ede396fefee8c788d7a053db03
1 /*
2 * Copyright (c) 1988-1997
3 * The Regents of the University of California. All rights reserved.
5 * Copyright (c) 1998-2012 Michael Richardson <mcr@tcpdump.org>
6 * The TCPDUMP project
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that: (1) source code distributions
10 * retain the above copyright notice and this paragraph in its entirety, (2)
11 * distributions including binary code include the above copyright notice and
12 * this paragraph in its entirety in the documentation or other materials
13 * provided with the distribution, and (3) all advertising materials mentioning
14 * features or use of this software display the following acknowledgement:
15 * ``This product includes software developed by the University of California,
16 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
17 * the University nor the names of its contributors may be used to endorse
18 * or promote products derived from this software without specific prior
19 * written permission.
20 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
21 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
22 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
25 #ifdef HAVE_CONFIG_H
26 #include <config.h>
27 #endif
29 #include "netdissect-stdinc.h"
30 #include "netdissect.h"
31 #include <string.h>
32 #include <stdio.h>
33 #include <stdlib.h>
35 #ifdef USE_LIBSMI
36 #include <smi.h>
37 #endif
40 * Initialize anything that must be initialized before dissecting
41 * packets.
43 * This should be called at the beginning of the program; it does
44 * not need to be called, and should not be called, for every
45 * netdissect_options structure.
47 int
48 nd_init(char *errbuf, size_t errbuf_size)
50 #ifdef _WIN32
51 WORD wVersionRequested;
52 WSADATA wsaData;
53 int err;
56 * Request Winsock 2.2; we expect Winsock 2.
58 wVersionRequested = MAKEWORD(2, 2);
59 err = WSAStartup(wVersionRequested, &wsaData);
60 if (err != 0) {
61 strlcpy(errbuf, "Attempting to initialize Winsock failed",
62 errbuf_size);
63 return (-1);
65 #endif /* _WIN32 */
67 #ifdef USE_LIBSMI
69 * XXX - should we just fail if this fails? Some of the
70 * libsmi calls may fail.
72 smiInit("tcpdump");
73 #endif
76 * Clears the error buffer, and uses it so we don't get
77 * "unused argument" warnings at compile time.
79 strlcpy(errbuf, "", errbuf_size);
80 return (0);
84 * Clean up anything that ndo_init() did.
86 void
87 nd_cleanup(void)
89 #ifdef USE_LIBSMI
91 * This appears, in libsmi 0.4.8, to do nothing if smiInit()
92 * wasn't done or failed, so we call it unconditionally.
94 smiExit();
95 #endif
97 #ifdef _WIN32
99 * Undo the WSAStartup() call above.
101 WSACleanup();
102 #endif
106 nd_have_smi_support(void)
108 #ifdef USE_LIBSMI
109 return (1);
110 #else
111 return (0);
112 #endif
116 * Indicates whether an SMI module has been loaded, so that we can use
117 * libsmi to translate OIDs.
119 int nd_smi_module_loaded;
122 nd_load_smi_module(const char *module, char *errbuf, size_t errbuf_size)
124 #ifdef USE_LIBSMI
125 if (smiLoadModule(module) == 0) {
126 snprintf(errbuf, errbuf_size, "could not load MIB module %s",
127 module);
128 return (-1);
130 nd_smi_module_loaded = 1;
131 return (0);
132 #else
133 snprintf(errbuf, errbuf_size, "MIB module %s not loaded: no libsmi support",
134 module);
135 return (-1);
136 #endif
139 const char *
140 nd_smi_version_string(void)
142 #ifdef USE_LIBSMI
143 return (smi_version_string);
144 #else
145 return (NULL);
146 #endif
151 nd_push_buffer(netdissect_options *ndo, u_char *new_buffer,
152 const u_char *new_packetp, const u_char *new_snapend)
154 struct netdissect_saved_packet_info *ndspi;
156 ndspi = (struct netdissect_saved_packet_info *)malloc(sizeof(struct netdissect_saved_packet_info));
157 if (ndspi == NULL)
158 return (0); /* fail */
159 ndspi->ndspi_buffer = new_buffer;
160 ndspi->ndspi_packetp = ndo->ndo_packetp;
161 ndspi->ndspi_snapend = ndo->ndo_snapend;
162 ndspi->ndspi_prev = ndo->ndo_packet_info_stack;
164 ndo->ndo_packetp = new_packetp;
165 ndo->ndo_snapend = new_snapend;
166 ndo->ndo_packet_info_stack = ndspi;
168 return (1); /* success */
172 * Set a new snapshot end to the minimum of the existing snapshot end
173 * and the new snapshot end.
176 nd_push_snapend(netdissect_options *ndo, const u_char *new_snapend)
178 struct netdissect_saved_packet_info *ndspi;
180 ndspi = (struct netdissect_saved_packet_info *)malloc(sizeof(struct netdissect_saved_packet_info));
181 if (ndspi == NULL)
182 return (0); /* fail */
183 ndspi->ndspi_buffer = NULL; /* no new buffer */
184 ndspi->ndspi_packetp = ndo->ndo_packetp;
185 ndspi->ndspi_snapend = ndo->ndo_snapend;
186 ndspi->ndspi_prev = ndo->ndo_packet_info_stack;
188 /* No new packet pointer, either */
189 if (new_snapend < ndo->ndo_snapend)
190 ndo->ndo_snapend = new_snapend;
191 ndo->ndo_packet_info_stack = ndspi;
193 return (1); /* success */
197 * Change an already-pushed snapshot end. This may increase the
198 * snapshot end, as it may be used, for example, for a Jumbo Payload
199 * option in IPv6. It must not increase it past the snapshot length
200 * atop which the current one was pushed, however.
202 void
203 nd_change_snapend(netdissect_options *ndo, const u_char *new_snapend)
205 struct netdissect_saved_packet_info *ndspi;
207 ndspi = ndo->ndo_packet_info_stack;
208 if (ndspi->ndspi_prev != NULL) {
209 if (new_snapend <= ndspi->ndspi_prev->ndspi_snapend)
210 ndo->ndo_snapend = new_snapend;
211 } else {
212 if (new_snapend < ndo->ndo_snapend)
213 ndo->ndo_snapend = new_snapend;
217 void
218 nd_pop_packet_info(netdissect_options *ndo)
220 struct netdissect_saved_packet_info *ndspi;
222 ndspi = ndo->ndo_packet_info_stack;
223 ndo->ndo_packetp = ndspi->ndspi_packetp;
224 ndo->ndo_snapend = ndspi->ndspi_snapend;
225 ndo->ndo_packet_info_stack = ndspi->ndspi_prev;
227 free(ndspi->ndspi_buffer);
228 free(ndspi);
231 void
232 nd_pop_all_packet_info(netdissect_options *ndo)
234 while (ndo->ndo_packet_info_stack != NULL)
235 nd_pop_packet_info(ndo);