Subject: Re: [PATCH v4 3/4] maintenance: use launchctl on macOS

From: Derrick Stolee <[email-masked]>
Date: Wed, 18 Nov 2020 13:22:46 -0500

On 11/18/2020 1:45 AM, Eric Sunshine wrote:
> On Tue, Nov 17, 2020 at 4:13 PM Derrick Stolee via GitGitGadget
> <[email-masked]> wrote:
>> +static int launchctl_boot_plist(int enable, const char *filename, const char *cmd)
>> +{
>> +       child.no_stderr = 1;
>> +       child.no_stdout = 1;
>> +       if (start_command(&child))
>> +               die(_("failed to start launchctl"));
> 
> Did you have any thoughts on the observation I made in a followup
> response[1] during review of v3 in which I suggested that we might be
> able to avoid suppressing stderr (and stdout) here? In particular, the
> idea was that if, in launchctl_schedule_plist(), we do a simple
> existence check for the .plist file and only call
> launchctl_boot_plist(0,...) to `bootout` the .plist file if it exists,
> then we shouldn't need to muck with stderr/stdout suppression. The
> benefit is that if `bootout` fails for some reason, then the user
> would see the (hopefully) meaningful error message emitted `launchctl
> bootout`.
> 
> The same .plist existence check could be done in
> launchctl_remove_plist() before trying to `bootout` the file.

If the file exists but isn't still registered with launchd, then
the bootout command will send output

"<path>.plist: Could not find specified service"

and return a failure code. This output isn't helpful to users,
since we still are in the desired state afterwards.

> Anyhow, such refinement can be done later is desired, so not worth a
> re-roll, but I was curious about your thoughts on the issue.

This pattern of squashing the output even in the successful case
is important for Windows where schtasks sends a line of output for
each task being registered!

I think it would be a reasonable extension to store the error
message for logging or communicating to the user if we actually
need it, but I don't believe we should be piping the output
directly.

Thanks,
-Stolee