diff options
author | Stef Walter <stef@memberwebs.com> | 2004-05-17 17:52:45 +0000 |
---|---|---|
committer | Stef Walter <stef@memberwebs.com> | 2004-05-17 17:52:45 +0000 |
commit | 887d8b57c4aa291919c8eec6b2af5a5f5259ac6d (patch) | |
tree | b1bd6b228a39d3f867f882467891e1291c229425 /srcx/jps.c | |
parent | 58c696e88cfeb6d97d836b9f328d683b0e187d65 (diff) |
Initial 5.2.x files
Diffstat (limited to 'srcx/jps.c')
-rw-r--r-- | srcx/jps.c | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/srcx/jps.c b/srcx/jps.c new file mode 100644 index 0000000..e9a6ec8 --- /dev/null +++ b/srcx/jps.c @@ -0,0 +1,132 @@ + +#include <sys/types.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <fcntl.h> +#include <kvm.h> +#include <paths.h> + +#include "util.h" + +#ifdef HAVE_CONFIG_H +#include "../config.h" +#endif + +static void usage(); +static void printJailIds(); +static void runJailPs(int argc, char* argv[]); + +int main(int argc, char* argv[]) +{ + int ch = 0; + int simple = 0; + int jid = 0; + + while((ch = getopt(argc, argv, "x")) != -1) + { + switch(ch) + { + case 'x': + simple = 1; + break; + + case '?': + default: + usage(); + } + } + + argc -= optind; + argv += optind; + + /* Make sure we have a jail name or id */ + if(argc == 0) + usage(); + + if(running_in_jail()) + errx(1, "can't run from inside jail"); + + /* Translate the jail name into an id if neccessary */ + name = argv[0]; + jid = translate_jail_name(argv[0]); + if(jid == -1) + errx(1, "unknown jail host name: %s", argv[0]); + + argc--; + argv++; + + /* Go into the jail */ + if(jail_attach(jid) == -1) + err(1, "couldn't attach to jail"); + + if(simple) + { + if(argc > 0) + usage(); + + print_jail_ids(); + } + + else + { + /* This function never returns */ + run_jail_ps(argc, argv); + } + + return 0; +} + +static void usage() +{ + fprintf(stderr, "usage: jps [-x] jail [ ps_options ... ]\n"); + exit(2); +} + +static void run_jail_ps(int argc, char* argv[]) +{ + char* args[]; + int i; + + if(!check_jail_command(NULL, "/bin/ps")) + exit(1); + + /* + * TODO: We need to purge down the environment here. + * If the jail is in any way malicious or compromised + * then it could have replaced /bin/ps which we run... + */ + + args = alloca(sizeof(char*) * (argc + 2)); + args[0] = "ps"; + + for(i = 0; i < argc; i++) + args[i + 1] = argv[i]; + + args[i + 1] = NULL; + + run_jail_command(NULL, "/bin/ps", args, 0); +} + +static void print_jail_ids() +{ + kvm_t* kd; + struct kinfo_proc* kp; + char errbuf[_POSIX2_LINE_MAX]; + + /* Open kernel interface */ + kd = kvm_openfiles(_PATH_DEVNULL, _PATH_DEVNULL, _PATH_DEVNULL, + O_RDONLY, errbuf); + if(kd == NULL) + errx(1, "couldn't connect to kernel: %s", errbuf); + + /* Get all processes and print the pids */ + if((kp = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nentries)) == 0) + errx(1, "couldn't list processes: %s", kvm_geterr(kd)); + + for(i = 0; i < nentries; i++) + printf("%d ", (int)(kp[i].ki_pid)); + + fputc(stdout, '\n'); + kvm_close(kd); +} |