Ejemplo n.º 1
0
/**
 * @brief Update transfer information when the transfer were initiated from the client side
 * @param profile The profile information
 * @return 0 on success, non-zero on erro
 */
int
solveUpdateClientSideTransfer(diet_profile_t* profile)
{
  std::string sessionKey = "";
  std::string transferSerialized = "";

  diet_string_get(profile,0, sessionKey);
  diet_string_get(profile,1, transferSerialized);

  try {
    FMS_Data::FileTransfer_ptr transfer;
    if (! vishnu::parseEmfObject(transferSerialized, transfer)) {
      SystemException(ERRCODE_INVDATA, "solveUpdateClientSideTransfer: invalid transfer object");
    }

    FileTransferServer transferServer(SessionServer(sessionKey),
                                      ServerXMS::getInstance()->getVishnuId());
    transferServer.setFileTransfer(*transfer);
    transferServer.updateDatabaseRecord();
    delete transfer;

    // reset the profile to handle result
    diet_profile_reset(profile, 2);

    // set success result
    diet_string_set(profile, 0, "success");
    diet_string_set(profile, 1, "");
  } catch (VishnuException& err) {
    diet_string_set(profile, 0, "error");
    diet_string_set(profile, 1, err.what());
  }

  return 0;
}
Ejemplo n.º 2
0
void handle(int client, char *remote_host, char *remote_port, struct sockaddr_storage their_addr, socklen_t addr_len)
{
    struct addrinfo hints, *res;
    int server = -1;
    int disconnected = 0;
    fd_set set;
    int max_sock;

    /* Get the address info */
    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_DGRAM;
    if (getaddrinfo(remote_host, remote_port, &hints, &res) != 0) {
        perror("getaddrinfo");
        printf(" in handle.\n");
        close(client);
        return;
    }

    /* Create the socket */
    server = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    if (server == -1) {
        perror("socket");
        close(client);
        return;
    }

    if (client > server) {
        max_sock = client;
    }
    else {
        max_sock = server;
    }

    /*freeaddrinfo(server);*/
    /*freeaddrinfo(res);*/

    /* Main transfer loop */
    while (!disconnected) {
        FD_ZERO(&set);
        FD_SET(client, &set);
        FD_SET(server, &set);
        /*printf("NEVER LUCKY\n");*/
        if (select(max_sock + 1, &set, NULL, NULL, NULL) == -1) {
            perror("select");
            break;
        }
        if (FD_ISSET(client, &set)) {
            /*printf("NEVER LUCKY CLIENT\n");*/
            disconnected = transfer(server, client, their_addr, res->ai_addrlen, res->ai_addr);

        }
        if (FD_ISSET(server, &set)) {
            /*printf("NEVER LUCKY SERVER\n");*/
            disconnected = transferServer(client, server, their_addr, addr_len, res->ai_addr);
        }
    }
    close(server);
    close(client);
}