IDMS : Weekly status report #2 of 14

Ambarisha B b.ambarisha at gmail.com
Tue Jul 2 11:00:14 UTC 2013


On Tue, Jul 2, 2013 at 5:23 AM, David Chisnall <theraven at freebsd.org> wrote:

> 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.
>

fd isn't the connection, it is the local file. libfetch doesn't take an
open local file descriptor. It returns the remote file stream wrapped as an
fd. The client (fectch program) expects this fd for cryptographic hash
verification etc and when it is done writes the data in that fd into a
local file. This doesn't work for us because that has to be done in the
daemon. I was talking about refactoring that into the daemon and the client
passes the fd of the local file to the daemon.


> 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 */
>         }
> }
>
>
Yes this is what I'm thinking as well. For this, libfetch has to be
modified to accept a connection. Right now, it takes a url and returns the
stream containing the remote file wrapped as an fd. Opening the connection
is abstracted in libfetch.

Cheers
Ambarish


More information about the soc-status mailing list