debian/rules: Use `git' potty wrapper.
[qmail] / substdo.c
1 #include "substdio.h"
2 #include "str.h"
3 #include "byte.h"
4 #include "error.h"
5
6 static int allwrite(op,fd,buf,len)
7 register int (*op)();
8 register int fd;
9 register char *buf;
10 register 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
27 int substdio_flush(s)
28 register 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
38 int substdio_bput(s,buf,len)
39 register substdio *s;
40 register char *buf;
41 register 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
55 int substdio_put(s,buf,len)
56 register substdio *s;
57 register char *buf;
58 register 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
80 int substdio_putflush(s,buf,len)
81 register substdio *s;
82 register char *buf;
83 register int len;
84 {
85 if (substdio_flush(s) == -1) return -1;
86 return allwrite(s->op,s->fd,buf,len);
87 }
88
89 int substdio_bputs(s,buf)
90 register substdio *s;
91 register char *buf;
92 {
93 return substdio_bput(s,buf,str_len(buf));
94 }
95
96 int substdio_puts(s,buf)
97 register substdio *s;
98 register char *buf;
99 {
100 return substdio_put(s,buf,str_len(buf));
101 }
102
103 int substdio_putsflush(s,buf)
104 register substdio *s;
105 register char *buf;
106 {
107 return substdio_putflush(s,buf,str_len(buf));
108 }