summaryrefslogtreecommitdiffabout
path: root/kmicromail/libetpan/tools/mailstream_socket.c
Unidiff
Diffstat (limited to 'kmicromail/libetpan/tools/mailstream_socket.c') (more/less context) (ignore whitespace changes)
-rw-r--r--kmicromail/libetpan/tools/mailstream_socket.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/kmicromail/libetpan/tools/mailstream_socket.c b/kmicromail/libetpan/tools/mailstream_socket.c
index 29e50e1..04a6f48 100644
--- a/kmicromail/libetpan/tools/mailstream_socket.c
+++ b/kmicromail/libetpan/tools/mailstream_socket.c
@@ -124,116 +124,123 @@ static int mailstream_low_socket_close(mailstream_low * s)
124 struct mailstream_socket_data * socket_data; 124 struct mailstream_socket_data * socket_data;
125 125
126 socket_data = (struct mailstream_socket_data *) s->data; 126 socket_data = (struct mailstream_socket_data *) s->data;
127 socket_data_close(socket_data); 127 socket_data_close(socket_data);
128 128
129 return 0; 129 return 0;
130} 130}
131 131
132static void mailstream_low_socket_free(mailstream_low * s) 132static void mailstream_low_socket_free(mailstream_low * s)
133{ 133{
134 struct mailstream_socket_data * socket_data; 134 struct mailstream_socket_data * socket_data;
135 135
136 socket_data = (struct mailstream_socket_data *) s->data; 136 socket_data = (struct mailstream_socket_data *) s->data;
137 socket_data_free(socket_data); 137 socket_data_free(socket_data);
138 s->data = NULL; 138 s->data = NULL;
139 139
140 free(s); 140 free(s);
141} 141}
142 142
143static int mailstream_low_socket_get_fd(mailstream_low * s) 143static int mailstream_low_socket_get_fd(mailstream_low * s)
144{ 144{
145 struct mailstream_socket_data * socket_data; 145 struct mailstream_socket_data * socket_data;
146 146
147 socket_data = (struct mailstream_socket_data *) s->data; 147 socket_data = (struct mailstream_socket_data *) s->data;
148 return socket_data->fd; 148 return socket_data->fd;
149} 149}
150 150
151 151
152static ssize_t mailstream_low_socket_read(mailstream_low * s, 152static ssize_t mailstream_low_socket_read(mailstream_low * s,
153 void * buf, size_t count) 153 void * buf, size_t count)
154{ 154{
155 struct mailstream_socket_data * socket_data; 155 struct mailstream_socket_data * socket_data;
156 156
157 socket_data = (struct mailstream_socket_data *) s->data; 157 socket_data = (struct mailstream_socket_data *) s->data;
158 158
159 /* timeout */ 159 /* timeout */
160 { 160 {
161 fd_set fds_read; 161 fd_set fds_read;
162 fd_set fds_excp; 162 fd_set fds_excp;
163 struct timeval timeout; 163 struct timeval timeout;
164 int r; 164 int r;
165 165
166 timeout = mailstream_network_delay; 166 timeout = mailstream_network_delay;
167 167
168 FD_ZERO(&fds_read); 168 FD_ZERO(&fds_read);
169 FD_SET(socket_data->fd, &fds_read); 169 FD_SET(socket_data->fd, &fds_read);
170 FD_ZERO(&fds_excp); 170 FD_ZERO(&fds_excp);
171 FD_SET(socket_data->fd, &fds_excp); 171 FD_SET(socket_data->fd, &fds_excp);
172 // LUTZ for safety I insert here a max val as well
173 if ( timeout.tv_sec > DEFAULT_NETWORK_TIMEOUT )
174 timeout.tv_sec = DEFAULT_NETWORK_TIMEOUT;
172 r = select(socket_data->fd + 1, &fds_read, NULL, &fds_excp, &timeout); 175 r = select(socket_data->fd + 1, &fds_read, NULL, &fds_excp, &timeout);
173 if (r == 0) 176 if (r < 1 )
174 return -1; 177 return -1;
175 if (FD_ISSET(socket_data->fd, &fds_excp)) 178 if (FD_ISSET(socket_data->fd, &fds_excp))
176 return -1; 179 return -1;
177 if (!FD_ISSET(socket_data->fd, &fds_read)) 180 if (!FD_ISSET(socket_data->fd, &fds_read))
178 return 0; 181 return 0;
179 } 182 }
180 return recv(socket_data->fd,buf,count,MSG_NOSIGNAL); 183 return recv(socket_data->fd,buf,count,MSG_NOSIGNAL);
181 //return read(socket_data->fd, buf, count); 184 //return read(socket_data->fd, buf, count);
182} 185}
183 186#include <stdio.h>
184static ssize_t mailstream_low_socket_write(mailstream_low * s, 187static ssize_t mailstream_low_socket_write(mailstream_low * s,
185 const void * buf, size_t count) 188 const void * buf, size_t count)
186{ 189{
187 struct mailstream_socket_data * socket_data; 190 struct mailstream_socket_data * socket_data;
188 191
189 socket_data = (struct mailstream_socket_data *) s->data; 192 socket_data = (struct mailstream_socket_data *) s->data;
190 /* timeout */ 193 /* timeout */
191 { 194 {
192 fd_set fds_write; 195 fd_set fds_write;
193 fd_set fds_excp; 196 fd_set fds_excp;
194 struct timeval timeout; 197 struct timeval timeout;
195 int r; 198 int r;
196 199
197 timeout = mailstream_network_delay; 200 timeout = mailstream_network_delay;
198 201
199 FD_ZERO(&fds_write); 202 FD_ZERO(&fds_write);
200 FD_SET(socket_data->fd, &fds_write); 203 FD_SET(socket_data->fd, &fds_write);
201 FD_ZERO(&fds_excp); 204 FD_ZERO(&fds_excp);
202 FD_SET(socket_data->fd, &fds_excp); 205 FD_SET(socket_data->fd, &fds_excp);
206 // LUTZ next line blocks sometimes
207 if ( timeout.tv_sec > DEFAULT_NETWORK_TIMEOUT )
208 timeout.tv_sec = DEFAULT_NETWORK_TIMEOUT;
209 fprintf(stderr,"fd %d to secs %d \n", socket_data->fd, timeout.tv_sec );
203 r = select(socket_data->fd + 1, NULL, &fds_write, &fds_excp, &timeout); 210 r = select(socket_data->fd + 1, NULL, &fds_write, &fds_excp, &timeout);
204 if (r == 0) 211 if (r < 1)
205 return -1; 212 return -1;
206 if (FD_ISSET(socket_data->fd, &fds_excp)) 213 if (FD_ISSET(socket_data->fd, &fds_excp))
207 return -1; 214 return -1;
208 if (!FD_ISSET(socket_data->fd, &fds_write)) 215 if (!FD_ISSET(socket_data->fd, &fds_write))
209 return 0; 216 return 0;
210 } 217 }
211 218
212 return send(socket_data->fd,buf,count,MSG_NOSIGNAL); 219 return send(socket_data->fd,buf,count,MSG_NOSIGNAL);
213 //return write(socket_data->fd, buf, count); 220 //return write(socket_data->fd, buf, count);
214} 221}
215 222
216 223
217/* mailstream */ 224/* mailstream */
218 225
219mailstream * mailstream_socket_open(int fd) 226mailstream * mailstream_socket_open(int fd)
220{ 227{
221 mailstream_low * low; 228 mailstream_low * low;
222 mailstream * s; 229 mailstream * s;
223 230
224 low = mailstream_low_socket_open(fd); 231 low = mailstream_low_socket_open(fd);
225 if (low == NULL) 232 if (low == NULL)
226 goto err; 233 goto err;
227 234
228 s = mailstream_new(low, 8192); 235 s = mailstream_new(low, 8192);
229 if (s == NULL) 236 if (s == NULL)
230 goto free_low; 237 goto free_low;
231 238
232 return s; 239 return s;
233 240
234 free_low: 241 free_low:
235 mailstream_low_close(low); 242 mailstream_low_close(low);
236 err: 243 err:
237 return NULL; 244 return NULL;
238} 245}
239 246