00001
00002
00003 #include "../include/CL.h"
00004 #include "../include/command.h"
00005 #include "../include/utility.h"
00006 #include "../include/cond_comp.h"
00007 #include <arpa/inet.h>
00008
00009 void mode_1(int sock, string file_name, string new_file_name, int delay) {
00010 int ret;
00011 command start(start_file_transfer, file_name.c_str());
00012 int FS_sd, d_size, CL_port;
00013 char* add_data;
00014 bool error = false;
00015 string CL_address;
00016 sockaddr_in CL_addr;
00017 socklen_t CL_addrlen = sizeof(CL_addr);
00018 char buf1[INET_ADDRSTRLEN];
00019 char buf2[INT_AS_STRING_BYTES];
00020 FS_info_struct* file_server;
00021 ret = getsockname(sock, (sockaddr*)&CL_addr, &CL_addrlen);
00022 if(ret < 0) {
00023 LOG(printf("CL -> could not get socket address\n"));
00024 return;
00025 }
00026 CL_address = inet_ntop(AF_INET, &(CL_addr.sin_addr), buf1, INET_ADDRSTRLEN);
00027 CL_port = ntohs(CL_addr.sin_port);
00028 sprintf(buf2, "%i", CL_port);
00029 CL_address += ':';
00030 CL_address += buf2;
00031 LOG(printf("CL %s -> mode 1 was selected\n", CL_address.c_str()));
00032 while(!error) {
00033 #ifdef TEST
00034 sleep(delay);
00035 #endif
00036 ret = send_command(sock, start, &d_size, &add_data);
00037 switch(ret) {
00038 case OK:
00039 file_server = get_FS_info(add_data);
00040 if(file_server == NULL) {
00041 LOG(printf("CL %s -> could not understand DFR info about the FS\n",
00042 CL_address.c_str()));
00043 send_end_command(sock, file_name, CL_address);
00044 error = true;
00045 break;
00046 }
00047 LOG(printf("CL %s -> file granted, located at %s:%i\n", CL_address.c_str(),
00048 file_server->ip_address.c_str(), file_server->port));
00049 FS_sd = init_sd_cli(file_server->port, file_server->ip_address);
00050 delete(file_server);
00051 if(FS_sd == -1) {
00052 LOG(printf("CL %s -> FS socket initialization failed\n", CL_address.c_str()));
00053 send_end_command(sock, file_name, CL_address);
00054 error = true;
00055 break;
00056 }
00057 LOG(printf("CL %s -> FS connection established\n", CL_address.c_str()));
00058 ret = transfer_file(FS_sd, file_name, new_file_name, CL_address);
00059 if(ret < 0)
00060 error = true;
00061 close(FS_sd);
00062 #ifdef TEST
00063 sleep(delay);
00064 #endif
00065 ret = send_end_command(sock, file_name, CL_address);
00066 if(ret < 0)
00067 error = true;
00068 break;
00069 case ERR_TOO_MANY_CLIENTS:
00070 LOG(printf("CL %s -> DFR has too many clients active on file %s\n",
00071 CL_address.c_str(), file_name.c_str()));
00072 break;
00073 case ERR_FILE_NOT_EXISTS:
00074 LOG(printf("CL %s -> file %s is not present on the DFR\n",
00075 CL_address.c_str(), file_name.c_str()));
00076 break;
00077 default:
00078 LOG(printf("CL %s -> unknown error from DFR, terminating\n",
00079 CL_address.c_str()));
00080 error = true;
00081 }
00082 delete(add_data);
00083 }
00084 }