void erros_stat(int err_cod, char *erros, int sockfd) { pacote_t resposta; switch (err_cod) { case EBADF: case EFAULT: case ENOENT: case ENOTDIR: if (DEBUG) fprintf(stdout, "ERRO: Arquivo ou diretório não encontrado.\n"); monta_pacote(erros+INEXISTENTE, 1, 0, ERRO, &resposta); envia_pacote(sockfd, resposta, 0); break; case EACCES: if (DEBUG) fprintf(stdout, "ERRO: Permissão negada.\n"); monta_pacote(erros+PERM_NEGADA, 1, 0, ERRO, &resposta); envia_pacote(sockfd, resposta, 0); break; case ELOOP: default: if (DEBUG) fprintf(stdout, "ERRO: Desconhecido.\n"); monta_pacote(erros+DESCONHECIDO, 1, 0, ERRO, &resposta); envia_pacote(sockfd, resposta, 0); break; } }
void put_cmd_servidor (int socket_servidor, msg pacote) { msg r, pac; FILE *arq; pac = cria_msg (0, 0, tipo_ack, NULL); envia_pacote (socket_servidor, pac); arq = fopen(pacote->dados, "w"); recebe_arq (socket_servidor, arq); pac = cria_msg (0, 0, tipo_ok, NULL); envia_pacote (socket_servidor, pac); fflush(arq); fclose(arq); }
void get_cmd_servidor (int socket_servidor, msg pacote) { msg r; FILE *arq; if ((arq = fopen (pacote->dados, "r")) == NULL) { r = cria_msg (0, 0, tipo_erro, NULL); envia_pacote (socket_servidor, r); return; } else { r = cria_msg (0, 0, tipo_ack, NULL); envia_pacote (socket_servidor, r); envia_arq (socket_servidor, arq, pacote->dados); } pacote = cria_msg (0, 0, tipo_end, NULL); envia_pacote (socket_servidor, pacote); fclose (arq); }
void servidor_inic () { int i; int seq, socket_servidor; char dir[63]; char *t, *m, *str; msg pacote, r; system ("clear"); t = malloc (40 * sizeof (char)); seq = 0; socket_servidor = create_sock (SOCKET_SERVER_DEVICE); recv (socket_servidor, t, 40 * sizeof (char), 0); printf ("%s\n\n" , t); m = malloc (40 * sizeof (char)); m = "Conexão estabelecida com o servidor"; send (socket_servidor, m, 40 * sizeof (char), 0); getcwd (dir, 63); send (socket_servidor, dir, 63, 0); while (1) { pacote = recebe_pacote (socket_servidor); if (pacote == NULL) { printf ("Pacote não foi recebido!\n"); r = cria_msg (0, 0, tipo_nack, NULL); envia_pacote (socket_servidor, r); } if (pacote->tipo == tipo_cd) cd_cmd_servidor (socket_servidor, pacote); if (pacote->tipo == tipo_ls) ls_cmd_servidor (socket_servidor, pacote); if (pacote->tipo == tipo_put) put_cmd_servidor (socket_servidor, pacote); if (pacote->tipo == tipo_get) get_cmd_servidor (socket_servidor, pacote); } }
void ls_cmd_servidor (int socket_servidor, msg pacote) { msg r; FILE *ls; if (!strcmp(pacote->dados, " ")) { system ("ls > .arq_ls"); ls = fopen (".arq_ls" , "r"); envia_ls (socket_servidor, ls); fclose (ls); remove (".arq_ls"); r = cria_msg (0, 0, tipo_end, NULL); envia_pacote (socket_servidor, r); } if (!strcmp(pacote->dados, "-l")) { system ("ls -l > .arq_lsl"); ls = fopen (".arq_lsl" , "r"); envia_ls (socket_servidor, ls); fclose (ls); remove (".arq_lsl"); r = cria_msg (0, 0, tipo_end, NULL); envia_pacote (socket_servidor, r); } if (!strcmp(pacote->dados, "-la")) { system ("ls -la > .arq_lsla"); ls = fopen (".arq_lsla" , "r"); envia_ls (socket_servidor, ls); fclose (ls); remove (".arq_lsla"); r = cria_msg (0, 0, tipo_end, NULL); envia_pacote (socket_servidor, r); } }
void cd_cmd_servidor (int socket_servidor, msg pacote) { int erro; char dir[63]; char *err; msg r; err = malloc (sizeof(int)*3); if (chdir(pacote->dados) == 0) { r = cria_msg (0, 0, tipo_ack, NULL); envia_pacote (socket_servidor, r); getcwd (dir, 63); send (socket_servidor, dir, 63, 0); } else { sprintf (err, "%d" , errno); r = cria_msg (sizeof(errno), 0, tipo_erro, err); envia_pacote (socket_servidor, r); getcwd (dir, 63); send (socket_servidor, dir, 63, 0); } }
char interpreta_resposta(pacote_t pacote, int sockfd) { char tipo = tipo_pacote(pacote); char tam = tam_pacote(pacote); pacote_t resposta; int i; switch (tipo) { case ERRO: // switch tipo de erro switch (pacote.dados[3]) { case INEXISTENTE: printf("ERRO: Arquivo ou diretório não encontrado.\n"); break; case PERM_NEGADA: printf("ERRO: Permissão negada.\n"); break; case ESP_INSUFICIENTE: printf("ERRO: Espaço insuficiente.\n"); break; case DESCONHECIDO: printf("ERRO: Desconhecido.\n"); break; } break; case SUCESSO: if (DEBUG) printf("Comando executado com sucesso.\n"); break; case TAM_ARQUIVO: printf("TAM_ARQUIVO\n"); unsigned long int size; size = ((pacote.dados[3] << 24)| (pacote.dados[4] << 16)); size |= ( (pacote.dados[5] << 8 ) | (pacote.dados[6])); // Estou assumindo que tem espaço disponível. // TODO responde um nack se não tiver espaço disponivel, integrar com a função da nicolly. monta_pacote(NULL, 0, 0, SUCESSO, &resposta); envia_pacote(sockfd, resposta, 1); break; case DADOS: fwrite(pacote.dados+3, 1, tam, fp); monta_pacote(NULL, 0, 0, ACK, &resposta); envia_pacote(sockfd, resposta, 1); break; case FIM_DADOS: fclose(fp); break; case ACK: break; case MOSTRA_NA_TELA: // Caso o usuário envie algum arquivo com terminador de string, o // melhor é imprimir num laço for (i=0; i<tam; i++) printf("%c", pacote.dados[3+i]); monta_pacote(NULL, 0, 0, ACK, &resposta); envia_pacote(sockfd, resposta, 1); break; case FIM_TEXTO: // Finaliza o mostra na tela. printf("\n"); break; case CRIA_ARQ: // Esse é o pacote que envio antes dos de tipo dados // Para criar um arquivo com o nome especificado. fp = fopen(pacote.dados+3, "w"); monta_pacote(NULL, 0, 0, ACK, &resposta); envia_pacote(sockfd, resposta, 1); break; } return tipo; }