* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ * SPDX-License-Identifier: GPL-2.0-or-later
*
*******************************************************************************/
#include <string.h>
#include <wsutil/file_util.h>
#include <wsutil/crash_info.h>
-#include <ws_version_info.h>
+#include <version_info.h>
#include <wsutil/inet_addr.h>
#ifdef _WIN32
/* Destination and source addresses for IP header */
static guint32 hdr_ip_dest_addr = 0;
static guint32 hdr_ip_src_addr = 0;
-static struct e_in6_addr hdr_ipv6_dest_addr = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
-static struct e_in6_addr hdr_ipv6_src_addr = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
-static struct e_in6_addr NO_IPv6_ADDRESS = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+static ws_in6_addr hdr_ipv6_dest_addr = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+static ws_in6_addr hdr_ipv6_src_addr = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+static ws_in6_addr NO_IPv6_ADDRESS = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
/* Dummy UDP header */
static int hdr_udp = FALSE;
/*--- Local date -----------------------------------------------------------------*/
/* This is where we store the packet currently being built */
-static guint8 packet_buf[WTAP_MAX_PACKET_SIZE];
+static guint8 packet_buf[WTAP_MAX_PACKET_SIZE_STANDARD];
static guint32 header_length;
static guint32 ip_offset;
static guint32 curr_offset;
-static guint32 max_offset = WTAP_MAX_PACKET_SIZE;
+static guint32 max_offset = WTAP_MAX_PACKET_SIZE_STANDARD;
static guint32 packet_start = 0;
static int start_new_packet(gboolean);
} hdr_ip_t;
static hdr_ip_t HDR_IP = {0x45, 0, 0, 0x3412, 0, 0, 0xff, 0, 0,
-#ifdef WORDS_BIGENDIAN
+#if G_BYTE_ORDER == G_BIG_ENDIAN
0x0a010101, 0x0a020202
#else
0x0101010a, 0x0202020a
};
/* Fixed IP address values */
-#ifdef WORDS_BIGENDIAN
+#if G_BYTE_ORDER == G_BIG_ENDIAN
#define IP_SRC 0x0a010101
#define IP_DST 0x0a020202
#else
} ip6_un1;
guint8 ip6_un2_vfc; /* 4 bits version, 4 bits priority */
} ip6_ctlun;
- struct e_in6_addr ip6_src; /* source address */
- struct e_in6_addr ip6_dst; /* destination address */
+ ws_in6_addr ip6_src; /* source address */
+ ws_in6_addr ip6_dst; /* destination address */
} hdr_ipv6_t;
static hdr_ipv6_t HDR_IPv6;
{
guint32 i;
- if (curr_offset + nbytes < WTAP_MAX_PACKET_SIZE) {
+ if (curr_offset + nbytes < WTAP_MAX_PACKET_SIZE_STANDARD) {
for (i = 0; i < nbytes; i++) {
packet_buf[curr_offset] = bytes[i];
curr_offset++;
HDR_IP.hdr_checksum = in_checksum(&HDR_IP, sizeof(HDR_IP));
write_bytes((const char *)&HDR_IP, sizeof(HDR_IP));
} else if (hdr_ipv6) {
- if (memcmp(isInbound ? &hdr_ipv6_dest_addr : &hdr_ipv6_src_addr, &NO_IPv6_ADDRESS, sizeof(struct e_in6_addr)))
- memcpy(&HDR_IPv6.ip6_src, isInbound ? &hdr_ipv6_dest_addr : &hdr_ipv6_src_addr, sizeof(struct e_in6_addr));
- if (memcmp(isInbound ? &hdr_ipv6_src_addr : &hdr_ipv6_dest_addr, &NO_IPv6_ADDRESS, sizeof(struct e_in6_addr)))
- memcpy(&HDR_IPv6.ip6_dst, isInbound ? &hdr_ipv6_src_addr : &hdr_ipv6_dest_addr, sizeof(struct e_in6_addr));
+ if (memcmp(isInbound ? &hdr_ipv6_dest_addr : &hdr_ipv6_src_addr, &NO_IPv6_ADDRESS, sizeof(ws_in6_addr)))
+ memcpy(&HDR_IPv6.ip6_src, isInbound ? &hdr_ipv6_dest_addr : &hdr_ipv6_src_addr, sizeof(ws_in6_addr));
+ if (memcmp(isInbound ? &hdr_ipv6_src_addr : &hdr_ipv6_dest_addr, &NO_IPv6_ADDRESS, sizeof(ws_in6_addr)))
+ memcpy(&HDR_IPv6.ip6_dst, isInbound ? &hdr_ipv6_src_addr : &hdr_ipv6_dest_addr, sizeof(ws_in6_addr));
HDR_IPv6.ip6_ctlun.ip6_un2_vfc &= 0x0F;
HDR_IPv6.ip6_ctlun.ip6_un2_vfc |= (6<< 4);
" used as the default for unspecified fields.\n"
" -D the text before the packet starts with an I or an O,\n"
" indicating that the packet is inbound or outbound.\n"
- " This is only stored if the output format is PCAP-NG.\n"
+ " This is only stored if the output format is pcapng.\n"
" -a enable ASCII text dump identification.\n"
" The start of the ASCII text dump can be identified\n"
" and excluded from the packet data, even if it looks\n"
" -h display this help and exit.\n"
" -d show detailed debug of parser states.\n"
" -q generate no output at all (automatically disables -d).\n"
- " -n use PCAP-NG instead of PCAP as output format.\n"
+ " -n use pcapng instead of pcap as output format.\n"
"",
- WTAP_MAX_PACKET_SIZE);
+ WTAP_MAX_PACKET_SIZE_STANDARD);
}
/*----------------------------------------------------------------------
{"version", no_argument, NULL, 'v'},
{0, 0, 0, 0 }
};
-
-#ifdef _WIN32
- arg_list_utf_16to8(argc, argv);
- create_app_running_mutex();
-#endif /* _WIN32 */
+ struct tm *now_tm;
/* Get the compile-time version information string */
comp_info_str = get_compiled_version_info(NULL, NULL);
return EXIT_FAILURE;
}
- hdr_ip = TRUE;
hdr_ip_proto = 132;
hdr_ethernet = TRUE;
hdr_ethernet_proto = 0x800;
return EXIT_FAILURE;
}
- hdr_ip = TRUE;
hdr_ip_proto = 132;
hdr_ethernet = TRUE;
hdr_ethernet_proto = 0x800;
print_usage(stderr);
return EXIT_FAILURE;
}
- hdr_ip = TRUE;
hdr_ip_proto = 17;
hdr_ethernet = TRUE;
hdr_ethernet_proto = 0x800;
print_usage(stderr);
return EXIT_FAILURE;
}
- hdr_ip = TRUE;
hdr_ip_proto = 6;
hdr_ethernet = TRUE;
hdr_ethernet_proto = 0x800;
return EXIT_FAILURE;
}
+ if (max_offset > WTAP_MAX_PACKET_SIZE_STANDARD) {
+ fprintf(stderr, "Maximum packet length cannot be more than %d bytes\n",
+ WTAP_MAX_PACKET_SIZE_STANDARD);
+ return EXIT_FAILURE;
+ }
+
if (strcmp(argv[optind], "-") != 0) {
input_filename = argv[optind];
input_file = ws_fopen(input_filename, "rb");
}
ts_sec = time(0); /* initialize to current time */
- /* We trust the OS to return a time after the Epoch. */
- timecode_default = *localtime(&ts_sec);
+ now_tm = localtime(&ts_sec);
+ if (now_tm == NULL) {
+ /*
+ * This shouldn't happen - on UN*X, this should Just Work, and
+ * on Windows, it won't work if ts_sec is before the Epoch,
+ * but it's long after 1970, so....
+ */
+ fprintf(stderr, "localtime(right now) failed\n");
+ return EXIT_FAILURE;
+ }
+ timecode_default = *now_tm;
timecode_default.tm_isdst = -1; /* Unknown for now, depends on time given to the strptime() function */
+ if ((hdr_tcp || hdr_udp || hdr_sctp) && !(hdr_ip || hdr_ipv6)) {
+ /*
+ * If TCP (-T), UDP (-u) or SCTP (-s/-S) header options are specified
+ * but none of IPv4 (-4) or IPv6 (-6) options then add an IPv4 header
+ */
+ hdr_ip = TRUE;
+ }
+
/* Display summary of our state */
if (!quiet) {
fprintf(stderr, "Input from: %s\n", input_filename);
fprintf(stderr, "Output to: %s\n", output_filename);
- fprintf(stderr, "Output format: %s\n", use_pcapng ? "PCAP-NG" : "PCAP");
+ fprintf(stderr, "Output format: %s\n", use_pcapng ? "pcapng" : "pcap");
if (hdr_ethernet) fprintf(stderr, "Generate dummy Ethernet header: Protocol: 0x%0X\n",
hdr_ethernet_proto);
if (hdr_ip) fprintf(stderr, "Generate dummy IP header: Protocol: %ld\n",
hdr_ip_proto);
+ if (hdr_ipv6) fprintf(stderr, "Generate dummy IPv6 header: Protocol: %ld\n",
+ hdr_ip_proto);
if (hdr_udp) fprintf(stderr, "Generate dummy UDP header: Source port: %u. Dest port: %u\n",
hdr_src_port, hdr_dest_port);
if (hdr_tcp) fprintf(stderr, "Generate dummy TCP header: Source port: %u. Dest port: %u\n",
return EXIT_SUCCESS;
}
-int
-main(int argc, char *argv[])
+static int
+real_main(int argc, char *argv[])
{
int ret = EXIT_SUCCESS;
- parse_options(argc, argv);
+#ifdef _WIN32
+ create_app_running_mutex();
+#endif /* _WIN32 */
+
+ if (parse_options(argc, argv) != EXIT_SUCCESS) {
+ ret = EXIT_FAILURE;
+ goto clean_exit;
+ }
assert(input_file != NULL);
assert(output_file != NULL);
curr_offset = header_length;
text2pcap_in = input_file;
- if (text2pcap_lex() == EXIT_SUCCESS) {
+ if (text2pcap_scan() == EXIT_SUCCESS) {
if (write_current_packet(FALSE) != EXIT_SUCCESS)
ret = EXIT_FAILURE;
} else {
bytes_written, (bytes_written == 1) ? "" : "s");
}
clean_exit:
- text2pcap_lex_destroy();
- fclose(input_file);
- fclose(output_file);
+ if (input_file) {
+ fclose(input_file);
+ }
+ if (output_file) {
+ fclose(output_file);
+ }
return ret;
}
+#ifdef _WIN32
+int
+wmain(int argc, wchar_t *wc_argv[])
+{
+ char **argv;
+
+ argv = arg_list_utf_16to8(argc, wc_argv);
+ return real_main(argc, argv);
+}
+#else
+int
+main(int argc, char *argv[])
+{
+ return real_main(argc, argv);
+}
+#endif
+
/*
* Editor modelines - http://www.wireshark.org/tools/modelines.html
*
* vi: set shiftwidth=4 tabstop=8 expandtab:
* :indentSize=4:tabSize=8:noTabs=true:
*/
-