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 [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message