From owner-freebsd-current Sat Feb 19 1:53:21 2000 Delivered-To: freebsd-current@freebsd.org Received: from fw.wintelcom.net (ns1.wintelcom.net [209.1.153.20]) by hub.freebsd.org (Postfix) with ESMTP id A646337BBA5 for ; Sat, 19 Feb 2000 01:53:17 -0800 (PST) (envelope-from bright@fw.wintelcom.net) Received: (from bright@localhost) by fw.wintelcom.net (8.9.3/8.9.3) id CAA15883 for current@freebsd.org; Sat, 19 Feb 2000 02:21:49 -0800 (PST) Date: Sat, 19 Feb 2000 02:21:49 -0800 From: Alfred Perlstein To: current@freebsd.org Subject: "Fixing" init. Message-ID: <20000219022149.N21720@fw.wintelcom.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Mailer: Mutt 1.0.1i Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG I remeber being a newbie and getting burned by the need to explicitly turn a line 'off' in my /etc/ttys file instead of simply deleting it. This fixes it using a trivial mark then collect sweep. Can a couple people take a look? I'd like to get it into 4.0 because it seems to follow POLA better. "hey i deleted and HUP'd but init keeps spawing them!" thanks, -Alfred Index: init.c =================================================================== RCS file: /home/ncvs/src/sbin/init/init.c,v retrieving revision 1.37 diff -u -u -r1.37 init.c --- init.c 1999/11/22 04:23:09 1.37 +++ init.c 2000/02/19 13:53:52 @@ -156,6 +156,7 @@ char *se_window_argv_space; /* pre-parsed argument array space */ char **se_window_argv; /* pre-parsed argument array */ char *se_type; /* default terminal type */ + int se_collect; /* flag for garbage collection */ struct init_session *se_prev; struct init_session *se_next; } session_t; @@ -1330,7 +1331,7 @@ } /* - * This is an n-squared algorithm. We hope it isn't run often... + * This is an (n*2)+(n^2) algorithm. We hope it isn't run often... */ state_func_t clean_ttys() @@ -1344,6 +1345,14 @@ if (! sessions) return (state_func_t) multi_user; + /* + * mark all sessions for death, + * as we find or create new ones they'll be marked as keepers, + * nuke all the ones not found in /etc/ttys + */ + for (sp = sessions; sp != NULL; sp = sp->se_next) + sp->se_collect = 1; + devlen = sizeof(_PATH_DEV) - 1; while ((typ = getttyent()) != NULL) { ++session_index; @@ -1353,6 +1362,8 @@ break; if (sp) { + /* we want this one to live */ + sp->se_collect = 0; if (sp->se_index != session_index) { warning("port %s changed utmp index from %d to %d", sp->se_device, sp->se_index, @@ -1402,6 +1413,18 @@ } endttyent(); + + /* + * sweep through and kill all deleted sessions + * (ones who's /etc/ttys line was deleted) + */ + for (sp = sessions; sp != NULL; sp = sp->se_next) { + /* if the gc flag hasn't been cleared, nuke it. */ + if (sp->se_collect == 1) { + sp->se_flags |= SE_SHUTDOWN; + kill(sp->se_process, SIGHUP); + } + } return (state_func_t) multi_user; } To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message