]> Zhao Yanbai Git Server - minix.git/commitdiff
Added 'service run' to run a service without restart.
authorBen Gras <ben@minix3.org>
Tue, 15 Aug 2006 15:54:51 +0000 (15:54 +0000)
committerBen Gras <ben@minix3.org>
Tue, 15 Aug 2006 15:54:51 +0000 (15:54 +0000)
servers/rs/main.c
servers/rs/manager.c
servers/rs/proto.h
servers/rs/service.c

index 19a3541fc5ffae346b927bd59f184d8a7c2b6c4c..2e75aa12baadd5944af21dd88a2973fdacf4e7ef 100644 (file)
@@ -81,8 +81,9 @@ PUBLIC int main(void)
        */
       else {   
           switch(call_nr) {
-          case RS_UP:          result = do_up(&m, FALSE /*!do_copy*/); break;
-          case RS_UP_COPY:     result = do_up(&m, TRUE /*do_copy*/);   break;
+          case RS_UP:          result = do_up(&m, FALSE, 0); break;
+          case RS_UP_COPY:     result = do_up(&m, TRUE, 0); break;
+         case RS_RUN:          result = do_up(&m, FALSE, RS_EXITING);  break;
           case RS_DOWN:        result = do_down(&m);           break;
           case RS_REFRESH:     result = do_refresh(&m);        break;
           case RS_RESCUE:      result = do_rescue(&m);         break;
index 017407aa1a7e422edbcd1b13bf5d2f64b869e712..506825eb562cecd07161366a9d24155ab50dca56 100644 (file)
@@ -20,7 +20,7 @@ int nr_in_use;                                        /* number of services */
 extern int errno;                              /* error status */
 
 /* Prototypes for internal functions that do the hard work. */
-FORWARD _PROTOTYPE( int start_service, (struct rproc *rp) );
+FORWARD _PROTOTYPE( int start_service, (struct rproc *rp, int flags) );
 FORWARD _PROTOTYPE( int stop_service, (struct rproc *rp,int how) );
 FORWARD _PROTOTYPE( int fork_nb, (void) );
 FORWARD _PROTOTYPE( int read_exec, (struct rproc *rp) );
@@ -32,9 +32,10 @@ PRIVATE int shutting_down = FALSE;
 /*===========================================================================*
  *                                     do_up                                *
  *===========================================================================*/
-PUBLIC int do_up(m_ptr, do_copy)
+PUBLIC int do_up(m_ptr, do_copy, flags)
 message *m_ptr;                                        /* request message pointer */
 int do_copy;                                   /* keep copy in memory */
+int flags;                                     /* extra flags, if any */
 {
 /* A request was made to start a new system service. Dismember the request 
  * message and gather all information needed to start the service. Starting
@@ -99,7 +100,7 @@ int do_copy;                                 /* keep copy in memory */
   rp->r_restarts = -1;                                 /* will be incremented */
   
   /* All information was gathered. Now try to start the system service. */
-  return(start_service(rp));
+  return(start_service(rp, flags));
 }
 
 
@@ -236,7 +237,7 @@ PUBLIC void do_exit(message *m_ptr)
              }
              else if(rp->r_flags & RS_REFRESHING) {
                      rp->r_restarts = -1;              /* reset counter */
-                     start_service(rp);                /* direct restart */
+                     start_service(rp, 0);             /* direct restart */
              }
               else if (WIFEXITED(exit_status) &&
                      WEXITSTATUS(exit_status) == EXEC_FAILED) {
@@ -260,7 +261,7 @@ rp->r_restarts= 0;
                        rp->r_backoff= 1;
                  }
                  else {
-                     start_service(rp);                /* direct restart */
+                     start_service(rp, 0);             /* direct restart */
                  }
               }
              break;
@@ -290,7 +291,7 @@ message *m_ptr;
          if (rp->r_backoff > 0) {
               rp->r_backoff -= 1;
              if (rp->r_backoff == 0) {
-                 start_service(rp);
+                 start_service(rp, 0);
              }
          }
 
@@ -345,8 +346,9 @@ message *m_ptr;
 /*===========================================================================*
  *                             start_service                                *
  *===========================================================================*/
-PRIVATE int start_service(rp)
+PRIVATE int start_service(rp, flags)
 struct rproc *rp;
+int flags;
 {
 /* Try to execute the given system service. Fork a new process. The child
  * process will be inhibited from running by the NO_PRIV flag. Only let the
@@ -431,7 +433,7 @@ struct rproc *rp;
    * that's the case, the child will exit. 
    */
   child_proc_nr_n = _ENDPOINT_P(child_proc_nr_e);
-  rp->r_flags = RS_IN_USE;                     /* mark slot in use */
+  rp->r_flags = RS_IN_USE | flags;             /* mark slot in use */
   rp->r_restarts += 1;                         /* raise nr of restarts */
   rp->r_proc_nr_e = child_proc_nr_e;           /* set child details */
   rp->r_pid = child_pid;
index 0b49739d39829ba86e0049a41051c1e6dafdaf14..df862313d6b7c50904c0ab92efa80a7f4b3c677a 100644 (file)
@@ -8,7 +8,7 @@ _PROTOTYPE( int dev_execve, (int proc_e,
 _PROTOTYPE( int main, (void));
 
 /* manager.c */
-_PROTOTYPE( int do_up, (message *m, int do_copy));
+_PROTOTYPE( int do_up, (message *m, int do_copy, int flags));
 _PROTOTYPE( int do_down, (message *m));
 _PROTOTYPE( int do_refresh, (message *m));
 _PROTOTYPE( int do_rescue, (message *m));
index cefc67b70c12a46b0e9a6d53f8b2dfda3bea7c58..4e70ea8d92050b883efbd55ce6ae1eb28d477194 100644 (file)
@@ -27,6 +27,8 @@ PRIVATE char *known_requests[] = {
   "refresh", 
   "rescue", 
   "shutdown", 
+  "upcopy",    /* fill for RS_UP_COPY */
+  "run", 
   "catch for illegal requests"
 };
 #define ILLEGAL_REQUEST  sizeof(known_requests)/sizeof(char *)
@@ -74,7 +76,7 @@ PRIVATE void print_usage(char *app_name, char *problem)
 {
   printf("Warning, %s\n", problem);
   printf("Usage:\n");
-  printf("    %s [-c] up <binary> [%s <args>] [%s <special>] [%s <ticks>]\n", 
+  printf("    %s [-c] (up|run) <binary> [%s <args>] [%s <special>] [%s <ticks>]\n", 
        app_name, ARG_ARGS, ARG_DEV, ARG_PERIOD);
   printf("    %s down <pid>\n", app_name);
   printf("    %s refresh <pid>\n", app_name);
@@ -137,9 +139,9 @@ PRIVATE int parse_arguments(int argc, char **argv)
   }
   req_nr = RS_RQ_BASE + req_type;
 
-  if (req_nr == RS_UP) {
+  if (req_nr == RS_UP || req_nr == RS_RUN) {
 
-      if (c_flag)
+      if (req_nr == RS_UP && c_flag)
        req_nr= RS_UP_COPY;
 
       /* Verify argument count. */ 
@@ -266,6 +268,7 @@ PUBLIC int main(int argc, char **argv)
   switch(request) {
   case RS_UP:
   case RS_UP_COPY:
+  case RS_RUN:
       /* Build space-separated command string to be passed to RS server. */
       strcpy(command, req_path);
       command[strlen(req_path)] = ' ';