ucspi-ssl  0.99e
TLS encryption for IPv6 communication
remoteinfo6.c
Go to the documentation of this file.
1 #include <unistd.h>
2 #include "fmt.h"
3 #include "buffer.h"
4 #include "socket.h"
5 #include "error.h"
6 #include "iopause.h"
7 #include "timeoutconn.h"
8 #include "remoteinfo.h"
9 
10 static struct taia now;
11 static struct taia deadline;
12 
13 static int mywrite(int fd,char *buf,int len)
14 {
15  iopause_fd x;
16 
17  x.fd = fd;
18  x.events = IOPAUSE_WRITE;
19  for (;;) {
20  taia_now(&now);
21  iopause(&x,1,&deadline,&now);
22  if (x.revents) break;
23  if (taia_less(&deadline,&now)) {
24  errno = error_timeout;
25  return -1;
26  }
27  }
28  return write(fd,buf,len);
29 }
30 
31 static int myread(int fd,char *buf,int len)
32 {
33  iopause_fd x;
34 
35  x.fd = fd;
36  x.events = IOPAUSE_READ;
37  for (;;) {
38  taia_now(&now);
39  iopause(&x,1,&deadline,&now);
40  if (x.revents) break;
41  if (taia_less(&deadline,&now)) {
42  errno = error_timeout;
43  return -1;
44  }
45  }
46  return read(fd,buf,len);
47 }
48 
49 static int doit(stralloc *out,int s,char ipremote[16],uint16 portremote,char iplocal[16],uint16 portlocal,unsigned int timeout,uint32 netif)
50 {
51  buffer b;
52  char bspace[128];
53  char strnum[FMT_ULONG];
54  int numcolons;
55  char ch;
56 
57  if (socket_bind6(s,iplocal,0,netif) == -1) return -1;
58  if (timeoutconn6(s,ipremote,113,timeout,netif) == -1) return -1;
59 
60  buffer_init(&b,mywrite,s,bspace,sizeof bspace);
61  buffer_put(&b,strnum,fmt_ulong(strnum,portremote));
62  buffer_put(&b," , ",3);
63  buffer_put(&b,strnum,fmt_ulong(strnum,portlocal));
64  buffer_put(&b,"\r\n",2);
65  if (buffer_flush(&b) == -1) return -1;
66 
67  buffer_init(&b,myread,s,bspace,sizeof bspace);
68  numcolons = 0;
69  for (;;) {
70  if (buffer_get(&b,&ch,1) != 1) return -1;
71  if ((ch == ' ') || (ch == '\t') || (ch == '\r')) continue;
72  if (ch == '\n') return 0;
73  if (numcolons < 3) {
74  if (ch == ':') ++numcolons;
75  }
76  else {
77  if (!stralloc_append(out,&ch)) return -1;
78  if (out->len > 256) return 0;
79  }
80  }
81 }
82 
83 int remoteinfo6(stralloc *out,char ipremote[16],uint16 portremote,char iplocal[16],uint16 portlocal,unsigned int timeout,uint32 netif)
84 {
85  int s;
86  int r;
87 
88  if (!stralloc_copys(out,"")) return -1;
89 
90  taia_now(&now);
91  taia_uint(&deadline,timeout);
92  taia_add(&deadline,&now,&deadline);
93 
94  s = socket_tcp6();
95  if (s == -1) return -1;
96  r = doit(out,s,ipremote,portremote,iplocal,portlocal,timeout,netif);
97  close(s);
98  return r;
99 }
Definition: taia.h:8
char iplocal[16]
Definition: sslclient.c:86
int iopause(iopause_fd *x, unsigned int len, struct taia *deadline, struct taia *stamp)
Definition: iopause.c:7
unsigned int fmt_ulong(char *, unsigned long)
char buf[SSL_NAME_LEN]
Definition: sslhandle.c:125
char strnum[FMT_ULONG]
Definition: ip4_bit.c:11
void buffer_init(buffer *s, int(*op)(), int fd, char *buf, unsigned int len)
Definition: buffer.c:5
int buffer_put(buffer *, const char *, unsigned int)
Definition: buffer_put.c:49
int remoteinfo6(stralloc *out, char ipremote[16], uint16 portremote, char iplocal[16], uint16 portlocal, unsigned int timeout, uint32 netif)
Definition: remoteinfo6.c:83
int socket_bind6(int s, const char *ip, uint16 port, uint32 scope_id)
int stralloc_append(stralloc *, const char *)
int taia_now(struct taia *)
Definition: taia_now.c:8
int taia_less(const struct taia *, const struct taia *)
Definition: taia_less.c:7
uint16 portlocal
Definition: sslclient.c:87
uint16 portremote
Definition: sslclient.c:91
#define FMT_ULONG
Definition: fmt.h:6
void taia_add(struct taia *, const struct taia *, const struct taia *)
Definition: taia_add.c:7
uint32 netif
Definition: sslclient.c:84
void taia_uint(struct taia *, unsigned int)
Definition: taia_uint.c:7
Definition: buffer.h:6
buffer b
Definition: auto-str.c:5
int buffer_get(buffer *, char *, unsigned int)
Definition: buffer_get.c:50
char bspace[256]
Definition: auto-str.c:4
int socket_tcp6(void)
Definition: socket_tcp6.c:18
unsigned short uint16
Definition: uint16.h:4
int stralloc_copys(stralloc *, const char *)
Definition: stralloc_opys.c:7
int error_timeout
Definition: error.c:50
int timeoutconn6(int, char *, uint16, unsigned int, uint32)
int buffer_flush(buffer *)
Definition: buffer_put.c:25
char ipremote[16]
Definition: sslclient.c:90
unsigned long timeout
Definition: sslhandle.c:67