int ftpc_socklisten(struct ftpc_socket_s *sock) { unsigned int addrlen = sizeof(sock->laddr); int ret; /* Bind the local socket to the local address */ sock->laddr.sin_port = 0; ret = bind(sock->sd, (struct sockaddr *)&sock->laddr, addrlen); if (ret < 0) { ndbg("bind() failed: %d\n", errno); return ERROR; } /* Wait for the connection to the server */ if (listen(sock->sd, 1) == -1) { return ERROR; } /* Then get the local address selected by NuttX */ ret = ftpc_sockgetsockname(sock, &sock->laddr); return ret; }
int ftpc_sockconnect(struct ftpc_socket_s *sock, struct sockaddr_in *addr) { int ret; /* Connect to the server */ ret = connect(sock->sd, (struct sockaddr *)addr, sizeof(struct sockaddr)); if (ret < 0) { ndbg("connect() failed: %d\n", errno); return ERROR; } /* Get the local address of the socket */ ret = ftpc_sockgetsockname(sock, &sock->laddr); if (ret < 0) { ndbg("ftpc_sockgetsockname() failed: %d\n", errno); return ERROR; } sock->connected = true; return OK; }
int ftpc_xfrinit(FAR struct ftpc_session_s *session) { struct sockaddr_in addr; uint8_t addrport[6]; uint8_t *paddr; uint8_t *pport; int ret; /* We must be connected to initiate a transfer */ if (!ftpc_connected(session)) { ndbg("Not connected\n"); goto errout; } /* Initialize the data channel */ ret = ftpc_sockinit(&session->data); if (ret != OK) { ndbg("ftpc_sockinit() failed: %d\n", errno); goto errout; } /* Duplicate the address and connection information of the command channel */ ftpc_sockcopy(&session->data, &session->cmd); /* Should we enter passive mode? */ if (FTPC_IS_PASSIVE(session)) { /* Yes.. going passive. */ ret = ftp_pasvmode(session, addrport); if (ret != OK) { ndbg("ftp_pasvmode() failed: %d\n", errno); goto errout_with_data; } /* Configure the data socket */ ftpc_sockgetsockname(&session->cmd, &addr); memcpy(&addr.sin_addr, addrport, 4); memcpy(&addr.sin_port, addrport+4, 2); /* Connect the data socket */ ret = ftpc_sockconnect(&session->data, &addr); if (ret < 0) { ndbg("ftpc_sockconnect() failed: %d\n", errno); goto errout_with_data; } } else { /* Wait for the connection to be established */ ftpc_socklisten(&session->data); /* Then send our local data channel address to the server */ paddr = (uint8_t *)&session->data.laddr.sin_addr; pport = (uint8_t *)&session->data.laddr.sin_port; ret = ftpc_cmd(session, "PORT %d,%d,%d,%d,%d,%d", paddr[0], paddr[1], paddr[2], paddr[3], pport[0], pport[1]); if (ret < 0) { ndbg("ftpc_cmd() failed: %d\n", errno); goto errout_with_data; } } return OK; errout_with_data: ftpc_sockclose(&session->data); errout: return ERROR; }