Ejemplo n.º 1
0
Archivo: process.c Proyecto: dcant/zftp
static void _handle_pasv(session_t *sess)
{
	if (!sess->is_login) {
		ftp_cmdio_write(sess->ctrl_fd, FTP_NLOGIN,
			"Please login first.");
		return;
	}

	if (sess->cliaddr != NULL) {
		free(sess->cliaddr);
		sess->cliaddr = NULL;
	}

	priv_sock_send_cmd(sess->child_fd, PRIV_SOCK_LISTEN);

	uint16_t port = priv_sock_recv_int(sess->child_fd);
	char c[6] = {0};
	union {
		char cs[2];
		uint16_t nport;
	} port_union;
	port_union.nport = htons(port);
	c[4] = port_union.cs[1];
	c[5] = port_union.cs[0];
	sscanf(tunable_listen_addr, "%c.%c.%c.%c", &c[0], &c[1], &c[2], &c[3]);

	char msg[1024] = {0};
	sprintf(msg, "Entering Passive Mode (%c,%c,%c,%c,%c,%c).", c[0], c[1],
		c[2], c[3], c[4], c[5]);
	ftp_cmdio_write(sess->ctrl_fd, FTP_PASV, msg);
}
Ejemplo n.º 2
0
void priv_sock_recv_str(int fd, char *buf, int len)
{
	int rlen = priv_sock_recv_int(fd);
	if (rlen > len)
		ERROR_EXIT("priv_sock_recv_str");
	if (readn(fd, buf, rlen) != rlen)
		ERROR_EXIT("priv_sock_recv_str");
}
Ejemplo n.º 3
0
void priv_sock_recv_str(int fd, char *buf, unsigned int len)
{
    unsigned int recv_len = (unsigned int)priv_sock_recv_int(fd);
    if (recv_len > len)
    {
        fprintf(stderr, "priv_sock_recv_str error\n");
        exit(EXIT_FAILURE);
    }

    int ret = readn(fd, buf, recv_len);
    if (ret != (int)recv_len)
    {
        fprintf(stderr, "priv_sock_recv_str error\n");
        exit(EXIT_FAILURE);
    }
}