~ubuntu-branches/ubuntu/intrepid/djbdns/intrepid-security

« back to all changes in this revision

Viewing changes to buffer_get.c

  • Committer: Bazaar Package Importer
  • Author(s): Gerrit Pape
  • Date: 2008-03-02 23:22:04 UTC
  • Revision ID: james.westby@ubuntu.com-20080302232204-wa3owprcpeiyu8kj
Tags: upstream-1.05
ImportĀ upstreamĀ versionĀ 1.05

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "buffer.h"
 
2
#include "byte.h"
 
3
#include "error.h"
 
4
 
 
5
static int oneread(int (*op)(),int fd,char *buf,unsigned int len)
 
6
{
 
7
  int r;
 
8
 
 
9
  for (;;) {
 
10
    r = op(fd,buf,len);
 
11
    if (r == -1) if (errno == error_intr) continue;
 
12
    return r;
 
13
  }
 
14
}
 
15
 
 
16
static int getthis(buffer *s,char *buf,unsigned int len)
 
17
{
 
18
  if (len > s->p) len = s->p;
 
19
  s->p -= len;
 
20
  byte_copy(buf,len,s->x + s->n);
 
21
  s->n += len;
 
22
  return len;
 
23
}
 
24
 
 
25
int buffer_feed(buffer *s)
 
26
{
 
27
  int r;
 
28
 
 
29
  if (s->p) return s->p;
 
30
  r = oneread(s->op,s->fd,s->x,s->n);
 
31
  if (r <= 0) return r;
 
32
  s->p = r;
 
33
  s->n -= r;
 
34
  if (s->n > 0) byte_copyr(s->x + s->n,r,s->x);
 
35
  return r;
 
36
}
 
37
 
 
38
int buffer_bget(buffer *s,char *buf,unsigned int len)
 
39
{
 
40
  int r;
 
41
 
 
42
  if (s->p > 0) return getthis(s,buf,len);
 
43
  if (s->n <= len) return oneread(s->op,s->fd,buf,s->n);
 
44
  r = buffer_feed(s); if (r <= 0) return r;
 
45
  return getthis(s,buf,len);
 
46
}
 
47
 
 
48
int buffer_get(buffer *s,char *buf,unsigned int len)
 
49
{
 
50
  int r;
 
51
 
 
52
  if (s->p > 0) return getthis(s,buf,len);
 
53
  if (s->n <= len) return oneread(s->op,s->fd,buf,len);
 
54
  r = buffer_feed(s); if (r <= 0) return r;
 
55
  return getthis(s,buf,len);
 
56
}
 
57
 
 
58
char *buffer_peek(buffer *s)
 
59
{
 
60
  return s->x + s->n;
 
61
}
 
62
 
 
63
void buffer_seek(buffer *s,unsigned int len)
 
64
{
 
65
  s->n += len;
 
66
  s->p -= len;
 
67
}