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>