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