static void ftp_pass_info(struct connection *c, struct read_buffer *rb)
{
    int g = get_ftp_response(c, rb, 0);
    if (g == -1) {
        setcstate(c, S_FTP_ERROR);
        abort_connection(c);
        return;
    }
    if (!g) {
        read_from_socket(c, c->sock1, rb, ftp_pass_info);
        setcstate(c, S_LOGIN);
        return;
    }
    if (g >= 530 && g < 540) {
        setcstate(c, S_FTP_LOGIN);
        abort_connection(c);
        return;
    }
    if (g >= 400) {
        setcstate(c, S_FTP_UNAVAIL);
        abort_connection(c);
        return;
    }
    if (ftp_options.fast_ftp) ftp_retr_file(c, rb);
    else ftp_send_retr_req(c, S_GETH);
}
示例#2
0
void ftp_got_user_info(struct connection *c, struct read_buffer *rb)
{
	int g = get_ftp_response(c, rb, 0);
	if (g == -1) { setcstate(c, S_FTP_ERROR); abort_connection(c); return; }
	if (!g) { read_from_socket(c, c->sock1, rb, ftp_got_user_info); return; }
	if (g >= 530 && g < 540) { setcstate(c, S_FTP_LOGIN); retry_connection(c); return; }
	if (g >= 400) { setcstate(c, S_FTP_UNAVAIL); retry_connection(c); return; }
	if (g >= 200 && g < 300) {
		if (ftp_options.fast_ftp) ftp_dummy_info(c, rb);
		else ftp_send_retr_req(c, S_GETH);
	} else {
		if (ftp_options.fast_ftp) ftp_pass_info(c, rb);
		else {
			unsigned char *login;
			unsigned char *u;
			int logl = 0;
			login = init_str();
			add_to_str(&login, &logl, "PASS ");
			if ((u = get_pass(c->url)) && *u) add_to_str(&login, &logl, u);
			else add_to_str(&login, &logl, ftp_options.anon_pass);
			if (u) mem_free(u);
			add_to_str(&login, &logl, "\r\n");
			write_to_socket(c, c->sock1, login, strlen(login), ftp_sent_passwd);
			mem_free(login);
			setcstate(c, S_LOGIN);
		}
	}
}
示例#3
0
void ftp_dummy_info(struct connection *c, struct read_buffer *rb)
{
	int g = get_ftp_response(c, rb, 0);
	if (g == -1) { setcstate(c, S_FTP_ERROR); abort_connection(c); return; }
	if (!g) { read_from_socket(c, c->sock1, rb, ftp_dummy_info); return; }
	ftp_retr_file(c, rb);
}
示例#4
0
void ftp_got_info(struct connection *c, struct read_buffer *rb)
{
	int g = get_ftp_response(c, rb, 0);
	if (g == -1) { setcstate(c, S_FTP_ERROR); abort_connection(c); return; }
	if (!g) { read_from_socket(c, c->sock1, rb, ftp_got_info); return; }
	if (g >= 400) { setcstate(c, S_FTP_UNAVAIL); retry_connection(c); return; }
	ftp_got_user_info(c, rb);
}
                        if (++i >= rb->len) goto no_epsv;
                    }
                    if (rb->data[i] != delim) goto no_epsv;
                    pc[4] = n >> 8;
                    pc[5] = n & 0xff;
                    pc[0] = pc[1] = pc[2] = pc[3] = 0;
                    goto pasv_ok;
                }
                i++;
            }
no_epsv:
            memset(pc, 0, sizeof pc);
pasv_ok:
            ;
        }
        g = get_ftp_response(c, rb, 0);
        if (g == -1) {
            setcstate(c, S_FTP_ERROR);
            abort_connection(c);
            return;
        }
        if (!g) {
            read_from_socket(c, c->sock1, rb, ftp_retr_file);
            setcstate(c, S_GETH);
            return;
        }
        inf->pending_commands--;
        switch (inf->opc - inf->pending_commands) {
        case 1:		/* TYPE */
            goto rep;
        case 2:		/* PORT */