void dispatcher_core(void *inisock)
{
  int sockval;

  signal(&dispatcher_sigusr1, SIGUSR1);

  openlog ("IRCDISPATCHER", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL3);
    
  if (!daemon_on && initiate_dispatcher(*inisock) == ERR) {
    syslog(LOG_ERR, "Error intiating dispatcher.");
    pthread_exit(ERR);
  }
  
  while (has_next(_connections)) {
    if (extract_connection(_connections, &sockval) == ERR) {
      syslog(LOG_ERR, "Error extrayendo conexión");
      return;
    }
    syslog(LOG_INFO, "Escuchando conexión %d", sockval);
    listen_connection(sockval);
    
  }
    
  stop_dispatcher();
}
Ejemplo n.º 2
0
void * server_loop(void * arg) {
    int listener_fd;
	int fdmax;
	fd_set master;   // master file descriptor list
	fd_set read_fds; // tmp file descriptor list for select
	int i, j;
	pthread_t connector, receiver;

	FD_ZERO(&master);    // clear the master and temp sets
	FD_ZERO(&read_fds);

    // create socket and listen on it
	listener_fd = listen_connection(PORT_1);

    FD_SET(listener_fd, &master);

	fdmax = listener_fd;

	while(1) {
	    read_fds = master; // copy it
		if (select(fdmax + 1, &read_fds, NULL, NULL, NULL) == -1 ) {
            perror("select() fails");
			exit(4);
		}
		// run through the existing connections looking for data to read
		for (i = 0; i <= fdmax; i++) {
			if (FD_ISSET(i, &read_fds)) {
				if (i == listener_fd) {
					// getting new incoming connection
					accept_connection(listener_fd, &fdmax, &master);
				} else {
					char* buffer = malloc(sizeof(Message_t));	
					memset (buffer, 0, sizeof(Message_t));		
					// handling data from client
					int bytesRead = datalink_recv(i, buffer);
					Message_t* msg = (Message_t*)buffer;
					// read the application header
					switch (msg->type) {
					case REMOTE_SHUTDOWN_MSG:
						close(i);
						FD_CLR(i, &master);
						break;
					case CHAT_MSG:
						printf("%s\n", msg->data); // print chat text
						break;
					case TRANSFER_MSG:
						store(msg, bytesRead);
						break;
					}
				}
			}
		}
	}
	return NULL;
}