summaryrefslogtreecommitdiffstats
path: root/substdi.c
diff options
context:
space:
mode:
authormanuel <manuel@mausz.at>2013-02-04 00:08:53 +0100
committermanuel <manuel@mausz.at>2013-02-04 00:08:53 +0100
commit69aec538b456402170dc723af417ba5c05389c32 (patch)
treee6f34c543f17c6392447ea337b2e2868212424d1 /substdi.c
downloadqmail-69aec538b456402170dc723af417ba5c05389c32.tar.gz
qmail-69aec538b456402170dc723af417ba5c05389c32.tar.bz2
qmail-69aec538b456402170dc723af417ba5c05389c32.zip
qmail 1.03 import
Diffstat (limited to 'substdi.c')
-rw-r--r--substdi.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/substdi.c b/substdi.c
new file mode 100644
index 0000000..42407a1
--- /dev/null
+++ b/substdi.c
@@ -0,0 +1,91 @@
1#include "substdio.h"
2#include "byte.h"
3#include "error.h"
4
5static int oneread(op,fd,buf,len)
6register int (*op)();
7register int fd;
8register char *buf;
9register int len;
10{
11 register int r;
12
13 for (;;) {
14 r = op(fd,buf,len);
15 if (r == -1) if (errno == error_intr) continue;
16 return r;
17 }
18}
19
20static int getthis(s,buf,len)
21register substdio *s;
22register char *buf;
23register int len;
24{
25 register int r;
26 register int q;
27
28 r = s->p;
29 q = r - len;
30 if (q > 0) { r = len; s->p = q; } else s->p = 0;
31 byte_copy(buf,r,s->x + s->n);
32 s->n += r;
33 return r;
34}
35
36int substdio_feed(s)
37register substdio *s;
38{
39 register int r;
40 register int q;
41
42 if (s->p) return s->p;
43 q = s->n;
44 r = oneread(s->op,s->fd,s->x,q);
45 if (r <= 0) return r;
46 s->p = r;
47 q -= r;
48 s->n = q;
49 if (q > 0) /* damn, gotta shift */ byte_copyr(s->x + q,r,s->x);
50 return r;
51}
52
53int substdio_bget(s,buf,len)
54register substdio *s;
55register char *buf;
56register int len;
57{
58 register int r;
59
60 if (s->p > 0) return getthis(s,buf,len);
61 r = s->n; if (r <= len) return oneread(s->op,s->fd,buf,r);
62 r = substdio_feed(s); if (r <= 0) return r;
63 return getthis(s,buf,len);
64}
65
66int substdio_get(s,buf,len)
67register substdio *s;
68register char *buf;
69register int len;
70{
71 register int r;
72
73 if (s->p > 0) return getthis(s,buf,len);
74 if (s->n <= len) return oneread(s->op,s->fd,buf,len);
75 r = substdio_feed(s); if (r <= 0) return r;
76 return getthis(s,buf,len);
77}
78
79char *substdio_peek(s)
80register substdio *s;
81{
82 return s->x + s->n;
83}
84
85void substdio_seek(s,len)
86register substdio *s;
87register int len;
88{
89 s->n += len;
90 s->p -= len;
91}