~ubuntu-branches/ubuntu/wily/freerdp/wily-proposed

« back to all changes in this revision

Viewing changes to libfreerdp-utils/pcap.c

  • Committer: Package Import Robot
  • Author(s): Martin Pitt, Jeremy Bicha, Jean-Louis Dupond, Martin Pitt
  • Date: 2012-01-31 10:02:14 UTC
  • mfrom: (1.1.6)
  • Revision ID: package-import@ubuntu.com-20120131100214-jaok3uwvni7sqxth
Tags: 1.0.0-0git1
Upload current Debian packaging git to get this rolling for precise.

[ Jeremy Bicha ]
* New upstream release. Closes: #647498.
* Updated symbols and bumped soname
* debian/control:
  - Added new build dependencies
  - Bump Standards-Version to 3.9.2
* debian/source/format: Set to 3.0 (quilt)
* debian/rules: Turn on strict symbols checking
* debian/watch: Watch github

[ Jean-Louis Dupond ]
* debian/control: Updated homepage
* debian/copyright: Reflect upstream switch to the Apache license

[ Martin Pitt ]
* debian/libfreerdp0.symbols: Fix version number, should
  be 1.0~beta5, not 1.0-beta5.
* debian/control: Add libavcodec-dev build dependency, upstream build system
  checks for that. Thanks Jean-Louis Dupond!

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/**
 
2
 * FreeRDP: A Remote Desktop Protocol Client
 
3
 * pcap File Format Utils
 
4
 *
 
5
 * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
 
6
 *
 
7
 * Licensed under the Apache License, Version 2.0 (the "License");
 
8
 * you may not use this file except in compliance with the License.
 
9
 * You may obtain a copy of the License at
 
10
 *
 
11
 *     http://www.apache.org/licenses/LICENSE-2.0
 
12
 *
 
13
 * Unless required by applicable law or agreed to in writing, software
 
14
 * distributed under the License is distributed on an "AS IS" BASIS,
 
15
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
16
 * See the License for the specific language governing permissions and
 
17
 * limitations under the License.
 
18
 */
 
19
 
 
20
#include <stdio.h>
 
21
#include <string.h>
 
22
 
 
23
#ifndef _WIN32
 
24
#include <sys/time.h>
 
25
#else
 
26
#include <time.h>
 
27
#include <sys/timeb.h>
 
28
 
 
29
struct timeval
 
30
{
 
31
        long tv_sec;
 
32
        long tv_usec;
 
33
};
 
34
 
 
35
int gettimeofday(struct timeval* tp, void* tz)
 
36
{
 
37
        struct _timeb timebuffer;
 
38
        _ftime (&timebuffer);
 
39
        tp->tv_sec = (long) timebuffer.time;
 
40
        tp->tv_usec = timebuffer.millitm * 1000;
 
41
        return 0;
 
42
}
 
43
#endif
 
44
 
 
45
#include <freerdp/types.h>
 
46
#include <freerdp/utils/memory.h>
 
47
 
 
48
#include <freerdp/utils/pcap.h>
 
49
 
 
50
#define PCAP_MAGIC      0xA1B2C3D4
 
51
 
 
52
void pcap_read_header(rdpPcap* pcap, pcap_header* header)
 
53
{
 
54
        fread((void*) header, sizeof(pcap_header), 1, pcap->fp);
 
55
}
 
56
 
 
57
void pcap_write_header(rdpPcap* pcap, pcap_header* header)
 
58
{
 
59
        fwrite((void*) header, sizeof(pcap_header), 1, pcap->fp);
 
60
}
 
61
 
 
62
void pcap_read_record_header(rdpPcap* pcap, pcap_record_header* record)
 
63
{
 
64
        fread((void*) record, sizeof(pcap_record_header), 1, pcap->fp);
 
65
}
 
66
 
 
67
void pcap_write_record_header(rdpPcap* pcap, pcap_record_header* record)
 
68
{
 
69
        fwrite((void*) record, sizeof(pcap_record_header), 1, pcap->fp);
 
70
}
 
71
 
 
72
void pcap_read_record(rdpPcap* pcap, pcap_record* record)
 
73
{
 
74
        pcap_read_record_header(pcap, &record->header);
 
75
        record->length = record->header.incl_len;
 
76
        record->data = xmalloc(record->length);
 
77
        fread(record->data, record->length, 1, pcap->fp);
 
78
}
 
79
 
 
80
void pcap_write_record(rdpPcap* pcap, pcap_record* record)
 
81
{
 
82
        pcap_write_record_header(pcap, &record->header);
 
83
        fwrite(record->data, record->length, 1, pcap->fp);
 
84
}
 
85
 
 
86
void pcap_add_record(rdpPcap* pcap, void* data, uint32 length)
 
