I added the LANalzyer file format to wiretap. I cleaned up some code in the
[obnox/wireshark/wip.git] / wiretap / file.c
1 /* file.c
2  *
3  * $Id: file.c,v 1.2 1998/11/12 06:01:21 gram Exp $
4  *
5  * Wiretap Library
6  * Copyright (c) 1998 by Gilbert Ramirez <gram@verdict.uthscsa.edu>
7  * 
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  * 
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  * 
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  */
23
24 #include <stdio.h>
25 #include <string.h>
26 #include "wtap.h"
27 #include "lanalyzer.h"
28 #include "ngsniffer.h"
29
30 /* The open_file_* routines should return the WTAP_FILE_* type
31  * that they are checking for if the file is successfully recognized
32  * as such. If the file is not of that type, the routine should return
33  * WTAP_FILE_UNKNOWN */
34 static int open_file_pcap(wtap *wth, char *filename);
35 static int convert_dlt_to_wtap_encap(int dlt);
36
37 /* Opens a file and prepares a wtap struct */
38 wtap* wtap_open_offline(char *filename, int filetype)
39 {
40         wtap    *wth;
41
42         wth = (wtap*)malloc(sizeof(wtap));
43
44         /* Open the file */
45         if (!(wth->fh = fopen(filename, "rb"))) {
46                 return NULL;
47         }
48
49         /* If the filetype is unknown, try all my file types */
50         if (filetype == WTAP_FILE_UNKNOWN) {
51                 /* WTAP_FILE_PCAP */
52                 if (wth->file_type = open_file_pcap(wth, filename)) {
53                         goto success;
54                 }
55                 /* WTAP_FILE_NGSNIFFER */
56                 if (wth->file_type = ngsniffer_open(wth)) {
57                         goto success;
58                 }
59                 /* WTAP_FILE_LANALYZER */
60                 if (wth->file_type = lanalyzer_open(wth)) {
61                         goto success;
62                 }
63
64                 printf("failed\n");
65                 /* WTAP_FILE_UNKNOWN */
66                 goto failure;
67         }
68
69         /* If the user tells us what the file is supposed to be, check it */
70         switch (filetype) {
71                 case WTAP_FILE_PCAP:
72                         if (wth->file_type = open_file_pcap(wth, filename)) {
73                                 goto success;
74                         }
75                         break;
76                 case WTAP_FILE_NGSNIFFER:
77                         if (wth->file_type = ngsniffer_open(wth)) {
78                                 goto success;
79                         }
80                         break;
81                 case WTAP_FILE_LANALYZER:
82                         if (wth->file_type = lanalyzer_open(wth)) {
83                                 goto success;
84                         }
85                         break;
86                 default:
87                         goto failure;
88         }
89
90         /* If we made it through the switch() statement w/o going to "success",
91          * then we failed. */
92         goto failure;
93
94 failure:
95         fclose(wth->fh);
96         free(wth);
97         wth = NULL;
98         return wth;
99
100 success:
101         buffer_init(&wth->frame_buffer, 1500);
102         wth->frame_number = 0;
103         wth->file_byte_offset = 0;
104         return wth;
105 }
106
107
108 /* libpcap/tcpdump files */
109 static
110 int open_file_pcap(wtap *wth, char *filename)
111 {
112         int bytes_read, dlt;
113         struct pcap_file_header file_hdr;
114
115         fseek(wth->fh, 0, SEEK_SET);
116         bytes_read = fread((char*)&file_hdr, 1,
117                         sizeof(struct pcap_file_header), wth->fh);
118
119         if (bytes_read != sizeof(struct pcap_file_header)) {
120                 return WTAP_FILE_UNKNOWN;
121         }
122
123         if (file_hdr.magic != 0xa1b2c3d4) {
124                 return WTAP_FILE_UNKNOWN;
125         }
126
127         /* This is a pcap file */
128         wth->capture.pcap = pcap_open_offline(filename, wth->err_str);
129         dlt = pcap_datalink(wth->capture.pcap);
130         wth->encapsulation =  convert_dlt_to_wtap_encap(dlt);
131         wth->subtype_read = NULL;
132
133         /* For most file types I don't fclose my handle, but for pcap I'm
134          * letting libpcap handle the file, so I don't need an open file
135          * handle. Libpcap already has the file open with the above
136          * pcap_open_offline() */
137         fclose(wth->fh);
138
139         return WTAP_FILE_PCAP;
140 }
141
142
143 static
144 int convert_dlt_to_wtap_encap(dlt)
145 {
146         int encap[] = {
147                 WTAP_ENCAP_NONE,
148                 WTAP_ENCAP_ETHERNET,
149                 WTAP_ENCAP_NONE,
150                 WTAP_ENCAP_NONE,
151                 WTAP_ENCAP_NONE,
152                 WTAP_ENCAP_NONE,
153                 WTAP_ENCAP_TR,
154                 WTAP_ENCAP_NONE,
155                 WTAP_ENCAP_SLIP,
156                 WTAP_ENCAP_PPP,
157                 WTAP_ENCAP_FDDI,
158                 WTAP_ENCAP_NONE,
159                 WTAP_ENCAP_RAW_IP,
160                 WTAP_ENCAP_NONE,
161                 WTAP_ENCAP_NONE,
162                 WTAP_ENCAP_NONE,
163                 WTAP_ENCAP_NONE
164         };
165
166         return encap[dlt];
167 }
168