From Hans-Christoph Schemmel:
[obnox/wireshark/wip.git] / wiretap / netscaler.c
index b1f3f589ac78fd140b4ba98f8642ebafb2685900..a0fcc425848ba27c37431508e73c893999bf0cca 100644 (file)
 #include "buffer.h"
 #include "netscaler.h"
 
-/* Defines imported from netscaler code: nstypes.h */
-
-#define ns_min(a, b)   ((a<b)?a:b)
-
 /* Defines imported from netscaler code: nsperfrc.h */
 
 #define        NSPR_SIGSTR_V10 "NetScaler Performance Data"
 
 typedef  struct nspr_header_v10
 {
-       guint16 ph_RecordType;  /* Record Type */
-       guint16 ph_RecordSize;  /* Record Size including header */
+       guint8  ph_RecordType[2];       /* Record Type */
+       guint8  ph_RecordSize[2];       /* Record Size including header */
 } nspr_header_v10_t;
 #define        nspr_header_v10_s       sizeof(nspr_header_v10_t)
 
 /* This is V20 short header (2 bytes long) to be included where needed */
 #define NSPR_HEADER_V20(prefix) \
-    guint8 prefix##_RecordType;    /* Record Type */ \
-       guint8 prefix##_RecordSize     /* Record Size including header */       \
+       guint8 prefix##_RecordType;     /* Record Type */ \
+       guint8 prefix##_RecordSize      /* Record Size including header */      \
                                        /* end of declaration */
 
 /* This is new long header (3 bytes long) to be included where needed */
@@ -123,9 +119,9 @@ typedef  struct nspr_hd_v20
 /* Performance Data Header with device number */
 typedef  struct nspr_headerdev_v10
 {
-       guint16 ph_RecordType;  /* Record Type */
-       guint16 ph_RecordSize;  /* Record Size including header */
-       guint32 ph_DevNo;       /* Network Device (NIC/CONN) number */
+       guint8  ph_RecordType[2];       /* Record Type */
+       guint8  ph_RecordSize[2];       /* Record Size including header */
+       guint8  ph_DevNo[4];            /* Network Device (NIC/CONN) number */
 } nspr_headerdev_v10_t;
 #define        nspr_headerdev_v10_s    sizeof(nspr_headerdev_v10_t)
 
@@ -157,7 +153,7 @@ typedef     struct nspr_signature_v10
        nspr_header_v10_t phd;  /* performance header */
        guint8  sig_EndianType; /* Endian Type for the data */
        guint8  sig_Reserved0;
-       guint16 sig_Reserved1;
+       guint8  sig_Reserved1[2];
        gchar   sig_Signature[NSPR_SIGSIZE_V10];        /* Signature value */
 } nspr_signature_v10_t;
 #define        nspr_signature_v10_s    sizeof(nspr_signature_v10_t)
@@ -175,8 +171,8 @@ typedef     struct nspr_signature_v20
 typedef        struct nspr_abstime_v10
 {
        nspr_header_v10_t phd;  /* performance header */
-       guint32 abs_RelTime;    /* relative time is ms from last time */
-       guint32 abs_Time;       /* absolute time in seconds from 1970 */
+       guint8  abs_RelTime[4]; /* relative time is ms from last time */
+       guint8  abs_Time[4];    /* absolute time in seconds from 1970 */
 } nspr_abstime_v10_t;
 #define        nspr_abstime_v10_s      sizeof(nspr_abstime_v10_t)
 
@@ -185,8 +181,8 @@ typedef     struct nspr_abstime_v10
 typedef        struct nspr_abstime_v20
 {
        NSPR_HEADER_V20(abs);   /* short performance header */
-       guint16 abs_RelTime;    /* relative time is ms from last time */
-       guint32 abs_Time;       /* absolute time in seconds from 1970 */
+       guint8  abs_RelTime[2]; /* relative time is ms from last time */
+       guint8  abs_Time[4];    /* absolute time in seconds from 1970 */
 } nspr_abstime_v20_t;
 #define        nspr_abstime_v20_s      sizeof(nspr_abstime_v20_t)
 
@@ -196,125 +192,123 @@ typedef struct nspr_abstime_v20
 typedef        struct  nspr_pktracefull_v10
 {
        nspr_headerdev_v10_t phd;       /* performance header */
-       guint32 fp_RelTimeHr;   /* High resolution relative time */
-       guint8  fp_Data[1];     /* packet data starts here */
+       guint8  fp_RelTimeHr[4];        /* High resolution relative time */
+       guint8  fp_Data[1];             /* packet data starts here */
 } nspr_pktracefull_v10_t;
 #define        nspr_pktracefull_v10_s  (nspr_hdev_v10_s + 4)
 
 /* new full packet trace structure v20 */
 typedef        struct  nspr_pktracefull_v20
 {
-       NSPR_HEADER3B_V20(fp);  /* long performance header */
-       guint8  fp_DevNo;       /* Network Device (NIC) number */
-       guint32 fp_RelTimeHr;   /* High resolution relative time */
-       guint8  fp_Data[4];     /* packet data starts here */
+       NSPR_HEADER3B_V20(fp);          /* long performance header */
+       guint8  fp_DevNo;               /* Network Device (NIC) number */
+       guint8  fp_RelTimeHr[4];        /* High resolution relative time */
+       guint8  fp_Data[4];             /* packet data starts here */
 } nspr_pktracefull_v20_t;
 #define        nspr_pktracefull_v20_s  (sizeof(nspr_pktracefull_v20_t) - 4)
 
 /* new full packet trace structure v21 */
 typedef        struct  nspr_pktracefull_v21
 {
-       NSPR_HEADER3B_V21(fp);  /* long performance header */
-       guint8  fp_DevNo;       /* Network Device (NIC) number */
-       guint32 fp_RelTimeHr;   /* High resolution relative time */
-       guint32 fp_PcbDevNo;    /* PCB devno */
-       guint32 fp_lPcbDevNo;   /* link PCB devno */
-       guint8  fp_Data[4];     /* packet data starts here */
+       NSPR_HEADER3B_V21(fp);          /* long performance header */
+       guint8  fp_DevNo;               /* Network Device (NIC) number */
+       guint8  fp_RelTimeHr[4];        /* High resolution relative time */
+       guint8  fp_PcbDevNo[4];         /* PCB devno */
+       guint8  fp_lPcbDevNo[4];        /* link PCB devno */
+       guint8  fp_Data[4];             /* packet data starts here */
 } nspr_pktracefull_v21_t;
 #define        nspr_pktracefull_v21_s  (sizeof(nspr_pktracefull_v21_t) - 4)
 
 /* new full packet trace structure v22 */
 typedef        struct  nspr_pktracefull_v22
 {
-       NSPR_HEADER3B_V22(fp);  /* long performance header */
-       guint8  fp_DevNo;       /* Network Device (NIC) number */
-       guint32 fp_RelTimeHr;   /* High resolution relative time */
-       guint32 fp_PcbDevNo;    /* PCB devno */
-       guint32 fp_lPcbDevNo;   /* link PCB devno */
-       guint16 fp_VlanTag;
-       guint8  fp_Data[4];     /* packet data starts here */
+       NSPR_HEADER3B_V22(fp);          /* long performance header */
+       guint8  fp_DevNo;               /* Network Device (NIC) number */
+       guint8  fp_RelTimeHr[4];        /* High resolution relative time */
+       guint8  fp_PcbDevNo[4];         /* PCB devno */
+       guint8  fp_lPcbDevNo[4];        /* link PCB devno */
+       guint8  fp_VlanTag[2];          /* vlan tag */
+       guint8  fp_Data[2];             /* packet data starts here */
 } nspr_pktracefull_v22_t;
