Ethereal-dev: [Ethereal-dev] Patch for writing Novell LanAlyzer files

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Markus Steinmann <ms@xxxxxx>
Date: Mon, 24 Jun 2002 13:05:05 +0200

Hi everybody,

I'm new in this list and my reason for participation is to admit
this little patch, which should give ethereal the ability to
write the Novell Lanalyzer trace files.

This is only tested with a i386 Linux system, and maybe there
are some more things to do for other platforms.

There are two more points to consider:
The lanalyzer file format is limited to 32k packets per file,
this is not implemented.
And I have up to now not tested if it works with sliced
packets.

Where can I switch on the packet size limit to generate an
sliced packet trace file?

Maybe stupid question, but I normally working with another
self written company internal tool.

Looking forward to your questions/comments
best regards

		Markus

__________________________________________________________________

Markus Steinmann                                         ms@xxxxxx
Software Development
SEH Computertechnik GmbH Bielefeld               http://www.seh.de
__________________________________________________________________
? wiretap/.file.c,
? wiretap/.kped
? wiretap/.lanalyzer.c,
? wiretap/.lanalyzer.h,
? wiretap/.snoop.c,
? wiretap/.visual.c,
? wiretap/mops.xd
Index: wiretap/file.c
===================================================================
RCS file: /cvsroot/ethereal/wiretap/file.c,v
retrieving revision 1.92
diff -r1.92 file.c
7c7
<  * 
---
>  *
12c12
<  * 
---
>  *
17c17
<  * 
---
>  *
346,347c346,347
< 	{ "Novell LANalyzer", NULL,
< 	  NULL, NULL },
---
> 	{ "Novell LanAlyzer","lanalyzer",
> 	  lanalyzer_dump_can_write_encap, lanalyzer_dump_open },
Index: wiretap/lanalyzer.c
===================================================================
RCS file: /cvsroot/ethereal/wiretap/lanalyzer.c,v
retrieving revision 1.33
diff -r1.33 lanalyzer.c
7c7
<  * 
---
>  *
12c12
<  * 
---
>  *
17c17
<  * 
---
>  *
49a50,124
> static const gint8 LA_HeaderRegularFake[] = {
> 0x01,0x10,0x4c,0x00,0x01,0x05,0x54,0x72,0x61,0x63,0x65,0x20,0x44,0x69,0x73,0x70,  //..L...Trace Disp
> 0x6c,0x61,0x79,0x20,0x54,0x72,0x61,0x63,0x65,0x20,0x46,0x69,0x6c,0x65,0x00,0x00,  //lay Trace File..
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //................
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //................
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00   //................
>       };
> 
> static const gint8 LA_RxChannelNameFake[] = {
> 0x06,0x10,0x80,0x00,0x43,0x68,0x61,0x6e ,0x6e,0x65,0x6c,0x31,0x00,0x43,0x68,0x61, //....Channel1.Cha
> 0x6e,0x6e,0x65,0x6c,0x32,0x00,0x43,0x68 ,0x61,0x6e,0x6e,0x65,0x6c,0x33,0x00,0x43, //nnel2.Channel3.C
> 0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x00 ,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x35, //hannel4.Channel5
> 0x00,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c ,0x36,0x00,0x43,0x68,0x61,0x6e,0x6e,0x65, //.Channel6.Channe
> 0x6c,0x37,0x00,0x43,0x68,0x61,0x6e,0x6e ,0x65,0x6c,0x38,0x00,0x00,0x00,0x00,0x00, //l7.Channel8.....
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //................
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //................
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //................
> 0x00,0x00,0x00,0x00
>       };
> 
> static const gint8 LA_TxChannelNameFake[] = {
>                     0x0b,0x10,0x36,0x00 ,0x54,0x72,0x61,0x6e,0x73,0x31,0x00,0x00, //......6.Trans1..
> 0x00,0x54,0x72,0x61,0x6e,0x73,0x32,0x00 ,0x00,0x00,0x54,0x72,0x61,0x6e,0x73,0x33, //.Trans2...Trans3
> 0x00,0x00,0x00,0x54,0x72,0x61,0x6e,0x73 ,0x34,0x00,0x00,0x00,0x54,0x72,0x61,0x6e, //...Trans4...Tran
> 0x73,0x35,0x00,0x00,0x00,0x54,0x72,0x61 ,0x6e,0x73,0x36,0x00,0x00,0x00            //s5...Trans6...
>       };
> 
> static const gint8 LA_RxTemplateNameFake[] = {
>                                                                        0x35,0x10,
> 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00
>       };
> 
> static const gint8 LA_TxTemplateNameFake[] = {
>           0x36,0x10,0x36,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00
>       };
> 
> static const gint8 LA_DisplayOptionsFake[] = {
>                                                              0x0a,0x10,0x0a,0x01,
> 0x00,0x00,0x01,0x00,0x01,0x02,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00
>       };
> 
> static const gint8 LA_CyclicInformationFake[] = {
>                                                    0x09,0x10,0x1a,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
>       };
> 
51c126,127
< static void lanalyzer_close(wtap *wth);
---
> static void     lanalyzer_close(wtap *wth);
> static gboolean lanalyzer_dump_close(wtap_dumper *wdh, int *err);
77c153
< 	if (record_type != REC_TRACE_HEADER && record_type != REC_CYCLIC_TRACE_HEADER) {  
---
> 	if (record_type != REC_TRACE_HEADER && record_type != REC_CYCLIC_TRACE_HEADER) {
196c272
< 	} 
---
> 	}
208c284
< 	guint16		record_type, record_length;
---
> 	guint16	record_type, record_length;
210,211c286,287
< 	guint16		time_low, time_med, time_high, true_size;
< 	double		t;
---
> 	guint16	time_low, time_med, time_high, true_size;
> 	double	t;
296,297c372,376
< static void
< lanalyzer_close(wtap *wth)
---
> 
> //---------------------------------------------------
> //
> //---------------------------------------------------
> static void lanalyzer_close(wtap *wth)
300a380,623
> 
> 
> //---------------------------------------------------
> // Returns 0 or error
> //   Write one block with error control
> //---------------------------------------------------
> static int swrite(const void* what, guint size, FILE *hd)
> {
> 	size_t nwritten;
> 	
>       nwritten = fwrite(what, 1, size, hd);
> 	if (nwritten != size) {
> 		if (nwritten == 0 && ferror(hd))
> 			return errno;
> 		else
> 			return WTAP_ERR_SHORT_WRITE;
>             }
>       return 0; // ok
> }
> 
> //---------------------------------------------------
> // Write a record for a packet to a dump file.
> //   Returns TRUE on success, FALSE on failure.
> //---------------------------------------------------
> static gboolean lanalyzer_dump(wtap_dumper *wdh,
> 	const struct wtap_pkthdr *phdr,
> 	const union wtap_pseudo_header *pseudo_header _U_,
> 	const u_char *pd, int *err)
> {
>       guint64 x;
>       int     i;
>       static LA_RecordHeader hr;
>       static LA_PacketRecord pr;
>              LA_TmpInfo *itmp = (LA_TmpInfo*)(wdh->dump.opaque);
>       struct timeval td;
> 
>       hr.rid         = 0x1005;
>       pr.rx_channels = 0x0001;
>       pr.rx_errors   = 0x0008;
> 
>       if (!itmp->init) {
>             itmp->start = phdr->ts;
>             itmp->pkts  = 0;
>             itmp->init  = TRUE;
>             }
> 
>       timersub(&(phdr->ts),&(itmp->start),&td);
> 
>       x   = td.tv_usec;
>       x  += td.tv_sec * 1000000;
>       x <<= 1;
> 
>       for (i = 0; i < 3; i++, x >>= 16) {
>             pr.rx_time[i] = (x & 0xffff);
>             }
> 
>       pr.pktno      = ++itmp->pkts;
>       pr.prvlen     = hr.rlen;
>       pr.rx_frm_len = phdr->len + 4;
>       pr.rx_frm_sln = phdr->caplen;
> 
>       hr.rlen       = pr.rx_frm_sln +  (pr.rx_frm_sln ? sizeof(LA_PacketRecord) : 0);
> 
>       *err = swrite(&hr, sizeof hr, wdh->fh);
>       if (*err)
> 		return FALSE;
> 
>       *err = swrite(&pr , sizeof pr , wdh->fh);
>       if (*err)
> 		return FALSE;
> 
>       *err = swrite(pd , phdr->caplen , wdh->fh);
>       if (*err)
> 		return FALSE;
> 
>       return TRUE;
> }
> 
> 
> //---------------------------------------------------
> // Returns 0 if we could write the specified encapsulation type,
> // an error indication otherwise.
> //---------------------------------------------------
> int lanalyzer_dump_can_write_encap(int encap)
> {
>       // !! 2Do !!
>       // printf("lanalyzer_dump_can_write_encap(%d)\n",encap);
> 	return 0;
> }
> 
> //---------------------------------------------------
> // Returns TRUE on success, FALSE on failure; sets "*err" to an
> // error code on failure
> //---------------------------------------------------
> gboolean lanalyzer_dump_open(wtap_dumper *wdh, int *err)
> {
>       int   jump;
>       void  *tmp;
> 
>       /* This is a LanAlyzer file */
> 
>       tmp = g_malloc(sizeof(LA_TmpInfo));
>       if (!tmp) {
> 	      *err = errno;
> 	      return FALSE;
>             }
> 
>       ((LA_TmpInfo*)tmp)->init = FALSE;
>       wdh->dump.opaque         = tmp;
> 	wdh->subtype_write       = lanalyzer_dump;
> 	wdh->subtype_close       = lanalyzer_dump_close;
> 
>       /* Some of the fields in the file header aren't known yet so
>        just skip over it for now.  It will be created after all
>        of the packets have been written. */
> 
>       jump = sizeof (LA_HeaderRegularFake)
>            + sizeof (LA_RxChannelNameFake)
>            + sizeof (LA_TxChannelNameFake)
>            + sizeof (LA_RxTemplateNameFake)
>            + sizeof (LA_TxTemplateNameFake)
>            + sizeof (LA_DisplayOptionsFake)
>            + sizeof (LA_SummaryRecord)
>            + sizeof (LA_SubfileSummaryRecord)
>            + sizeof (LA_IndexRecord)
>            + sizeof (LA_CyclicInformationFake);
> 
>       if (fseek(wdh->fh, jump, SEEK_SET) == -1) {
> 	      *err = errno;
> 	      return FALSE;
>             }
>       return TRUE;
> }
> 
> //---------------------------------------------------
> //
> //---------------------------------------------------
> gboolean lanalyzer_dump_header(wtap_dumper *wdh, int *err)
> {
>       static LA_SummaryRecord sr;
>       static LA_SubfileSummaryRecord ssr;
>       static LA_IndexRecord sir;
>              LA_TmpInfo *itmp = (LA_TmpInfo*)(wdh->dump.opaque);
>       struct tm         *fT   = localtime(&(itmp->start.tv_sec));
> 
>       // printf("lanalyzer_dump_header pkts:%d\n",itmp->pkts);
>       fseek(wdh->fh, 0, SEEK_SET);
> 
>       *err = swrite(&LA_HeaderRegularFake,  sizeof LA_HeaderRegularFake, wdh->fh);
>       if (*err)
> 		return FALSE;
>       *err = swrite(&LA_RxChannelNameFake , sizeof LA_RxChannelNameFake , wdh->fh);
>       if (*err)
> 		return FALSE;
>       *err = swrite(&LA_TxChannelNameFake , sizeof LA_TxChannelNameFake , wdh->fh);
>       if (*err)
> 		return FALSE;
>       *err = swrite(&LA_RxTemplateNameFake, sizeof LA_RxTemplateNameFake, wdh->fh);
>       if (*err)
> 		return FALSE;
>       *err = swrite(&LA_TxTemplateNameFake, sizeof LA_TxTemplateNameFake, wdh->fh);
>       if (*err)
> 		return FALSE;
>       *err = swrite(&LA_DisplayOptionsFake, sizeof LA_DisplayOptionsFake, wdh->fh);
>       if (*err)
> 		return FALSE;
> 
>       //-----------------------------------------------------------------
>       //
>       //fprintf(stderr,"%02d.%02d.%d %02d:%02d:%02d",
>       //    fT->tm_mday,1+fT->tm_mon,1900 + fT->tm_year,
>       //    fT->tm_hour,fT->tm_min,fT->tm_sec);
>       //
>       sr.rid              = RT_Summary;
>       sr.rlen             = sizeof (Summary);
>       sr.s.datcre.day     = fT->tm_mday;
>       sr.s.datcre.mon     = fT->tm_mon  + 1;
>       sr.s.datcre.year    = fT->tm_year + 1900;
>       sr.s.datclo.day     = fT->tm_mday;
>       sr.s.datclo.mon     = fT->tm_mon  + 1;
>       sr.s.datclo.year    = fT->tm_year + 1900;
>       sr.s.timeopn.second = fT->tm_sec;
>       sr.s.timeopn.minute = fT->tm_min;
>       sr.s.timeopn.hour   = fT->tm_hour;
>       sr.s.timeopn.day    = fT->tm_mday;
>       sr.s.timeclo.second = fT->tm_sec;
>       sr.s.timeclo.minute = fT->tm_min;
>       sr.s.timeclo.hour   = fT->tm_hour;
>       sr.s.timeclo.day    = fT->tm_mday;
>       // EAddr  == 0
>       sr.s.mxseqno        = 1;
>       // slcoff == 0
>       sr.s.mxslc          = 1514;
>       sr.s.totpktt        = itmp->pkts;
>       // statrg == 0; ? -1
>       // stptrg == 0; ? -1
>       sr.s.mxpkta[1]      = itmp->pkts;  // *.tr1
>       sr.s.board_type     = 226;    // Lanalyzer Board Type
>       // board_version == 0
> 
>       *err = swrite(&sr, sizeof sr, wdh->fh);
>       if (*err)
> 		return FALSE;
> 
>       //-----------------------------------------------------------------
>       ssr.rid              = RT_SubfileSummary;
>       ssr.rlen             = sizeof(LA_SubfileSummaryRecord) - 4;
>       ssr.seqno            = 1;
>       ssr.totpktf          = itmp->pkts;
>       *err = swrite(&ssr, sizeof ssr, wdh->fh);
>       if (*err)
> 		return FALSE;
>       //-----------------------------------------------------------------
>       *err = swrite(&LA_CyclicInformationFake, sizeof LA_CyclicInformationFake, wdh->fh);
>       if (*err)
> 		return FALSE;
>       //-----------------------------------------------------------------
>       sir.rid              = RT_Index;
>       sir.rlen             = sizeof(sir) - 4;
>       sir.idxsp            = LA_IndexSize;
> 
>       *err = swrite(&sir, sizeof sir, wdh->fh);
>       if (*err)
> 		return FALSE;
> 
> 	return TRUE;
> }
> 
> //---------------------------------------------------
> // Finish writing to a dump file.
> // Returns TRUE on success, FALSE on failure.
> //---------------------------------------------------
> static gboolean lanalyzer_dump_close(wtap_dumper *wdh, int *err)
> {
>       if (wdh->dump.opaque) {
>             lanalyzer_dump_header(wdh,err);
>             g_free(wdh->dump.opaque);
>             wdh->dump.opaque = 0;
>             }
>       return *err ? FALSE : TRUE;
> }
> 
> 
> 
Index: wiretap/lanalyzer.h
===================================================================
RCS file: /cvsroot/ethereal/wiretap/lanalyzer.h,v
retrieving revision 1.5
diff -r1.5 lanalyzer.h
7c7
<  * 
---
>  *
12c12
<  * 
---
>  *
17c17
<  * 
---
>  *
27c27,135
< int lanalyzer_open(wtap *wth, int *err);
---
> //    Record type codes:
> 
> #define     RT_HeaderRegular       0x1001
> #define     RT_HeaderCyclic        0x1007
> #define     RT_RxChannelName       0x1006
> #define     RT_TxChannelName       0x100b
> #define     RT_FilterName          0x1032
> #define     RT_RxTemplateName      0x1035
> #define     RT_TxTemplateName      0x1036
> #define     RT_DisplayOptions      0x100a
> #define     RT_Summary             0x1002
> #define     RT_SubfileSummary      0x1003
> #define     RT_CyclicInformation   0x1009
> #define     RT_Index               0x1004
> #define     RT_PacketData          0x1005
> 
> typedef guint8  Eadr[6];
> typedef guint16 TimeStamp[3];  // 0.5 microseconds since start of trace
> 
> #pragma pack(2)
> 
> typedef struct {
>       guint8      day;
>       guint8      mon;
>       gint16      year;
>       } Date;
> 
> typedef struct {
>       guint8      second;
>       guint8      minute;
>       guint8      hour;
>       guint8      day;
>       gint16      reserved;
>       } Time;
> 
> typedef struct {
>       guint16     rx_channels;
>       guint16     rx_errors;
>       gint16      rx_frm_len;
>       gint16      rx_frm_sln;
>       TimeStamp   rx_time;
>       guint32     pktno;
>       gint16      prvlen;
>       gint16      offset;
>       gint16      tx_errs;
>       gint16      rx_filters;
>       gint8       unused[2];
>       gint16      hwcolls;
>       gint16      hwcollschans;
>       //                Packetdata ....;
>       } LA_PacketRecord;
> 
> typedef struct {
>       Date        datcre;
>       Date        datclo;
>       Time        timeopn;
>       Time        timeclo;
>       Eadr        statadr;
>       gint16      mxseqno;
>       gint16      slcoff;
>       gint16      mxslc;
>       gint32      totpktt;
>       gint32      statrg;
>       gint32      stptrg;
>       gint32      mxpkta[36];
>       gint16      board_type;
>       gint16      board_version;
>       gint8       reserved[18];
>       } Summary;
> 
> typedef struct {
>       gint16      rid;
>       gint16      rlen;
>       Summary     s;
>       } LA_SummaryRecord;
> 
> typedef struct {
>       gint16      rid;
>       gint16      rlen;
>       gint16      seqno;
>       gint32      totpktf;
>       } LA_SubfileSummaryRecord;
> 
> #define LA_IndexSize 500
> 
> typedef struct {
>       gint16      rid;
>       gint16      rlen;
>       gint16      idxsp; // = LA_IndexSize
>       gint16      idxct;
>       gint8       idxgranu;
>       gint8       idxvd;
>       gint32      trcidx[LA_IndexSize + 2]; // +2 undocumented but used by La 2.2
>       } LA_IndexRecord;
> 
> typedef struct {
>       gint16      rid;
>       gint16      rlen;
>       } LA_RecordHeader;
> 
> typedef struct {
>       gboolean        init;
>       struct timeval  start;
>       guint32         pkts;
>       } LA_TmpInfo;
> 
> int         lanalyzer_open(wtap *wth, int *err);
> gboolean    lanalyzer_dump_open(wtap_dumper *wdh, int *err);
> int         lanalyzer_dump_can_write_encap(int encap);
Index: wiretap/snoop.c
===================================================================
RCS file: /cvsroot/ethereal/wiretap/snoop.c,v
retrieving revision 1.52
diff -r1.52 snoop.c
7c7
<  * 
---
>  *
12c12
<  * 
---
>  *
17c17
<  * 
---
>  *
81c81
<  * 
---
>  *
Index: wiretap/visual.c
===================================================================
RCS file: /cvsroot/ethereal/wiretap/visual.c,v
retrieving revision 1.8
diff -r1.8 visual.c
9c9
<  * 
---
>  *
14c14
<  * 
---
>  *
19c19
<  * 
---
>  *
231c231
<     if (visual->current_pkt > visual->num_pkts) 
---
>     if (visual->current_pkt > visual->num_pkts)
241c241
<     if (bytes_read != phdr_size) 
---
>     if (bytes_read != phdr_size)
244c244
<         if (*err == 0 && bytes_read != 0) 
---
>         if (*err == 0 && bytes_read != 0)
254c254
<     if (packet_size > WTAP_MAX_PACKET_SIZE) 
---
>     if (packet_size > WTAP_MAX_PACKET_SIZE)
269c269
<     if (bytes_read != (int) packet_size) 
---
>     if (bytes_read != (int) packet_size)
332c332
< static gboolean visual_seek_read (wtap *wth, long seek_off, 
---
> static gboolean visual_seek_read (wtap *wth, long seek_off,
386c386
< /* Check for media types that may be written in Visual file format. 
---
> /* Check for media types that may be written in Visual file format.
468c468
<     if (visual->index_table_index == 0) 
---
>     if (visual->index_table_index == 0)
477c477
<     
---
> 
491c491
<         vpkt_hdr.encap_hint = 2;    
---
>         vpkt_hdr.encap_hint = 2;
494c494
<         vpkt_hdr.encap_hint = 3;    
---
>         vpkt_hdr.encap_hint = 3;
498c498
<         vpkt_hdr.encap_hint = 14;   
---
>         vpkt_hdr.encap_hint = 14;
501c501
<         vpkt_hdr.encap_hint = 13;   
---
>         vpkt_hdr.encap_hint = 13;
504c504
<         vpkt_hdr.encap_hint = 12;   
---
>         vpkt_hdr.encap_hint = 12;
533c533
<     if (nwritten != hdr_size) 
---
>     if (nwritten != hdr_size)
544c544
<     if (nwritten != phdr->caplen) 
---
>     if (nwritten != phdr->caplen)
554c554
<     if (visual->index_table_index >= visual->index_table_size) 
---
>     if (visual->index_table_index >= visual->index_table_size)
593c593
<         if (nwritten != n_to_write) 
---
>         if (nwritten != n_to_write)
648c648
<     if (nwritten != sizeof vfile_hdr) 
---
>     if (nwritten != sizeof vfile_hdr)

Attachment: lanalyzer.patch.zip
Description: Binary data