debian/rules: Use `git' potty wrapper.
[qmail] / substdo.c
... / ...
CommitLineData
1#include "substdio.h"
2#include "str.h"
3#include "byte.h"
4#include "error.h"
5
6static int allwrite(op,fd,buf,len)
7register int (*op)();
8register int fd;
9register char *buf;
10register int len;
11{
12 register int w;
13
14 while (len) {
15 w = op(fd,buf,len);
16 if (w == -1) {
17 if (errno == error_intr) continue;
18 return -1; /* note that some data may have been written */
19 }
20 if (w == 0) ; /* luser's fault */
21 buf += w;
22 len -= w;
23 }
24 return 0;
25}
26
27int substdio_flush(s)
28register substdio *s;
29{
30 register int p;
31
32 p = s->p;
33 if (!p) return 0;
34 s->p = 0;
35 return allwrite(s->op,s->fd,s->x,p);
36}
37
38int substdio_bput(s,buf,len)
39register substdio *s;
40register char *buf;
41register int len;
42{
43 register int n;
44
45 while (len > (n = s->n - s->p)) {
46 byte_copy(s->x + s->p,n,buf); s->p += n; buf += n; len -= n;
47 if (substdio_flush(s) == -1) return -1;
48 }
49 /* now len <= s->n - s->p */
50 byte_copy(s->x + s->p,len,buf);
51 s->p += len;
52 return 0;
53}
54
55int substdio_put(s,buf,len)
56register substdio *s;
57register char *buf;
58register int len;
59{
60 register int n;
61
62 n = s->n;
63 if (len > n - s->p) {
64 if (substdio_flush(s) == -1) return -1;
65 /* now s->p == 0 */
66 if (n < SUBSTDIO_OUTSIZE) n = SUBSTDIO_OUTSIZE;
67 while (len > s->n) {
68 if (n > len) n = len;
69 if (allwrite(s->op,s->fd,buf,n) == -1) return -1;
70 buf += n;
71 len -= n;
72 }
73 }
74 /* now len <= s->n - s->p */
75 byte_copy(s->x + s->p,len,buf);
76 s->p += len;
77 return 0;
78}
79
80int substdio_putflush(s,buf,len)
81register substdio *s;
82register char *buf;
83register int len;
84{
85 if (substdio_flush(s) == -1) return -1;
86 return allwrite(s->op,s->fd,buf,len);
87}
88
89int substdio_bputs(s,buf)
90register substdio *s;
91register char *buf;
92{
93 return substdio_bput(s,buf,str_len(buf));
94}
95
96int substdio_puts(s,buf)
97register substdio *s;
98register char *buf;
99{
100 return substdio_put(s,buf,str_len(buf));
101}
102
103int substdio_putsflush(s,buf)
104register substdio *s;
105register char *buf;
106{
107 return substdio_putflush(s,buf,str_len(buf));
108}