comparison recpt1/recpt1.c @ 39:b03685d25fee

recpt1 now shows error explanation when write() fails.
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Fri, 17 Apr 2009 22:52:35 +0900
parents 3228f5cde349
children a35e352f6c4a
comparison
equal deleted inserted replaced
38:3228f5cde349 39:b03685d25fee
206 addr = &data->sock_data->addr; 206 addr = &data->sock_data->addr;
207 } 207 }
208 208
209 while(1) { 209 while(1) {
210 ssize_t wc = 0; 210 ssize_t wc = 0;
211 int file_err = 0;
211 qbuf = dequeue(p_queue); 212 qbuf = dequeue(p_queue);
212 /* no entry in the queue */ 213 /* no entry in the queue */
213 if(qbuf == NULL) { 214 if(qbuf == NULL) {
214 break; 215 break;
215 } 216 }
233 int offset = 0; 234 int offset = 0;
234 while(size_remain > 0) { 235 while(size_remain > 0) {
235 int ws = size_remain < SIZE_CHANK ? size_remain : SIZE_CHANK; 236 int ws = size_remain < SIZE_CHANK ? size_remain : SIZE_CHANK;
236 wc = write(wfd, buf.data + offset, ws); 237 wc = write(wfd, buf.data + offset, ws);
237 if(wc < 0) { 238 if(wc < 0) {
238 if(errno == EPIPE) 239 perror("write");
239 pthread_kill(signal_thread, SIGPIPE); 240 file_err = 1;
240 else 241 pthread_kill(signal_thread,
241 pthread_kill(signal_thread, SIGUSR2); 242 errno == EPIPE ? SIGPIPE : SIGUSR2);
242 break; 243 break;
243 } 244 }
244 size_remain -= wc; 245 size_remain -= wc;
245 offset += wc; 246 offset += wc;
246 } 247 }
264 } 265 }
265 266
266 free(qbuf); 267 free(qbuf);
267 268
268 /* normal exit */ 269 /* normal exit */
269 if((f_exit) && (!p_queue->num_used)) { 270 if(f_exit && !p_queue->num_used && !file_err) {
270 271
271 buf = sbuf; /* default */ 272 buf = sbuf; /* default */
272 273
273 if(use_b25) { 274 if(use_b25) {
274 code = b25_finish(dec, &sbuf, &dbuf); 275 code = b25_finish(dec, &sbuf, &dbuf);
279 } 280 }
280 281
281 if(!fileless) { 282 if(!fileless) {
282 wc = write(wfd, buf.data, buf.size); 283 wc = write(wfd, buf.data, buf.size);
283 if(wc < 0) { 284 if(wc < 0) {
284 if(errno == EPIPE) 285 perror("write");
285 pthread_kill(signal_thread, SIGPIPE); 286 file_err = 1;
286 else 287 pthread_kill(signal_thread,
287 pthread_kill(signal_thread, SIGUSR2); 288 errno == EPIPE ? SIGPIPE : SIGUSR2);
288 } 289 }
289 } 290 }
290 291
291 if(use_udp && sfd != -1) { 292 if(use_udp && sfd != -1) {
292 wc = write(sfd, buf.data, buf.size); 293 wc = write(sfd, buf.data, buf.size);
474 break; 475 break;
475 case SIGUSR1: /* normal exit*/ 476 case SIGUSR1: /* normal exit*/
476 cleanup(sdata); 477 cleanup(sdata);
477 break; 478 break;
478 case SIGUSR2: /* error */ 479 case SIGUSR2: /* error */
479 fprintf(stderr, "\nSomething is wrong. cleaning up...\n"); 480 fprintf(stderr, "Detected an error. cleaning up...\n");
480 cleanup(sdata); 481 cleanup(sdata);
481 break; 482 break;
482 } 483 }
483 484
484 return NULL; /* dummy */ 485 return NULL; /* dummy */