]> Zhao Yanbai Git Server - minix.git/commitdiff
Removed PM signon for INET. Now daemonized in /usr/etc/rc.
authorJorrit Herder <jnherder@minix3.org>
Tue, 19 Jul 2005 12:11:11 +0000 (12:11 +0000)
committerJorrit Herder <jnherder@minix3.org>
Tue, 19 Jul 2005 12:11:11 +0000 (12:11 +0000)
SIGTRAP generated in PM (where it belongs / no longer in kernel).
Updated Makefiles: servers are now installed in /usr/sbin.

servers/fs/Makefile
servers/inet/Makefile
servers/init/Makefile
servers/is/Makefile
servers/is/main.c
servers/pm/Makefile
servers/pm/exec.c
servers/pm/main.c
servers/pm/misc.c
servers/pm/mproc.h
servers/pm/signal.c

index bd761c618bb42c666753017c1026139439a96859..6a914f4f03bc29766d80231450fea5c6a5ae7d73 100644 (file)
@@ -25,8 +25,8 @@ $(SERVER):    $(OBJ)
        install -S 512w $@
 
 # install with other servers
-install:       /usr/sbin/servers/$(SERVER)
-/usr/sbin/servers/$(SERVER):   $(SERVER)
+install:       /usr/sbin/$(SERVER)
+/usr/sbin/$(SERVER):   $(SERVER)
        install -o root -cs $? $@       
 
 # clean up local files
index 6e7307861866e040b888efaad99d8114259d92eb..8038feb24b49c4005cd3420cbc9c14a3980c661f 100644 (file)
@@ -28,9 +28,9 @@ all:  inet
 inet:  $(OBJ)
        $(CC) -o $@ $(LDFLAGS) $(OBJ) version.c $(LIBS)
 
-install:       /usr/sbin/servers/inet
+install:       /usr/sbin/inet
 
-/usr/sbin/servers/inet:        inet
+/usr/sbin/inet:        inet
        install -c $? $@
 
 clean:
index 5b19f4e5e12d784e5253052c0ffe46f76dbba0c9..4070c12de1513d45683cc05dc519dbdcf4479027 100644 (file)
@@ -22,8 +22,8 @@ $(SERVER):    $(OBJ)
        install -S 192w $@
 
 # install with other servers
-install:       /usr/sbin/servers/$(SERVER)
-/usr/sbin/servers/$(SERVER):   $(SERVER)
+install:       /usr/sbin/$(SERVER)
+/usr/sbin/$(SERVER):   $(SERVER)
        install -o root -cs $? $@
 
 # clean up local files
index 4e09ef9ba8e7cd70727459951be1053255fef8f5..57031af65de4062e8468db4f4048e4c47ffeeced 100644 (file)
@@ -26,8 +26,8 @@ $(SERVER):    $(OBJ)
 #      install -S 256w $@
 
 # install with other servers
-install:       /usr/sbin/servers/$(SERVER)
-/usr/sbin/servers/$(SERVER):   $(SERVER)
+install:       /usr/sbin/$(SERVER)
+/usr/sbin/$(SERVER):   $(SERVER)
        install -o root -c $? $@
 #      install -o root -cs $? $@
 
index 9312996c61f2370801c9c87f3a04ed296ac105b3..0923f82517208472c3220c3aad1f78af07fd8a12 100644 (file)
@@ -42,6 +42,7 @@ PUBLIC void main(void)
  * sending the reply. The loop never terminates, unless a panic occurs.
  */
     int result;                 
+    sigset_t sigset;
 
     /* Initialize the server, then go to work. */
     init_server();
