/** * @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; }
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); }