kerberos dissect KERBEROS_AD_GSS_API_ETYPE_NEGOTIATION content
[metze/wireshark/wip.git] / wiretap / btsnoop.c
index 9d026e4c643ab0db4729281b36389785b570bd83..91a09d3b3a8465113cc52c900ffffa4ddc1276ad 100644 (file)
@@ -3,19 +3,7 @@
  * Wiretap Library
  * Copyright (c) 1998 by Gilbert Ramirez <gram@alumni.rice.edu>
  *
- * 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 "config.h"
@@ -23,8 +11,6 @@
 #include <string.h>
 #include "wtap-int.h"
 #include "file_wrappers.h"
-#include <wsutil/buffer.h>
-#include "atm.h"
 #include "btsnoop.h"
 
 /*
@@ -76,9 +62,9 @@ static const gint64 KUnixTimeBase = G_GINT64_CONSTANT(0x00dcddb30f2f8000); /* of
 static gboolean btsnoop_read(wtap *wth, int *err, gchar **err_info,
     gint64 *data_offset);
 static gboolean btsnoop_seek_read(wtap *wth, gint64 seek_off,
-    struct wtap_pkthdr *phdr, Buffer *buf, int *err, gchar **err_info);
+    wtap_rec *rec, Buffer *buf, int *err, gchar **err_info);
 static gboolean btsnoop_read_record(wtap *wth, FILE_T fh,
-    struct wtap_pkthdr *phdr, Buffer *buf, int *err, gchar **err_info);
+    wtap_rec *rec, Buffer *buf, int *err, gchar **err_info);
 
 wtap_open_return_val btsnoop_open(wtap *wth, int *err, gchar **err_info)
 {
@@ -122,18 +108,18 @@ wtap_open_return_val btsnoop_open(wtap *wth, int *err, gchar **err_info)
         break;
     case KHciLoggerDatalinkTypeBCSP:
         *err = WTAP_ERR_UNSUPPORTED;
-        *err_info = g_strdup_printf("btsnoop: BCSP capture logs unsupported");
+        *err_info = g_strdup("btsnoop: BCSP capture logs unsupported");
         return WTAP_OPEN_ERROR;
     case KHciLoggerDatalinkTypeH5:
         *err = WTAP_ERR_UNSUPPORTED;
-        *err_info = g_strdup_printf("btsnoop: H5 capture logs unsupported");
+        *err_info = g_strdup("btsnoop: H5 capture logs unsupported");
         return WTAP_OPEN_ERROR;
     case KHciLoggerDatalinkLinuxMonitor:
         file_encap=WTAP_ENCAP_BLUETOOTH_LINUX_MONITOR;
         break;
     case KHciLoggerDatalinkBlueZ5Simulator:
         *err = WTAP_ERR_UNSUPPORTED;
-        *err_info = g_strdup_printf("btsnoop: BlueZ 5 Simulator capture logs unsupported");
+        *err_info = g_strdup("btsnoop: BlueZ 5 Simulator capture logs unsupported");
         return WTAP_OPEN_ERROR;
     default:
         *err = WTAP_ERR_UNSUPPORTED;
@@ -155,21 +141,21 @@ static gboolean btsnoop_read(wtap *wth, int *err, gchar **err_info,
 {
     *data_offset = file_tell(wth->fh);
 
-    return btsnoop_read_record(wth, wth->fh, &wth->phdr, wth->frame_buffer,
+    return btsnoop_read_record(wth, wth->fh, &wth->rec, wth->rec_data,
                                err, err_info);
 }
 
 static gboolean btsnoop_seek_read(wtap *wth, gint64 seek_off,
-                                  struct wtap_pkthdr *phdr, Buffer *buf, int *err, gchar **err_info)
+                                  wtap_rec *rec, Buffer *buf, int *err, gchar **err_info)
 {
     if (file_seek(wth->random_fh, seek_off, SEEK_SET, err) == -1)
         return FALSE;
 
-    return btsnoop_read_record(wth, wth->random_fh, phdr, buf, err, err_info);
+    return btsnoop_read_record(wth, wth->random_fh, rec, buf, err, err_info);
 }
 
 static gboolean btsnoop_read_record(wtap *wth, FILE_T fh,
-                                    struct wtap_pkthdr *phdr, Buffer *buf, int *err, gchar **err_info)
+                                    wtap_rec *rec, Buffer *buf, int *err, gchar **err_info)
 {
     struct btsnooprec_hdr hdr;
     guint32 packet_size;
@@ -185,55 +171,54 @@ static gboolean btsnoop_read_record(wtap *wth, FILE_T fh,
     packet_size = g_ntohl(hdr.incl_len);
     orig_size = g_ntohl(hdr.orig_len);
     flags = g_ntohl(hdr.flags);
-    if (packet_size > WTAP_MAX_PACKET_SIZE) {
+    if (packet_size > WTAP_MAX_PACKET_SIZE_STANDARD) {
         /*
          * Probably a corrupt capture file; don't blow up trying
          * to allocate space for an immensely-large packet.
          */
         *err = WTAP_ERR_BAD_FILE;
         *err_info = g_strdup_printf("btsnoop: File has %u-byte packet, bigger than maximum of %u",
-                                    packet_size, WTAP_MAX_PACKET_SIZE);
+                                    packet_size, WTAP_MAX_PACKET_SIZE_STANDARD);
         return FALSE;
     }
 
     ts = GINT64_FROM_BE(hdr.ts_usec);
     ts -= KUnixTimeBase;
 
