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 <netdb.h>
00008 #include <fcntl.h>
00009 #include <arpa/inet.h>
00010 #include <cstdlib>
00011 #include <cstring>
00012
00013 int send_end_command(int sock, string file_name, string CL_address) {
00014 command end(end_file_transfer, file_name.c_str());
00015 int d_size;
00016 char* add_data;
00017 int ret = send_command(sock, end, &d_size, &add_data);
00018 delete(add_data);
00019 switch(ret) {
00020 case OK:
00021 LOG(printf("CL %s -> terminated transfer signaled to the DFR\n",
00022 CL_address.c_str()));
00023 return 0;
00024 case ERR_NO_TRANSFER:
00025 LOG(printf("CL %s -> no transfer resulting from the DFR\n",
00026 CL_address.c_str()));
00027 break;
00028 return 1;
00029 default:
00030 LOG(printf("CL %s -> invalid reply from DFR when releasing file %s\n",
00031 CL_address.c_str(), file_name.c_str()));
00032 return -1;
00033 }
00034 return -1;
00035 }
00036
00037 FS_info_struct* get_FS_info(const char* mes) {
00038 FS_info_struct* file_server = new FS_info_struct;
00039 char* s_cpy = new char[strlen(mes)+1];
00040 strcpy(s_cpy , mes);
00041 char* a = s_cpy;
00042 int len;
00043
00044 file_server->ip_address = strtok(a, ":");
00045 len = file_server->ip_address.length();
00046 if(mes[len] != ':') {
00047 delete(s_cpy);
00048 delete(file_server);
00049 return NULL;
00050 }
00051 a += len+1;
00052 file_server->port = atoi(a);
00053 if(file_server->port <= 0 || file_server->port > 65535){
00054 delete(s_cpy);
00055 delete(file_server);
00056 return NULL;
00057 }
00058 delete(s_cpy);
00059 return file_server;
00060 }
00061
00062 int transfer_file (int FS_sd, string file_name, string new_file_name, string CL_address) {
00063 command c(get_file, file_name.c_str());
00064 int d_size;
00065 char* add_data, *p;
00066 int ret = send_command(FS_sd, c, &d_size, &add_data);
00067 int fd;
00068 switch(ret) {
00069 case OK:
00070 fd = open(new_file_name.c_str(), O_WRONLY|O_CREAT);
00071 if(fd < 0) {
00072 LOG(printf("CL %s -> could not open or create file %s\n",
00073 CL_address.c_str(), new_file_name.c_str()));
00074 delete(add_data);
00075 return -1;
00076 }
00077 p = add_data;
00078 while (d_size > 0) {
00079 ret = write(fd, p, d_size);
00080 if(ret == -1) {
00081 LOG(printf("CL %s -> could not write on file %s\n",
00082 CL_address.c_str(), new_file_name.c_str()));
00083 delete(add_data);
00084 close(fd);
00085 return -1;
00086 }
00087 d_size -= ret;
00088 p += ret;
00089 }
00090 delete(add_data);
00091 close(fd);
00092 ret = chmod(new_file_name.c_str(), S_IRUSR|S_IWUSR|S_IXUSR);
00093 if(ret < 0) {
00094 LOG(printf("CL %s -> could not change file %s permissions\n",
00095 CL_address.c_str(), new_file_name.c_str()));
00096 return -1;
00097 }
00098 LOG(printf("CL %s -> file transfer complete\n", CL_address.c_str()));
00099 return 0;
00100 case ERR_FILE_NOT_EXISTS:
00101 LOG(printf("CL %s -> file %s not found on FS\n",
00102 CL_address.c_str(), file_name.c_str()));
00103 delete(add_data);
00104 return 1;
00105 case ERR_TOO_MANY_CLIENTS:
00106 LOG(printf("CL %s -> too many clients active on FS\n", CL_address.c_str()));
00107 delete(add_data);
00108 return 1;
00109 default:
00110 LOG(printf("CL %s -> unknown error from FS, terminating\n",
00111 CL_address.c_str()));
00112 return -1;
00113 }
00114 }
00115
00116 int main(int argc, char* argv[]) {
00117 int DFR_port;
00118 string DFR_ip_address;
00119 int mode, sd, delay;
00120 string file_name, new_file_name;
00121 if(argc != 7) {
00122 LOG(printf("CL -> usage: CL <DFR IP address or domain name for CLs> <DFR port for CLs> "));
00123 LOG(printf("<file to transfer> <new filename> <mode> <delay>\n"));
00124 exit(1);
00125 }
00126 hostent* DFR;
00127 char buf[INET_ADDRSTRLEN];
00128 DFR = gethostbyname(argv[1]);
00129 if(DFR == NULL) {
00130 LOG(printf("CL -> DFR IP address or domain name not valid\n"));
00131 exit(1);
00132 }
00133 DFR_ip_address = inet_ntop(AF_INET, DFR->h_addr, buf, INET_ADDRSTRLEN);
00134 DEB(printf("ip address: %i %s\n", DFR->h_length, DFR_ip_address.c_str()));
00135 DFR_port = atoi(argv[2]);
00136 if(DFR_port <= 0 || DFR_port > 65535) {
00137 LOG(printf("CL -> DFR port not valid\n"));
00138 exit(1);
00139 }
00140 file_name = argv[3];
00141 new_file_name = argv[4];
00142 mode = atoi(argv[5]);
00143 delay = atoi(argv[6]);
00144 if(delay < 0) {
00145 LOG(printf("CL -> specified delay is not valid\n"));
00146 exit(1);
00147 }
00148
00149 sd = init_sd_cli(DFR_port, DFR_ip_address);
00150 if(sd == -1) {
00151 LOG(printf("CL -> DFR socket initialization failed\n"));
00152 exit(1);
00153 }
00154 LOG(printf("CL -> client successfully connected\n"));
00155 switch(mode) {
00156 case 1:
00157 mode_1(sd, file_name, new_file_name, delay);
00158 break;
00159 case 2:
00160 mode_2(sd, file_name, new_file_name, delay);
00161 break;
00162 default:
00163 LOG(printf("CL -> invalid mode\n"));
00164 break;
00165 }
00166 close(sd);
00167 return 0;
00168 }