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_2(int sock, string file_name, string new_file_name, int delay) {
00010 int ret;
00011 command reg(reg_notification, file_name.c_str());
00012 command recv;
00013 int FS_sd, d_size, CL_port;
00014 char* add_data;
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 bool completed = false, error = false;
00022 ret = getsockname(sock, (sockaddr*)&CL_addr, &CL_addrlen);
00023 if(ret < 0) {
00024 LOG(printf("CL -> could not get socket address\n"));
00025 return;
00026 }
00027 CL_address = inet_ntop(AF_INET, &(CL_addr.sin_addr), buf1, INET_ADDRSTRLEN);
00028 CL_port = ntohs(CL_addr.sin_port);
00029 sprintf(buf2, "%i", CL_port);
00030 CL_address += ':';
00031 CL_address += buf2;
00032 LOG(printf("CL %s -> mode 2 was selected\n", CL_address.c_str()));
00033 while(!completed && !error) {
00034 ret = send_command(sock, reg, &d_size, &add_data);
00035 delete(add_data);
00036 switch(ret) {
00037 case OK:
00038 ret = receive_command(sock, &recv);
00039 if(ret == -1) {
00040 LOG(printf("CL %s -> error receiving command from DFR\n",
00041 CL_address.c_str()));
00042 error = true;
00043 break;
00044 }
00045 if(recv.id != notify) {
00046 LOG(printf("CL %s -> invalid command received from DFR\n",
00047 CL_address.c_str()));
00048 error = true;
00049 break;
00050 }
00051 if(recv.file_name != file_name) {
00052 LOG(printf("CL %s -> client was not waiting for notification on file %s\n",
00053 CL_address.c_str(), recv.file_name.c_str()));
00054 reply_command(sock, ERR_NO_NOTIFICATION, 0, NULL);
00055 break;
00056 }
00057 reply_command(sock, OK, 0, NULL);
00058 ret = receive_sft_reply(sock, &d_size, &add_data);
00059 switch(ret) {
00060 case OK:
00061 file_server = get_FS_info(add_data);
00062 delete(add_data);
00063 if(file_server == NULL) {
00064 LOG(printf("CL %s -> could not understand DFR info about the FS\n",
00065 CL_address.c_str()));
00066 send_end_command(sock, file_name, CL_address);
00067 error = true;
00068 break;
00069 }
00070 LOG(printf("CL %s -> file granted, located at %s:%i\n", CL_address.c_str(),
00071 file_server->ip_address.c_str(), file_server->port));
00072 FS_sd = init_sd_cli(file_server->port, file_server->ip_address);
00073 delete(file_server);
00074 if(FS_sd == -1) {
00075 LOG(printf("CL %s -> FS socket initialization failed\n", CL_address.c_str()));
00076 send_end_command(sock, file_name, CL_address);
00077 error = true;
00078 break;
00079 }
00080 LOG(printf("CL %s -> FS connection established\n", CL_address.c_str()));
00081 ret = transfer_file(FS_sd, file_name, new_file_name, CL_address);
00082 if(ret == 0)
00083 completed = true;
00084 else if(ret < 0)
00085 error = true;
00086 close(FS_sd);
00087 #ifdef TEST
00088 sleep(delay);
00089 #endif
00090 ret = send_end_command(sock, file_name, CL_address);
00091 if(ret < 0)
00092 error = true;
00093 break;
00094 case ERR_FILE_NOT_EXISTS:
00095 LOG(printf("CL %s -> file %s not found on the DFR after notify\n",
00096 CL_address.c_str(), file_name.c_str()));
00097 break;
00098 case ERR_TOO_MANY_CLIENTS:
00099 LOG(printf("CL %s -> FSs found too busy for file %s after notify\n",
00100 CL_address.c_str(), file_name.c_str()));
00101 break;
00102 default:
00103 LOG(printf("CL %s -> unnknown error from DFR, terminating\n",
00104 CL_address.c_str()));
00105 error = true;
00106 }
00107 break;
00108 default:
00109 LOG(printf("CL %s -> unknown error from DFR, terminating\n",
00110 CL_address.c_str()));
00111 error = true;
00112 }
00113 }
00114 }