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); }
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"); }
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); } }