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>
References:  <CAJP25sPv9FvWjm0125ix0iDm18nZfAFO_O-0MWz6PZ=UdwypKw@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
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 =3D /* 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 =3D 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 =3D fork();
	/* Error handling here */

	if (child =3D=3D 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




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