Exemplo n.º 1
0
int main(int argc, char** argv) {
	
	// maximum length = 512 (bytes)
	char *cmdLine;
	
	if (argc == 2) {
		int f_fd = open(argv[1], O_RDONLY | O_RDWR);
		if (f_fd == -1) {
			write(STDERR_FILENO, ERROR_MESSAGE, sizeof(ERROR_MESSAGE));
			return 0;
		}
		int ori_std_fd = STDIN_FILENO;
		dup2(f_fd, STDIN_FILENO);
		close(f_fd);
		
		int readState;
		while ((readState = readCmdLine(&cmdLine, 1)) != EOF) {
			printf("\n");
			if (readState == 1) {
				write(STDERR_FILENO, ERROR_MESSAGE, sizeof(ERROR_MESSAGE));
				free(cmdLine);
				continue;
			}
			coreFunc(cmdLine);
		}
			
		dup2(ori_std_fd, STDIN_FILENO);
		close(ori_std_fd);
	}
	
	else {
		while (1) {
			// read the command line in
			write(STDOUT_FILENO, PROMPT, sizeof(PROMPT));
			if (readCmdLine(&cmdLine, 0) == 1) {
				write(STDERR_FILENO, ERROR_MESSAGE, sizeof(ERROR_MESSAGE));
				free(cmdLine);
				continue;
			}
			coreFunc(cmdLine);
		}
	}
	
	return 0;
}
Exemplo n.º 2
0
void * SelecionaDescritores(void *args) {
	
	// Indica se o socket com o nó principal esta ativo.
	bool flagSockConectado = false;

	// Sockets a serem manipulados.
	int sockfd = -1;
	int accfd = -1;
	int listenfd = -1;
	
	// Porta e ip do servidor principal.
	int portaConnect;
	char servidor[TAM_STR_IP + 1];
	
	// Ponteiro p/ argumentos.
	TpArgumento * argumentos;
	
	char maquina[MAX_CANON];
	
	//Variaveis necessarias para o uso de "select".
	//int	i;
	//int	maxi;
	int	nready;
	int	peerfd;			//Armazena temporariamente o descritor que estah sendo checado.

	// Inicializa variaveis.
	
	argumentos = (TpArgumento *)args;
	
	listenfd = argumentos->listenfd;
	portaConnect = argumentos->portaConnect; // Se for -1 eh pq eh um noh principal
	strcpy(servidor, argumentos->ipConnect); // Se for NULL eh pq eh um noh principal
	
	maxfd = listenfd;			// Valor inteiro do maior descritor utilizado. Inicialmente soh temos o listenfd
	//maxi = -1;
	
	FD_ZERO(&allset);		// Zera todos os bits do set de descritores que serao checados
	FD_SET(listenfd, &allset);	// Seta o bit do listenfd, ou seja, coloca listenfd no set de descritores q sera usado por "select"
	
	FD_SET(fileno(stdin), &allset);
	if(fileno(stdin) > maxfd)
		maxfd = fileno(stdin);	
	
	if(!DadosAplicacao.principal) {
	
		puts("Entrou como naum principal");
		
		while((sockfd = u_connect(portaConnect, servidor)) == -1) {
			sleep(1);
			puts("Tentando conectar no peer principal...");
		}
		
		DadosAplicacao.sockPrincipalConectado = sockfd;
		if(sockfd >= 0) {
				
				FD_SET(sockfd, &allset);		// Utiliza-se esse socket para falar com o noh principal	
				if(sockfd > maxfd)
					maxfd = sockfd;
				
				insereTabelaSocket(sockfd);
					
				flagSockConectado = true;
		}
		
	}
	
	// 'zSeta' os TIMER's.
	SetTimer( DadosAplicacao.intervaloHello, TIMER_HELLO, 0 );
	
	for(;;) {
		
		#ifdef DEBUG
		fprintf(stdout, "\nInicio do FOR\n");
		fprintf(stdout, "SockPrincipal: %d\n\n\n", DadosAplicacao.sockPrincipalConectado);
		#endif
		
		if(DadosAplicacao.principal && (DadosAplicacao.sockPrincipalConectado != -1) && (!flagSockConectado)) {
			
			sockfd = DadosAplicacao.sockPrincipalConectado;	
			
			if(sockfd >= 0) {
				
				FD_SET(sockfd, &allset);		// Utiliza-se esse socket para falar com o noh principal	
				if(sockfd > maxfd)
					maxfd = sockfd;
				
				insereTabelaSocket(sockfd);
					
				flagSockConectado = true;
			}
		}
		
		// Seta o conjunto de descritores que serah checado para eventos do tipo "read"
		rset = allset;
		
		#ifdef DEBUG
		if(RetornaTimer() == NULL)	fprintf(stdout, "Timer NULL\n");
		else	imprimeTimer();
		#endif
		
		//printf("\nANTES DO SELECT:\n");
		//printf("nready: %d\terrno: %d(%d)\n\n", nready, errno, EINTR);
		
		// Retorna o numero de sockets prontos ou zero caso seja um evento de timeout.
		while(((nready = select(maxfd + 1, &rset, NULL, NULL, RetornaTimer()) ) == -1) && (errno == EINTR));
		
		//printf("\n-----> SELECT <-----\n");
		
		// Caso select retorne -1 e o tipo de erro naum seja interrupcao
		if( nready == -1 ) {
			printf("\n-----> ERRO SELECT <-----\n");
			puts(strerror(errno));
			exit(1);
		}
		
		//*********************************
		// TRATA EVENTO DE TIMEOUT
		//*********************************
		
		if(nready == 0) {
//			printf("\n-----> TIMER <-----\n");
			#ifdef DEBUG
				puts("Vou chamar o trataTimer");
			#endif
			
			trataTimer();
		}
		
		//*********************************
		// TRATA PEDIDOS DE CONEXOES
		//*********************************
		
		if(FD_ISSET(listenfd, &rset))
		{
			printf("\n-----> CONEXAO <-----\n");
			//fprintf(stdout, "*** Listen ***\n");
			if((accfd = u_accept(listenfd, maquina)) >= 0)
			{
				puts("Conectou");
				insereTabelaSocket(accfd);
			}
			else{
					// TODO  Accept deu erro - TRATAR
			}
			
			FD_SET(accfd, &allset); 	// Seta o bit para o novo descritor no set de descritores q estao sendo tratados por "select"
			
			if(accfd > maxfd)
				maxfd = accfd;  		// Variavel q sera utilizada na chamada a "select"
			
			if(--nready <= 0)		// Caso o unico descritor setado for o listenfd
				continue;				// Nao ha mais descritores pendentes de serem tratados
		}
		
		
		//**********************************
		// TRATA EVENTOS DE TECLADO
		//**********************************
		
		if( FD_ISSET( fileno(stdin), &rset ) ) {
			printf("\n-----> TECLADO <-----\n");
			
			fprintf(stdout, "*** Teclado ***\n");
			readCmdLine();
		}
		
		//***********************************
		// TRATA RECEBIMENTO DE MENSAGENS
		//***********************************
		
		if((peerfd = encontraTabelaSocketPorRSet(rset)) != -1) {

			//#ifdef DEBUG
	//			printf("\n-----> MENSAGEM <-----\n");
		//		printf("Socket: %d\n", peerfd);
			//#endif
									
			trataRecebimento(peerfd);
			
			if (--nready <= 0 )
				continue;
		}
	}
}