static gboolean aethra_seek_read(wtap *wth, gint64 seek_off, struct wtap_pkthdr *phdr, Buffer *buf, int length, int *err, gchar **err_info) { struct aethrarec_hdr hdr; if (file_seek(wth->random_fh, seek_off, SEEK_SET, err) == -1) return FALSE; if (!aethra_read_rec_header(wth, wth->random_fh, &hdr, phdr, err, err_info)) return FALSE; /* * Read the packet data. */ if (!wtap_read_packet_bytes(wth->random_fh, buf, length, err, err_info)) return FALSE; /* failed */ return TRUE; }
static gboolean aethra_seek_read(wtap *wth, gint64 seek_off, union wtap_pseudo_header *pseudo_header, guint8 *pd, int length, int *err, gchar **err_info) { struct aethrarec_hdr hdr; if (file_seek(wth->random_fh, seek_off, SEEK_SET, err) == -1) return FALSE; if (!aethra_read_rec_header(wth->random_fh, &hdr, pseudo_header, err, err_info)) return FALSE; /* * Read the packet data. */ if (!aethra_read_rec_data(wth->random_fh, pd, length, err, err_info)) return FALSE; /* failed */ return TRUE; }
/* Read the next packet */ static gboolean aethra_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset) { struct aethrarec_hdr hdr; /* * Keep reading until we see an AETHRA_ISDN_LINK with a subtype * of AETHRA_ISDN_LINK_LAPD record or get an end-of-file. */ for (;;) { *data_offset = file_tell(wth->fh); /* Read record header. */ if (!aethra_read_rec_header(wth, wth->fh, &hdr, &wth->phdr, err, err_info)) return FALSE; /* * XXX - if this is big, we might waste memory by * growing the buffer to handle it. */ if (wth->phdr.caplen != 0) { if (!wtap_read_packet_bytes(wth->fh, wth->frame_buffer, wth->phdr.caplen, err, err_info)) return FALSE; /* Read error */ } #if 0 packet++; #endif switch (hdr.rec_type) { case AETHRA_ISDN_LINK: #if 0 fprintf(stderr, "Packet %u: type 0x%02x (AETHRA_ISDN_LINK)\n", packet, hdr.rec_type); #endif switch (hdr.flags & AETHRA_ISDN_LINK_SUBTYPE) { case AETHRA_ISDN_LINK_LAPD: /* * The data is a LAPD frame. */ #if 0 fprintf(stderr, " subtype 0x%02x (AETHRA_ISDN_LINK_LAPD)\n", hdr.flags & AETHRA_ISDN_LINK_SUBTYPE); #endif goto found; case AETHRA_ISDN_LINK_SA_BITS: /* * These records have one data byte, which * has the Sa bits in the lower 5 bits. * * XXX - what about stuff other than 2048K * PRI lines? */ #if 0 fprintf(stderr, " subtype 0x%02x (AETHRA_ISDN_LINK_SA_BITS)\n", hdr.flags & AETHRA_ISDN_LINK_SUBTYPE); #endif break; case AETHRA_ISDN_LINK_ALL_ALARMS_CLEARED: /* * No data, just an "all alarms cleared" * indication. */ #if 0 fprintf(stderr, " subtype 0x%02x (AETHRA_ISDN_LINK_ALL_ALARMS_CLEARED)\n", hdr.flags & AETHRA_ISDN_LINK_SUBTYPE); #endif break; default: #if 0 fprintf(stderr, " subtype 0x%02x, packet_size %u, direction 0x%02x\n", hdr.flags & AETHRA_ISDN_LINK_SUBTYPE, wth->phdr.caplen, hdr.flags & AETHRA_U_TO_N); #endif break; } break; default: #if 0 fprintf(stderr, "Packet %u: type 0x%02x, packet_size %u, flags 0x%02x\n", packet, hdr.rec_type, wth->phdr.caplen, hdr.flags); #endif break; } } found: return TRUE; }
/* Read the next packet */ static gboolean aethra_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset) { aethra_t *aethra = (aethra_t *)wth->priv; struct aethrarec_hdr hdr; guint32 rec_size; guint32 packet_size; guint32 msecs; /* * Keep reading until we see an AETHRA_ISDN_LINK with a subtype * of AETHRA_ISDN_LINK_LAPD record or get an end-of-file. */ for (;;) { *data_offset = file_tell(wth->fh); /* Read record header. */ if (!aethra_read_rec_header(wth->fh, &hdr, &wth->pseudo_header, err, err_info)) return FALSE; rec_size = pletohs(hdr.rec_size); if (rec_size < (sizeof hdr - sizeof hdr.rec_size)) { /* The record is shorter than a record header. */ *err = WTAP_ERR_BAD_FILE; *err_info = g_strdup_printf("aethra: File has %u-byte record, less than minimum of %u", rec_size, (unsigned int)(sizeof hdr - sizeof hdr.rec_size)); return FALSE; } /* * XXX - if this is big, we might waste memory by * growing the buffer to handle it. */ packet_size = rec_size - (sizeof hdr - sizeof hdr.rec_size); if (packet_size != 0) { buffer_assure_space(wth->frame_buffer, packet_size); if (!aethra_read_rec_data(wth->fh, buffer_start_ptr(wth->frame_buffer), packet_size, err, err_info)) return FALSE; /* Read error */ } #if 0 packet++; #endif switch (hdr.rec_type) { case AETHRA_ISDN_LINK: #if 0 fprintf(stderr, "Packet %u: type 0x%02x (AETHRA_ISDN_LINK)\n", packet, hdr.rec_type); #endif switch (hdr.flags & AETHRA_ISDN_LINK_SUBTYPE) { case AETHRA_ISDN_LINK_LAPD: /* * The data is a LAPD frame. */ #if 0 fprintf(stderr, " subtype 0x%02x (AETHRA_ISDN_LINK_LAPD)\n", hdr.flags & AETHRA_ISDN_LINK_SUBTYPE); #endif goto found; case AETHRA_ISDN_LINK_SA_BITS: /* * These records have one data byte, which * has the Sa bits in the lower 5 bits. * * XXX - what about stuff other than 2048K * PRI lines? */ #if 0 fprintf(stderr, " subtype 0x%02x (AETHRA_ISDN_LINK_SA_BITS)\n", hdr.flags & AETHRA_ISDN_LINK_SUBTYPE); #endif break; case AETHRA_ISDN_LINK_ALL_ALARMS_CLEARED: /* * No data, just an "all alarms cleared" * indication. */ #if 0 fprintf(stderr, " subtype 0x%02x (AETHRA_ISDN_LINK_ALL_ALARMS_CLEARED)\n", hdr.flags & AETHRA_ISDN_LINK_SUBTYPE); #endif break; default: #if 0 fprintf(stderr, " subtype 0x%02x, packet_size %u, direction 0x%02x\n", hdr.flags & AETHRA_ISDN_LINK_SUBTYPE, packet_size, hdr.flags & AETHRA_U_TO_N); #endif break; } break; default: #if 0 fprintf(stderr, "Packet %u: type 0x%02x, packet_size %u, flags 0x%02x\n", packet, hdr.rec_type, packet_size, hdr.flags); #endif break; } } found: msecs = pletohl(hdr.timestamp); wth->phdr.presence_flags = WTAP_HAS_TS; wth->phdr.ts.secs = aethra->start + (msecs / 1000); wth->phdr.ts.nsecs = (msecs % 1000) * 1000000; wth->phdr.caplen = packet_size; wth->phdr.len = packet_size; return TRUE; }