-#define        nspr_pktracefull_v22_s  (sizeof(nspr_pktracefull_v22_t) - 4)
+#define        nspr_pktracefull_v22_s  (sizeof(nspr_pktracefull_v22_t) - 2)
 
 typedef        struct  nspr_pktracefull_v23
 {
-       NSPR_HEADER3B_V22(fp);  /* long performance header */
-       guint8  fp_DevNo;       /* Network Device (NIC) number */
-       guint32 fp_AbsTimeLowHdr;       /* High resolution low time */
-       guint32 fp_AbsTimeHighHdr; /* Higher value of the absolute time */
-       guint32 fp_PcbDevNo;    /* PCB devno */
-       guint32 fp_lPcbDevNo;   /* link PCB devno */
-       guint16 fp_VlanTag; /* vlan tag */
-       guint16 fp_Coreid; /* coreid of the packet */
-       guint8  fp_Data[4];     /* packet data starts here */
+       NSPR_HEADER3B_V22(fp);          /* long performance header */
+       guint8  fp_DevNo;               /* Network Device (NIC) number */
+       guint8  fp_AbsTimeHr[8];        /* High resolution absolute time */
+       guint8  fp_PcbDevNo[4];         /* PCB devno */
+       guint8  fp_lPcbDevNo[4];        /* link PCB devno */
+       guint8  fp_VlanTag[2];          /* vlan tag */
+       guint8  fp_Coreid[2];           /* coreid of the packet */
+       guint8  fp_Data[2];             /* packet data starts here */
 } nspr_pktracefull_v23_t;
-#define        nspr_pktracefull_v23_s  (sizeof(nspr_pktracefull_v23_t) - 4)
+#define        nspr_pktracefull_v23_s  (sizeof(nspr_pktracefull_v23_t) - 2)
 
 /* partial packet trace structure */
 typedef        struct  nspr_pktracepart_v10
 {
        nspr_headerdev_v10_t phd;       /* performance header */
-       guint32 pp_RelTimeHr;   /* High resolution relative time */
-       guint16 pp_PktSizeOrg;  /* Original packet size */
-       guint16 pp_PktOffset;   /* starting offset in packet */
-       guint8  pp_Data[1];     /* packet data starts here */
+       guint8  pp_RelTimeHr[4];        /* High resolution relative time */
+       guint8  pp_PktSizeOrg[2];       /* Original packet size */
+       guint8  pp_PktOffset[2];        /* starting offset in packet */
+       guint8  pp_Data[1];             /* packet data starts here */
 } nspr_pktracepart_v10_t;
 #define        nspr_pktracepart_v10_s  (nspr_pktracefull_v10_s + 4)
 
 /* new partial packet trace structure */
 typedef        struct  nspr_pktracepart_v20
 {
-       NSPR_HEADER3B_V20(pp);  /* long performance header */
-       guint8  pp_DevNo;       /* Network Device (NIC) number */
-       guint32 pp_RelTimeHr;   /* High resolution relative time */
-       guint16 pp_PktSizeOrg;  /* Original packet size */
-       guint16 pp_PktOffset;   /* starting offset in packet */
-       guint8  pp_Data[4];     /* packet data starts here */
+       NSPR_HEADER3B_V20(pp);          /* long performance header */
+       guint8  pp_DevNo;               /* Network Device (NIC) number */
+       guint8  pp_RelTimeHr[4];        /* High resolution relative time */
+       guint8  pp_PktSizeOrg[2];       /* Original packet size */
+       guint8  pp_PktOffset[2];        /* starting offset in packet */
+       guint8  pp_Data[4];             /* packet data starts here */
 } nspr_pktracepart_v20_t;
 #define        nspr_pktracepart_v20_s  (sizeof(nspr_pktracepart_v20_t) -4)
 
 /* new partial packet trace structure */
 typedef        struct  nspr_pktracepart_v21
 {
-       NSPR_HEADER3B_V21(pp);  /* long performance header */
-       guint8  pp_DevNo;       /* Network Device (NIC) number */
-       guint32 pp_RelTimeHr;   /* High resolution relative time */
-       guint16 pp_PktSizeOrg;  /* Original packet size */
-       guint16 pp_PktOffset;   /* starting offset in packet */
-       guint32 pp_PcbDevNo;    /* PCB devno */
-       guint32 pp_lPcbDevNo;   /* link PCB devno */
-       guint8  pp_Data[4];     /* packet data starts here */
+       NSPR_HEADER3B_V21(pp);          /* long performance header */
+       guint8  pp_DevNo;               /* Network Device (NIC) number */
+       guint8  pp_RelTimeHr[4];        /* High resolution relative time */
+       guint8  pp_PktSizeOrg[2];       /* Original packet size */
+       guint8  pp_PktOffset[2];        /* starting offset in packet */
+       guint8  pp_PcbDevNo[4];         /* PCB devno */
+       guint8  pp_lPcbDevNo[4];        /* link PCB devno */
+       guint8  pp_Data[4];             /* packet data starts here */
 } nspr_pktracepart_v21_t;
 #define        nspr_pktracepart_v21_s  (sizeof(nspr_pktracepart_v21_t) -4)
 
 /* new partial packet trace structure v22 */
 typedef        struct  nspr_pktracepart_v22
 {
-       NSPR_HEADER3B_V22(pp);  /* long performance header */
-       guint8  pp_DevNo;       /* Network Device (NIC) number */
-       guint32 pp_RelTimeHr;   /* High resolution relative time */
-       guint16 pp_PktSizeOrg;  /* Original packet size */
-       guint16 pp_PktOffset;   /* starting offset in packet */
-       guint32 pp_PcbDevNo;    /* PCB devno */
-       guint32 pp_lPcbDevNo;   /* link PCB devno */
-       guint16 pp_VlanTag;     /* Vlan Tag */
-       guint8  pp_Data[4];     /* packet data starts here */
+       NSPR_HEADER3B_V22(pp);          /* long performance header */
+       guint8  pp_DevNo;               /* Network Device (NIC) number */
+       guint8  pp_RelTimeHr[4];        /* High resolution relative time */
+       guint8  pp_PktSizeOrg[2];       /* Original packet size */
+       guint8  pp_PktOffset[2];        /* starting offset in packet */
+       guint8  pp_PcbDevNo[4];         /* PCB devno */
+       guint8  pp_lPcbDevNo[4];        /* link PCB devno */
+       guint8  pp_VlanTag[2];          /* Vlan Tag */
+       guint8  pp_Data[2];             /* packet data starts here */
 } nspr_pktracepart_v22_t;
