Hi,
Here is a half baked attempt at preserving the SHB, does this look to be on the right track? If it looks OK feel free to apply it or any part of it or even complete it :-)

Regards
Anders
Index: pcapng.c
===================================================================
--- pcapng.c    (revision 41027)
+++ pcapng.c    (working copy)
@@ -186,16 +186,18 @@
 
 
 /* Capture section */
+#if 0
+/* Moved to wtap.h */
 typedef struct wtapng_section_s {
        /* mandatory */
        guint64                         section_length;
        /* options */
        gchar                           *opt_comment;   /* NULL if not 
available */
        gchar                           *shb_hardware;  /* NULL if not 
available */
-       gchar                           *shb_os;        /* NULL if not 
available */
+       gchar                           *shb_os;                /* NULL if not 
available */
        gchar                           *shb_user_appl; /* NULL if not 
available */
 } wtapng_section_t;
-
+#endif
 /* Interface Description */
 typedef struct wtapng_if_descr_s {
        /* mandatory */
@@ -203,7 +205,7 @@
        guint32                         snap_len;
        /* options */
        gchar                           *opt_comment;   /* NULL if not 
available */
-       gchar                           *if_name;       /* NULL if not 
available */
+       gchar                           *if_name;               /* NULL if not 
available */
        gchar                           *if_description;/* NULL if not 
available */
        /* XXX: if_IPv4addr */
        /* XXX: if_IPv6addr */
@@ -1505,6 +1507,11 @@
                return 0;
        }
 
+       wth->shb_hdr.opt_comment        = wblock.data.section.opt_comment;
+       wth->shb_hdr.shb_hardware       = wblock.data.section.shb_hardware;
+       wth->shb_hdr.shb_os                     = wblock.data.section.shb_os;
+       wth->shb_hdr.shb_user_appl      = wblock.data.section.shb_user_appl;
+
        wth->file_encap = WTAP_ENCAP_UNKNOWN;
        wth->snapshot_length = 0;
        wth->tsprecision = WTAP_FILE_TSPREC_NSEC;
@@ -2179,11 +2186,18 @@
        wblock.type = BLOCK_TYPE_SHB;
        wblock.data.section.section_length = -1;
 
-       /* XXX - options unused */
-       wblock.data.section.opt_comment   = NULL;
-       wblock.data.section.shb_hardware  = NULL;
-       wblock.data.section.shb_os        = NULL;
-       wblock.data.section.shb_user_appl = NULL;
+       /* Options */
+       if(wdh->shb_hdr){
+               wblock.data.section.opt_comment   = wdh->shb_hdr->opt_comment;
+               wblock.data.section.shb_hardware  = wdh->shb_hdr->shb_hardware;
+               wblock.data.section.shb_os        = wdh->shb_hdr->shb_os;
+               wblock.data.section.shb_user_appl = wdh->shb_hdr->shb_user_appl;
+       }else{
+               wblock.data.section.opt_comment   = NULL;
+               wblock.data.section.shb_hardware  = NULL;
+               wblock.data.section.shb_os        = NULL;
+               wblock.data.section.shb_user_appl = NULL;
+       }
 
        if (!pcapng_write_block(wdh, &wblock, err)) {
                return FALSE;
Index: wtap.h
===================================================================
--- wtap.h      (revision 41027)
+++ wtap.h      (working copy)
@@ -833,6 +833,19 @@
        guint32                         pack_flags;     /* XXX - 0 for now (any 
value for "we don't have it"?) */
 };
 
+/**
+ * Holds the option strings from pcapng:s Section Header block(SHB).
+ */
+typedef struct wtapng_section_s {
+       /* mandatory */
+       guint64                         section_length;
+       /* options */
+       gchar                           *opt_comment;   /* NULL if not 
available */
+       gchar                           *shb_hardware;  /* NULL if not 
available, UTF-8 string containing the description of the hardware used to 
create this section. */
+       gchar                           *shb_os;                /* NULL if not 
available, UTF-8 string containing the name of the operating system used to 
create this section. */
+       gchar                           *shb_user_appl; /* NULL if not 
available, UTF-8 string containing the name of the application used to create 
this section. */
+} wtapng_section_t;
+
 struct Buffer;
 struct wtap_dumper;
 
