dsniff  2.4b2
About: A collection of tools for network auditing
  Fossies Dox: dsniff-2.4b2.tar.gz  ("inofficial" and yet experimental doxygen-generated source code documentation)  

buf.c
Go to the documentation of this file.
1 /*
2  * buf.c
3  *
4  * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
5  *
6  * $Id: buf.c,v 1.7 2001/03/15 08:32:59 dugsong Exp $
7  */
8 
9 #include "config.h"
10 
11 #include <sys/param.h>
12 #include <sys/types.h>
13 
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <stdarg.h>
17 #include <unistd.h>
18 #include <ctype.h>
19 #include <err.h>
20 
21 #include "buf.h"
22 
23 void
24 buf_init(buf_t buf, u_char *data, int len)
25 {
26  buf->base = data;
27  buf->end = buf->size = len;
28  buf->offset = 0;
29 }
30 
31 buf_t
32 buf_new(int size)
33 {
34  buf_t buf;
35 
36  if ((buf = malloc(sizeof(*buf))) == NULL)
37  return (NULL);
38 
39  if ((buf->base = malloc(size)) == NULL) {
40  free(buf);
41  return (NULL);
42  }
43  buf->size = size;
44  buf->offset = 0;
45  buf->end = 0;
46 
47  return (buf);
48 }
49 
50 void
52 {
53  if (buf->base != NULL) {
54  free(buf->base);
55  }
56  free(buf);
57 }
58 
59 int
60 buf_seek(buf_t buf, int off, int whence)
61 {
62  if ((whence == SEEK_SET) && (off <= buf->size)) {
63  buf->offset = off;
64  }
65  else if ((whence == SEEK_CUR) && ((buf->offset + off) <= buf->size)) {
66  buf->offset += off;
67  }
68  else return (-1);
69 
70  return (buf->offset);
71 }
72 
73 int
74 buf_get(buf_t buf, void *dst, int len)
75 {
76  u_char *p;
77  int i;
78 
79  p = dst;
80 
81  if (buf_len(buf) < len) {
82  return (-1);
83  }
84  for (i = 0; i < len; i++)
85  p[i] = buf->base[buf->offset + i];
86 
87  buf->offset += len;
88 
89  return (len);
90 }
91 
92 int
93 buf_put(buf_t buf, void *src, int len)
94 {
95  if (buf->offset + len > buf->size) {
96  return (-1);
97  }
98  memcpy(buf_ptr(buf), src, len);
99 
100  buf->offset += len;
101 
102  return (len);
103 }
104 
105 int
106 buf_putf(buf_t buf, const char *fmt, ...)
107 {
108  va_list ap;
109  int i;
110 
111  va_start(ap, fmt);
112  i = vsnprintf(buf_ptr(buf), buf_len(buf), fmt, ap);
113  va_end(ap);
114 
115  buf_skip(buf, i);
116 
117  return (i);
118 }
119 
120 void
122 {
123  buf->end = buf->offset;
124  buf->offset = 0;
125 }
126 
127 int
128 buf_index(buf_t buf, void *ptr, int len)
129 {
130  u_char *p, *q;
131 
132  p = buf_ptr(buf);
133  q = buf->base + buf->end;
134 
135  for (; q - p >= len; p++) {
136  if (memcmp(p, ptr, len) == 0)
137  return (p - buf_ptr(buf));
138  }
139  return (-1);
140 }
141 
142 int
143 buf_rindex(buf_t buf, void *ptr, int len)
144 {
145  u_char *p, *q;
146 
147  p = buf->base + buf->end - len;
148  q = buf_ptr(buf);
149 
150  for (; p > q; p--) {
151  if (memcmp(p, ptr, len) == 0)
152  return (p - q);
153  }
154  return (-1);
155 }
156 
157 int
158 buf_cmp(buf_t buf, void *ptr, int len)
159 {
160  if (buf_len(buf) < len)
161  return (-1);
162 
163  return (memcmp(buf_ptr(buf), ptr, len));
164 }
165 
166 buf_t
167 buf_tok(buf_t buf, void *sep, int len)
168 {
169  static struct buf *savebuf, tokbuf;
170  int off;
171 
172  if (buf != NULL)
173  savebuf = buf;
174 
175  if (sep == NULL && buf_len(savebuf) >= len) {
176  tokbuf.base = buf_ptr(savebuf);
177  tokbuf.offset = 0;
178  tokbuf.size = tokbuf.end = len;
179  buf_skip(savebuf, len);
180  }
181  else if ((off = buf_index(savebuf, sep, len)) != -1) {
182  tokbuf.base = buf_ptr(savebuf);
183  tokbuf.offset = 0;
184  tokbuf.size = tokbuf.end = off;
185  buf_skip(savebuf, off + len);
186  }
187  else if (buf_len(savebuf) > 0) {
188  tokbuf.base = buf_ptr(savebuf);
189  tokbuf.offset = 0;
190  tokbuf.size = tokbuf.end = buf_len(savebuf);
191  savebuf->offset = savebuf->end;
192  }
193  else return (NULL);
194 
195  return (&tokbuf);
196 }
197 
198 buf_t
199 buf_getbuf(buf_t buf, int offset, int len)
200 {
201  buf_t b;
202 
203  if (buf->offset + offset + len > buf->end)
204  return (NULL);
205 
206  buf_skip(buf, offset);
207 
208  if ((b = buf_new(len)) != NULL) {
209  buf_put(b, buf_ptr(buf), len);
210  buf_end(b);
211  }
212  buf_skip(buf, len);
213 
214  return (b);
215 }
216 
217 buf_t
218 buf_getword(buf_t buf, void *sep, int len)
219 {
220  buf_t b;
221  int off;
222 
223  if ((off = buf_index(buf, sep, len)) < 0)
224  return (NULL);
225 
226  if ((b = buf_new(off)) != NULL) {
227  buf_put(b, buf_ptr(buf), off);
228  buf_end(b);
229  buf_skip(buf, off + len);
230  }
231  return (b);
232 }
233 
234 char *
236 {
237  char *p;
238  int i;
239 
240  i = buf_len(buf);
241 
242  if ((p = malloc(i + 1)) == NULL)
243  err(1, "malloc");
244 
245  memcpy(p, buf_ptr(buf), i);
246 
247  p[i] = '\0';
248 
249  return (p);
250 }
251 
252 int
254 {
255  u_char *p, *q;
256 
257  p = buf_ptr(buf);
258  q = buf->base + buf->end;
259 
260  for (; p < q; p++)
261  if (!isascii(*p)) return (0);
262 
263  return (1);
264 }
buf_putf
int buf_putf(buf_t buf, const char *fmt,...)
Definition: buf.c:106
buf_isascii
int buf_isascii(buf_t buf)
Definition: buf.c:253
buf_getbuf
buf_t buf_getbuf(buf_t buf, int offset, int len)
Definition: buf.c:199
buf::size
int size
Definition: buf.h:16
buf_init
void buf_init(buf_t buf, u_char *data, int len)
Definition: buf.c:24
buf::offset
int offset
Definition: buf.h:17
buf_end
void buf_end(buf_t buf)
Definition: buf.c:121
buf::base
u_char * base
Definition: buf.h:15
buf
static u_char buf[BUFSIZ]
Definition: filenamesnarf.c:29
buf_put
int buf_put(buf_t buf, void *src, int len)
Definition: buf.c:93
buf.h
buf_strdup
char * buf_strdup(buf_t buf)
Definition: buf.c:235
buf_getword
buf_t buf_getword(buf_t buf, void *sep, int len)
Definition: buf.c:218
err.h
buf
Definition: buf.h:14
err
void err(int eval, const char *fmt,...)
Definition: err.c:47
buf_get
int buf_get(buf_t buf, void *dst, int len)
Definition: buf.c:74
buf_tok
buf_t buf_tok(buf_t buf, void *sep, int len)
Definition: buf.c:167
buf_ptr
#define buf_ptr(b)
Definition: buf.h:31
buf_cmp
int buf_cmp(buf_t buf, void *ptr, int len)
Definition: buf.c:158
buf_new
buf_t buf_new(int size)
Definition: buf.c:32
memcmp
int memcmp(void *s1, void *s2, size_t n) const
Definition: memcmp.c:44
buf_skip
#define buf_skip(b, l)
Definition: buf.h:47
buf::end
int end
Definition: buf.h:18
config.h
buf_seek
int buf_seek(buf_t buf, int off, int whence)
Definition: buf.c:60
buf_rindex
int buf_rindex(buf_t buf, void *ptr, int len)
Definition: buf.c:143
buf_len
#define buf_len(b)
Definition: buf.h:34
buf_index
int buf_index(buf_t buf, void *ptr, int len)
Definition: buf.c:128
buf_free
void buf_free(buf_t buf)
Definition: buf.c:51