vserver 2.0-pre1
[linux-2.6.git] / kernel / vserver / helper.c
index c547236..5963b18 100644 (file)
 char vshelper_path[255] = "/sbin/vshelper";
 
 
+int do_vshelper(char *name, char *argv[], char *envp[], int sync)
+{
+       int ret;
+
+       if ((ret = call_usermodehelper(name, argv, envp, sync))) {
+               printk( KERN_WARNING
+                       "%s: (%s %s) returned with %d\n",
+                       name, argv[1], argv[2], ret);
+       }
+       vxdprintk(VXD_CBIT(switch, 1),
+               "%s: (%s %s) returned with %d",
+               name, argv[1], argv[2], ret);
+       return ret;
+}
+
 /*
  *      vshelper path is set via /proc/sys
  *      invoked by vserver sys_reboot(), with
@@ -67,31 +82,33 @@ long vs_reboot(unsigned int cmd, void * arg)
        case LINUX_REBOOT_CMD_SW_SUSPEND:
                argv[1] = "swsusp";
                break;
-
-       default:
-               argv[1] = "restart2";
-               break;
        }
 
-       /* maybe we should wait ? */
-       if (call_usermodehelper(*argv, argv, envp, 1)) {
-               printk( KERN_WARNING
-                       "vs_reboot(): failed to exec (%s %s %s)\n",
-                       vshelper_path, argv[1], argv[2]);
+       if (do_vshelper(vshelper_path, argv, envp, 1))
                return -EPERM;
-       }
        return 0;
 }
 
-long vs_context_state(unsigned int cmd)
-{
-       char id_buf[8], cmd_buf[32];
 
-       char *argv[] = {vshelper_path, NULL, id_buf, NULL, 0};
+/*
+ *      invoked by vserver sys_reboot(), with
+ *      the following arguments
+ *
+ *      argv [0] = vshelper_path;
+ *      argv [1] = action: "startup", "shutdown"
+ *      argv [2] = context identifier
+ *
+ *      envp [*] = type-specific parameters
+ */
+
+long vs_context_state(struct vx_info *vxi, unsigned int cmd)
+{
+       char id_buf[8], cmd_buf[16];
+       char *argv[] = {vshelper_path, NULL, id_buf, 0};
        char *envp[] = {"HOME=/", "TERM=linux",
                        "PATH=/sbin:/usr/sbin:/bin:/usr/bin", cmd_buf, 0};
 
-       snprintf(id_buf, sizeof(id_buf)-1, "%d", vx_current_xid());
+       snprintf(id_buf, sizeof(id_buf)-1, "%d", vxi->vx_id);
        snprintf(cmd_buf, sizeof(cmd_buf)-1, "VS_CMD=%08x", cmd);
 
        switch (cmd) {
@@ -105,12 +122,7 @@ long vs_context_state(unsigned int cmd)
                return 0;
        }
 
-       if (call_usermodehelper(*argv, argv, envp, 1)) {
-               printk( KERN_WARNING
-                       "vs_context_state(): failed to exec (%s %s %s %s)\n",
-                       vshelper_path, argv[1], argv[2], argv[3]);
-               return 0;
-       }
+       do_vshelper(vshelper_path, argv, envp, 1);
        return 0;
 }