int i4btrace_open(wtap *wth, int *err, gchar **err_info) { int bytes_read; i4b_trace_hdr_t hdr; gboolean byte_swapped = FALSE; i4btrace_t *i4btrace; /* I4B trace files have no magic in the header... Sigh */ errno = WTAP_ERR_CANT_READ; bytes_read = file_read(&hdr, sizeof(hdr), wth->fh); if (bytes_read != sizeof(hdr)) { *err = file_error(wth->fh, err_info); if (*err != 0 && *err != WTAP_ERR_SHORT_READ) return -1; return 0; } /* Silly heuristic... */ if (!I4B_HDR_IS_OK(hdr)) { /* * OK, try byte-swapping the header fields. */ hdr.length = BSWAP32(hdr.length); hdr.unit = BSWAP32(hdr.unit); hdr.type = BSWAP32(hdr.type); hdr.dir = BSWAP32(hdr.dir); hdr.trunc = BSWAP32(hdr.trunc); if (!I4B_HDR_IS_OK(hdr)) { /* * It doesn't look valid in either byte order. */ return 0; } /* * It looks valid byte-swapped, so assume it's a * trace written in the opposite byte order. */ byte_swapped = TRUE; } if (file_seek(wth->fh, 0, SEEK_SET, err) == -1) return -1; /* Get capture start time */ wth->file_type = WTAP_FILE_I4BTRACE; i4btrace = (i4btrace_t *)g_malloc(sizeof(i4btrace_t)); wth->priv = (void *)i4btrace; wth->subtype_read = i4btrace_read; wth->subtype_seek_read = i4btrace_seek_read; wth->snapshot_length = 0; /* not known */ i4btrace->byte_swapped = byte_swapped; wth->file_encap = WTAP_ENCAP_ISDN; wth->tsprecision = WTAP_FILE_TSPREC_USEC; return 1; }
wtap_open_return_val i4btrace_open(wtap *wth, int *err, gchar **err_info) { i4b_trace_hdr_t hdr; gboolean byte_swapped = FALSE; i4btrace_t *i4btrace; /* I4B trace files have no magic in the header... Sigh */ if (!wtap_read_bytes(wth->fh, &hdr, sizeof(hdr), err, err_info)) { if (*err != WTAP_ERR_SHORT_READ) return WTAP_OPEN_ERROR; return WTAP_OPEN_NOT_MINE; } /* Silly heuristic... */ if (!I4B_HDR_IS_OK(hdr)) { /* * OK, try byte-swapping the header fields. */ hdr.length = GUINT32_SWAP_LE_BE(hdr.length); hdr.unit = GUINT32_SWAP_LE_BE(hdr.unit); hdr.type = GUINT32_SWAP_LE_BE(hdr.type); hdr.dir = GUINT32_SWAP_LE_BE(hdr.dir); hdr.trunc = GUINT32_SWAP_LE_BE(hdr.trunc); if (!I4B_HDR_IS_OK(hdr)) { /* * It doesn't look valid in either byte order. */ return WTAP_OPEN_NOT_MINE; } /* * It looks valid byte-swapped, so assume it's a * trace written in the opposite byte order. */ byte_swapped = TRUE; } if (file_seek(wth->fh, 0, SEEK_SET, err) == -1) return WTAP_OPEN_ERROR; /* Get capture start time */ wth->file_type_subtype = WTAP_FILE_TYPE_SUBTYPE_I4BTRACE; i4btrace = (i4btrace_t *)g_malloc(sizeof(i4btrace_t)); wth->priv = (void *)i4btrace; wth->subtype_read = i4btrace_read; wth->subtype_seek_read = i4btrace_seek_read; wth->snapshot_length = 0; /* not known */ i4btrace->byte_swapped = byte_swapped; wth->file_encap = WTAP_ENCAP_ISDN; wth->file_tsprec = WTAP_TSPREC_USEC; return WTAP_OPEN_MINE; }