take default shell if no program argument is given - scroll - scrollbackbuffer program for st
 (HTM) git clone git://git.suckless.org/scroll
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit e37cb1032aa76478be9955cecece16b37c954cfe
 (DIR) parent f1e7a78ba26a8c12f92afe9434f1e8744e08e378
 (HTM) Author: Jan Klemkow <j.klemkow@wemelug.de>
       Date:   Sun, 12 Apr 2020 00:01:08 +0200
       
       take default shell if no program argument is given
       
       Diffstat:
         M scroll.1                            |       2 +-
         M scroll.c                            |      16 +++++++++++-----
       
       2 files changed, 12 insertions(+), 6 deletions(-)
       ---
 (DIR) diff --git a/scroll.1 b/scroll.1
       @@ -23,7 +23,7 @@
        .Nm
        .Op Fl M
        .Op Fl m Ar size
       -.Ar program
       +.Op program Op arg ...
        .Sh DESCRIPTION
        The
        .Nm
 (DIR) diff --git a/scroll.c b/scroll.c
       @@ -27,6 +27,7 @@
        #include <errno.h>
        #include <fcntl.h>
        #include <poll.h>
       +#include <pwd.h>
        #include <signal.h>
        #include <stdarg.h>
        #include <stdbool.h>
       @@ -369,7 +370,7 @@ jumpdown(char *buf, size_t size)
        
        void
        usage(void) {
       -        die("usage: scroll [-M] [-m mem] <program>");
       +        die("usage: scroll [-M] [-m mem] [program]");
        }
        
        int
       @@ -405,9 +406,6 @@ main(int argc, char *argv[])
                if (isatty(STDOUT_FILENO) == 0)
                        die("stdout it not a tty");
        
       -        if (argc < 1)
       -                usage();
       -
                /* save terminal settings for resetting after exit */
                if (tcgetattr(STDIN_FILENO, &dfl) == -1)
                        die("tcgetattr:");
       @@ -422,7 +420,15 @@ main(int argc, char *argv[])
                if (child == -1)
                        die("forkpty:");
                if (child == 0) {        /* child */
       -                execvp(argv[0], argv);
       +                if (argc >= 1) {
       +                        execvp(argv[0], argv);
       +                } else {
       +                        struct passwd *passwd = getpwuid(getuid());
       +                        if (passwd == NULL)
       +                                die("getpwid:");
       +                        execlp(passwd->pw_shell, passwd->pw_shell, NULL);
       +                }
       +
                        perror("execvp");
                        _exit(127);
                }