move unix_file_* code to vppinfra
[vpp.git] / src / vlib / unix / main.c
index ad1a7c3..ed0631e 100644 (file)
 /** Default CLI history depth if not configured in startup.conf */
 #define UNIX_CLI_DEFAULT_HISTORY 50
 
+char *vlib_default_runtime_dir __attribute__ ((weak));
+char *vlib_default_runtime_dir = "vlib";
 
 unix_main_t unix_main;
+clib_file_main_t file_main;
 
 static clib_error_t *
 unix_main_init (vlib_main_t * vm)
@@ -315,6 +318,7 @@ unix_config (vlib_main_t * vm, unformat_input_t * input)
   unix_main_t *um = &unix_main;
   clib_error_t *error = 0;
   gid_t gid;
+  int pidfd = -1;
 
   /* Defaults */
   um->cli_pager_buffer_limit = UNIX_CLI_DEFAULT_PAGER_LIMIT;
@@ -332,6 +336,8 @@ unix_config (vlib_main_t * vm, unformat_input_t * input)
       else
        if (unformat (input, "cli-listen %s", &um->cli_listen_socket.config))
        ;
+      else if (unformat (input, "runtime-dir %s", &um->runtime_dir))
+       ;
       else if (unformat (input, "cli-line-mode"))
        um->cli_line_mode = 1;
       else if (unformat (input, "cli-no-banner"))
@@ -411,15 +417,42 @@ unix_config (vlib_main_t * vm, unformat_input_t * input)
          if (setegid (gid) == -1)
            return clib_error_return_unix (0, "setegid");
        }
+      else if (unformat (input, "pidfile %s", &um->pidfile))
+       ;
       else
        return clib_error_return (0, "unknown input `%U'",
                                  format_unformat_error, input);
     }
 
+  if (um->runtime_dir == 0)
+    {
+      uid_t uid = geteuid ();
+      if (uid == 00)
+       um->runtime_dir = format (0, "/run/%s%c",
+                                 vlib_default_runtime_dir, 0);
+      else
+       um->runtime_dir = format (0, "/run/user/%u/%s%c", uid,
+                                 vlib_default_runtime_dir, 0);
+    }
+
   error = setup_signal_handlers (um);
   if (error)
     return error;
 
+  if (um->pidfile)
+    {
+      if ((error = vlib_unix_validate_runtime_file (um,
+                                                   (char *) um->pidfile,
+                                                   &um->pidfile)))
+       return error;
+
+      if (((pidfd = open ((char *) um->pidfile,
+                         O_CREAT | O_WRONLY | O_TRUNC, 0644)) < 0))
+       {
+         return clib_error_return_unix (0, "open");
+       }
+    }
+
   if (!(um->flags & UNIX_FLAG_INTERACTIVE))
     {
       openlog (vm->name, LOG_CONS | LOG_PERROR | LOG_PID, LOG_DAEMON);
@@ -430,6 +463,20 @@ unix_config (vlib_main_t * vm, unformat_input_t * input)
                                                       0) < 0)
        clib_error_return (0, "daemon () fails");
     }
+
+  if (pidfd >= 0)
+    {
+      u8 *lv = format (0, "%d", getpid ());
+      if (write (pidfd, (char *) lv, vec_len (lv)) != vec_len (lv))
+       {
+         vec_free (lv);
+         close (pidfd);
+         return clib_error_return_unix (0, "write");
+       }
+      vec_free (lv);
+      close (pidfd);
+    }
+
   um->unix_config_complete = 1;
 
   return 0;
@@ -459,10 +506,17 @@ unix_config (vlib_main_t * vm, unformat_input_t * input)
  * Very useful in situations where folks don't remember or can't be bothered
  * to include CLI commands in bug reports.
  *
+ * @cfgcmd{pidfile, &lt;filename&gt;}
+ * Writes the pid of the main thread in @c filename.
+ *
  * @cfgcmd{full-coredump}
  * Ask the Linux kernel to dump all memory-mapped address regions, instead
  * of just text+data+bss.
  *
+ * @cfgcmd{runtime-dir}
+ * Define directory where VPP is going to store all runtime files.
+ * Default is /run/vpp.
+ *
  * @cfgcmd{cli-listen, &lt;address:port&gt;}
  * Bind the CLI to listen at the address and port given. @clocalhost
  * on TCP port @c 5002, given as <tt>cli-listen localhost:5002</tt>,
@@ -489,7 +543,7 @@ unix_config (vlib_main_t * vm, unformat_input_t * input)
  * Limit pager buffer to @c nn lines of output.
  * A value of @c 0 disables the pager. Default value: @c 100000
 ?*/
-VLIB_CONFIG_FUNCTION (unix_config, "unix");
+VLIB_EARLY_CONFIG_FUNCTION (unix_config, "unix");
 
 static clib_error_t *
 unix_exit (vlib_main_t * vm)