From Xiao Xiangquan:
[obnox/wireshark/wip.git] / wiretap / btsnoop.c
index f937c5baf31fa20a9f5fa6f2d43b15f92a50c168..8863f8967fb63e043efb701ee850b9d1a246a0bc 100644 (file)
@@ -76,11 +76,12 @@ const gint64 KUnixTimeBase = G_GINT64_CONSTANT(0x00dcddb30f2f8000); /* offset fr
 static gboolean btsnoop_read(wtap *wth, int *err, gchar **err_info,
     gint64 *data_offset);
 static gboolean btsnoop_seek_read(wtap *wth, gint64 seek_off,
-    union wtap_pseudo_header *pseudo_header, guchar *pd, int length,
+    union wtap_pseudo_header *pseudo_header, guint8 *pd, int length,
     int *err, gchar **err_info);
-static gboolean snoop_read_rec_data(FILE_T fh, guchar *pd, int length, int *err);
+static gboolean snoop_read_rec_data(FILE_T fh, guint8 *pd, int length, int *err,
+    gchar **err_info);
 
-int btsnoop_open(wtap *wth, int *err, gchar **err_info _U_)
+int btsnoop_open(wtap *wth, int *err, gchar **err_info)
 {
        int bytes_read;
        char magic[sizeof btsnoop_magic];
@@ -90,9 +91,9 @@ int btsnoop_open(wtap *wth, int *err, gchar **err_info _U_)
 
        /* Read in the string that should be at the start of a "btsnoop" file */
        errno = WTAP_ERR_CANT_READ;
-       bytes_read = file_read(magic, 1, sizeof magic, wth->fh);
+       bytes_read = file_read(magic, sizeof magic, wth->fh);
        if (bytes_read != sizeof magic) {
-               *err = file_error(wth->fh);
+               *err = file_error(wth->fh, err_info);
                if (*err != 0)
                        return -1;
                return 0;
@@ -105,9 +106,9 @@ int btsnoop_open(wtap *wth, int *err, gchar **err_info _U_)
 
        /* Read the rest of the header. */
        errno = WTAP_ERR_CANT_READ;
-       bytes_read = file_read(&hdr, 1, sizeof hdr, wth->fh);
+       bytes_read = file_read(&hdr, sizeof hdr, wth->fh);
        if (bytes_read != sizeof hdr) {
-               *err = file_error(wth->fh);
+               *err = file_error(wth->fh, err_info);
                if (*err != 0)
                        return -1;
                return 0;
@@ -130,16 +131,19 @@ int btsnoop_open(wtap *wth, int *err, gchar **err_info _U_)
                file_encap=WTAP_ENCAP_BLUETOOTH_HCI;
                break;
        case KHciLoggerDatalinkTypeBCSP:
+               *err = WTAP_ERR_UNSUPPORTED;
+               *err_info = g_strdup_printf("btsnoop: BCSP capture logs unsupported");
+               return -1;
        case KHciLoggerDatalinkTypeH5:
                *err = WTAP_ERR_UNSUPPORTED;
-               *err_info = g_strdup_printf("btsnoop: BCSP/H5 capture logs %u unsupported", hdr.version);
+               *err_info = g_strdup_printf("btsnoop: H5 capture logs unsupported");
                return -1;
        case KHciLoggerDatalinkTypeH4:
-               file_encap=WTAP_ENCAP_BLUETOOTH_H4;
+               file_encap=WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR;
                break;
        default:
                *err = WTAP_ERR_UNSUPPORTED;
-               *err_info = g_strdup_printf("btsnoop: datalink %u unsupported", hdr.version);
+               *err_info = g_strdup_printf("btsnoop: datalink type %u unknown or unsupported", hdr.datalink);
                return -1;
        }
 
@@ -169,9 +173,9 @@ static gboolean btsnoop_read(wtap *wth, int *err, gchar **err_info,
 
        /* Read record header. */
        errno = WTAP_ERR_CANT_READ;
-       bytes_read = file_read(&hdr, 1, sizeof hdr, wth->fh);
+       bytes_read = file_read(&hdr, sizeof hdr, wth->fh);
        if (bytes_read != sizeof hdr) {
-               *err = file_error(wth->fh);
+               *err = file_error(wth->fh, err_info);
                if (*err == 0 && bytes_read != 0)
                        *err = WTAP_ERR_SHORT_READ;
                return FALSE;
@@ -186,7 +190,7 @@ static gboolean btsnoop_read(wtap *wth, int *err, gchar **err_info,
                 * Probably a corrupt capture file; don't blow up trying
                 * to allocate space for an immensely-large packet.
                 */
-               *err = WTAP_ERR_BAD_RECORD;
+               *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);
                return FALSE;
@@ -194,7 +198,7 @@ static gboolean btsnoop_read(wtap *wth, int *err, gchar **err_info,
 
        buffer_assure_space(wth->frame_buffer, packet_size);
        if (!snoop_read_rec_data(wth->fh, buffer_start_ptr(wth->frame_buffer),
-               packet_size, err)) {
+               packet_size, err, err_info)) {
                return FALSE;   /* Read error */
        }
        wth->data_offset += packet_size;
@@ -206,7 +210,7 @@ static gboolean btsnoop_read(wtap *wth, int *err, gchar **err_info,
        wth->phdr.ts.nsecs = (guint)((ts % 1000000) * 1000);
        wth->phdr.caplen = packet_size;
        wth->phdr.len = orig_size;
-       if(wth->file_encap == WTAP_ENCAP_BLUETOOTH_H4)
+       if(wth->file_encap == WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR)
        {
                wth->pseudo_header.p2p.sent = (flags & KHciLoggerControllerToHost) ? FALSE : TRUE;
        }
@@ -233,8 +237,8 @@ static gboolean btsnoop_read(wtap *wth, int *err, gchar **err_info,
 }
 
 static gboolean btsnoop_seek_read(wtap *wth, gint64 seek_off,
-    union wtap_pseudo_header *pseudo_header, guchar *pd, int length,
-    int *err, gchar **err_info _U_) {
+    union wtap_pseudo_header *pseudo_header, guint8 *pd, int length,
+    int *err, gchar **err_info) {
        int     bytes_read;
        struct btsnooprec_hdr hdr;
        guint32 flags;
@@ -243,9 +247,9 @@ static gboolean btsnoop_seek_read(wtap *wth, gint64 seek_off,
 
        /* Read record header. */
        errno = WTAP_ERR_CANT_READ;
-       bytes_read = file_read(&hdr, 1, sizeof hdr, wth->random_fh);
+       bytes_read = file_read(&hdr, sizeof hdr, wth->random_fh);
        if (bytes_read != sizeof hdr) {
-               *err = file_error(wth->random_fh);
+               *err = file_error(wth->random_fh, err_info);
                if (*err == 0 && bytes_read != 0)
                        *err = WTAP_ERR_SHORT_READ;
                return FALSE;
@@ -255,10 +259,10 @@ static gboolean btsnoop_seek_read(wtap *wth, gint64 seek_off,
        /*
         * Read the packet data.
         */
-       if (!snoop_read_rec_data(wth->random_fh, pd, length, err))
+       if (!snoop_read_rec_data(wth->random_fh, pd, length, err, err_info))
                return FALSE;   /* failed */
 
-       if(wth->file_encap == WTAP_ENCAP_BLUETOOTH_H4)
+       if(wth->file_encap == WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR)
        {
                pseudo_header->p2p.sent = (flags & KHciLoggerControllerToHost) ? FALSE : TRUE;
        }
@@ -285,15 +289,16 @@ static gboolean btsnoop_seek_read(wtap *wth, gint64 seek_off,
 }
 
 static gboolean
-snoop_read_rec_data(FILE_T fh, guchar *pd, int length, int *err)
+snoop_read_rec_data(FILE_T fh, guint8 *pd, int length, int *err,
+    gchar **err_info)
 {
        int     bytes_read;
 
        errno = WTAP_ERR_CANT_READ;
-       bytes_read = file_read(pd, 1, length, fh);
+       bytes_read = file_read(pd, length, fh);
 
        if (bytes_read != length) {
-               *err = file_error(fh);
+               *err = file_error(fh, err_info);
                if (*err == 0)
                        *err = WTAP_ERR_SHORT_READ;
                return FALSE;
@@ -350,7 +355,7 @@ static guint8 btsnoop_lookup_flags(guint8 hci_type, gboolean sent, guint8 *flags
 static gboolean btsnoop_dump_partial_rec_hdr(wtap_dumper *wdh _U_,
     const struct wtap_pkthdr *phdr,
     const union wtap_pseudo_header *pseudo_header,
-    const guchar *pd, int *err,
+    const guint8 *pd, int *err,
     struct btsnooprec_hdr *rec_hdr)
 {
     gint64 ts_usec;
@@ -375,7 +380,7 @@ static gboolean btsnoop_dump_partial_rec_hdr(wtap_dumper *wdh _U_,
 static gboolean btsnoop_dump_h1(wtap_dumper *wdh,
     const struct wtap_pkthdr *phdr,
     const union wtap_pseudo_header *pseudo_header,
-    const guchar *pd, int *err)
+    const guint8 *pd, int *err)
 {
     struct btsnooprec_hdr rec_hdr;
 
@@ -385,7 +390,7 @@ static gboolean btsnoop_dump_h1(wtap_dumper *wdh,
     rec_hdr.incl_len = GUINT32_TO_BE(phdr->caplen-1);
     rec_hdr.orig_len = GUINT32_TO_BE(phdr->len-1);
 
-    if (!wtap_dump_file_write_all(wdh, &rec_hdr, sizeof rec_hdr, err))
+    if (!wtap_dump_file_write(wdh, &rec_hdr, sizeof rec_hdr, err))
         return FALSE;
 
     wdh->bytes_dumped += sizeof rec_hdr;
@@ -393,7 +398,7 @@ static gboolean btsnoop_dump_h1(wtap_dumper *wdh,
     /* Skip HCI packet type */
     ++pd;
 
-    if (!wtap_dump_file_write_all(wdh, pd, phdr->caplen-1, err))
+    if (!wtap_dump_file_write(wdh, pd, phdr->caplen-1, err))
         return FALSE;
 
     wdh->bytes_dumped += phdr->caplen-1;
@@ -404,7 +409,7 @@ static gboolean btsnoop_dump_h1(wtap_dumper *wdh,
 static gboolean btsnoop_dump_h4(wtap_dumper *wdh,
     const struct wtap_pkthdr *phdr,
     const union wtap_pseudo_header *pseudo_header,
-    const guchar *pd, int *err)
+    const guint8 *pd, int *err)
 {
     struct btsnooprec_hdr rec_hdr;
 
@@ -414,12 +419,12 @@ static gboolean btsnoop_dump_h4(wtap_dumper *wdh,
     rec_hdr.incl_len = GUINT32_TO_BE(phdr->caplen);
     rec_hdr.orig_len = GUINT32_TO_BE(phdr->len);
 
-    if (!wtap_dump_file_write_all(wdh, &rec_hdr, sizeof rec_hdr, err))
+    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_all(wdh, pd, phdr->caplen, err))
+    if (!wtap_dump_file_write(wdh, pd, phdr->caplen, err))
         return FALSE;
 
     wdh->bytes_dumped += phdr->caplen;
@@ -428,7 +433,7 @@ static gboolean btsnoop_dump_h4(wtap_dumper *wdh,
 }
 
 /* FIXME: How do we support multiple backends?*/
-gboolean btsnoop_dump_open_h1(wtap_dumper *wdh, gboolean cant_seek _U_, int *err)
+gboolean btsnoop_dump_open_h1(wtap_dumper *wdh, int *err)
 {
     struct btsnoop_hdr file_hdr;
 
@@ -450,7 +455,7 @@ gboolean btsnoop_dump_open_h1(wtap_dumper *wdh, gboolean cant_seek _U_, int *err
         return FALSE;
     }
 
-    if (!wtap_dump_file_write_all(wdh, btsnoop_magic, sizeof btsnoop_magic, err))
+    if (!wtap_dump_file_write(wdh, btsnoop_magic, sizeof btsnoop_magic, err))
         return FALSE;
 
     wdh->bytes_dumped += sizeof btsnoop_magic;
@@ -460,7 +465,7 @@ gboolean btsnoop_dump_open_h1(wtap_dumper *wdh, gboolean cant_seek _U_, int *err
     /* HCI type encoded in first byte */
     file_hdr.datalink = GUINT32_TO_BE(KHciLoggerDatalinkTypeH1);
 
-    if (!wtap_dump_file_write_all(wdh, &file_hdr, sizeof file_hdr, err))
+    if (!wtap_dump_file_write(wdh, &file_hdr, sizeof file_hdr, err))
         return FALSE;
 
     wdh->bytes_dumped += sizeof file_hdr;
@@ -470,7 +475,7 @@ gboolean btsnoop_dump_open_h1(wtap_dumper *wdh, gboolean cant_seek _U_, int *err
 
 /* Returns TRUE on success, FALSE on failure; sets "*err" to an error code on
    failure */
-gboolean btsnoop_dump_open_h4(wtap_dumper *wdh, gboolean cant_seek _U_, int *err)
+gboolean btsnoop_dump_open_h4(wtap_dumper *wdh, int *err)
 {
     struct btsnoop_hdr file_hdr;
 
@@ -492,7 +497,7 @@ gboolean btsnoop_dump_open_h4(wtap_dumper *wdh, gboolean cant_seek _U_, int *err
         return FALSE;
     }
 
-    if (!wtap_dump_file_write_all(wdh, btsnoop_magic, sizeof btsnoop_magic, err))
+    if (!wtap_dump_file_write(wdh, btsnoop_magic, sizeof btsnoop_magic, err))
         return FALSE;
 
     wdh->bytes_dumped += sizeof btsnoop_magic;
@@ -502,7 +507,7 @@ gboolean btsnoop_dump_open_h4(wtap_dumper *wdh, gboolean cant_seek _U_, int *err
     /* HCI type encoded in first byte */
     file_hdr.datalink = GUINT32_TO_BE(KHciLoggerDatalinkTypeH4);
 
-    if (!wtap_dump_file_write_all(wdh, &file_hdr, sizeof file_hdr, err))
+    if (!wtap_dump_file_write(wdh, &file_hdr, sizeof file_hdr, err))
         return FALSE;
 
     wdh->bytes_dumped += sizeof file_hdr;