static int collect_task(struct pstree_item *item) { int ret; ret = collect_loop(item, collect_threads); if (ret < 0) goto err_close; /* Depth-first search (DFS) is used for traversing a process tree. */ ret = collect_loop(item, collect_children); if (ret < 0) goto err_close; if ((item->state == TASK_DEAD) && !list_empty(&item->children)) { pr_err("Zombie with children?! O_o Run, run, run!\n"); goto err_close; } if (pstree_alloc_cores(item)) goto err_close; pr_info("Collected %d in %d state\n", item->pid.real, item->state); return 0; err_close: close_pid_proc(); return -1; }
int main(int argc, char **argv) { int i, j, c; struct collect_state *cs; int verbose; int baseline; int port = 0; char *binary = NULL; char *text = NULL; verbose = 1; baseline = BASELINE01; i = 1; j = 1; while (i < argc) { if (argv[i][0] == '-') { c = argv[i][j]; switch (c) { case '\0': j = 1; i++; break; case '-': j++; break; case 'b': i++; if( strncmp(argv[i],"01",2) == 0 ) { baseline = BASELINE01; } else if( strncmp(argv[i],"02",2) == 0 ) { baseline = BASELINE02; } else if( strncmp(argv[i],"03",2) == 0) { baseline = BASELINE03; } else if( strncmp(argv[i],"12",2) == 0) { baseline = BASELINE12; } else if( strncmp(argv[i],"13",2) == 0) { baseline = BASELINE13; } else if( strncmp(argv[i],"23",2) == 0) { baseline = BASELINE23; } else { fprintf(stderr,"parse_args: unrecognised baseline %s\n",argv[i]); } i++; j = 1; break; case 'q': verbose = 0; i++; break; case 'v': verbose++; i++; break; case 'h' : fprintf(stderr, "usage: %s [-b nm] [-o binary-output] [-d decoded-output] [-p receive-port]\n", argv[0]); return 0; break; case 'd' : j++; if (argv[i][j] == '\0') { j = 0; i++; } if(i >= argc){ text = NULL; } else { text = argv[i] + j; } i++; j = 1; break; case 'o' : case 'p' : j++; if (argv[i][j] == '\0') { j = 0; i++; } if (i >= argc) { fprintf(stderr, "%s: option -%c requires a parameter\n", argv[0], c); return EX_USAGE; } switch(c){ case 'o' : binary = argv[i] + j; break; case 'p' : port = atoi(argv[i] + j); break; } i++; j = 1; break; default: fprintf(stderr, "%s: unknown option -%c\n", argv[0], c); return 1; break; } } else { fprintf(stderr, "%s: extra argument %s\n", argv[0], argv[i]); return EX_USAGE; } } if((port <= 0) || (port > 0xffff)){ fprintf(stderr, "%s: invalid port %d\n", argv[0], port); return EX_USAGE; } if(binary == NULL){ fprintf(stderr, "%s: need an output filename\n", argv[0]); return EX_USAGE; } cs = create_collect(binary, text, port, verbose, baseline); if(cs == NULL){ fprintf(stderr, "%s: unable to set up\n", argv[0]); return EX_USAGE; } collect_loop(cs); collect_stats(cs); destroy_collect(cs); return 0; }