00001
00002
00003 #include "../include/repository.h"
00004 #include "../include/command.h"
00005 #include "../include/DFR_FS.h"
00006 #include "../include/cond_comp.h"
00007 #include <arpa/inet.h>
00008
00009 extern repository_class repository;
00010
00011
00012
00013 void* FS_req_s_body (void* sock) {
00014 pthread_detach(pthread_self());
00015 int req_sock = (int)sock;
00016
00017 list<string> added_files;
00018 list<string>::iterator j;
00019 string FS_ip_address, FS_address;
00020 sockaddr_in FS_addr;
00021 socklen_t FS_addrlen = sizeof(FS_addr);
00022 command com;
00023 char buf1[INET_ADDRSTRLEN];
00024 char buf2[INT_AS_STRING_BYTES];
00025 bool error = false;
00026 int ret = getpeername(req_sock, (sockaddr*)&FS_addr, &FS_addrlen);
00027 if(ret < 0) {
00028 LOG(fprintf(stderr, "DFR as FS_req_s -> could not get FS address\n"));
00029 close(req_sock);
00030 pthread_exit(NULL);
00031 }
00032 FS_ip_address = inet_ntop(AF_INET, &(FS_addr.sin_addr), buf1, INET_ADDRSTRLEN);
00033 FS_address = FS_ip_address;
00034 int port = ntohs(FS_addr.sin_port);
00035 sprintf(buf2, "%i", port);
00036 FS_address += ':';
00037 FS_address += buf2;
00038 LOG(printf("DFR as FS_req_s -> FS at %s connected and ready\n", FS_address.c_str()));
00039 while(!error) {
00040 ret = receive_command(req_sock, &com);
00041 if(ret == -1)
00042 break;
00043 switch(com.id) {
00044 case register_file:
00045 added_files.push_back(com.file_name);
00046 repository.add_file(com.file_name, req_sock, FS_ip_address, com.port, com.max_clients);
00047 LOG(printf("DFR as FS_req_s -> FS at %s added file: %s\n", FS_address.c_str(), com.file_name.c_str()));
00048 reply_command(req_sock, OK, 0, NULL);
00049 break;
00050 case unregister_file:
00051 ret = repository.remove_file(com.file_name, req_sock);
00052 if(ret == 0) {
00053 for(j = added_files.begin(); j != added_files.end(); j++)
00054 if(*j == com.file_name)
00055 j = added_files.erase(j);
00056 LOG(printf("DFR as FS_req_s -> FS at %s removed file: %s\n", FS_address.c_str(), com.file_name.c_str()));
00057 reply_command(req_sock, OK, 0, NULL);
00058 }
00059 else {
00060 LOG(printf("DFR as FS_req_s -> FS at %s failed to remove file: %s\n", FS_address.c_str(), com.file_name.c_str()));
00061 reply_command(req_sock, ERR_FILE_NOT_REGISTERED, 0, NULL);
00062 }
00063 break;
00064 default:
00065 LOG(printf("DFR as FS_req_s -> received invalid command from FS at %s\nDFR as FS_req_s -> the FS will be disconnected\n", FS_address.c_str()));
00066 error = true;
00067 }
00068 }
00069 for(j = added_files.begin(); j != added_files.end(); j++)
00070 repository.remove_file(*j, req_sock);
00071 LOG(printf("DFR as FS_req_s -> FS at %s disconnected\n", FS_address.c_str()));
00072 close(req_sock);
00073 pthread_exit(NULL);
00074 }
00075
00076 void* FS_s_body (void* sock) {
00077 int l_sock = (int)sock, ret;
00078 int cur_sock, err_counter = 0;
00079 sockaddr_in FS_addr;
00080 socklen_t FS_addrlen = sizeof(FS_addr);
00081 pthread_t FS_req_s;
00082 while(1) {
00083 cur_sock = accept(l_sock, (sockaddr*)&FS_addr, &FS_addrlen);
00084 if(cur_sock < 0) {
00085 LOG(fprintf(stderr, "DFR as FS_s -> cannot accept a FS\n"));
00086 err_counter++;
00087 if(err_counter >= MAX_ERR_COUNT_FS)
00088 pthread_exit(NULL);
00089 else continue;
00090 }
00091 ret = pthread_create(&FS_req_s, 0, FS_req_s_body, (void*)cur_sock);
00092 if(ret != 0) {
00093 LOG(printf("DFR as CL_s -> could not create a request server thread\n"));
00094 pthread_exit(NULL);
00095 }
00096 }
00097 }