static int FILE_recv_binary(Socket* in, FILE *out) { time_t then = time(0) - 1; time_t now; ftp_set_close_handler(); if(foo_hookf) foo_hookf(&ftp->ti); ftp->ti.begin = false; sock_clearerr_in(in); clearerr(out); char* buf = xmalloc(FTP_BUFSIZ); while (!sock_eof(in)) { if(wait_for_input() != 0) { ftp_trace("wait_for_input() returned non-zero\n"); break; } const ssize_t n = sock_read(in, buf, FTP_BUFSIZ); if (n <= 0) break; if(ftp_sigints() > 0) { ftp_trace("break due to sigint\n"); break; } if(fwrite(buf, sizeof(char), n, out) != n) break; ftp->ti.size += n; if(foo_hookf) { now = time(0); if(now > then) { foo_hookf(&ftp->ti); then = now; } } } free(buf); ftp_set_close_handler(); return maybe_abort_in(in, out); }
/* reads reply * returns 0 on success or -1 on error */ int ftp_read_reply(void) { char tmp[5]="xxx "; int r; ftp_set_signal(SIGALRM, reply_ALRM_handler); if(ftp->reply_timeout) alarm(ftp->reply_timeout); sock_clearerr_in(ftp->ctrl); r = ftp_gets(); if(!sock_connected(ftp->ctrl)) { alarm(0); ftp_set_signal(SIGALRM, SIG_DFL); ftp_trace("sock is not connected\n"); return -1; } if(r == -1) { alarm(0); ftp_set_signal(SIGALRM, SIG_DFL); ftp_trace("ftp_gets returned -1\n"); return -1; } ftp_print_reply(); if(ftp->reply[3] == '-') { /* multiline response */ strncpy(tmp, ftp->reply, 3); do { if(ftp_gets() == -1) break; ftp_print_reply(); } while(strncmp(tmp, ftp->reply, 4) != 0); } ftp->tmp_verbosity = vbUnset; alarm(0); ftp_set_signal(SIGALRM, SIG_DFL); return r; }
static int FILE_recv_ascii(Socket* in, FILE *out) { time_t then = time(0) - 1; time_t now; ftp_set_close_handler(); if(foo_hookf) foo_hookf(&ftp->ti); ftp->ti.begin = false; sock_clearerr_in(in); clearerr(out); bool next = true; int nc = 0; while (true) { int c = 0; if (next) { c = sock_get(in); if (c == EOF) break; } else { c = nc; next = true; } if (ftp_sigints() > 0 || wait_for_input() != 0) break; if (c == '\n') ftp->ti.barelfs++; else if (c == '\r') { nc = sock_get(in); if (nc == EOF) break; if (nc != '\n') next = false; else c = nc; } if (fputc(c, out) == EOF) break; ftp->ti.size++; if(foo_hookf) { now = time(0); if(now > then) { foo_hookf(&ftp->ti); then = now; } } } return maybe_abort_in(in, out); }