コード例 #1
0
ファイル: seize.c プロジェクト: OpenVZ/criu
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;
}
コード例 #2
0
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;
}