Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}