-    phdr->rec_type = REC_TYPE_PACKET;
-    phdr->pkt_encap = wth->file_encap;
-    phdr->presence_flags = WTAP_HAS_TS|WTAP_HAS_CAP_LEN;
-    phdr->ts.secs = (guint)(ts / 1000000);
-    phdr->ts.nsecs = (guint)((ts % 1000000) * 1000);
-    phdr->caplen = packet_size;
-    phdr->len = orig_size;
+    rec->rec_type = REC_TYPE_PACKET;
+    rec->presence_flags = WTAP_HAS_TS|WTAP_HAS_CAP_LEN;
+    rec->ts.secs = (guint)(ts / 1000000);
+    rec->ts.nsecs = (guint)((ts % 1000000) * 1000);
+    rec->rec_header.packet_header.caplen = packet_size;
+    rec->rec_header.packet_header.len = orig_size;
     if(wth->file_encap == WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR)
     {
-        phdr->pseudo_header.p2p.sent = (flags & KHciLoggerControllerToHost) ? FALSE : TRUE;
+        rec->rec_header.packet_header.pseudo_header.p2p.sent = (flags & KHciLoggerControllerToHost) ? FALSE : TRUE;
     } else if(wth->file_encap == WTAP_ENCAP_BLUETOOTH_HCI) {
-        phdr->pseudo_header.bthci.sent = (flags & KHciLoggerControllerToHost) ? FALSE : TRUE;
+        rec->rec_header.packet_header.pseudo_header.bthci.sent = (flags & KHciLoggerControllerToHost) ? FALSE : TRUE;
         if(flags & KHciLoggerCommandOrEvent)
         {
-            if(phdr->pseudo_header.bthci.sent)
+            if(rec->rec_header.packet_header.pseudo_header.bthci.sent)
             {
-                phdr->pseudo_header.bthci.channel = BTHCI_CHANNEL_COMMAND;
+                rec->rec_header.packet_header.pseudo_header.bthci.channel = BTHCI_CHANNEL_COMMAND;
             }
             else
             {
-                phdr->pseudo_header.bthci.channel = BTHCI_CHANNEL_EVENT;
+                rec->rec_header.packet_header.pseudo_header.bthci.channel = BTHCI_CHANNEL_EVENT;
             }
         }
         else
         {
-            phdr->pseudo_header.bthci.channel = BTHCI_CHANNEL_ACL;
+            rec->rec_header.packet_header.pseudo_header.bthci.channel = BTHCI_CHANNEL_ACL;
         }
     } else  if (wth->file_encap == WTAP_ENCAP_BLUETOOTH_LINUX_MONITOR) {
-        phdr->pseudo_header.btmon.opcode = flags & 0xFFFF;
-        phdr->pseudo_header.btmon.adapter_id = flags >> 16;
+        rec->rec_header.packet_header.pseudo_header.btmon.opcode = flags & 0xFFFF;
+        rec->rec_header.packet_header.pseudo_header.btmon.adapter_id = flags >> 16;
     }
 
 
     /* Read packet data. */
