Esempio n. 1
0
void *blockingListener(void *socketid)
{
  int sock = *((int*)socketid);
  int acceptSock;
  while (1) {
		say("Waiting for a client connection\n");
   		
		if ((acceptSock = Xaccept(sock, NULL, NULL)) < 0)
			die(-1, "accept failed\n");

		say("connected\n");
		
		// handle the connection in a new thread
		pthread_t client;
	pthread_create(&client, NULL, recvCmd, (void *)&acceptSock);
	}
	
	Xclose(sock); // we should never reach here!
	return NULL;
}
Esempio n. 2
0
int main(int argc, char **argv)
{
	int sock = -1;
	int peer = -1;
	struct addrinfo hints, *ai;

// FIXME: put signal handlers back into code once Xselect is working
//	signal(SIGINT, handler);
//	signal(SIGTERM, handler);

	configure(argc, argv);
	say("XIA firehose listening on %s\n", name);

	// get our local AD/HID and append the SID to the resultant dag
	memset(&hints, 0, sizeof(hints));
	hints.ai_flags = XAI_XIDSERV;
	int rc = Xgetaddrinfo(NULL, SID, &hints, &ai);
	if (rc != 0)
		die("%s\n", Xgai_strerror(rc));

	sockaddr_x *sa = (sockaddr_x*)ai->ai_addr;
	if ( XregisterName(NAME, sa) < 0)
		die("Unable to register name %s\n", name);

	if ((sock = Xsocket(AF_XIA, SOCK_STREAM, 0)) < 0)
		die("Unable to create socket\n");
	if (Xbind(sock, (struct sockaddr*)sa, sizeof(sockaddr_x)) < 0) {
		Xclose(sock);
		die("Unable to bind to DAG\n");
	}

	while (!timetodie) {

		fd_set fds;
		FD_ZERO(&fds);
		FD_SET(sock, &fds);

		struct timeval tv;
		tv.tv_sec = 2;
		tv.tv_usec = 0;
		if ((rc = Xselect(sock + 1, &fds, NULL, NULL, &tv)) < 0) {
			printf("select failed\n");
			break;
	
		} else if (rc == 0) {
			// timed out, try again
			continue;
	
		} else if (!FD_ISSET(sock, &fds)) {
			// this shouldn't happen!
			printf("something is really wrong, exiting\n");
			break;
		}

		peer = Xaccept(sock, NULL, NULL);
		if (peer < 0) {
			printf("Xaccept failed\n");
			break;
		}

		say("peer connected...\n");
		pid_t pid = fork();

		if (pid == -1) { 
			printf("fork failed\n");
			break;
		}
		else if (pid == 0) {
			process(peer);
			exit(0);
		}
		else {
			// use regular close so we don't rip out the Xsocket state from under the child
			close(peer);
		}
	}

	say("firehose exiting\n");
	Xclose(sock);
	return 0;
}
Esempio n. 3
0
void echo_stream()
{
	int acceptor, sock;

	if (signal(SIGCHLD, reaper) == SIG_ERR) {
		die(-1, "unable to catch SIGCHLD");
	}
	say("Stream service started\n");

	/* Prepare XSSL context and get SID (based on RSA key) */
	XSSL_CTX *ctx = XSSL_CTX_new();
	if (ctx == NULL) {
		die(-5, "Unable to create new XSSL_CTX\n");
	}
	char *SID = SID_from_keypair(ctx->keypair);

	/* Prepare listen socket, binding to generated SID */
	if ((acceptor = Xsocket(AF_XIA, SOCK_STREAM, 0)) < 0)
		die(-2, "unable to create the stream socket\n");

	struct addrinfo *ai;
	if (Xgetaddrinfo(NULL, SID, NULL, &ai) != 0)
		die(-1, "getaddrinfo failure!\n");

	Graph g((sockaddr_x*)ai->ai_addr);

	sockaddr_x *sa = (sockaddr_x*)ai->ai_addr;

	printf("\nStream DAG\n%s\n", g.dag_string().c_str());

    if (XregisterName(STREAM_NAME, sa) < 0 )
    	die(-1, "error registering name: %s\n", STREAM_NAME);
	say("registered name: \n%s\n", STREAM_NAME);

	if (Xbind(acceptor, (struct sockaddr *)sa, sizeof(sockaddr_x)) < 0) {
		die(-3, "unable to bind to the dag\n");
	}

	Xlisten(acceptor, 5);

	while (1) {

		say("Xsock %4d waiting for a new connection.\n", acceptor);
		if ((sock = Xaccept(acceptor, NULL, 0)) < 0) {
			warn("Xsock %d accept failure! error = %d\n", acceptor, errno);
			// FIXME: should we die here instead or try and recover?
			continue;
		}

		say ("Xsock %4d new session\n", sock);

		pid_t pid = fork();

		if (pid == -1) {
			die(-1, "FORK FAILED\n");

		} else if (pid == 0) {
			process(sock, ctx);
			exit(0);

		} else {
			// FIXME: we need to close the socket in the main process or the file
			// descriptor limit will be hit. But if Xclose is called, the connection
			// is torn down in click as well keeping the child process from using it.
			// for now use a regular close to shut it here without affecting the child.
			close(sock);
		}
	}

	Xclose(acceptor);
	XSSL_CTX_free(ctx);
	free(SID);
}
Esempio n. 4
0
void echo_stream()
{
	int acceptor, sock;
	char sid_string[strlen("SID:") + XIA_SHA_DIGEST_STR_LEN];

	if (signal(SIGCHLD, reaper) == SIG_ERR) {
		die(-1, "unable to catch SIGCHLD");
	}

	say("Stream service started\n");

	if ((acceptor = Xsocket(AF_XIA, SOCK_STREAM, 0)) < 0)
		die(-2, "unable to create the stream socket\n");

	// Generate an SID to use
	if(XmakeNewSID(sid_string, sizeof(sid_string))) {
		die(-1, "Unable to create a temporary SID");
	}

	struct addrinfo hints, *ai;
	bzero(&hints, sizeof(hints));
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_family = AF_XIA;
	if (Xgetaddrinfo(NULL, sid_string, &hints, &ai) != 0)
		die(-1, "getaddrinfo failure!\n");

	Graph g((sockaddr_x*)ai->ai_addr);

	sockaddr_x *sa = (sockaddr_x*)ai->ai_addr;

	printf("\nStream DAG\n%s\n", g.dag_string().c_str());

    if (XregisterName(STREAM_NAME, sa) < 0 )
    	die(-1, "error registering name: %s\n", STREAM_NAME);
	say("registered name: \n%s\n", STREAM_NAME);

	if (Xbind(acceptor, (struct sockaddr *)sa, sizeof(sockaddr_x)) < 0) {
		die(-3, "unable to bind to the dag\n");
	}

	Xlisten(acceptor, 5);

	while (1) {

		say("Xsock %4d waiting for a new connection.\n", acceptor);
		sockaddr_x sa;
		socklen_t sz = sizeof(sa);

		if ((sock = Xaccept(acceptor, (sockaddr*)&sa, &sz)) < 0) {
			warn("Xsock %d accept failure! error = %d\n", acceptor, errno);
			// FIXME: should we die here instead or try and recover?
			continue;
		}

		Graph g(&sa);
		say ("Xsock %4d new session\n", sock);
		say("peer:%s\n", g.dag_string().c_str()); 

		pid_t pid = Xfork();

		if (pid == -1) {
			die(-1, "FORK FAILED\n");

		} else if (pid == 0) {
			// close the parent's listening socket
			Xclose(acceptor);

			process(sock);
			exit(0);

		} else {
			// close the child's socket
			Xclose(sock);
		}
	}

	Xclose(acceptor);
}