Example #1
0
void
handle_signal(int signum)
{
    if (signum) {
        fprintf(stderr,
                "WARNING: stopping proxy service [signal %i: %s]\n",
                signum, strsignal(signum));
    }

    /* Attempt to disconnect from everything */
    if (session_data.conn >= 0) {
        destroy_socket(session_data.conn);
    }
    if (session_data.ssock >= 0) {
        destroy_socket(session_data.ssock);
    }
    if (session_data.csock >= 0) {
        destroy_socket(session_data.csock);
    }

    /* Clear the internal buffer */
    memset(session_data.buffer, '\0', MAX_COMMAND_LENGTH);

    /* Re-raise the proper termination signals */
    if (sigismember(&session_data.termination_signals, signum)) {
        sigemptyset(&session_data.signal_action.sa_mask);
        session_data.signal_action.sa_handler = SIG_DFL;
        sigaction(signum, &session_data.signal_action, NULL);
        raise(signum);
    }
}
Example #2
0
void
handle_signal(int signum)
{
  int i;
  putchar('\n');
  if (signum) {
    fprintf(stderr,
            "WARNING: signal caught [code %i: %s]\n",
            signum, strsignal(signum));
  }
  /* Perform a graceful shutdown of the system */
  session_data.caught_signal = signum;

  /* Send SIGTERM to every worker */
  for (i = 0; i < MAX_CONNECTIONS; ++i) {
    if (session_data.thread_data[i].id != (pthread_t)(BANKING_FAILURE)) {
      #ifndef NDEBUG
      fprintf(stderr, "INFO: sending kill signal to worker thread\n");
      #endif
      pthread_kill(session_data.thread_data[i].id, SIGUSR1);
    }
  }

  /* Now collect them */
  for (i = 0; i < MAX_CONNECTIONS; ++i) {
    if (session_data.thread_data[i].id != (pthread_t)(BANKING_FAILURE)) {
      if (pthread_join(session_data.thread_data[i].id, NULL)) {
        session_data.thread_data[i].id = (pthread_t)(BANKING_FAILURE);
        fprintf(stderr, "ERROR: failed to collect worker thread\n");
      } else {
        session_data.thread_data[i].id = (pthread_t)(BANKING_SUCCESS);
        #ifndef NDEBUG
        fprintf(stderr, "INFO: collected worker thread\n");
        #endif
      }
    }
  }

  /* Do remaining housekeeping */
  gcry_pthread_mutex_destroy((void **)(&session_data.accept_mutex));
  gcry_pthread_mutex_destroy((void **)(&session_data.keystore_mutex));
  destroy_socket(session_data.sock);
  /* TODO remove shared memory code */
  shutdown_crypto(old_shmid(&i));
  if (shmctl(i, IPC_RMID, NULL)) {
    fprintf(stderr, "WARNING: unable to remove shared memory segment\n");
  }
  destroy_db(BANKING_DB_FILE, session_data.db_conn);

  /* Re-raise proper signals */
  if (signum == SIGINT || signum == SIGTERM) {
    sigemptyset(&session_data.signal_action.sa_mask);
    session_data.signal_action.sa_handler = SIG_DFL;
    sigaction(signum, &session_data.signal_action, NULL);
    raise(signum);
  }
}
Example #3
0
void shutdown_socket(int unused __attribute__((__unused__))) {
    sock_deallocated = 1;
    if (sock) {
        printf("Closing connection gracefully...\n");
        close_connection(sock);
        sleep(3);
        destroy_socket(sock);
        exit(0);
    }
}
Example #4
0
void us_mfa::shutdown() {
	for (ifid_socket_map::iterator i = m_ifid_socket.begin(); i != m_ifid_socket.end(); i++) {
		raw_socket *sock = i->second;
		m_ifid_socket.erase(i);
		destroy_socket(sock);
		delete sock;
	}

	g_mrd->register_source_discovery("data-plane", 0);
}
Example #5
0
int main(int argc, char *argv[])
{
    SOCKET sock = create_socket();

    if (sock != INVALID_SOCKET)
    {
        if (connect_socket(&sock, IP_ADDR, PORT_NO, 10))
        {
            char buffer[256] = {0};
            int n;

            keyboard_read("Please enter the message: ", buffer, 255);

            n = send_socket(&sock, buffer, strlen(buffer));

            if (n >= 0)
            {
                memset((void*) buffer, 0, 256);
                n = recv_socket(&sock, buffer, 256);

                if (n >= 0)
                {
                    printf("%s\n", buffer);
                }
                else
                {
                    puts("ERROR reading from socket");
                }
            }
            else
            {
                puts("ERROR writing to socket");
            }
        }
        else
        {
            puts("ERROR connecting");
        }

        disconnect_socket(&sock);
    }
    else
    {
        puts("ERROR opening socket");
    }

    destroy_socket(&sock);

    return 0;
}
void zmq::socket_base_t::check_destroy ()
{
    //  If the object was already marked as destroyed, finish the deallocation.
    if (destroyed) {

        //  Remove the socket from the reaper's poller.
        poller->rm_fd (handle);

        //  Remove the socket from the context.
        destroy_socket (this);

        //  Notify the reaper about the fact.
        send_reaped ();

        //  Deallocate.
        own_t::process_destroy ();
    }
}
Example #7
0
int main(int argc, char *argv[])
{
    SOCKET sockfd = create_socket();

    if (sockfd != INVALID_SOCKET)
    {
        if (bind_socket(&sockfd, PORT_NO, 10))
        {
            SOCKET sockets[MAX_SOCKETS] = {INVALID_SOCKET};
            int opened_sockets = 0;

            while (1)
            {
                int idx, max;
				
                if (opened_sockets < MAX_SOCKETS)
                {
                    SOCKET new_sockfd = wait_connection(&sockfd);

                    if (new_sockfd != INVALID_SOCKET)
                    {
                        sockets[opened_sockets++] = new_sockfd;
                    }
                    else if (WSAGetLastError() != WSAETIMEDOUT)
                    {
                        //printf("ERROR waiting\n");
                    }
                }

                for (idx = 0, max = opened_sockets; idx < max; idx++)
                {
                    if (sockets[idx] != INVALID_SOCKET)
                    {
                        if (do_processing(&sockets[idx]) < 0)
                        {
							printf("Disconnecting...\n");
							disconnect_socket(&sockets[idx]);
							sockets[idx] = sockets[opened_sockets-1];
							sockets[opened_sockets-1] = INVALID_SOCKET;
							opened_sockets--;
                        }
                    }
                }
            }
        }
        else
        {
            perror("ERROR binding");
        }

        disconnect_socket(&sockfd);
    }
    else
    {
        perror("ERROR opening socket");
    }

    destroy_socket(&sockfd);

    return 0;
}
Example #8
0
void *
handle_client(void * arg)
{
  struct thread_data_t * datum = (struct thread_data_t *)(arg);
  /* Fetch the ID from the argument */
  #ifndef NDEBUG
  fprintf(stderr, "[thread %lu] INFO: worker started\n", datum->id);
  #endif

  /* Worker thread signal handling is unique */
  sigaction(SIGUSR1, datum->signal_action, NULL);
  sigaction(SIGUSR2, datum->signal_action, NULL);

  /* As long as possible, grab up whatever connection is available */
  while (!session_data.caught_signal && !datum->caught_signal) {
    /* Ensure only one worker accepts the next client */
    gcry_pthread_mutex_lock((void **)(&session_data.accept_mutex));
    datum->sock = accept(session_data.sock,
                         (struct sockaddr *)(&datum->remote_addr),
                         &datum->remote_addr_len);
    gcry_pthread_mutex_unlock((void **)(&session_data.accept_mutex));
    if (datum->sock >= 0) {
      #ifndef NDEBUG
      fprintf(stderr,
              "[thread %lu] INFO: worker connected to client\n",
              datum->id);
      #endif
      /* Receive a "hello" message from the client */
      recv_message(&datum->buffet, datum->sock);
      /* Decrypt it with the default key */
      decrypt_message(&datum->buffet, keystore.key);
      /* Verify it is an authentication request */
      if (strncmp(datum->buffet.tbuffer,
                  AUTH_CHECK_MSG, sizeof(AUTH_CHECK_MSG))) {
        /* Respond with nonce (misdirection) */
        gcry_create_nonce(datum->buffet.pbuffer, MAX_COMMAND_LENGTH);
        encrypt_message(&datum->buffet, keystore.key);
        send_message(&datum->buffet, datum->sock);
      } else {
        /* Request a session key */
        gcry_pthread_mutex_lock((void **)(&session_data.keystore_mutex));
        #ifndef NDEBUG
        print_keystore(stderr, "before request");
        #endif
        request_key(&datum->credentials.key);
        #ifndef NDEBUG
        print_keystore(stderr, "after request");
        #endif
        gcry_pthread_mutex_unlock((void **)(&session_data.keystore_mutex));
        /* Encrypted it using the default key */
        salt_and_pepper((char *)(datum->credentials.key), NULL,
                        &datum->buffet);
        encrypt_message(&datum->buffet, keystore.key);
        send_message(&datum->buffet, datum->sock);
        clear_buffet(&datum->buffet);
        /* Repeatedly poll for message streams */
        while (handle_stream(datum) == BANKING_SUCCESS);
        /* Revoke the session key */
        gcry_pthread_mutex_lock((void **)(&session_data.keystore_mutex));
        #ifndef NDEBUG
        print_keystore(stderr, "before revoke");
        #endif
        revoke_key(&datum->credentials.key);
        #ifndef NDEBUG
        print_keystore(stderr, "after revoke");
        #endif
        gcry_pthread_mutex_unlock((void **)(&session_data.keystore_mutex));
      }
      /* Cleanup (disconnect) */
      #ifndef NDEBUG
      fprintf(stderr,
              "[thread %lu] INFO: worker disconnected from client\n",
              datum->id);
      #endif
      clear_buffet(&datum->buffet);
      destroy_socket(datum->sock);
      datum->sock = BANKING_FAILURE;
    } else {
      fprintf(stderr,
              "[thread %lu] ERROR: worker unable to connect\n",
              datum->id);
    }
  }

  /* Teardown */
  handle_interruption(0);
  return NULL;
}
static int destory_outstream_handle_http(struct cdx_stream_info *stm_info)
{
	destroy_socket(stm_info->fd_desc.fd);
	return 0;
}
Example #10
0
int
main(int argc, char ** argv)
{
    ssize_t received, sent, bytes;
    struct sigaction old_signal_action;

    /* Input sanitation */
    if (argc != 3) {
        fprintf(stderr, "USAGE: %s listen_port bank_port\n", argv[0]);
        return EXIT_FAILURE;
    }

    /* Capture SIGINT and SIGTERM */
    memset(&session_data.signal_action, '\0', sizeof(struct sigaction));
    sigfillset(&session_data.signal_action.sa_mask);
    session_data.signal_action.sa_handler = &handle_signal;
    sigemptyset(&session_data.termination_signals);
    sigaction(SIGINT, NULL, &old_signal_action);
    if (old_signal_action.sa_handler != SIG_IGN) {
        sigaction(SIGINT, &session_data.signal_action, NULL);
        sigaddset(&session_data.termination_signals, SIGINT);
    }
    sigaction(SIGTERM, NULL, &old_signal_action);
    if (old_signal_action.sa_handler != SIG_IGN) {
        sigaction(SIGTERM, &session_data.signal_action, NULL);
        sigaddset(&session_data.termination_signals, SIGTERM);
    }

    /* Socket initialization */
    if ((session_data.csock = init_client_socket(argv[2])) < 0) {
        fprintf(stderr, "ERROR: unable to connect to server\n");
        return EXIT_FAILURE;
    }
    if ((session_data.ssock = init_server_socket(argv[1])) < 0) {
        fprintf(stderr, "ERROR: unable to start server\n");
        destroy_socket(session_data.csock);
        return EXIT_FAILURE;
    }

    /* Provide a dumb echo tunnel service TODO send/recv threads */
    while (!handle_connection(session_data.ssock, &session_data.conn)) {
        session_data.mode = A2B;
        session_data.count = 0;
        while (!handle_relay(&received, &sent)) {
            /* Report leaky transmissions */
            if (sent != received) {
                bytes = sent - received;
                if (bytes < 0) {
                    bytes = -bytes;
                }
                fprintf(stderr, "ERROR: %li byte(s) lost\n", (long)(bytes));
            }
            /* NOTE: modality is swapped after relay */
            if (session_data.mode == A2B) {
                fprintf(stderr,
                        "INFO: server sent message [id: %08i]\n",
                        session_data.count);
            }
            if (session_data.mode == B2A) {
                fprintf(stderr,
                        "INFO: client sent message [id: %08i]\n",
                        session_data.count);
            }
#ifndef NDEBUG
            /* Report entire transmission */
            hexdump(stderr, session_data.buffer, MAX_COMMAND_LENGTH);
#endif
        }
        time(&session_data.terminated);
        fprintf(stderr, "INFO: tunnel closed [%i msg / %li sec]\n",
                session_data.count,
                (long)(session_data.terminated - session_data.established));
        /* Disconnect from defunct clients */
        destroy_socket(session_data.conn);
        /* Re-establish with the server TODO should this be necessary? */
        destroy_socket(session_data.csock);
        session_data.csock = init_client_socket(argv[2]);
    }

    /* Teardown */
    handle_signal(0);
    return EXIT_SUCCESS;
}
Example #11
0
int main(int argc, char *argv[])
{
	WSADATA wsaData;
	  // Initialize Winsock
    int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed with error: %d\n", iResult);
        return 1;
    }
    SOCKET sockfd = create_socket();

    if (sockfd != INVALID_SOCKET)
    {
        if (bind_socket(&sockfd, PORT_NO, 10))
        {
            SOCKET sockets[MAX_SOCKETS] = {INVALID_SOCKET};
            int opened_sockets = 0;

            while (1)
            {
                int idx, max;
                if (opened_sockets < MAX_SOCKETS)
                {
                    SOCKET new_sockfd = wait_connection(&sockfd);

                    if (new_sockfd != INVALID_SOCKET)
                    {
                        sockets[opened_sockets++] = new_sockfd;
                    }
                    //else if (errno != WSAETIMEDOUT)
                    {
                        //puts("ERROR waiting");
                    }
                }

                for (idx = 0, max = opened_sockets; idx < max; idx++)
                {
                    if (sockets[idx] != INVALID_SOCKET)
                    {
                        if (do_processing(&sockets[idx])==-1)
                        {
                            if (errno != WSAETIMEDOUT)
                            {
                                printf("Disconnecting...\n");
                                disconnect_socket(&sockets[idx]);
                                sockets[idx] = sockets[opened_sockets-1];
                                sockets[opened_sockets-1] = INVALID_SOCKET;
                                opened_sockets--;
                            }
                        }
                    }
                }
            }
        }
        else
        {
            printf("ERROR binding\n");
        }

        disconnect_socket(&sockfd);
    }
    else
    {
        printf("ERROR opening socket\n");
    }

    destroy_socket(&sockfd);

    return 0;
}
Example #12
0
int main(int argc, char *argv[])
{
    SOCKET sock = create_socket(), sockets[MAX_CLIENT] = {INVALID_SOCKET};
	int num_clients = 0;
	
	//cria e conecta o socket
	if(sock != INVALID_SOCKET)
    {
        if(bind_socket(&sock, PORT_NO) == SOCKET_ERROR)
		{
			printf("ERROR binding\n");
			exit(1);
		}
            
		else
		{
			listen(sock, MAX_CLIENT);
			printf("Servidor iniciado.\n");
		}
    }
    else
	{
		printf("ERROR opening socket");
		exit(1);
	}
	
	//aceita conexões
	
	puts("Esperando por conexoes...");
	
	while (1)
	{
		int i, max;
		if (num_clients < MAX_CLIENT)
		{
			SOCKET new_sockfd = wait_connection(&sock);

			if(new_sockfd != INVALID_SOCKET)
			{
				sockets[num_clients++] = new_sockfd;
			}
			else if (WSAGetLastError() != WSAETIMEDOUT)
			{
				printf("ERROR waiting\n");
			}
		}

		for (i = 0, max = num_clients; i < max; i++)
		{
			if (sockets[i] != INVALID_SOCKET)
			{
				if (!do_processing(&sockets[i]))
				{
					if (WSAGetLastError() != WSAETIMEDOUT)
					{
						printf("Disconnecting...\n");
						disconnect_socket(&sockets[i]);
						sockets[i] = sockets[num_clients-1];
						sockets[num_clients-1] = INVALID_SOCKET;
						num_clients--;
					}
				}
			}
		}
	}
	
	disconnect_socket(&sock);
    destroy_socket(&sock);

    return 0;
}