@@ -946,10 +959,16 @@
 gboolean wtap_dump_can_write_encap(int filetype, int encap);
 gboolean wtap_dump_can_compress(int filetype);
 gboolean wtap_dump_has_name_resolution(int filetype);
+
 wtap_dumper* wtap_dump_open(const char *filename, int filetype, int encap,
        int snaplen, gboolean compressed, int *err);
+
+wtap_dumper* wtap_dump_open_ng(const char *filename, int filetype, int encap,
+       int snaplen, gboolean compressed, wtapng_section_t *shb_hdr,int *err);
+
 wtap_dumper* wtap_dump_fdopen(int fd, int filetype, int encap, int snaplen,
        gboolean compressed, int *err);
+
 gboolean wtap_dump(wtap_dumper *, const struct wtap_pkthdr *,
        const union wtap_pseudo_header *pseudo_header, const guint8 *, int 
*err);
 void wtap_dump_flush(wtap_dumper *);
Index: file_access.c
===================================================================
--- file_access.c       (revision 41027)
+++ file_access.c       (working copy)
@@ -976,6 +976,12 @@
 wtap_dumper* wtap_dump_open(const char *filename, int filetype, int encap,
                                int snaplen, gboolean compressed, int *err)
 {
+       return wtap_dump_open_ng(filename, filetype, encap,snaplen, compressed, 
NULL, err);
+}
+
+wtap_dumper* wtap_dump_open_ng(const char *filename, int filetype, int encap,
+                               int snaplen, gboolean compressed, 
wtapng_section_t *shb_hdr, int *err)
+{
        wtap_dumper *wdh;
        WFILE_T fh;
 
@@ -988,7 +994,10 @@
        wdh = wtap_dump_alloc_wdh(filetype, encap, snaplen, compressed, err);
        if (wdh == NULL)
                return NULL;    /* couldn't allocate it */
-
+       
+       /* Set Section Header Block data */
+       wdh->shb_hdr = shb_hdr;
+       
        /* "-" means stdout */
        if (strcmp(filename, "-") == 0) {
                if (compressed) {
Index: wtap-int.h
===================================================================
--- wtap-int.h  (revision 41027)
+++ wtap-int.h  (working copy)
@@ -51,6 +51,7 @@
        guint                                           snapshot_length;
        struct Buffer                           *frame_buffer;
        struct wtap_pkthdr                      phdr;
+       struct wtapng_section_s         shb_hdr;
        union wtap_pseudo_header        pseudo_header;
 
        gint64                                          data_offset;
@@ -99,9 +100,10 @@
        subtype_write_func      subtype_write;
        subtype_close_func      subtype_close;
 
-       int                     tsprecision;    /* timestamp precision of the 
lower 32bits
-                                                                * e.g. 
WTAP_FILE_TSPREC_USEC */
-       struct addrinfo *addrinfo_list;
+       int                                                     tsprecision;    
/* timestamp precision of the lower 32bits
+                                                                               
                 * e.g. WTAP_FILE_TSPREC_USEC */
+       struct addrinfo                         *addrinfo_list;
+       struct wtapng_section_s         *shb_hdr;
 };
 
 extern gboolean wtap_dump_file_write(wtap_dumper *wdh, const void *buf,
Index: wtap.def
===================================================================
--- wtap.def    (revision 41027)
+++ wtap.def    (working copy)
@@ -41,6 +41,7 @@
 wtap_dump_fdopen
 wtap_dump_flush
 wtap_dump_open
+wtap_dump_open_ng
 wtap_dump_set_addrinfo_list
 wtap_encap_short_string
 wtap_encap_string
___________________________________________________________________________
Sent via:    Wireshark-dev mailing list <[email protected]>
Archives:    http://www.wireshark.org/lists/wireshark-dev
Unsubscribe: https://wireshark.org/mailman/options/wireshark-dev
             mailto:[email protected]?subject=unsubscribe

Reply via email to