s/qmail  3.3.23
Next generation secure email transport
substdo.c
Go to the documentation of this file.
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 
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 
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 */
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 
104 register substdio *s;
105 register char *buf;
106 {
107  return substdio_putflush(s,buf,str_len(buf));
108 }
int substdio_bputs(substdio *s, char *buf)
Definition: substdo.c:89
unsigned int str_len(char *)
void p(char *home, char *fifo, int uid, int gid, int mode)
Definition: install.c:39
int fd
Definition: idedit.c:16
void byte_copy(char *, unsigned int, char *)
int substdio_putflush(substdio *s, char *buf, int len)
Definition: substdo.c:80
int substdio_bput(substdio *s, char *buf, int len)
Definition: substdo.c:38
unsigned len
Definition: matchup.c:36
#define SUBSTDIO_OUTSIZE
Definition: substdio.h:34
int errno
int substdio_flush(substdio *s)
Definition: substdo.c:27
int error_intr
Definition: error.c:6
int substdio_putsflush(substdio *s, char *buf)
Definition: substdo.c:103
int substdio_put(substdio *s, char *buf, int len)
Definition: substdo.c:55
unsigned n
Definition: matchup.c:36
unsigned char * buf
Definition: dns.c:41
int substdio_puts(substdio *s, char *buf)
Definition: substdo.c:96