Setting tag util-vserver-pl-0.4-29
[util-vserver-pl.git] / src / vsh.c
index 0bbdadf..ef6dfa8 100644 (file)
--- a/src/vsh.c
+++ b/src/vsh.c
@@ -45,17 +45,50 @@ char **extend_argv(int argc, char **argv, int num_extra_args) {
     return argv2;
 }
 
-#define NUM_VSERVER_SUEXEC_ARGS 5
+void associate_vserver_cgroup(char *slice_name, int pid)
+{
+    char cgroup_dir[4096], fn[4096];
+    struct stat st;
+    int result;
+    FILE *f;
+
+    sprintf(cgroup_dir, "/dev/cgroup/%s", slice_name);
+
+    result = stat(cgroup_dir, &st);
+    if (result != 0) {
+        // doesn't exist
+        return;
+    }
+
+    if (!S_ISDIR(st.st_mode)) {
+        // not a directory
+        return;
+    }
+
+    /* Write the pid to the cgroup tasks file, so the SSH process is associated
+     * with the correct cgroup
+     */
 
-int main(int argc, char **argv)
+    sprintf(fn, "%s/tasks", cgroup_dir);
+    f = fopen(fn, "wt");
+    if (f==NULL) {
+        // failed to open
+        return;
+    }
+
+    fprintf(f, "%d\n", pid);
+    fclose(f);
+}
+
+#define NUM_VSERVER_EXEC_ARGS 5
+
+int main(int argc, char **argv, char **envp)
 {
     char *slice_name;
     char **argv2;
     int argc2;
     char slice_id_str[256];
     unsigned int slice_xid;
-    char *envp[] = { NULL, NULL };
-    char home_env_str[256];
 
     slice_xid = getuid();
     slice_name = get_current_username(slice_xid);
@@ -63,8 +96,10 @@ int main(int argc, char **argv)
         fprintf(stderr,"Could not look up slice name\n");
         goto out_exception;
     }
+
+    associate_vserver_cgroup(slice_name, getpid());
     
-    argv2 = extend_argv(argc, argv, NUM_VSERVER_SUEXEC_ARGS);
+    argv2 = extend_argv(argc, argv, NUM_VSERVER_EXEC_ARGS);
     if (!argv2) goto out_exception;
         
     
@@ -72,13 +107,10 @@ int main(int argc, char **argv)
     snprintf(slice_id_str, 255, "%u", slice_xid);
     argv2[0] = strdup(VSERVER_PATH);
     argv2[1] = strdup(slice_name);
-    argv2[2] = strdup("suexec");
-    argv2[3] = strdup(slice_id_str);
-    argv2[4] = strdup("/bin/bash"); 
-    argv2[5] = strdup("-login"); 
-
-    snprintf(home_env_str, 255, "HOME=/home/%s", slice_name);
-    envp[0] = home_env_str;
+    argv2[2] = strdup("exec");
+    argv2[3] = strdup("/bin/su"); 
+    argv2[4] = strdup("-"); 
+    argv2[5] = strdup(slice_name);
 
     if (setuid(geteuid())) goto out_exception;