87
{
 
88
        pcap_record* record;
 
89
        struct timeval tp;
 
90
 
 
91
        if (pcap->tail == NULL)
 
92
        {
 
93
                pcap->tail = (pcap_record*) xzalloc(sizeof(pcap_record));
 
94
                pcap->head = pcap->tail;
 
95
                pcap->record = pcap->head;
 
96
                record = pcap->tail;
 
97
        }
 
98
        else
 
99
        {
 
100
                record = (pcap_record*) xzalloc(sizeof(pcap_record));
 
101
                pcap->tail->next = record;
 
102
                pcap->tail = record;
 
103
        }
 
104
 
 
105
        if (pcap->record == NULL)
 
106
                pcap->record = record;
 
107
 
 
108
        record->data = data;
 
109
        record->length = length;
 
110
        record->header.incl_len = length;
 
111
        record->header.orig_len = length;
 
112
 
 
113
        gettimeofday(&tp, 0);
 
114
        record->header.ts_sec = tp.tv_sec;
 
115
        record->header.ts_usec = tp.tv_usec;
 
116
}
 
117
 
 
118
boolean pcap_has_next_record(rdpPcap* pcap)
 
119
{
 
120
        if (pcap->file_size - (ftell(pcap->fp)) <= 16)
 
121
                return false;
 
122
 
 
123
        return true;
 
124
}
 
125
 
 
126
boolean pcap_get_next_record_header(rdpPcap* pcap, pcap_record* record)
 
127
{
 
128
        if (pcap_has_next_record(pcap) != true)
 
129
                return false;
 
130
 
 
131
        pcap_read_record_header(pcap, &record->header);
 
132
        record->length = record->header.incl_len;
 
133
        record->data = xmalloc(record->length);
 
134
 
 
135
        return true;
 
136
}
 
137
 
 
138
boolean pcap_get_next_record_content(rdpPcap* pcap, pcap_record* record)
 
139
{
 
140
        fread(record->data, record->length, 1, pcap->fp);
 
141
        return true;
 
142
}
 
143
 
 
144
boolean pcap_get_next_record(rdpPcap* pcap, pcap_record* record)
 
145
{
 
146
        if (pcap_has_next_record(pcap) != true)
 
147
                return false;
 
148
 
 
149
        pcap_read_record(pcap, record);
 
150
 
 
151
        return true;
 
152
}
 
153
 
 
154
rdpPcap* pcap_open(char* name, boolean write)
 
155
{
 
156
        rdpPcap* pcap;
 
157
 
 
158
        FILE *pcap_fp = fopen(name, write ? "w+" : "r");
 
159
        if (pcap_fp == NULL)
 
160
        {
 
161
                perror("opening pcap dump");
 
162
                return NULL;
 
163
        }
 
164
 
 
165
        pcap = (rdpPcap*) xzalloc(sizeof(rdpPcap));
 
166
 
 
167
        if (pcap != NULL)
 
168
        {
 
169
                pcap->name = name;
 
170
                pcap->write = write;
 
171
                pcap->record_count = 0;
 
172
                pcap->fp = pcap_fp;
 
173
 
 
174
                if (write)
 
175
                {
 
176
                        pcap->header.magic_number = 0xA1B2C3D4;
 
177
                        pcap->header.version_major = 2;
 
178
                        pcap->header.version_minor = 4;
 
179
                        pcap->header.thiszone = 0;
 
180
                        pcap->header.sigfigs = 0;
 
181
                        pcap->header.snaplen = 0xFFFFFFFF;
 
182
                        pcap->header.network = 0;
 
183
                        pcap_write_header(pcap, &pcap->header);
 
184
                }
 
185
                else
 
186
                {
 
187
                        fseek(pcap->fp, 0, SEEK_END);
 
188
                        pcap->file_size = (int) ftell(pcap->fp);
 
189
                        fseek(pcap->fp, 0, SEEK_SET);
 
190
                        pcap_read_header(pcap, &pcap->header);
 
191
                }
 
192
        }
 
193
 
 
194
        return pcap;
 
195
}
 
196
 
 
197
void pcap_flush(rdpPcap* pcap)
 
198
{
 
199
        while (pcap->record != NULL)
 
200
        {
 
201
                pcap_write_record(pcap, pcap->record);
 
202
                pcap->record = pcap->record->next;
 
203
        }
 
204
 
 
205
        if (pcap->fp != NULL)
 
206
                fflush(pcap->fp);
 
207
}
 
208
 
 
209
void pcap_close(rdpPcap* pcap)
 
210
{
 
211
        pcap_flush(pcap);
 
212
 
 
213
        if (pcap->fp != NULL)
 
214
                fclose(pcap->fp);
 
215
}