@@ -53,9 +54,17 @@ PUBLIC void main(void)
         get_work();
 
         switch (callnr) {
-            case NEW_KMESS:
-               result = do_new_kmess(&m_in);
-               break;
+            case SYS_EVENT:
+                sigset = (sigset_t) m_in.NOTIFY_ARG;
+                if (sigismember(&sigset, SIGKMESS)) {
+                    printf("IS proc SIGKMESS\n");
+                   result = do_new_kmess(&m_in);
+               } else if (sigismember(&sigset, SIGTERM)) {
+                    printf("IS proc SIGTERM\n");
+               } else {
+                   report("IS","warning, got unknown signal", NO_NUM);
+               }
+               continue;
             case DIAGNOSTICS:
                result = do_diagnostics(&m_in);
                break;
@@ -103,8 +112,8 @@ PRIVATE void init_server()
   int i, s;
   struct sigaction sigact;
 
-  /* Install signal handler.*/
-  sigact.sa_handler = signal_handler;
+  /* Install signal handler. Ask PM to transform signal into message. */
+  sigact.sa_handler = SIG_MESS;
   sigact.sa_mask = ~0;                 /* block all other signals */
   sigact.sa_flags = 0;                 /* default behaviour */
   if (sigaction(SIGTERM, &sigact, NULL) != OK) 
index 8237e302f85b768f06b64f667ad6910efd775332..af0a0397446ded07a3e7525fdec64ab322c8ae52 100644 (file)
@@ -23,8 +23,8 @@ $(SERVER):    $(OBJ)
        install -S 256w $@
 
 # install with other servers
-install:       /usr/sbin/servers/$(SERVER)
-/usr/sbin/servers/$(SERVER):   $(SERVER)
+install:       /usr/sbin/$(SERVER)
+/usr/sbin/$(SERVER):   $(SERVER)
        install -o root -cs $? $@
 
 # clean up local files
index 4dc867662025010caa675a2e86b64a434a977ca4..e675a426f33f7de9a2bdd192053a397c672d0b97 100644 (file)
@@ -178,6 +178,8 @@ PUBLIC int do_exec()
   rmp->mp_name[PROC_NAME_LEN] = '\0';
   sys_exec(who, new_sp, rmp->mp_flags & TRACED, basename, pc);
 
+  if (rmp->mp_flags & TRACED) check_sig(rmp->mp_pid, SIGTRAP);
+
   return(SUSPEND);             /* no reply, new program just runs */
 }
 
index dfe65511534c010d2f1bfb411bf469b0fc3ffa30..5200ff65d4e651f1d3a184384461d92675ac874d 100644 (file)
@@ -41,9 +41,9 @@ FORWARD _PROTOTYPE( void patch_mem_chunks, (struct memory *mem_chunks,
 PUBLIC void main()
 {
 /* Main routine of the process manager. */
-
   int result, s, proc_nr;
   struct mproc *rmp;
+  sigset_t sigset;
 
   pm_init();                   /* initialize process manager tables */
 
@@ -55,8 +55,11 @@ PUBLIC void main()
         if (call_nr == SYN_ALARM) {
                pm_expire_timers(m_in.NOTIFY_TIMESTAMP);
                result = SUSPEND;               /* don't reply */
-       } else if (call_nr == KSIG_PENDING) {   /* signals pending */
-               (void) ksig_pending();
+       } else if (call_nr == SYS_EVENT) {      /* signals pending */
+               sigset = m_in.NOTIFY_ARG;
+               if (sigismember(&sigset, SIGKSIG)) {
+                       (void) ksig_pending();
+               }
                result = SUSPEND;               /* don't reply */
        }
        /* Else, if the system call number is valid, perform the call. */
@@ -103,7 +106,8 @@ PRIVATE void get_work()
   call_nr = m_in.m_type;       /* system call number */
 
   /* Process slot of caller. Misuse PM's own process slot if the kernel is
-   * calling. The can happen in case of pending kernel signals.
+   * calling. This can happen in case of synchronous alarms (CLOCK) or or 
+   * event like pending kernel signals (SYSTEM).
    */
   mp = &mproc[who < 0 ? PM_PROC_NR : who];
 }
@@ -142,7 +146,6 @@ PRIVATE void pm_init()
   static char core_sigs[] = { SIGQUIT, SIGILL, SIGTRAP, SIGABRT,
                        SIGEMT, SIGFPE, SIGUSR1, SIGSEGV, SIGUSR2 };
   static char ign_sigs[] = { SIGCHLD };
-  register int proc_nr;
   register struct mproc *rmp;
   register char *sig_ptr;
   phys_clicks total_clicks, minix_clicks, free_clicks;
@@ -193,13 +196,23 @@ PRIVATE void pm_init()
 
                /* Set process details found in the image table. */
                rmp = &mproc[ip->proc_nr];      
-               rmp->mp_flags |= IN_USE | DONT_SWAP; 
-               rmp->mp_pid = get_free_pid();
-               rmp->mp_parent = INIT_PROC_NR;
                strncpy(rmp->mp_name, ip->proc_name, PROC_NAME_LEN); 
-               sigfillset(&rmp->mp_ignore);
-               sigfillset(&rmp->mp_sigmask);
+               if (ip->proc_nr == INIT_PROC_NR) {      /* user process */
+                       rmp->mp_pid = INIT_PID;
+                       rmp->mp_parent = PM_PROC_NR;
+                       rmp->mp_flags |= IN_USE; 
+                       sigemptyset(&rmp->mp_ignore);   
+                       rmp->mp_nice = 0;
+               }
+               else {                                  /* system process */
+                       rmp->mp_pid = get_free_pid();
+                       rmp->mp_parent = INIT_PROC_NR;
+                       rmp->mp_flags |= IN_USE | DONT_SWAP | PRIV_PROC; 
+                       sigfillset(&rmp->mp_ignore);
+               }
+               sigemptyset(&rmp->mp_sigmask);
                sigemptyset(&rmp->mp_catch);
+               sigemptyset(&rmp->mp_sig2mess);
 
                /* Get memory map for this process from the kernel. */
                if ((s=get_mem_map(ip->proc_nr, rmp->mp_seg)) != OK)
@@ -217,15 +230,7 @@ PRIVATE void pm_init()
        }
   }
 
-  /* PM and INIT are somewhat special. Override some details. Set signal
-   * handling behaviour for PM, since PM cannot call sigaction() as others.
-   */
-  mproc[INIT_PROC_NR].mp_pid = INIT_PID;
-  mproc[INIT_PROC_NR].mp_nice = 0;
-  mproc[INIT_PROC_NR].mp_parent = PM_PROC_NR;
-  sigemptyset(&mproc[INIT_PROC_NR].mp_ignore);
-  sigemptyset(&mproc[INIT_PROC_NR].mp_sigmask);
-
+  /* PM is somewhat special. Override some details. */ 
   mproc[PM_PROC_NR].mp_pid = PM_PID;
   mproc[PM_PROC_NR].mp_parent = PM_PROC_NR;
 
index 69b825b14776a13262901d25257e65faf572740f..49d3469e65fc1083d2ded9a92c7f8a0c0aa92974 100644 (file)
@@ -183,13 +183,13 @@ PUBLIC int do_getsetpriority()
 
        /* Only support PRIO_PROCESS for now. */
        if(arg_which != PRIO_PROCESS)
-               return EINVAL;
+               return(EINVAL);
 
        if(arg_who == 0)
                rmp_nr = who;
        else
                if((rmp_nr = proc_from_pid(arg_who)) < 0)
-                       return ESRCH;
+                       return(ESRCH);
 
        rmp = &mproc[rmp_nr];
 
@@ -198,18 +198,17 @@ PUBLIC int do_getsetpriority()
                return EPERM;
 
        /* If GET, that's it. */
-
        if(call_nr == GETPRIORITY) {
-               return rmp->mp_nice - PRIO_MIN;
+               return(rmp->mp_nice - PRIO_MIN);
        }
 
        /* Only root is allowed to reduce the nice level. */
        if(rmp->mp_nice > arg_pri && mp->mp_effuid != SUPER_USER)
-               return EACCES;
-
+               return(EACCES);
+       
        /* We're SET, and it's allowed. Do it and tell kernel. */
        rmp->mp_nice = arg_pri;
-       return sys_setpriority(rmp_nr, arg_pri);
+       return sys_nice(rmp_nr, arg_pri);
 }
 
 /*=====================================================================*
@@ -280,6 +279,7 @@ PUBLIC int do_svrctl()
       return OK;
   }
   case MMSIGNON: {
+#if DEAD_CODE
        /* A user process becomes a task.  Simulate an exit by
         * releasing a waiting parent and disinheriting children.
         */
@@ -307,10 +307,7 @@ PUBLIC int do_svrctl()
                        rmp->mp_parent = INIT_PROC_NR;
                }
        }
-
-       /* Become like PM and FS. */
-       mp->mp_pid = mp->mp_procgrp = 0;
-       mp->mp_parent = 0;
+#endif
        return(OK); }
 
 #if ENABLE_SWAP
index af24adc1f2373eb51638dcffcccd969a44072e77..127547d37960c40c2c03951102bb227fd8f48008 100644 (file)
@@ -33,6 +33,7 @@ EXTERN struct mproc {
   /* Signal handling information. */
   sigset_t mp_ignore;          /* 1 means ignore the signal, 0 means don't */
   sigset_t mp_catch;           /* 1 means catch the signal, 0 means don't */
+  sigset_t mp_sig2mess;                /* 1 means transform into notify message */
   sigset_t mp_sigmask;         /* signals to be blocked */
   sigset_t mp_sigmask2;                /* saved copy of mp_sigmask */
   sigset_t mp_sigpending;      /* pending signals to be handled */
@@ -68,6 +69,7 @@ EXTERN struct mproc {
 #define ONSWAP         0x400   /* set if data segment is swapped out */
 #define SWAPIN         0x800   /* set if on the "swap this in" queue */
 #define DONT_SWAP      0x1000   /* never swap out this process */
+#define PRIV_PROC      0x2000   /* system process, special privileges */
 
 #define NIL_MPROC ((struct mproc *) 0)
 
index 6dbfd8b22fbb9cf59a28ea082810fabde577718e..1cc1e8f69be571f562a516d6651bc1fb2c371830 100644 (file)
@@ -1,4 +1,3 @@
-#define NEW_AL 1
 /* This file handles signals, which are asynchronous events and are generally
  * a messy and unpleasant business.  Signals can be generated by the KILL
  * system call, or from the keyboard (SIGINT) or from the clock (SIGALRM).
@@ -71,12 +70,20 @@ PUBLIC int do_sigaction()
        sigaddset(&mp->mp_ignore, m_in.sig_nr);
        sigdelset(&mp->mp_sigpending, m_in.sig_nr);
        sigdelset(&mp->mp_catch, m_in.sig_nr);
+       sigdelset(&mp->mp_sig2mess, m_in.sig_nr);
+  } else if (svec.sa_handler == SIG_DFL) {
+       sigdelset(&mp->mp_ignore, m_in.sig_nr);
+       sigdelset(&mp->mp_catch, m_in.sig_nr);
+       sigdelset(&mp->mp_sig2mess, m_in.sig_nr);
+  } else if (svec.sa_handler == SIG_MESS) {
+       if (! (mp->mp_flags & PRIV_PROC)) return(EPERM);
+       sigdelset(&mp->mp_ignore, m_in.sig_nr);
+       sigaddset(&mp->mp_sig2mess, m_in.sig_nr);
+       sigdelset(&mp->mp_catch, m_in.sig_nr);
   } else {
        sigdelset(&mp->mp_ignore, m_in.sig_nr);
-       if (svec.sa_handler == SIG_DFL)
-               sigdelset(&mp->mp_catch, m_in.sig_nr);
-       else
-               sigaddset(&mp->mp_catch, m_in.sig_nr);
+       sigaddset(&mp->mp_catch, m_in.sig_nr);
+       sigdelset(&mp->mp_sig2mess, m_in.sig_nr);
   }
   mp->mp_sigact[m_in.sig_nr].sa_handler = svec.sa_handler;
   sigdelset(&svec.sa_mask, SIGKILL);
@@ -376,14 +383,16 @@ register struct mproc *rmp;       /* pointer to the process to be signaled */
 int signo;                     /* signal to send to process (1 to _NSIG) */
 {
 /* Send a signal to a process.  Check to see if the signal is to be caught,
- * ignored, or blocked.  If the signal is to be caught, coordinate with
- * KERNEL to push a sigcontext structure and a sigframe structure onto
- * the catcher's stack.  Also, KERNEL will reset the program counter and
- * stack pointer, so that when the process next runs, it will be executing
- * the signal handler.  When the signal handler returns,  sigreturn(2)
- * will be called.  Then KERNEL will restore the signal context from the
- * sigcontext structure.
- *
+ * ignored, tranformed into a message (for system processes) or blocked.  
+ *  - If the signal is to be transformed into a message, request the KERNEL to
+ * send the target process a system notification with the pending signal as an 
+ * argument. 
+ *  - If the signal is to be caught, request the KERNEL to push a sigcontext 
+ * structure and a sigframe structure onto the catcher's stack.  Also, KERNEL 
+ * will reset the program counter and stack pointer, so that when the process 
+ * next runs, it will be executing the signal handler. When the signal handler 
+ * returns,  sigreturn(2) will be called.  Then KERNEL will restore the signal 
+ * context from the sigcontext structure.
  * If there is insufficient stack space, kill the process.
  */
 
@@ -410,21 +419,21 @@ int signo;                        /* signal to send to process (1 to _NSIG) */
        DEBUG(m_in.pid == 11, printf("PM: sig_proc ignored sig\n"));
        return;
   }
-
   if (sigismember(&rmp->mp_sigmask, signo)) {
        /* Signal should be blocked. */
        sigaddset(&rmp->mp_sigpending, signo);
        return;
   }
+  if (rmp->mp_flags & ONSWAP) {
+       /* Process is swapped out, leave signal pending. */
+       sigaddset(&rmp->mp_sigpending, signo);
+       swap_inqueue(rmp);
+       return;
+  }
+
   sigflags = rmp->mp_sigact[signo].sa_flags;
   if (sigismember(&rmp->mp_catch, signo)) {
        DEBUG(m_in.pid == 11, printf("PM: sig_proc catch sig!\n"));
-       if (rmp->mp_flags & ONSWAP) {
-               /* Process is swapped out, leave signal pending. */
-               sigaddset(&rmp->mp_sigpending, signo);
-               swap_inqueue(rmp);
-               return;
-       }
        if (rmp->mp_flags & SIGSUSPENDED)
                sm.sm_mask = rmp->mp_sigmask2;
        else
@@ -466,6 +475,12 @@ int signo;                 /* signal to send to process (1 to _NSIG) */
        }
        panic(__FILE__, "warning, sys_sigsend failed", s);
   }
+  else if (sigismember(&rmp->mp_sig2mess, signo)) {
+       if (OK != (s=sys_kill(slot,signo)))
+               panic(__FILE__, "warning, sys_kill failed", s);
+       return;
+  }
+
 doterminate:
        DEBUG(m_in.pid == 11, printf("PM: sig_proc doterminate\n"));
   /* Signal should not or cannot be caught.  Take default action. */