chiark / gitweb /
Merge branches 'idx/verh' and 'idx/qmqpc'
[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 }