On Sat, Nov 17 2018, Klemens Nanni <k...@openbsd.org> wrote:
> On Sun, Nov 11, 2018 at 05:39:52PM +0100, Klemens Nanni wrote:
>> On Sat, Nov 03, 2018 at 09:01:33PM +0100, Klemens Nanni wrote:
>> > Closing stdin makes sense, but I still want to see error messages from
>> > the program I'm running.  Since arbitrary progams can be run, keep both
>> > stdout and stderr open so users get a chance to actually notice program
>> > failure or maybe even use output for good.
>> > 
>> > In a common setup where xidle(1) is started from ~/.xsession, I'd expect
>> > errors to pop up in ~/.xsession-errors.

I think the daemon(3)-like behavior was intended.  On the 3628 lines in
my ~/.xsession-errors, 3566 of them are useless crap from a single
program.

>> This, plus closely related changes:
>> 
>> We should never execute the program unless a new session was
>> created so that the child process does not share the same controlling
>> terminal.

xidle might not have a controlling terminal in the first place, for
example when spawned by my window manager.  You're adding a possible
failure case which might lead to undesirable consequences, eg failure to
lock the X session.  This has to be weighed in.

>> Also, use execvp(3) to search PATH so users don't have to provide full
>> paths any longer. Not sure why this wasn't done in the first place.
>
>> Termination information from wait(2) is not used and irrelevant at this
>> point, so zap `status'.
> New diff with complete "full path" -> "program" changes in the manual
> this time. Shuffling/splitting diffs got a bit messy here, sorry.
>
> I'm running with this on my daily work machines without any problems.
>
> Feedback? OK?
>
> Index: xidle.1
> ===================================================================
> RCS file: /cvs/xenocara/app/xidle/xidle.1,v
> retrieving revision 1.5
> diff -u -p -r1.5 xidle.1
> --- xidle.1   6 Sep 2018 07:21:34 -0000       1.5
> +++ xidle.1   17 Nov 2018 12:11:29 -0000
> @@ -23,7 +23,7 @@
>  .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
>  .\" OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>  .\"
> -.Dd June 20, 2005
> +.Dd $Mdocdate: November 17 2018 $
>  .Dt XIDLE 1
>  .Os
>  .Sh NAME
> @@ -36,7 +36,7 @@
>  .Op Fl delay Ar secs
>  .Op Fl display Ar display
>  .Op Fl no | nw | ne | sw | se
> -.Op Fl program Ar path
> +.Op Fl program Ar program
>  .Op Fl timeout Ar secs
>  .Ek
>  .Sh DESCRIPTION
> @@ -71,9 +71,8 @@ Set the position to one of none, northwe
>  respectively.
>  If no position is specified,
>  the default is northwest.
> -.It Fl program Ar path
> -Specify the full pathname of the program to run on any of the
> -aforementioned events.
> +.It Fl program Ar program
> +Specify the program to run on any of the aforementioned events.
>  Arguments to the program may also be specified, separated by whitespace.
>  If
>  .Fl program
> @@ -110,7 +109,7 @@ and
>  .Fl se
>  options.
>  .It Sy program No (class Sy Program )
> -Specify the full pathname of the program to run; see the
> +Specify the program to run; see the
>  .Fl program
>  option.
>  .It Sy timeout No (class Sy Timeout )
> @@ -129,8 +128,7 @@ Run
>  using the flying bats mode if no activity is detected in 300 seconds or the
>  pointer sits in the southwest corner for more than 5 seconds:
>  .Bd -literal -offset indent
> -$ xidle -delay 5 -sw -program "/usr/X11R6/bin/xlock -mode bat" \e
> -     -timeout 300
> +$ xidle -delay 5 -sw -program "xlock -mode bat" -timeout 300
>  .Ed
>  .Sh SEE ALSO
>  .Xr xlock 1 ,
> Index: xidle.c
> ===================================================================
> RCS file: /cvs/xenocara/app/xidle/xidle.c,v
> retrieving revision 1.8
> diff -u -p -r1.8 xidle.c
> --- xidle.c   11 Nov 2018 16:10:37 -0000      1.8
> +++ xidle.c   17 Nov 2018 12:17:55 -0000
> @@ -94,7 +94,7 @@ static XrmOptionDescRec opts[] = {
>  
>  extern char *__progname;
>  
> -void action(struct xinfo *, char **);
> +void action(struct xinfo *, char *const []);
>  void close_x(struct xinfo *);
>  Bool getres(XrmValue *, const XrmDatabase, const char *, const char *);
>  void    init_x(struct xinfo *, int, int, int);
> @@ -180,19 +180,18 @@ close_x(struct xinfo *xi)
>  
>  
>  void
> -action(struct xinfo *xi, char **args)
> +action(struct xinfo *xi, char *const args[])
>  {
> -     int dumb;
> -
>       switch (fork()) {
>       case -1:
>               err(1, "fork");
>       case 0:
> -             setsid();
> -             execv(*args, args);
> -             exit(1);
> +             if (setsid() == -1)
> +                     err(1, "setsid");
> +             execvp(args[0], args);
> +             err(1, "execvp: %s", args[0]);
>       default:
> -             wait(&dumb);
> +             wait(NULL);
>               XSync(xi->dpy, True);
>               break;
>       }
> @@ -356,8 +355,6 @@ main(int argc, char **argv)
>       if (fd < 0)
>               err(1, _PATH_DEVNULL);
>       dup2(fd, STDIN_FILENO);
> -     dup2(fd, STDOUT_FILENO);
> -     dup2(fd, STDERR_FILENO);
>       if (fd > 2)
>               close(fd);
>  
>

-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to