This will be used by a restart wrapper to analyze /proc/$$/mountinfo. Also add the new rpids field to ckpt_pids to reflect kernel. It depends on the patch I just sent for linux-cr adding rpid to struct ckpt_pids. Signed-off-by: Serge E. Hallyn <serue@xxxxxxxxxx> --- ckptinfo.c | 36 +++++++++++++++++++++++++++++++++++- include/linux/checkpoint_hdr.h | 1 + 2 files changed, 36 insertions(+), 1 deletions(-) diff --git a/ckptinfo.c b/ckptinfo.c index 6190301..b5922da 100644 --- a/ckptinfo.c +++ b/ckptinfo.c @@ -28,6 +28,7 @@ static char usage_str[] = "\tOptions:\n" "\t -h,--help print this help message\n" "\t -e,--error show error messages\n" +"\t -p,--pids just list process tree\n" "\t -v,--verbose verbose output\n" "\t --show-arch-regs show registers contents\n" ""; @@ -36,6 +37,7 @@ struct args { int error; int verbose; int show_arch_regs; + int show_process_tree; }; int __verbose; @@ -55,6 +57,7 @@ static int image_parse_vma(struct ckpt_hdr *h, int fd, struct args *args); static int image_parse_file(struct ckpt_hdr *h, int fd, struct args *args); static int image_parse_objref(struct ckpt_hdr *h, int fd, struct args *args); static int image_parse_error(struct ckpt_hdr *h, int fd, struct args *args); +static void show_tasks(struct ckpt_hdr *h, int numpids); #ifdef __i386__ #define __HAVE_image_parse_cpu @@ -85,10 +88,11 @@ static void parse_args(struct args *args, int argc, char *argv[]) { "help", no_argument, NULL, 'h' }, { "error", no_argument, NULL, 'e' }, { "verbose", no_argument, NULL, 'v' }, + { "pids", no_argument, NULL, 'p' }, { "show-arch-regs", no_argument, NULL, 1 }, { NULL, 0, NULL, 0 } }; - static char optc[] = "hve"; + static char optc[] = "hvep"; while (1) { int c = getopt_long(argc, argv, optc, opts, NULL); @@ -99,6 +103,9 @@ static void parse_args(struct args *args, int argc, char *argv[]) exit(1); case 'h': usage(usage_str); + case 'p': + args->show_process_tree = 1; + break; case 'e': args->error = 1; break; @@ -208,6 +215,7 @@ static int image_parse(int fd, struct args *args) { struct ckpt_hdr *h; int ret; + int numpids, next_read_pids = 0; do { ret = image_read_obj(fd, &h); @@ -215,6 +223,11 @@ static int image_parse(int fd, struct args *args) break; if (!h) continue; + if (next_read_pids) { + next_read_pids = 0; + if (args->show_process_tree) + show_tasks(h, numpids); + } switch (h->type) { case CKPT_HDR_OBJREF: ret = image_parse_objref(h, fd, args); @@ -232,12 +245,33 @@ static int image_parse(int fd, struct args *args) ret = image_parse_error(h, fd, args); break; } + if (h->type == CKPT_HDR_TREE) { + struct ckpt_hdr_tree *t = (struct ckpt_hdr_tree *) h; + numpids = t->nr_tasks; + next_read_pids = 1; + } free(h); } while (ret > 0); return ret; } +struct ckpt_hdr_pids { + struct ckpt_hdr h; + struct ckpt_pids p; +}; + +static void show_tasks(struct ckpt_hdr *h, int numpids) +{ + struct ckpt_hdr_pids *pp = (struct ckpt_hdr_pids *)h; + struct ckpt_pids *p = &pp->p; + int i; + + for (i=0; i<numpids; i++) + printf("Task %d: rpid %d pid %d vppid %d\n", i, p[i].rpid, + p[i].vpid, p[i].vppid); +} + static int image_parse_objref(struct ckpt_hdr *h, int fd, struct args *args) { struct ckpt_hdr_objref *hh = (struct ckpt_hdr_objref *) h; diff --git a/include/linux/checkpoint_hdr.h b/include/linux/checkpoint_hdr.h index e8eaf23..9c6bc6d 100644 --- a/include/linux/checkpoint_hdr.h +++ b/include/linux/checkpoint_hdr.h @@ -321,6 +321,7 @@ struct ckpt_hdr_tree { } __attribute__((aligned(8))); struct ckpt_pids { + __s32 rpid; __s32 vpid; __s32 vppid; __s32 vtgid; -- 1.6.0.6 _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers