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

Reply via email to