-#define        nspr_pktracepart_v22_s  (sizeof(nspr_pktracepart_v22_t) -4)
+#define        nspr_pktracepart_v22_s  (sizeof(nspr_pktracepart_v22_t) -2)
 
 typedef        struct  nspr_pktracepart_v23
 {
-       NSPR_HEADER3B_V22(pp);  /* long performance header */
-       guint8  pp_DevNo;       /* Network Device (NIC) number */
-       guint32 pp_AbsTimeLowHdr;       /* High resolution low time */
-       guint32 pp_AbsTimeHighHdr; /* Higher value of the absolute time */
-       guint16 pp_PktSizeOrg;  /* Original packet size */
-       guint16 pp_PktOffset;   /* starting offset in packet */
-       guint32 pp_PcbDevNo;    /* PCB devno */
-       guint32 pp_lPcbDevNo;   /* link PCB devno */
-       guint16 pp_VlanTag;     /* vlan tag */
-       guint16 pp_Coreid; /* Coreid of the packet */
-       guint8  pp_Data[4];     /* packet data starts here */
+       NSPR_HEADER3B_V22(pp);          /* long performance header */
+       guint8  pp_DevNo;               /* Network Device (NIC) number */
+       guint8  pp_AbsTimeHr[8];        /* High resolution absolute time */
+       guint8  pp_PktSizeOrg[2];       /* Original packet size */
+       guint8  pp_PktOffset[2];        /* starting offset in packet */
+       guint8  pp_PcbDevNo[4];         /* PCB devno */
+       guint8  pp_lPcbDevNo[4];        /* link PCB devno */
+       guint8  pp_VlanTag[2];          /* vlan tag */
+       guint8  pp_Coreid[2];           /* Coreid of the packet */
+       guint8  pp_Data[4];             /* packet data starts here */
 } nspr_pktracepart_v23_t;
 #define        nspr_pktracepart_v23_s  (sizeof(nspr_pktracepart_v23_t) -4)
 
@@ -325,7 +319,7 @@ typedef     struct  nspr_pktracepart_v23
 
 #define __TNL(enumprefix,structprefix,structname,hdrname,structfieldname) \
        guint8 enumprefix##_##hdrname##_len = (guint8)sizeof(((nspr_##structname##_t*)0)->structprefix##_##structfieldname);
-       
+
 #define __TNV1O(enumprefix,structprefix,structname,hdrname,structfieldname) \
        guint8 enumprefix##_##hdrname##_offset = (guint8)GPOINTER_TO_INT(myoffsetof(nspr_##structname##_t,structfieldname));
 
@@ -338,14 +332,14 @@ typedef   struct  nspr_pktracepart_v23
                __TNV1O(enumprefix,structprefix,structname,nicno,phd.ph_DevNo)\
                __TNV1L(enumprefix,structprefix,structname,nicno,phd.ph_DevNo)\
                __TNO(enumprefix,structprefix,structname,eth,Data)
-       
+
 #define TRACE_V20_REC_LEN_OFF(enumprefix,structprefix,structname) \
                __TNO(enumprefix,structprefix,structname,dir,RecordType)\
                __TNL(enumprefix,structprefix,structname,dir,RecordType)\
                __TNO(enumprefix,structprefix,structname,nicno,DevNo)\
                __TNL(enumprefix,structprefix,structname,nicno,DevNo)\
                __TNO(enumprefix,structprefix,structname,eth,Data)
-       
+
 #define TRACE_V21_REC_LEN_OFF(enumprefix,structprefix,structname) \
                TRACE_V20_REC_LEN_OFF(enumprefix,structprefix,structname)\
                __TNO(enumprefix,structprefix,structname,pcb,PcbDevNo)\
@@ -359,7 +353,7 @@ typedef     struct  nspr_pktracepart_v23
                TRACE_V22_REC_LEN_OFF(enumprefix,structprefix,structname)\
                __TNO(enumprefix,structprefix,structname,coreid,Coreid)
 
-       
+
        TRACE_V10_REC_LEN_OFF(v10_part,pp,pktracepart_v10)
        TRACE_V10_REC_LEN_OFF(v10_full,fp,pktracefull_v10)
        TRACE_V20_REC_LEN_OFF(v20_part,pp,pktracepart_v20)
@@ -370,7 +364,7 @@ typedef     struct  nspr_pktracepart_v23
        TRACE_V22_REC_LEN_OFF(v22_full,fp,pktracefull_v22)
        TRACE_V23_REC_LEN_OFF(v23_part,pp,pktracepart_v23)
        TRACE_V23_REC_LEN_OFF(v23_full,fp,pktracefull_v23)
-       
+
 #undef __TNV1O
 #undef __TNV1L
 #undef __TNO
@@ -416,10 +410,10 @@ gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info,
                 gint64 *data_offset);
 gboolean nstrace_read_v20(wtap *wth, int *err, gchar **err_info,
                 gint64 *data_offset);