-    return wtap_read_packet_bytes(fh, buf, phdr->caplen, err, err_info);
+    return wtap_read_packet_bytes(fh, buf, rec->rec_header.packet_header.caplen, err, err_info);
 }
 
 /* Returns 0 if we could write the specified encapsulation type,
@@ -283,7 +268,7 @@ static guint8 btsnoop_lookup_flags(guint8 hci_type, gboolean sent, guint8 *flags
 }
 
 static gboolean btsnoop_format_partial_rec_hdr(
-    const struct wtap_pkthdr *phdr,
+    const wtap_rec *rec,
     const union wtap_pseudo_header *pseudo_header,
     const guint8 *pd, int *err, gchar **err_info,
     struct btsnooprec_hdr *rec_hdr)
@@ -300,8 +285,8 @@ static gboolean btsnoop_format_partial_rec_hdr(
         return FALSE;
     }
 
-    nsecs = phdr->ts.nsecs;
-    ts_usec  = ((gint64) phdr->ts.secs * 1000000) + (nsecs / 1000);
+    nsecs = rec->ts.nsecs;
+    ts_usec  = ((gint64) rec->ts.secs * 1000000) + (nsecs / 1000);
     ts_usec += KUnixTimeBase;
 
     rec_hdr->flags = GUINT32_TO_BE(flags);
@@ -313,14 +298,14 @@ static gboolean btsnoop_format_partial_rec_hdr(
 
 /* FIXME: How do we support multiple backends?*/
 static gboolean btsnoop_dump_h1(wtap_dumper *wdh,
-    const struct wtap_pkthdr *phdr,
+    const wtap_rec *rec,
     const guint8 *pd, int *err, gchar **err_info)
 {
-    const union wtap_pseudo_header *pseudo_header = &phdr->pseudo_header;
+    const union wtap_pseudo_header *pseudo_header = &rec->rec_header.packet_header.pseudo_header;
     struct btsnooprec_hdr rec_hdr;
 
     /* We can only write packet records. */
-    if (phdr->rec_type != REC_TYPE_PACKET) {
+    if (rec->rec_type != REC_TYPE_PACKET) {
         *err = WTAP_ERR_UNWRITABLE_REC_TYPE;
         return FALSE;
     }
@@ -329,17 +314,17 @@ static gboolean btsnoop_dump_h1(wtap_dumper *wdh,
      * Don't write out anything bigger than we can read.
      * (This will also fail on a caplen of 0, as it should.)
      */
-    if (phdr->caplen-1 > WTAP_MAX_PACKET_SIZE) {
+    if (rec->rec_header.packet_header.caplen-1 > WTAP_MAX_PACKET_SIZE_STANDARD) {
         *err = WTAP_ERR_PACKET_TOO_LARGE;
         return FALSE;
     }
 
-    if (!btsnoop_format_partial_rec_hdr(phdr, pseudo_header, pd, err, err_info,
+    if (!btsnoop_format_partial_rec_hdr(rec, pseudo_header, pd, err, err_info,
                                         &rec_hdr))
         return FALSE;
 
-    rec_hdr.incl_len = GUINT32_TO_BE(phdr->caplen-1);
-    rec_hdr.orig_len = GUINT32_TO_BE(phdr->len-1);
+    rec_hdr.incl_len = GUINT32_TO_BE(rec->rec_header.packet_header.caplen-1);
+    rec_hdr.orig_len = GUINT32_TO_BE(rec->rec_header.packet_header.len-1);
 
     if (!wtap_dump_file_write(wdh, &rec_hdr, sizeof rec_hdr, err))
         return FALSE;
@@ -349,49 +334,49 @@ static gboolean btsnoop_dump_h1(wtap_dumper *wdh,
     /* Skip HCI packet type */
     ++pd;
 
-    if (!wtap_dump_file_write(wdh, pd, phdr->caplen-1, err))
+    if (!wtap_dump_file_write(wdh, pd, rec->rec_header.packet_header.caplen-1, err))
         return FALSE;
 
-    wdh->bytes_dumped += phdr->caplen-1;
+    wdh->bytes_dumped += rec->rec_header.packet_header.caplen-1;
 
     return TRUE;
 }
 
 static gboolean btsnoop_dump_h4(wtap_dumper *wdh,
-    const struct wtap_pkthdr *phdr,
+    const wtap_rec *rec,
     const guint8 *pd, int *err, gchar **err_info)
 {
-    const union wtap_pseudo_header *pseudo_header = &phdr->pseudo_header;
+    const union wtap_pseudo_header *pseudo_header = &rec->rec_header.packet_header.pseudo_header;
     struct btsnooprec_hdr rec_hdr;
 
     /* We can only write packet records. */
-    if (phdr->rec_type != REC_TYPE_PACKET) {
+    if (rec->rec_type != REC_TYPE_PACKET) {
         *err = WTAP_ERR_UNWRITABLE_REC_TYPE;
         return FALSE;
     }
 
     /* Don't write out anything bigger than we can read. */
-    if (phdr->caplen > WTAP_MAX_PACKET_SIZE) {
+    if (rec->rec_header.packet_header.caplen > WTAP_MAX_PACKET_SIZE_STANDARD) {
         *err = WTAP_ERR_PACKET_TOO_LARGE;
         return FALSE;
     }
 
-    if (!btsnoop_format_partial_rec_hdr(phdr, pseudo_header, pd, err, err_info,
+    if (!btsnoop_format_partial_rec_hdr(rec, pseudo_header, pd, err, err_info,
                                         &rec_hdr))
         return FALSE;
 
-    rec_hdr.incl_len = GUINT32_TO_BE(phdr->caplen);
-    rec_hdr.orig_len = GUINT32_TO_BE(phdr->len);
+    rec_hdr.incl_len = GUINT32_TO_BE(rec->rec_header.packet_header.caplen);
+    rec_hdr.orig_len = GUINT32_TO_BE(rec->rec_header.packet_header.len);
 
     if (!wtap_dump_file_write(wdh, &rec_hdr, sizeof rec_hdr, err))
         return FALSE;
 
     wdh->bytes_dumped += sizeof rec_hdr;
 
-    if (!wtap_dump_file_write(wdh, pd, phdr->caplen, err))
+    if (!wtap_dump_file_write(wdh, pd, rec->rec_header.packet_header.caplen, err))
         return FALSE;
 
-    wdh->bytes_dumped += phdr->caplen;
+    wdh->bytes_dumped += rec->rec_header.packet_header.caplen;
 
     return TRUE;
 }
@@ -401,24 +386,10 @@ gboolean btsnoop_dump_open_h1(wtap_dumper *wdh, int *err)
 {
     struct btsnoop_hdr file_hdr;
 
-    /* This is a libpcap file */
+    /* This is a btsnoop file */
     wdh->subtype_write = btsnoop_dump_h1;
-    wdh->subtype_close = NULL;
 
     /* Write the file header. */
-    switch (wdh->file_type_subtype) {
-
-    case WTAP_FILE_TYPE_SUBTYPE_BTSNOOP:
-        wdh->tsprecision = WTAP_TSPREC_USEC;
-        break;
-
-    default:
-        /* We should never get here - our open routine
-           should only get called for the types above. */
-        *err = WTAP_ERR_UNWRITABLE_FILE_TYPE;
-        return FALSE;
-    }
-
     if (!wtap_dump_file_write(wdh, btsnoop_magic, sizeof btsnoop_magic, err))
         return FALSE;
 
@@ -443,24 +414,10 @@ gboolean btsnoop_dump_open_h4(wtap_dumper *wdh, int *err)
 {
     struct btsnoop_hdr file_hdr;
 
-    /* This is a libpcap file */
+    /* This is a btsnoop file */
     wdh->subtype_write = btsnoop_dump_h4;
-    wdh->subtype_close = NULL;
 
     /* Write the file header. */
-    switch (wdh->file_type_subtype) {
-
-    case WTAP_FILE_TYPE_SUBTYPE_BTSNOOP:
-        wdh->tsprecision = WTAP_TSPREC_USEC;
-        break;
-
-    default:
-        /* We should never get here - our open routine
-           should only get called for the types above. */
-        *err = WTAP_ERR_UNWRITABLE_FILE_TYPE;
-        return FALSE;
-    }
-
     if (!wtap_dump_file_write(wdh, btsnoop_magic, sizeof btsnoop_magic, err))
         return FALSE;