00001
00010 #include "files.h"
00011
00025 int parse_maquinas(FILE *file, HASHTABLE_T *maquinas)
00026 {
00027 char* line = NULL, chave[MAX_IP_LEN + 1] = {'\0'}, logins[MAX_LOGIN_LIST_LEN + 1] = {'\0'}, pastas[MAX_FOLDER_LIST_LEN + 1] = {'\0'};
00028 size_t size;
00029 LISTA_GENERICA_T *lista_pastas = NULL;
00030 HASHTABLE_T *hash_logins = NULL;
00031 size_t bufsize = 512;
00032 char *token = NULL, *token_buf = NULL, *buf = (char *) malloc(sizeof(char) * bufsize);
00033 t_maquina *maquina;
00034 struct hostent ret, *result;
00035 int error, ip_error = 0;
00036
00037 if (!file)
00038 return ERROR_VAL;
00039
00040 #ifdef SHOW_DEBUG
00041 DEBUG("A inciar a leitura do ficheiro de maquinas.");
00042 #endif
00043
00044 while ((getline(&line, &size, file)) != -1)
00045 if(sscanf(line, "%[^#]", line) > 0)
00046 {
00047 sscanf(line, "%[^;];%[^;];%s", chave, logins, pastas);
00048 if(strlen(chave) < 1 || strlen(logins) < 1 || strlen(pastas) < 1)
00049 {
00050 WARNING("Formato do ficheiro de maquinas incorrecto. IP, conjunto de logins ou pastas invalidos");
00051 continue;
00052 }
00053 result = NULL;
00054 if(validate_ip(chave))
00055 {
00056 while((ip_error = gethostbyname_r(chave, &ret, buf, bufsize, &result, &error)) == ERANGE)
00057 {
00058 bufsize *= 2;
00059 buf = (char *) malloc(sizeof(char) * bufsize);
00060 }
00061 if(ip_error || result == NULL)
00062 {
00063 WARNING("Erro ao resolver o ip da maquina %s", chave);
00064 continue;
00065 }
00066 }
00067 hash_logins = tabela_criar(HASHBASE, free);
00068 lista_pastas = lista_criar(free);
00069 token = strtok_r(logins, "|", &token_buf);
00070 tabela_inserir(hash_logins, strdup(token), strdup(token));
00071 while((token = strtok_r(NULL, "|", &token_buf)))
00072 {
00073 if(strlen(token) > MAX_LOGIN_LEN)
00074 {
00075 WARNING("Login demasiado grande.");
00076 continue;
00077 }
00078 tabela_inserir(hash_logins, strdup(token), strdup(token));
00079 }
00080
00081 token = strtok_r(pastas, "|", &token_buf);
00082 lista_inserir(lista_pastas, strdup(token));
00083 while((token = strtok_r(NULL, "|", &token_buf)))
00084 lista_inserir(lista_pastas, strdup(token));
00085
00086
00087
00088 if(result)
00089 maquina = create_maquina(result->h_addr_list[0], hash_logins, lista_pastas);
00090 else
00091 maquina = create_maquina(chave, hash_logins, lista_pastas);
00092 tabela_inserir(maquinas, maquina->ip, maquina);
00093 }
00094
00095 #ifdef SHOW_DEBUG
00096 DEBUG("A terminar a leitura do ficheiro de maquinas.");
00097 #endif
00098
00099 if(!feof(file))
00100 return ERROR_VAL;
00101 if (line)
00102 free(line);
00103 free(buf);
00104 return ALL_GOES_WELL;
00105 }
00106
00121 int parse_contas(FILE *file, HASHTABLE_T *contas)
00122 {
00123 char* line = NULL;
00124 size_t size;
00125 char login[MAX_LOGIN_LEN + 1] = {'\0'}, pass[MAX_PASS_LEN + 1] = {'\0'};
00126
00127 if (!file)
00128 return ERROR_VAL;
00129
00130 #ifdef SHOW_DEBUG
00131 DEBUG("A inciar a leitura do ficheiro de contas.");
00132 #endif
00133
00134 while (getline(&line, &size, file) != -1)
00135 if(sscanf(line, "%[^#]", line) > 0)
00136 {
00137 sscanf(line, "%[^;];%s", login, pass);
00138
00139 #ifdef SHOW_DEBUG
00140 DEBUG("Linha do ficheiro de contas lida: ^%s^", line);
00141 #endif
00142
00143 if(strlen(login) < 1 || strlen(pass) < 1)
00144 {
00145
00146 #ifdef SHOW_DEBUG
00147 DEBUG("LOGIN ou PASSWORD sem tamanho valido.");
00148 #endif
00149
00150 WARNING("Formato do ficheiro de contas incorrecto. Login ou password invalidos.");
00151 continue;
00152 }
00153 if(strlen(login) > MAX_LOGIN_LEN || strlen(pass) > MAX_PASS_LEN)
00154 {
00155
00156 #ifdef SHOW_DEBUG
00157 DEBUG("LOGIN ou PASSWORD exederam o tamanho permitido.");
00158 #endif
00159
00160 WARNING("Tamanho do login ou da password demasiado grande.");
00161 continue;
00162 }
00163 tabela_inserir(contas, login, create_conta(login, pass));
00164 }
00165
00166 #ifdef SHOW_DEBUG
00167 DEBUG("A terminar a leitura do ficheiro de contas.");
00168 #endif
00169
00170 if(!feof(file))
00171 return ERROR_VAL;
00172 if (line)
00173 free(line);
00174 return ALL_GOES_WELL;
00175 }