-gboolean nstrace_seek_read(wtap *wth, gint64 seek_off, 
-                     union wtap_pseudo_header *pseudo_header, 
+gboolean nstrace_seek_read(wtap *wth, gint64 seek_off,
+                     union wtap_pseudo_header *pseudo_header,
                      guchar *pd, int length,
-                     int *err, gchar **err_info _U_);
+                     int *err, gchar **err_info);
 void nstrace_close(wtap *wth);
 void nstrace_sequential_close(wtap *wth);
 
@@ -428,10 +422,8 @@ gboolean nstrace_set_start_time_v20(wtap *wth);
 gboolean nstrace_set_start_time(wtap *wth);
 guint64        ns_hrtime2nsec(guint32 tm);
 
-static gboolean nstrace_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr, 
+static gboolean nstrace_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
        const union wtap_pseudo_header *pseudo_header, const guchar *pd, int *err);
-gboolean nstrace_add_signature(wtap_dumper *wdh);
-gboolean nstrace_add_abstime(wtap_dumper *wdh, const struct wtap_pkthdr *phdr, const guchar *pd);
 
 
 #define GET_READ_PAGE_SIZE(remaining_file_size) ((gint32)((remaining_file_size>NSPR_PAGESIZE)?NSPR_PAGESIZE:remaining_file_size))
@@ -460,12 +452,13 @@ int nstrace_open(wtap *wth, int *err, gchar **err_info)
        gint64 file_size;
        gint32 page_size;
        nstrace_t *nstrace;
+       int bytes_read;
 
        errno = WTAP_ERR_CANT_READ;
 
-       if ((file_size = wtap_file_size(wth, err)) == -1)       
+       if ((file_size = wtap_file_size(wth, err)) == -1)
                return 0;
-  
+
        nstrace_buf = g_malloc(NSPR_PAGESIZE);
        page_size = GET_READ_PAGE_SIZE(file_size);
 
@@ -474,7 +467,7 @@ int nstrace_open(wtap *wth, int *err, gchar **err_info)
        case WTAP_FILE_NETSCALER_1_0:
                wth->file_encap = WTAP_ENCAP_NSTRACE_1_0;
                break;
-       
+
        case WTAP_FILE_NETSCALER_2_0:
                wth->file_encap = WTAP_ENCAP_NSTRACE_2_0;
                break;
@@ -488,21 +481,22 @@ int nstrace_open(wtap *wth, int *err, gchar **err_info)
 
        if ((file_seek(wth->fh, 0, SEEK_SET, err)) == -1)
        {
-               *err = file_error(wth->fh);
+               *err = file_error(wth->fh, err_info);
                g_free(nstrace_buf);
                return 0;
        }
 
-       if (page_size != file_read(nstrace_buf, 1, page_size, wth->fh))
+       bytes_read = file_read(nstrace_buf, page_size, wth->fh);
+       if (bytes_read != page_size)
        {
-               *err = file_error(wth->fh);
+               *err = file_error(wth->fh, err_info);
                g_free(nstrace_buf);
                return 0;
        }
-       
+
        wth->subtype_read = nstrace_read;
        wth->subtype_seek_read = nstrace_seek_read;
-       wth->subtype_close = nstrace_close; 
+       wth->subtype_close = nstrace_close;
 
        nstrace = (nstrace_t *)g_malloc(sizeof(nstrace_t));
        wth->priv = (void *)nstrace;
@@ -515,34 +509,35 @@ int nstrace_open(wtap *wth, int *err, gchar **err_info)
        nstrace->nsg_creltime = 0;
        nstrace->file_size = file_size;
 
-  
+
        /* Set the start time by looking for the abstime record */
        if ((nstrace_set_start_time(wth)) == FALSE)
        {
                /* Reset the read pointer to start of the file. */
                if ((file_seek(wth->fh, 0, SEEK_SET, err)) == -1)
                {
-                       *err = file_error(wth->fh);
+                       *err = file_error(wth->fh, err_info);
                        g_free(nstrace->pnstrace_buf);
                        g_free(nstrace);
                        return 0;
                }
 
                /* Read the first page of data */
-               if (page_size != file_read(nstrace_buf, 1, page_size, wth->fh))
+               bytes_read = file_read(nstrace_buf, page_size, wth->fh);
+               if (bytes_read != page_size)
                {
-                       *err = file_error(wth->fh);
+                       *err = file_error(wth->fh, err_info);
                        g_free(nstrace->pnstrace_buf);
                        g_free(nstrace);
                        return 0;
                }
-       
+
                /* reset the buffer offset */
                nstrace->nstrace_buf_offset = 0;
        }
 
        wth->tsprecision = WTAP_FILE_TSPREC_NSEC;
-       wth->phdr.ts.secs = nstrace->nspm_curtime; 
+       wth->phdr.ts.secs = nstrace->nspm_curtime;
        wth->phdr.ts.nsecs = 0;
 
        *err = 0;
