Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 11 Aug 2002 19:46:21 -0700 (PDT)
From:      David Xu <bsddiy@yahoo.com>
To:        "Andrey A. Chernov" <ache@nagual.pp.ru>
Cc:        Julian Elischer <julian@elischer.org>, FreeBSD CURRENT <freebsd-current@freebsd.org>
Subject:   Re: cvs commit: src/sys/kern kern_sig.c (fwd)
Message-ID:  <20020812024621.12191.qmail@web20902.mail.yahoo.com>
In-Reply-To: <20020811140248.GA4497@nagual.pp.ru>

next in thread | previous in thread | raw e-mail | index | archive | help

--- "Andrey A. Chernov" <ache@nagual.pp.ru> wrote:
> On Sun, Aug 11, 2002 at 17:41:20 +0400, Andrey A. Chernov wrote:
> > On Sun, Aug 11, 2002 at 06:28:54 -0700, David Xu wrote:
> > > does anyone believe that su behaviours correctly?
> > 
> > I not believe in that first, so why I remove tcsetpgrg() in my initial 
> > commit. It fix suspend/fg, but break stop $$/fg those times. I not test, 
> > is it break stop $$/fg now too (I'll do it a bit later and send result).
> > fork/wait seems to be needed here just for PAM_END.
> 
> Yes, still there. If tcsetpgrp() removed, suspend/fg fixed, but "stop
> $$/fg" kills login shell. It means that neither variant is correct, unless
> there is a kernel bug. To be 100% sure, we need to test su with old
> -current kernel without KSE. Anybody have that thing? I can cvsup early
> kernel sources and build from them, but I don't know exact KSE changes
> data. Other way is to build su statically and test on -stable. I don't 
> have any -stable machines around.
> 
> -- 
> Andrey A. Chernov
> http://ache.pp.ru/

Sorry, Andrey, current su's job control mode does not work under STABLE too,
I have tested, it has same result as under CURRENT. the following piece of 
code does not work under STABLE, it mimics what su is doing in CURRENT 
source tree.

#include <err.h>
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>

int main()
{
        pid_t ret_pid, statusp, child_pid, child_pgrp;
        struct sigaction sa, sa_int, sa_quit, sa_tstp;
        char buf[64];
        char* sargv[3];

        sa.sa_flags = SA_RESTART;
        sa.__sigaction_u.__sa_handler = SIG_IGN;
        sigemptyset(&sa.sa_mask);
        sigaction(SIGINT, &sa, &sa_int);
        sigaction(SIGQUIT, &sa, &sa_quit);
        sigaction(SIGTSTP, &sa, &sa_tstp);

        child_pid = fork();
        switch (child_pid) {
        default:
                while ((ret_pid = waitpid(child_pid, &statusp, WUNTRACED)) != -1) {
                        if (WIFSTOPPED(statusp)) {
                                child_pgrp = tcgetpgrp(1);
                                kill(getpid(), SIGSTOP);
                                tcsetpgrp(1, child_pgrp);
                                kill(child_pid, SIGCONT);
                                statusp = 1;
                                continue;
                        }
                        break;
                }
                if (ret_pid == -1)
                        err(1, "waitpid");
                exit(statusp);
        case -1:
                err(1, "fork");
                exit(1);
        case 0:
                sigaction(SIGINT, &sa_int, NULL);
                sigaction(SIGQUIT, &sa_quit, NULL);
                sigaction(SIGTSTP, &sa_tstp, NULL);
                sargv[0] = "csh";
                sargv[1] = NULL;
                execv("/bin/csh", sargv);
                printf("hi, there!\n");
                break;
        }
        return 0;
}

David



__________________________________________________
Do You Yahoo!?
HotJobs - Search Thousands of New Jobs
http://www.hotjobs.com

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020812024621.12191.qmail>