annotate mcabber/connwrap/connwrap.c @ 830:80434fde7cfa

Display presence notification timestamps when they exist These timestamps were used in the roster, but not in the buffer window message nor in the history logfile. Reported by "ze".
author Mikael Berthe <mikael@lilotux.net>
date Wed, 03 May 2006 11:28:41 +0200
parents 89aeb8fdd215
children 40175f3dcef7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1 #include "connwrap.h"
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2
302
8ca708a0d550 Remove compilation warnings in connwrap library
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
3 #include <stdio.h>
8ca708a0d550 Remove compilation warnings in connwrap library
Mikael Berthe <mikael@lilotux.net>
parents: 235
diff changeset
4 #include <stdlib.h>
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
5 #include <netdb.h>
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
6 #include <string.h>
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
7 #include <netinet/in.h>
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
8 #include <errno.h>
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
9 #include <arpa/inet.h>
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
10 #include <fcntl.h>
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
11 #include <sys/time.h>
112
edb5591e2e64 [/trunk] Changeset 126 by mikael
mikael
parents: 25
diff changeset
12 #include <unistd.h>
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
13
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
14 #define PROXY_TIMEOUT 10
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
15 // HTTP proxy timeout in seconds (for the CONNECT method)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
16
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
17 #ifdef HAVE_OPENSSL
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
18
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
19 #define OPENSSL_NO_KRB5 1
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
20 #include <openssl/ssl.h>
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
21 #include <openssl/err.h>
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
22
134
e19ad58c3cad [/trunk] Changeset 147 by mikael
mikael
parents: 112
diff changeset
23 #else
e19ad58c3cad [/trunk] Changeset 147 by mikael
mikael
parents: 112
diff changeset
24 # ifdef HAVE_GNUTLS
e19ad58c3cad [/trunk] Changeset 147 by mikael
mikael
parents: 112
diff changeset
25 # include <gnutls/openssl.h>
e19ad58c3cad [/trunk] Changeset 147 by mikael
mikael
parents: 112
diff changeset
26 # define HAVE_OPENSSL
e19ad58c3cad [/trunk] Changeset 147 by mikael
mikael
parents: 112
diff changeset
27 # endif
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
28 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
29
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
30 static int in_http_connect = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
31
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
32 #ifdef HAVE_OPENSSL
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
33
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
34 static SSL_CTX *ctx = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
35
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
36 typedef struct { int fd; SSL *ssl; } sslsock;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
37
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
38 static sslsock *socks = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
39 static int sockcount = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
40
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
41 static sslsock *getsock(int fd) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
42 int i;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
43
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
44 for(i = 0; i < sockcount; i++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
45 if(socks[i].fd == fd)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
46 return &socks[i];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
47
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
48 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
49 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
50
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
51 static sslsock *addsock(int fd) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
52 sslsock *p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
53 socks = (sslsock *) realloc(socks, sizeof(sslsock)*++sockcount);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
54
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
55 p = &socks[sockcount-1];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
56
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
57 if(!ctx) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
58 SSL_library_init();
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
59 SSL_load_error_strings();
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
60
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
61 #ifdef HAVE_SSLEAY
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
62 SSLeay_add_all_algorithms();
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
63 #else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
64 OpenSSL_add_all_algorithms();
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
65 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
66
134
e19ad58c3cad [/trunk] Changeset 147 by mikael
mikael
parents: 112
diff changeset
67 //ctx = SSL_CTX_new(SSLv23_method());
e19ad58c3cad [/trunk] Changeset 147 by mikael
mikael
parents: 112
diff changeset
68 ctx = SSL_CTX_new(SSLv23_client_method());
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
69 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
70
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
71 p->ssl = SSL_new(ctx);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
72 SSL_set_fd(p->ssl, p->fd = fd);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
73
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
74 return p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
75 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
76
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
77 static void delsock(int fd) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
78 int i, nsockcount;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
79 sslsock *nsocks;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
80
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
81 nsockcount = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
82 nsocks = (sslsock *) malloc(sizeof(sslsock)*(sockcount-1));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
83
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
84 for(i = 0; i < sockcount; i++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
85 if(socks[i].fd != fd) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
86 nsocks[nsockcount++] = socks[i];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
87 } else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
88 SSL_free(socks[i].ssl);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
89 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
90 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
91
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
92 free(socks);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
93
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
94 socks = nsocks;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
95 sockcount = nsockcount;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
96 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
97
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
98 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
99
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
100 static char *bindaddr = 0, *proxyhost = 0, *proxyuser = 0, *proxypass = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
101 static int proxyport = 3128;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
102 static int proxy_ssl = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
103
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
104 #define SOCKOUT(s) write(sockfd, s, strlen(s))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
105
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
106 int cw_http_connect(int sockfd, const struct sockaddr *serv_addr, int addrlen) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
107 int err, pos, fl;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
108 struct hostent *server;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
109 struct sockaddr_in paddr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
110 char buf[512];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
111 fd_set rfds;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
112
400
e536ab271584 Kill a warning in the connwrap library
Mikael Berthe <mikael@lilotux.net>
parents: 302
diff changeset
113 fl = 0;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
114 err = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
115 in_http_connect = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
116
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
117 if(!(server = gethostbyname(proxyhost))) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
118 errno = h_errno;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
119 err = -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
120 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
121
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
122 if(!err) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
123 memset(&paddr, 0, sizeof(paddr));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
124 paddr.sin_family = AF_INET;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
125 memcpy(&paddr.sin_addr.s_addr, *server->h_addr_list, server->h_length);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
126 paddr.sin_port = htons(proxyport);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
127
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
128 fl = fcntl(sockfd, F_GETFL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
129 fcntl(sockfd, F_SETFL, fl & ~O_NONBLOCK);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
130
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
131 buf[0] = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
132
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
133 err = cw_connect(sockfd, (struct sockaddr *) &paddr, sizeof(paddr), proxy_ssl);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
134 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
135
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
136 errno = ECONNREFUSED;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
137
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
138 if(!err) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
139 struct sockaddr_in *sin = (struct sockaddr_in *) serv_addr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
140 char *ip = inet_ntoa(sin->sin_addr), c;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
141 struct timeval tv;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
142
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
143 sprintf(buf, "%d", ntohs(sin->sin_port));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
144 SOCKOUT("CONNECT ");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
145 SOCKOUT(ip);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
146 SOCKOUT(":");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
147 SOCKOUT(buf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
148 SOCKOUT(" HTTP/1.0\r\n");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
149
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
150 if(proxyuser) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
151 char *b;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
152 SOCKOUT("Proxy-Authorization: Basic ");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
153
427
ac85ce87f539 Fix buffer overflow in cw_setproxy()
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
154 snprintf(buf, sizeof(buf), "%s:%s", proxyuser, proxypass);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
155 b = cw_base64_encode(buf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
156 SOCKOUT(b);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
157 free(b);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
158
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
159 SOCKOUT("\r\n");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
160 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
161
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
162 SOCKOUT("\r\n");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
163
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
164 buf[0] = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
165
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
166 while(err != -1) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
167 FD_ZERO(&rfds);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
168 FD_SET(sockfd, &rfds);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
169
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
170 tv.tv_sec = PROXY_TIMEOUT;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
171 tv.tv_usec = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
172
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
173 err = select(sockfd+1, &rfds, 0, 0, &tv);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
174
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
175 if(err < 1) err = -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
176
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
177 if(err != -1 && FD_ISSET(sockfd, &rfds)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
178 err = read(sockfd, &c, 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
179 if(!err) err = -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
180
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
181 if(err != -1) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
182 pos = strlen(buf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
183 buf[pos] = c;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
184 buf[pos+1] = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
185
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
186 if(strlen(buf) > 4)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
187 if(!strcmp(buf+strlen(buf)-4, "\r\n\r\n"))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
188 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
189 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
190 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
191 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
192 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
193
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
194 if(err != -1 && strlen(buf)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
195 char *p = strstr(buf, " ");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
196
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
197 err = -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
198
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
199 if(p)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
200 if(atoi(++p) == 200)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
201 err = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
202
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
203 fcntl(sockfd, F_SETFL, fl);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
204 if(fl & O_NONBLOCK) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
205 errno = EINPROGRESS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
206 err = -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
207 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
208 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
209
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
210 in_http_connect = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
211
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
212 return err;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
213 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
214
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
215 int cw_connect(int sockfd, const struct sockaddr *serv_addr, int addrlen, int ssl) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
216 int rc;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
217 struct sockaddr_in ba;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
218
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
219 if(bindaddr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
220 if(strlen(bindaddr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
221 #ifdef HAVE_INET_ATON
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
222 struct in_addr addr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
223 rc = inet_aton(bindaddr, &addr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
224 ba.sin_addr.s_addr = addr.s_addr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
225 #else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
226 rc = inet_pton(AF_INET, bindaddr, &ba);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
227 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
228
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
229 if(rc) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
230 ba.sin_port = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
231 rc = bind(sockfd, (struct sockaddr *) &ba, sizeof(ba));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
232 } else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
233 rc = -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
234 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
235
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
236 if(rc) return rc;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
237 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
238
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
239 if(proxyhost && !in_http_connect) rc = cw_http_connect(sockfd, serv_addr, addrlen);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
240 else rc = connect(sockfd, serv_addr, addrlen);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
241
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
242 #ifdef HAVE_OPENSSL
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
243 if(ssl && !rc) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
244 sslsock *p = addsock(sockfd);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
245 if(SSL_connect(p->ssl) != 1)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
246 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
247 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
248 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
249
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
250 return rc;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
251 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
252
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
253 int cw_nb_connect(int sockfd, const struct sockaddr *serv_addr, int addrlen, int ssl, int *state) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
254 int rc = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
255 struct sockaddr_in ba;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
256
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
257 if(bindaddr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
258 if(strlen(bindaddr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
259 #ifdef HAVE_INET_ATON
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
260 struct in_addr addr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
261 rc = inet_aton(bindaddr, &addr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
262 ba.sin_addr.s_addr = addr.s_addr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
263 #else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
264 rc = inet_pton(AF_INET, bindaddr, &ba);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
265 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
266
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
267 if(rc) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
268 ba.sin_port = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
269 rc = bind(sockfd, (struct sockaddr *) &ba, sizeof(ba));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
270 } else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
271 rc = -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
272 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
273
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
274 if(rc) return rc;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
275 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
276
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
277 #ifdef HAVE_OPENSSL
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
278 if(ssl) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
279 if ( !(*state & CW_CONNECT_WANT_SOMETHING))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
280 rc = cw_connect(sockfd, serv_addr, addrlen, 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
281 else{ /* check if the socket is connected correctly */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
282 int optlen = sizeof(int), optval;
235
f7f07794d2df [/trunk] Changeset 248 by mikael
mikael
parents: 134
diff changeset
283 if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &optval, (socklen_t*)&optlen) || optval)
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
284 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
285 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
286
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
287 if(!rc) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
288 sslsock *p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
289 if (*state & CW_CONNECT_SSL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
290 p = getsock(sockfd);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
291 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
292 p = addsock(sockfd);
414
ec86d759ed54 Trailing whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 409
diff changeset
293
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
294 rc = SSL_connect(p->ssl);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
295 switch(rc){
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
296 case 1:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
297 *state = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
298 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
299 case 0:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
300 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
301 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
302 switch (SSL_get_error(p->ssl, rc)){
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
303 case SSL_ERROR_WANT_READ:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
304 *state = CW_CONNECT_SSL | CW_CONNECT_WANT_READ;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
305 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
306 case SSL_ERROR_WANT_WRITE:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
307 *state = CW_CONNECT_SSL | CW_CONNECT_WANT_WRITE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
308 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
309 default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
310 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
311 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
312 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
313 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
314 else{ /* catch EINPROGRESS error from the connect call */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
315 if (errno == EINPROGRESS){
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
316 *state = CW_CONNECT_STARTED | CW_CONNECT_WANT_WRITE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
317 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
318 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
319 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
320
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
321 return rc;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
322 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
323 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
324 if ( !(*state & CW_CONNECT_WANT_SOMETHING))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
325 rc = connect(sockfd, serv_addr, addrlen);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
326 else{ /* check if the socket is connected correctly */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
327 int optlen = sizeof(int), optval;
235
f7f07794d2df [/trunk] Changeset 248 by mikael
mikael
parents: 134
diff changeset
328 if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &optval, (socklen_t*)&optlen) || optval)
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
329 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
330 *state = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
331 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
332 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
333 if (rc)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
334 if (errno == EINPROGRESS){
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
335 *state = CW_CONNECT_STARTED | CW_CONNECT_WANT_WRITE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
336 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
337 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
338 return rc;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
339 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
340
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
341 int cw_accept(int s, struct sockaddr *addr, int *addrlen, int ssl) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
342 #ifdef HAVE_OPENSSL
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
343 int rc;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
344
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
345 if(ssl) {
235
f7f07794d2df [/trunk] Changeset 248 by mikael
mikael
parents: 134
diff changeset
346 rc = accept(s, addr, (socklen_t*)addrlen);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
347
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
348 if(!rc) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
349 sslsock *p = addsock(s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
350 if(SSL_accept(p->ssl) != 1)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
351 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
352
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
353 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
354
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
355 return rc;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
356 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
357 #endif
235
f7f07794d2df [/trunk] Changeset 248 by mikael
mikael
parents: 134
diff changeset
358 return accept(s, addr, (socklen_t*)addrlen);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
359 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
360
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
361 int cw_write(int fd, const void *buf, int count, int ssl) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
362 #ifdef HAVE_OPENSSL
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
363 sslsock *p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
364
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
365 if(ssl)
235
f7f07794d2df [/trunk] Changeset 248 by mikael
mikael
parents: 134
diff changeset
366 if((p = getsock(fd)) != NULL)
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
367 return SSL_write(p->ssl, buf, count);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
368 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
369 return write(fd, buf, count);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
370 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
371
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
372 int cw_read(int fd, void *buf, int count, int ssl) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
373 #ifdef HAVE_OPENSSL
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
374 sslsock *p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
375
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
376 if(ssl)
235
f7f07794d2df [/trunk] Changeset 248 by mikael
mikael
parents: 134
diff changeset
377 if((p = getsock(fd)) != NULL)
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
378 return SSL_read(p->ssl, buf, count);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
379 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
380 return read(fd, buf, count);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
381 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
382
235
f7f07794d2df [/trunk] Changeset 248 by mikael
mikael
parents: 134
diff changeset
383 void cw_close(int fd) {
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
384 #ifdef HAVE_OPENSSL
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
385 delsock(fd);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
386 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
387 close(fd);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
388 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
389
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
390 #define FREEVAR(v) if(v) free(v), v = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
391
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
392 void cw_setbind(const char *abindaddr) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
393 FREEVAR(bindaddr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
394 bindaddr = strdup(abindaddr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
395 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
396
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
397 void cw_setproxy(const char *aproxyhost, int aproxyport, const char *aproxyuser, const char *aproxypass) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
398 FREEVAR(proxyhost);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
399 FREEVAR(proxyuser);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
400 FREEVAR(proxypass);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
401
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
402 if(aproxyhost && strlen(aproxyhost)) proxyhost = strdup(aproxyhost);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
403 if(aproxyuser && strlen(aproxyuser)) proxyuser = strdup(aproxyuser);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
404 if(aproxypass && strlen(aproxypass)) proxypass = strdup(aproxypass);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
405 proxyport = aproxyport;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
406 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
407
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
408 char *cw_base64_encode(const char *in) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
409 static char base64digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._";
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
410
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
411 int j = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
412 int inlen = strlen(in);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
413 char *out = (char *) malloc(inlen*4+1), c;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
414
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
415 for(out[0] = 0; inlen >= 3; inlen -= 3) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
416 strncat(out, &base64digits[ in[j] >> 2 ], 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
417 strncat(out, &base64digits[ ((in[j] << 4) & 0x30) | (in[j+1] >> 4) ], 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
418 strncat(out, &base64digits[ ((in[j+1] << 2) & 0x3c) | (in[j+2] >> 6) ], 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
419 strncat(out, &base64digits[ in[j+2] & 0x3f ], 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
420 j += 3;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
421 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
422
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
423 if(inlen > 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
424 unsigned char fragment;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
425
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
426 strncat(out, &base64digits[in[j] >> 2], 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
427 fragment = (in[j] << 4) & 0x30;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
428
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
429 if(inlen > 1)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
430 fragment |= in[j+1] >> 4;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
431
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
432 strncat(out, &base64digits[fragment], 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
433
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
434 c = (inlen < 2) ? '-' : base64digits[ (in[j+1] << 2) & 0x3c ];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
435 strncat(out, &c, 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
436 c = '-';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
437 strncat(out, &c, 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
438 }
414
ec86d759ed54 Trailing whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 409
diff changeset
439
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
440 return out;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
441 }