Ejemplo n.º 1
0
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;
    }
}
Ejemplo n.º 2
0
Archivo: servidor.c Proyecto: gvs11/BCC
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);
}
Ejemplo n.º 3
0
Archivo: servidor.c Proyecto: gvs11/BCC
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);
}
Ejemplo n.º 4
0
Archivo: servidor.c Proyecto: gvs11/BCC
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);
		
  	}
}
Ejemplo n.º 5
0
Archivo: servidor.c Proyecto: gvs11/BCC
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);
	}
}
Ejemplo n.º 6
0
Archivo: servidor.c Proyecto: gvs11/BCC
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);
	}		
}
Ejemplo n.º 7
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;
}