IDMS : Weekly status report #2 of 14

David Chisnall theraven at FreeBSD.org
Tue Jul 2 09:23:53 UTC 2013


On 1 Jul 2013, at 19:27, Ambarisha B <b.ambarisha at 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



More information about the soc-status mailing list