* Creates random packet traces. Useful for debugging sniffers by testing
* assumptions about the veracity of the data found in the packet.
*
- * $Id$
- *
* Copyright (C) 1999 by Gilbert Ramirez <gram@alumni.rice.edu>
*
* This program is free software; you can redistribute it and/or
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+#include <config.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
-#ifndef HAVE_GETOPT
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#ifndef HAVE_GETOPT_LONG
#include "wsutil/wsgetopt.h"
#endif
static int parse_type(char *string);
-static void usage(void);
+static void usage(gboolean is_error);
static void seed(void);
static pkt_example* find_example(int type);
wtap_dumper *dump;
struct wtap_pkthdr pkthdr;
- union wtap_pseudo_header ps_header;
+ union wtap_pseudo_header *ps_header = &pkthdr.pseudo_header;
int i, j, len_this_pkt, len_random, err;
+ gchar *err_info;
guint8 buffer[65536];
int opt;
char *produce_filename = NULL;
int produce_max_bytes = 5000;
pkt_example *example;
+ static const struct option long_options[] = {
+ {(char *)"help", no_argument, NULL, 'h'},
+ {0, 0, 0, 0 }
+ };
#ifdef _WIN32
arg_list_utf_16to8(argc, argv);
+ create_app_running_mutex();
#endif /* _WIN32 */
- while ((opt = getopt(argc, argv, "b:c:ht:")) != -1) {
+ while ((opt = getopt_long(argc, argv, "b:c:ht:", long_options, NULL)) != -1) {
switch (opt) {
case 'b': /* max bytes */
produce_max_bytes = atoi(optarg);
break;
case 'h':
+ usage(FALSE);
+ break;
default:
- usage();
+ usage(TRUE);
break;
}
}
produce_filename = argv[optind];
}
else {
- usage();
+ usage(TRUE);
}
example = find_example(produce_type);
- dump = wtap_dump_open(produce_filename, WTAP_FILE_PCAP,
+ dump = wtap_dump_open(produce_filename, WTAP_FILE_TYPE_SUBTYPE_PCAP,
example->sample_wtap_encap, produce_max_bytes, FALSE /* compressed */, &err);
if (!dump) {
fprintf(stderr,
}
memset(&pkthdr, 0, sizeof(pkthdr));
- memset(&ps_header, 0, sizeof(ps_header));
memset(buffer, 0, sizeof(buffer));
+ pkthdr.rec_type = REC_TYPE_PACKET;
+ pkthdr.presence_flags = WTAP_HAS_TS;
pkthdr.pkt_encap = example->sample_wtap_encap;
/* Load the sample pseudoheader into our pseudoheader buffer */
if (example->pseudo_buffer)
- memcpy(&ps_header, example->pseudo_buffer, example->pseudo_length);
+ memcpy(ps_header, example->pseudo_buffer, example->pseudo_length);
/* Load the sample into our buffer */
if (example->sample_buffer)
pkthdr.len = len_this_pkt;
pkthdr.ts.secs = i; /* just for variety */
- for (j = example->pseudo_length; j < (int) sizeof(ps_header); j++) {
- ((guint8*)&ps_header)[j] = (rand() % 0x100);
+ for (j = example->pseudo_length; j < (int) sizeof(*ps_header); j++) {
+ ((guint8*)ps_header)[j] = (rand() % 0x100);
}
for (j = example->sample_length; j < len_this_pkt; j++) {
}
}
- wtap_dump(dump, &pkthdr, &ps_header, &buffer[0], &err);
+ /* XXX - report errors! */
+ if (!wtap_dump(dump, &pkthdr, &buffer[0], &err, &err_info)) {
+ if (err_info != NULL)
+ g_free(err_info);
+ }
}
wtap_dump_close(dump, &err);
}
/* Print usage statement and exit program */
-static
-void usage(void)
+static void
+usage(gboolean is_error)
{
- int num_entries = array_length(examples);
- int i;
+ FILE *output;
+ int num_entries = array_length(examples);
+ int i;
- printf("Usage: randpkt [-b maxbytes] [-c count] [-t type] filename\n");
- printf("Default max bytes (per packet) is 5000\n");
- printf("Default count is 1000.\n");
- printf("Types:\n");
+ if (!is_error) {
+ output = stdout;
+ }
+ else {
+ output = stderr;
+ }
+
+ fprintf(output, "Usage: randpkt [-b maxbytes] [-c count] [-t type] filename\n");
+ fprintf(output, "Default max bytes (per packet) is 5000\n");
+ fprintf(output, "Default count is 1000.\n");
+ fprintf(output, "Types:\n");
for (i = 0; i < num_entries; i++) {
- printf("\t%s\t%s\n", examples[i].abbrev, examples[i].longname);
+ fprintf(output, "\t%-16s%s\n", examples[i].abbrev, examples[i].longname);
}
- printf("\n");
+ fprintf(output, "\n");
- exit(0);
+ exit(is_error ? 1 : 0);
}
/* Parse command-line option "type" and return enum type */
seed(void)
{
unsigned int randomness;
- time_t now;
+ time_t now;
#ifndef _WIN32
int fd;
ssize_t ret;
srand(randomness);
}
+
+/*
+ * Editor modelines - http://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 8
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * End:
+ *
+ * vi: set shiftwidth=8 tabstop=8 noexpandtab:
+ * :indentSize=8:tabSize=8:noTabs=false:
+ */