Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 11 Aug 2002 22:53:15 -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:  <20020812055315.7682.qmail@web20907.mail.yahoo.com>

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

--- David Xu <bsddiy@yahoo.com> wrote:
> 
> --- "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;
> }
> 

following is patch for su, I can type "suspend" and stop $$ without the
problem you described, I have tested it under tcsh and bash, all works 
for me.

--- su.c	Mon Aug 12 13:08:01 2002
+++ su.c.new	Mon Aug 12 13:16:14 2002
@@ -329,10 +329,13 @@
 	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);
+				child_pgrp = getpgid(child_pid);
+				if (tcgetpgrp(1) == getpgrp())
+				{
+					tcsetpgrp(1, child_pgrp);
+					kill(child_pid, SIGCONT);
+				}
 				statusp = 1;
 				continue;
 			}
 


__________________________________________________
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?20020812055315.7682.qmail>