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);
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;
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;