Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 2 Jul 2013 10:23:46 +0100
From:      David Chisnall <theraven@FreeBSD.org>
To:        Ambarisha B <b.ambarisha@gmail.com>
Cc:        soc-status@FreeBSD.org
Subject:   Re: IDMS : Weekly status report #2 of 14
Message-ID:  <C2E395F2-3026-48E1-8A62-E9BC36F0DFBD@FreeBSD.org>
In-Reply-To: <CAJP25sPv9FvWjm0125ix0iDm18nZfAFO_O-0MWz6PZ=UdwypKw@mail.gmail.com>

index | next in thread | previous in thread | raw e-mail

On 1 Jul 2013, at 19:27, Ambarisha B <b.ambarisha@gmail.com> wrote:

> 3. Refactor the client to give an open fd to the server (instead of
> expecting one, as is the model with libfetch)

Can you explain a bit what this means?  The daemon should be the thing openning the connection.  The forked worker should then pass it to libfetch.  The code in the daemon should look something approximately like this:


struct client_request req;

int IPC_connection_to_clients = /* whatever you're using here, most likely a UNIX domain socket so that you can pass in the fd for the output file from the client. */;

while (wait_for_request(IPC_connection_to_clients, &req) {
	/* URL parsing code goes here. */
	int fd server = connect(...);
	/* Error handling goes here */

	/* You may want to create a pipe here for sending progress messages from the client back to the server */

	/* You may want to queue requests and not start downloading immediately if some bandwidth or number of concurrent downloads quota is reached */

	/* Create the worker */
	pid_t child = fork();
	/* Error handling here */

	if (child == 0)
	{
		/* Now we're in the worker, close any file descriptors that we shouldn't have */
		close(IPC_connection_to_clients);
		close(stdin);
		close(stdout);
		/* Then enter sandboxed mode */
		cap_enter();
		/* Now do the real downloading and exit */
		do_the_real_downloading(server, req.output_file, req.url);
		exit(0);
	}
	else
	{
		/* Close the file descriptors that the worker is using. */
		close(server);
		close(req.output_file);
		/* Probably add child to a list of things that you'll wait for exit signals from in the kqueue call in the wait_for_request part */
	}
}

David



home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?C2E395F2-3026-48E1-8A62-E9BC36F0DFBD>