@@ -561,17 +556,19 @@ nspm_signature_func(20)
 /*
 ** Check signature and return the version number of the signature.
 ** If not found, it returns 0. At the time of return from this function
-** we might not be at the first page. So after a call to this function, there 
+** we might not be at the first page. So after a call to this function, there
 ** has to be a file seek to return to the start of the first page.
 */
 guint32
 nspm_signature_version(wtap *wth, gchar *nstrace_buf, gint32 len)
 {
        gchar *dp = nstrace_buf;
+       int bytes_read;
 
-       if (len == file_read(dp, 1, len, wth->fh)) {
+       bytes_read = file_read(dp, len, wth->fh);
+       if (bytes_read == len) {
 
-               for ( ; len > (gint32)(ns_min(sizeof(NSPR_SIGSTR_V10), sizeof(NSPR_SIGSTR_V20))); dp++, len--)
+               for ( ; len > (gint32)(MIN(sizeof(NSPR_SIGSTR_V10), sizeof(NSPR_SIGSTR_V20))); dp++, len--)
                {
 #define        sigv10p ((nspr_signature_v10_t*)dp)
                        if ((pletohs(&sigv10p->nsprRecordType) == NSPR_SIGNATURE_V10) &&
@@ -580,7 +577,7 @@ nspm_signature_version(wtap *wth, gchar *nstrace_buf, gint32 len)
                                (!nspm_signature_isv10(sigv10p->sig_Signature)))
                                return WTAP_FILE_NETSCALER_1_0;
 #undef sigv10p
-    
+
 #define        sigv20p ((nspr_signature_v20_t*)dp)
                        if ((sigv20p->sig_RecordType == NSPR_SIGNATURE_V20) &&
                                (sigv20p->sig_RecordSize <= len) &&
@@ -611,6 +608,7 @@ nspm_signature_version(wtap *wth, gchar *nstrace_buf, gint32 len)
                gchar* nstrace_buf = nstrace->pnstrace_buf;\
                gint32 nstrace_buf_offset = nstrace->nstrace_buf_offset;\
                gint32 nstrace_buflen = nstrace->nstrace_buflen;\
+               int bytes_read;\
                do\
                {\
                        while (nstrace_buf_offset < nstrace_buflen)\
@@ -633,7 +631,7 @@ nspm_signature_version(wtap *wth, gchar *nstrace_buf, gint32 len)
                        nstrace_buf_offset = 0;\
                        wth->data_offset += nstrace_buflen;\
                        nstrace_buflen = GET_READ_PAGE_SIZE((nstrace->file_size - wth->data_offset));\
-               }while((nstrace_buflen > 0) && (nstrace_buflen == (file_read(nstrace_buf, 1, nstrace_buflen, wth->fh))));\
+               }while((nstrace_buflen > 0) && (bytes_read = file_read(nstrace_buf, nstrace_buflen, wth->fh)) && bytes_read == nstrace_buflen); \
                return FALSE;\
        }
 
@@ -648,7 +646,7 @@ nstrace_set_start_time_ver(20)
 ** Set the start time of the trace file. We look for the first ABSTIME record. We use that
 ** to set the start time. Apart from that we also make sure that we remember the position of
 ** the next record after the ABSTIME record. Inorder to report correct time values, all trace
-** records before the ABSTIME record are ignored. 
+** records before the ABSTIME record are ignored.
 */
 gboolean nstrace_set_start_time(wtap *wth)
 {
@@ -686,7 +684,8 @@ gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *data_of
        gint32 nstrace_buflen = nstrace->nstrace_buflen;
        nspr_pktracefull_v10_t *fp;
        nspr_pktracepart_v10_t *pp;
-      
+       int bytes_read;
+
        *err = 0;
        *err_info = NULL;
        do
@@ -694,102 +693,102 @@ gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *data_of
                while ((nstrace_buf_offset < nstrace_buflen) &&
                        ((nstrace_buflen - nstrace_buf_offset) >= ((gint32)sizeof(fp->nsprRecordType))))
                {
-      
+
                        fp = (nspr_pktracefull_v10_t *) &nstrace_buf[nstrace_buf_offset];
                        pp = (nspr_pktracepart_v10_t *) fp;
-      
+
                        switch (pletohs(&fp->nsprRecordType))
                        {
                        case NSPR_PDPKTRACEFULLTX_V10:
                        case NSPR_PDPKTRACEFULLTXB_V10:
                        case NSPR_PDPKTRACEFULLRX_V10:
-      
+
                                nsg_creltime += ns_hrtime2nsec(pletohl(&fp->fp_RelTimeHr));
-                               wth->phdr.ts.secs = nstrace->nspm_curtime + (guint32) (nsg_creltime / 1000000000); 
+                               wth->phdr.ts.secs = nstrace->nspm_curtime + (guint32) (nsg_creltime / 1000000000);
                                wth->phdr.ts.nsecs = (guint32) (nsg_creltime % 1000000000);
-      
+
                                wth->phdr.len = pletohs(&fp->nsprRecordSize);
                                wth->phdr.caplen = wth->phdr.len;
-     
+
+
                                TRACE_V10_REC_LEN_OFF(v10_full,fp,pktracefull_v10);
-                               
+
                                buffer_assure_space(wth->frame_buffer, wth->phdr.caplen);
-                               memcpy(buffer_start_ptr(wth->frame_buffer), fp, wth->phdr.caplen); 
+                               memcpy(buffer_start_ptr(wth->frame_buffer), fp, wth->phdr.caplen);
                                *data_offset = wth->data_offset + nstrace_buf_offset;
-      
+
                                nstrace->nstrace_buf_offset = nstrace_buf_offset + wth->phdr.len;
                                nstrace->nstrace_buflen = nstrace_buflen;
                                nstrace->nsg_creltime = nsg_creltime;
 
                                return TRUE;
-      
+
                        case NSPR_PDPKTRACEPARTTX_V10:
                        case NSPR_PDPKTRACEPARTTXB_V10:
                        case NSPR_PDPKTRACEPARTRX_V10:
-      
+
                                nsg_creltime += ns_hrtime2nsec(pletohl(&pp->pp_RelTimeHr));
-                               wth->phdr.ts.secs = nstrace->nspm_curtime + (guint32) (nsg_creltime / 1000000000); 
+                               wth->phdr.ts.secs = nstrace->nspm_curtime + (guint32) (nsg_creltime / 1000000000);
                                wth->phdr.ts.nsecs = (guint32) (nsg_creltime % 1000000000);
-      
+
                                wth->phdr.len =  pletohs(&pp->pp_PktSizeOrg) + nspr_pktracepart_v10_s;
                                wth->phdr.caplen =  pletohs(&pp->nsprRecordSize);
-      
+
                                TRACE_V10_REC_LEN_OFF(v10_part,pp,pktracepart_v10);
-                                     
+
                                buffer_assure_space(wth->frame_buffer, wth->phdr.caplen);
-                               memcpy(buffer_start_ptr(wth->frame_buffer), pp, wth->phdr.caplen); 
+                               memcpy(buffer_start_ptr(wth->frame_buffer), pp, wth->phdr.caplen);
                                *data_offset = wth->data_offset + nstrace_buf_offset;
-      
+
                                nstrace->nstrace_buf_offset = nstrace_buf_offset + wth->phdr.caplen;
                                nstrace->nsg_creltime = nsg_creltime;
                                nstrace->nstrace_buflen = nstrace_buflen;
 
                                return TRUE;
-      
+
                        case NSPR_ABSTIME_V10:
 
-                               ns_setabstime(nstrace, pletohl(&((nspr_abstime_v10_t *) fp)->abs_Time), pletohl(&((nspr_abstime_v10_t *) fp)->abs_RelTime));
+                               ns_setabstime(nstrace, pletohl(((nspr_abstime_v10_t *) fp)->abs_Time), pletohl(&((nspr_abstime_v10_t *) fp)->abs_RelTime));
                                nstrace_buf_offset += pletohs(&fp->nsprRecordSize);
                                break;
-      
+
                        case NSPR_RELTIME_V10:
 
-                               ns_setrelativetime(nstrace, ((nspr_abstime_v10_t *) fp)->abs_RelTime);
+                               ns_setrelativetime(nstrace, pletohl(((nspr_abstime_v10_t *) fp)->abs_RelTime));
                                nstrace_buf_offset += pletohs(&fp->nsprRecordSize);
                                break;
-      
+
                        case NSPR_UNUSEDSPACE_V10:
 
                                nstrace_buf_offset = nstrace_buflen;
                                break;
-       
+
                        default:
 
                                nstrace_buf_offset += pletohs(&fp->nsprRecordSize);
                                break;
                        }
                }
-  
+
                nstrace_buf_offset = 0;
                wth->data_offset += nstrace_buflen;
                nstrace_buflen = GET_READ_PAGE_SIZE((nstrace->file_size - wth->data_offset));
-       }while((nstrace_buflen > 0) && (nstrace_buflen == (file_read(nstrace_buf, 1, nstrace_buflen, wth->fh))));
-  
+       }while((nstrace_buflen > 0) && (bytes_read = file_read(nstrace_buf, nstrace_buflen, wth->fh)) && (bytes_read == nstrace_buflen));
+
        return FALSE;
 }
 
 #define TIMEDEFV20(fp,type) \
        do {\
-               nsg_creltime += ns_hrtime2nsec(pletohl(&fp->type##_RelTimeHr));\
+               nsg_creltime += ns_hrtime2nsec(pletohl(fp->type##_RelTimeHr));\
                wth->phdr.ts.secs = nstrace->nspm_curtime + (guint32) (nsg_creltime / 1000000000);\
                wth->phdr.ts.nsecs = (guint32) (nsg_creltime % 1000000000);\
        }while(0)
 
 #define TIMEDEFV23(fp,type) \
        do {\
-               /* access _AbsTimeHighHdr as a 64bit value */\
-               nsg_creltime = (((guint64)fp->type##_AbsTimeHighHdr<<32) | (fp->type##_AbsTimeLowHdr));\
+               /* access _AbsTimeHr as a 64bit value */\
+               nsg_creltime = pletohll(fp->type##_AbsTimeHr);\
                wth->phdr.ts.secs = (guint32) (nsg_creltime / 1000000000);\
                wth->phdr.ts.nsecs = (guint32) (nsg_creltime % 1000000000);\
        }while(0)
@@ -806,7 +805,7 @@ gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *data_of
 #define PPSIZEDEFV21(pp,ver) PPSIZEDEFV20(pp,ver)
 #define PPSIZEDEFV22(pp,ver) PPSIZEDEFV20(pp,ver)
 #define PPSIZEDEFV23(pp,ver) PPSIZEDEFV20(pp,ver)
-               
+
 #define FPSIZEDEFV20(fp,ver)\
        do {\
                wth->phdr.len = nspr_getv20recordsize((nspr_hd_v20_t *)fp);\
@@ -842,7 +841,8 @@ gboolean nstrace_read_v20(wtap *wth, int *err, gchar **err_info, gint64 *data_of
        gint32 nstrace_buflen = nstrace->nstrace_buflen;
        nspr_pktracefull_v20_t *fp20;
        nspr_pktracefull_v21_t *fp21;
-               
+       int bytes_read;
+
        *err = 0;
        *err_info = NULL;
        do
@@ -851,7 +851,7 @@ gboolean nstrace_read_v20(wtap *wth, int *err, gchar **err_info, gint64 *data_of
                        ((nstrace_buflen - nstrace_buf_offset) >= ((gint32)sizeof(fp21->fp_RecordType))))
                {
                        fp21 = (nspr_pktracefull_v21_t *) &nstrace_buf[nstrace_buf_offset];
-    
+
                        switch (fp21->fp_RecordType)
                        {
 
@@ -884,7 +884,7 @@ gboolean nstrace_read_v20(wtap *wth, int *err, gchar **err_info, gint64 *data_of
                                        ns_setabstime(nstrace, pletohl(&((nspr_abstime_v20_t *) fp20)->abs_Time), pletohs(&((nspr_abstime_v20_t *) fp20)->abs_RelTime));
                                        break;
                                }
-      
+
                                case NSPR_RELTIME_V20:
                                {
                                        fp20 = (nspr_pktracefull_v20_t *) &nstrace_buf[nstrace_buf_offset];
@@ -892,7 +892,7 @@ gboolean nstrace_read_v20(wtap *wth, int *err, gchar **err_info, gint64 *data_of
                                        nstrace_buf_offset += nspr_getv20recordsize((nspr_hd_v20_t *)fp20);
                                        break;
                        }
-      
+
                                case NSPR_UNUSEDSPACE_V20:
                                {
                                        if (nstrace_buf_offset >= NSPR_PAGESIZE/2)
@@ -901,7 +901,7 @@ gboolean nstrace_read_v20(wtap *wth, int *err, gchar **err_info, gint64 *data_of
                                                nstrace_buf_offset = NSPR_PAGESIZE/2;
                                        break;
                        }
-       
+
                                default:
                                {
                                        fp20 = (nspr_pktracefull_v20_t *) &nstrace_buf[nstrace_buf_offset];
@@ -909,13 +909,13 @@ gboolean nstrace_read_v20(wtap *wth, int *err, gchar **err_info, gint64 *data_of
                                        break;
                                }
                        }
-       }      
-   
+       }
+
                nstrace_buf_offset = 0;
            wth->data_offset += nstrace_buflen;
        nstrace_buflen = GET_READ_PAGE_SIZE((nstrace->file_size - wth->data_offset));
-       }while((nstrace_buflen > 0) && (nstrace_buflen == (file_read(nstrace_buf, 1, nstrace_buflen, wth->fh))));
-  
+       }while((nstrace_buflen > 0) && (bytes_read = file_read(nstrace_buf, nstrace_buflen, wth->fh)) && (bytes_read == nstrace_buflen));
+
        return FALSE;
 }
 
@@ -951,8 +951,10 @@ gboolean nstrace_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset
 
 gboolean nstrace_seek_read(wtap *wth, gint64 seek_off,
     union wtap_pseudo_header *pseudo_header, guchar *pd, int length,
-    int *err, gchar **err_info _U_)
+    int *err, gchar **err_info)
 {
+       int bytes_read;
+
        *err = 0;
 
        if (file_seek(wth->random_fh, seek_off, SEEK_SET, err) == -1)
@@ -961,8 +963,13 @@ gboolean nstrace_seek_read(wtap *wth, gint64 seek_off,
        /*
        ** Read the packet data.
        */
-       if ((file_read(pd, 1, length, wth->random_fh)) != length)
+       bytes_read = file_read(pd, length, wth->random_fh);
+       if (bytes_read != length) {
+               *err = file_error(wth->random_fh, err_info);
+               if (*err == 0)
+                       *err = WTAP_ERR_SHORT_READ;
                return FALSE;
+       }
 
        if (wth->file_type == WTAP_FILE_NETSCALER_1_0)
        {
@@ -1053,16 +1060,10 @@ int nstrace_20_dump_can_write_encap(int encap)
 
 /* Returns TRUE on success, FALSE on failure; sets "*err" to an error code on
 ** failure */
-gboolean nstrace_dump_open(wtap_dumper *wdh, gboolean cant_seek, int *err)
+gboolean nstrace_dump_open(wtap_dumper *wdh, int *err _U_)
 {
        nstrace_dump_t *nstrace;
 
-       if (cant_seek) 
-       {
-               *err = WTAP_ERR_CANT_WRITE_TO_PIPE;
-               return FALSE;
-       }
-
        wdh->subtype_write = nstrace_dump;
 
        nstrace = (nstrace_dump_t *)g_malloc(sizeof(nstrace_dump_t));
@@ -1075,28 +1076,31 @@ gboolean nstrace_dump_open(wtap_dumper *wdh, gboolean cant_seek, int *err)
 }
 
 
-gboolean nstrace_add_signature(wtap_dumper *wdh)
+static gboolean nstrace_add_signature(wtap_dumper *wdh, int *err)
 {
        nstrace_dump_t *nstrace = (nstrace_dump_t *)wdh->priv;
-       size_t nwritten;
 
        if (wdh->file_type == WTAP_FILE_NETSCALER_1_0)
        {
+               guint16 val16b;
                nspr_signature_v10_t sig10;
 
                /* populate the record */
-               sig10.phd.ph_RecordType = htoles(NSPR_SIGNATURE_V10);
-               sig10.phd.ph_RecordSize = htoles(nspr_signature_v10_s);
-               memcpy(sig10.sig_Signature, NSPR_SIGSTR_V10, NSPR_SIGSIZE_V10);
+               val16b = htoles(NSPR_SIGNATURE_V10);
+               memcpy(sig10.phd.ph_RecordType, &val16b, sizeof sig10.phd.ph_RecordType);
+               val16b = htoles(nspr_signature_v10_s);
+               memcpy(sig10.phd.ph_RecordSize, &val16b, sizeof sig10.phd.ph_RecordSize);
+               memset(sig10.sig_Signature, 0, NSPR_SIGSIZE_V10);
+               g_strlcpy(sig10.sig_Signature, NSPR_SIGSTR_V10, NSPR_SIGSIZE_V10);
 
                /* Write the record into the file */
-               nwritten = fwrite(&sig10, 1, nspr_signature_v10_s, wdh->fh);
-               if (nwritten != nspr_signature_v10_s)
-                       return FALSE;    
+               if (!wtap_dump_file_write(wdh, &sig10, nspr_signature_v10_s,
+                   err))
+                       return FALSE;
 
                /* Move forward the page offset */
-               nstrace->page_offset += (guint16) nwritten;
-       
+               nstrace->page_offset += (guint16) nspr_signature_v10_s;
+
        } else if (wdh->file_type == WTAP_FILE_NETSCALER_2_0)
        {
                gchar sig[nspr_signature_v20_s + sizeof(NSPR_SIGSTR_V20)];
@@ -1108,14 +1112,14 @@ gboolean nstrace_add_signature(wtap_dumper *wdh)
                memcpy(sig20->sig_Signature, NSPR_SIGSTR_V20, sizeof(NSPR_SIGSTR_V20));
 
                /* Write the record into the file */
-               nwritten = fwrite(sig20, 1, sig20->sig_RecordSize, wdh->fh);
-               if (nwritten != sig20->sig_RecordSize) 
-                       return FALSE;    
+               if (!wtap_dump_file_write(wdh, sig20, sig20->sig_RecordSize,
+                   err))
+                       return FALSE;
 
                /* Move forward the page offset */
-               nstrace->page_offset += (guint16) nwritten;
-       
-       } else  
+               nstrace->page_offset += (guint16) sig20->sig_RecordSize;
+
+       } else
        {
                g_assert_not_reached();
                return FALSE;
@@ -1125,31 +1129,35 @@ gboolean nstrace_add_signature(wtap_dumper *wdh)
 }
 
 
-gboolean nstrace_add_abstime(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
-     const guchar *pd)
+static gboolean
+nstrace_add_abstime(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
+     const guchar *pd, int *err)
 {
        nstrace_dump_t *nstrace = (nstrace_dump_t *)wdh->priv;
-       size_t nwritten;
        guint64 nsg_creltime;
 
        if (wdh->file_type == WTAP_FILE_NETSCALER_1_0)
        {
+               guint16 val16;
+               guint32 reltime;
+               guint64 abstime;
                nspr_abstime_v10_t abs10;
-               nspr_pktracefull_v10_t fp10;
 
                /* populate the record */
-               abs10.phd.ph_RecordType = htoles(NSPR_ABSTIME_V10);
-               abs10.phd.ph_RecordSize = htoles(nspr_abstime_v10_s);
+               val16 = htoles(NSPR_ABSTIME_V10);
+               memcpy(abs10.phd.ph_RecordType, &val16, sizeof abs10.phd.ph_RecordType);
+               val16 = htoles(nspr_abstime_v10_s);
+               memcpy(abs10.phd.ph_RecordSize, &val16, sizeof abs10.phd.ph_RecordSize);
+
+               memcpy(&reltime, ((nspr_pktracefull_v10_t *)pd)->fp_RelTimeHr, sizeof reltime);
+               nsg_creltime = ns_hrtime2nsec(reltime);
 
-               memcpy(&fp10, pd, nspr_pktracefull_v10_s);
-               nsg_creltime = ns_hrtime2nsec(fp10.fp_RelTimeHr);
-               
-               abs10.abs_RelTime = 0;
-               abs10.abs_Time = htolel((guint32)phdr->ts.secs - (guint32)(nsg_creltime/1000000000));
+               memset(abs10.abs_RelTime, 0, sizeof abs10.abs_RelTime);
+               abstime = htolel((guint32)phdr->ts.secs - (guint32)(nsg_creltime/1000000000));
+               memcpy(abs10.abs_Time, &abstime, sizeof abs10.abs_Time);
 
                /* Write the record into the file */
-               nwritten = fwrite(&abs10, 1, nspr_abstime_v10_s, wdh->fh);
-               if (nwritten != nspr_abstime_v10_s) 
+               if (!wtap_dump_file_write(wdh, &abs10, nspr_abstime_v10_s, err))
                        return FALSE;
 
                /* Move forward the page offset */
@@ -1157,21 +1165,22 @@ gboolean nstrace_add_abstime(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
 
        } else if (wdh->file_type == WTAP_FILE_NETSCALER_2_0)
        {
+               guint32 reltime;
+               guint64 abstime;
                nspr_abstime_v20_t abs20;
-               nspr_pktracefull_v20_t fp20;
 
                abs20.abs_RecordType = NSPR_ABSTIME_V20;
                abs20.abs_RecordSize = nspr_abstime_v20_s;
 
-               memcpy(&fp20, pd, nspr_pktracefull_v20_s);
-               nsg_creltime = ns_hrtime2nsec(fp20.fp_RelTimeHr);
+               memcpy(&reltime, ((nspr_pktracefull_v20_t *)pd)->fp_RelTimeHr, sizeof reltime);
+               nsg_creltime = ns_hrtime2nsec(reltime);
 
-               abs20.abs_RelTime = 0;
-               abs20.abs_Time = htolel((guint32)phdr->ts.secs - (guint32)(nsg_creltime/1000000000));
+               memset(abs20.abs_RelTime, 0, sizeof abs20.abs_RelTime);
+               abstime = htolel((guint32)phdr->ts.secs - (guint32)(nsg_creltime/1000000000));
+               memcpy(abs20.abs_RelTime, &abstime, sizeof abs20.abs_RelTime);
 
                /* Write the record into the file */
-               nwritten = fwrite(&abs20, 1, nspr_abstime_v20_s, wdh->fh);
-               if (nwritten != nspr_abstime_v20_s) 
+               if (!wtap_dump_file_write(wdh, &abs20, nspr_abstime_v20_s, err))
                        return FALSE;
 
                /* Move forward the page offset */
@@ -1191,20 +1200,21 @@ gboolean nstrace_add_abstime(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
    Returns TRUE on success, FALSE on failure. */
 static gboolean nstrace_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
     const union wtap_pseudo_header *pseudo_header, const guchar *pd, int *err)
-{  
+{
        nstrace_dump_t *nstrace = (nstrace_dump_t *)wdh->priv;
-       size_t nwritten;
 
        if (nstrace->page_offset == 0)
        {
                /* Add the signature record and abs time record */
                if (wdh->file_type == WTAP_FILE_NETSCALER_1_0)
                {
-                       if ((nstrace_add_signature(wdh) == FALSE) || (nstrace_add_abstime(wdh, phdr, pd) == FALSE))
+                       if (!nstrace_add_signature(wdh, err) ||
+                           !nstrace_add_abstime(wdh, phdr, pd, err))
                                return FALSE;
                } else if (wdh->file_type == WTAP_FILE_NETSCALER_2_0)
                {
-                       if ((nstrace_add_signature(wdh) == FALSE) || (nstrace_add_abstime(wdh, phdr, pd) == FALSE))
+                       if (!nstrace_add_signature(wdh, err) ||
+                           !nstrace_add_abstime(wdh, phdr, pd, err))
                                return FALSE;
                } else
                {
@@ -1231,27 +1241,19 @@ static gboolean nstrace_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
                                nstrace->page_offset = 0;
 
                                /* Possibly add signature and abstime records and increment offset */
-                               if (nstrace_add_signature(wdh) == FALSE)
+                               if (!nstrace_add_signature(wdh, err))
                                        return FALSE;
                        }
 
                        /* Write the actual record as is */
-                       nwritten = fwrite(pd, 1, phdr->caplen, wdh->fh);
-                       if (nwritten != phdr->caplen)
-                       {
-                               if (nwritten == 0 && ferror(wdh->fh))
-                                       *err = errno;
-                               else
-                                       *err = WTAP_ERR_SHORT_WRITE;
-
+                       if (!wtap_dump_file_write(wdh, pd, phdr->caplen, err))
                                return FALSE;
-                       }
 
-                       nstrace->page_offset += (guint16) nwritten;
+                       nstrace->page_offset += (guint16) phdr->caplen;
                } else if (wdh->file_type == WTAP_FILE_NETSCALER_2_0)
                {
                        *err = WTAP_ERR_UNSUPPORTED_FILE_TYPE;
-                       return FALSE;    
+                       return FALSE;
                }
 
                break;
@@ -1279,24 +1281,15 @@ static gboolean nstrace_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
                                nstrace->page_offset = 0;
 
                                /* Possibly add signature and abstime records and increment offset */
-                               if (nstrace_add_signature(wdh) == FALSE)
-                               return FALSE;
+                               if (!nstrace_add_signature(wdh, err))
+                                       return FALSE;
                        }
 
                        /* Write the actual record as is */
-                       nwritten = fwrite(pd, 1, phdr->caplen, wdh->fh);
-
-                       if (nwritten != phdr->caplen)
-                       {
-                               if (nwritten == 0 && ferror(wdh->fh))
-                                       *err = errno;
-                               else
-                                       *err = WTAP_ERR_SHORT_WRITE;
-
+                       if (!wtap_dump_file_write(wdh, pd, phdr->caplen, err))
                                return FALSE;
-                       }
 
-                       nstrace->page_offset += (guint16) nwritten;
+                       nstrace->page_offset += (guint16) phdr->caplen;
                }
 
                break;
@@ -1304,7 +1297,7 @@ static gboolean nstrace_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
        default:
                g_assert_not_reached();
                return FALSE;
-       } 
+       }
 
        return TRUE;
 }