ucspi-ssl  0.99e
TLS encryption for IPv6 communication
buffer_put.c
Go to the documentation of this file.
1 /* Public domain. */
2 
3 #include "buffer.h"
4 #include "str.h"
5 #include "byte.h"
6 #include "error.h"
7 
8 static int allwrite(int (*op)(),int fd,const char *buf,unsigned int len)
9 {
10  int w;
11 
12  while (len) {
13  w = op(fd,buf,len);
14  if (w == -1) {
15  if (errno == error_intr) continue;
16  return -1; /* note that some data may have been written */
17  }
18  if (w == 0) ; /* luser's fault */
19  buf += w;
20  len -= w;
21  }
22  return 0;
23 }
24 
26 {
27  int p;
28 
29  p = s->p;
30  if (!p) return 0;
31  s->p = 0;
32  return allwrite(s->op,s->fd,s->x,p);
33 }
34 
35 int buffer_putalign(buffer *s,const char *buf,unsigned int len)
36 {
37  unsigned int n;
38 
39  while (len > (n = s->n - s->p)) {
40  byte_copy(s->x + s->p,n,buf); s->p += n; buf += n; len -= n;
41  if (buffer_flush(s) == -1) return -1;
42  }
43  /* now len <= s->n - s->p */
44  byte_copy(s->x + s->p,len,buf);
45  s->p += len;
46  return 0;
47 }
48 
49 int buffer_put(buffer *s,const char *buf,unsigned int len)
50 {
51  unsigned int n;
52 
53  n = s->n;
54  if (len > n - s->p) {
55  if (buffer_flush(s) == -1) return -1;
56  /* now s->p == 0 */
57  if (n < BUFFER_OUTSIZE) n = BUFFER_OUTSIZE;
58  while (len > s->n) {
59  if (n > len) n = len;
60  if (allwrite(s->op,s->fd,buf,n) == -1) return -1;
61  buf += n;
62  len -= n;
63  }
64  }
65  /* now len <= s->n - s->p */
66  byte_copy(s->x + s->p,len,buf);
67  s->p += len;
68  return 0;
69 }
70 
71 int buffer_putflush(buffer *s,const char *buf,unsigned int len)
72 {
73  if (buffer_flush(s) == -1) return -1;
74  return allwrite(s->op,s->fd,buf,len);
75 }
76 
77 int buffer_putsalign(buffer *s,const char *buf)
78 {
79  return buffer_putalign(s,buf,str_len(buf));
80 }
81 
82 int buffer_puts(buffer *s,const char *buf)
83 {
84  return buffer_put(s,buf,str_len(buf));
85 }
86 
87 int buffer_putsflush(buffer *s,const char *buf)
88 {
89  return buffer_putflush(s,buf,str_len(buf));
90 }
void byte_copy(void *, unsigned int, const void *)
char buf[SSL_NAME_LEN]
Definition: sslhandle.c:125
int buffer_putsalign(buffer *s, const char *buf)
Definition: buffer_put.c:77
int buffer_puts(buffer *s, const char *buf)
Definition: buffer_put.c:82
unsigned int p
Definition: buffer.h:8
int buffer_putalign(buffer *s, const char *buf, unsigned int len)
Definition: buffer_put.c:35
int buffer_put(buffer *s, const char *buf, unsigned int len)
Definition: buffer_put.c:49
int(* op)()
Definition: buffer.h:11
char * x
Definition: buffer.h:7
int error_intr
Definition: error.c:8
int fd
Definition: buffer.h:10
unsigned int str_len(const char *)
Definition: str_len.c:5
int buffer_putsflush(buffer *s, const char *buf)
Definition: buffer_put.c:87
Definition: buffer.h:6
int buffer_flush(buffer *s)
Definition: buffer_put.c:25
int buffer_putflush(buffer *s, const char *buf, unsigned int len)
Definition: buffer_put.c:71
#define BUFFER_OUTSIZE
Definition: buffer.h:16
unsigned int n
Definition: buffer.h:9