Exemple #1
0
int
main(int argc, char *argv[])
{
	int ch, interval, tmp;
	int i;
	struct kinfo_proc *p;
	struct procstat *prstat, *cprstat;
	long l;
	pid_t pid;
	char *dummy;
	char *nlistf, *memf;
	const char *xocontainer;
	int cnt;

	interval = 0;
	memf = nlistf = NULL;
	argc = xo_parse_args(argc, argv);
	xocontainer = "basic";

	while ((ch = getopt(argc, argv, "CHN:M:abcefijklhrsStvw:x")) != -1) {
		switch (ch) {
		case 'C':
			Cflag++;
			break;

		case 'H':
			Hflag++;
			break;

		case 'M':
			memf = optarg;
			break;
		case 'N':
			nlistf = optarg;
			break;
		case 'S':
			Sflag++;
			xocontainer = "cs";
			break;
		case 'a':
			aflag++;
			break;

		case 'b':
			bflag++;
			xocontainer = "binary";
			break;

		case 'c':
			cflag++;
			xocontainer = "arguments";
			break;

		case 'e':
			eflag++;
			xocontainer = "environment";
			break;

		case 'f':
			fflag++;
			xocontainer = "files";
			break;

		case 'i':
			iflag++;
			xocontainer = "signals";
			break;

		case 'j':
			jflag++;
			xocontainer = "thread_signals";
			break;

		case 'k':
			kflag++;
			xocontainer = "kstack";
			break;

		case 'l':
			lflag++;
			xocontainer = "rlimit";
			break;

		case 'n':
			nflag++;
			break;

		case 'h':
			hflag++;
			break;

		case 'r':
			rflag++;
			xocontainer = "rusage";
			break;

		case 's':
			sflag++;
			xocontainer = "credentials";
			break;

		case 't':
			tflag++;
			xocontainer = "threads";
			break;

		case 'v':
			vflag++;
			xocontainer = "vm";
			break;

		case 'w':
			l = strtol(optarg, &dummy, 10);
			if (*dummy != '\0')
				usage();
			if (l < 1 || l > INT_MAX)
				usage();
			interval = l;
			break;

		case 'x':
			xflag++;
			xocontainer = "auxv";
			break;

		case '?':
		default:
			usage();
		}

	}
	argc -= optind;
	argv += optind;

	/* We require that either 0 or 1 mode flags be set. */
	tmp = bflag + cflag + eflag + fflag + iflag + jflag + (kflag ? 1 : 0) +
	    lflag + rflag + sflag + tflag + vflag + xflag + Sflag;
	if (!(tmp == 0 || tmp == 1))
		usage();

	/* We allow -k to be specified up to twice, but not more. */
	if (kflag > 2)
		usage();

	/* Must specify either the -a flag or a list of pids. */
	if (!(aflag == 1 && argc == 0) && !(aflag == 0 && argc > 0))
		usage();

	/* Only allow -C with -f. */
	if (Cflag && !fflag)
		usage();

	if (memf != NULL)
		prstat = procstat_open_kvm(nlistf, memf);
	else
		prstat = procstat_open_sysctl();
	if (prstat == NULL)
		xo_errx(1, "procstat_open()");
	do {
		xo_set_version(PROCSTAT_XO_VERSION);
		xo_open_container("procstat");
		xo_open_container(xocontainer);

		if (aflag) {
			p = procstat_getprocs(prstat, KERN_PROC_PROC, 0, &cnt);
			if (p == NULL)
				xo_errx(1, "procstat_getprocs()");
			kinfo_proc_sort(p, cnt);
			for (i = 0; i < cnt; i++) {
				procstat(prstat, &p[i]);

				/* Suppress header after first process. */
				hflag = 1;
				xo_flush();
			}
			procstat_freeprocs(prstat, p);
		}
		for (i = 0; i < argc; i++) {
			l = strtol(argv[i], &dummy, 10);
			if (*dummy == '\0') {
				if (l < 0)
					usage();
				pid = l;

				p = procstat_getprocs(prstat, KERN_PROC_PID,
				    pid, &cnt);
				if (p == NULL)
					xo_errx(1, "procstat_getprocs()");
				if (cnt != 0)
					procstat(prstat, p);
				procstat_freeprocs(prstat, p);
			} else {
				cprstat = procstat_open_core(argv[i]);
				if (cprstat == NULL) {
					warnx("procstat_open()");
					continue;
				}
				p = procstat_getprocs(cprstat, KERN_PROC_PID,
				    -1, &cnt);
				if (p == NULL)
					xo_errx(1, "procstat_getprocs()");
				if (cnt != 0)
					procstat(cprstat, p);
				procstat_freeprocs(cprstat, p);
				procstat_close(cprstat);
			}
			/* Suppress header after first process. */
			hflag = 1;
		}

		xo_close_container(xocontainer);
		xo_close_container("procstat");
		xo_finish();
		if (interval)
			sleep(interval);
	} while (interval);

	procstat_close(prstat);

	exit(0);
}
Exemple #2
0
int
main(int argc, char *argv[])
{
    int ch, interval, tmp;
    int i;
    struct kinfo_proc *p;
    struct procstat *prstat, *cprstat;
    long l;
    pid_t pid;
    char *dummy;
    char *nlistf, *memf;
    int cnt;

    interval = 0;
    memf = nlistf = NULL;
    while ((ch = getopt(argc, argv, "CHLM:N:ORSXabcefijklhrstvw:x")) != -1) {
        switch (ch) {
        case 'C':
            Cflag++;
            break;

        case 'L':
            Lflag++;
            break;

        case 'H':
            Hflag++;
            break;

        case 'M':
            memf = optarg;
            break;

        case 'N':
            nlistf = optarg;
            break;

        case 'O':
            Oflag++;
            break;

        case 'R':
            Rflag++;
            break;

        case 'S':
            Sflag++;
            break;

        case 'X':
            Xflag++;
            break;

        case 'a':
            aflag++;
            break;

        case 'b':
            bflag++;
            break;

        case 'c':
            cflag++;
            break;

        case 'e':
            eflag++;
            break;

        case 'f':
            fflag++;
            break;

        case 'i':
            iflag++;
            break;

        case 'j':
            jflag++;
            break;

        case 'k':
            kflag++;
            break;

        case 'l':
            lflag++;
            break;

        case 'n':
            nflag++;
            break;

        case 'h':
            hflag++;
            break;

        case 'r':
            rflag++;
            break;

        case 's':
            sflag++;
            break;

        case 't':
            tflag++;
            break;

        case 'v':
            vflag++;
            break;

        case 'w':
            l = strtol(optarg, &dummy, 10);
            if (*dummy != '\0')
                usage();
            if (l < 1 || l > INT_MAX)
                usage();
            interval = l;
            break;

        case 'x':
            xflag++;
            break;

        case '?':
        default:
            usage();
        }

    }
    argc -= optind;
    argv += optind;

    /* We require that either 0 or 1 mode flags be set. */
    tmp = Lflag + Oflag + Rflag + Sflag + bflag + cflag + eflag + fflag +
          iflag + jflag + (kflag ? 1 : 0) + lflag + rflag + sflag + tflag +
          vflag + xflag;
    if (!(tmp == 0 || tmp == 1))
        usage();

    /* We allow -k to be specified up to twice, but not more. */
    if (kflag > 2)
        usage();

    /* Must specify either the -a flag or a list of pids. */
    if (!(aflag == 1 && argc == 0) && !(aflag == 0 && argc > 0))
        usage();

    /* Only allow -C with -f. */
    if (Cflag && !fflag)
        usage();

    /* Only allow -X with -S and -R. */
    if (Xflag && !(Sflag || Rflag))
        usage();

    if (memf != NULL)
        prstat = procstat_open_kvm(nlistf, memf);
    else
        prstat = procstat_open_sysctl();
    if (prstat == NULL)
        errx(1, "procstat_open()");
    do {
        if (aflag) {
            p = procstat_getprocs(prstat, KERN_PROC_PROC, 0, &cnt);
            if (p == NULL)
                errx(1, "procstat_getprocs()");
            kinfo_proc_sort(p, cnt);
            for (i = 0; i < cnt; i++) {
                procstat(prstat, &p[i]);

                /* Suppress header after first process. */
                hflag = 1;
            }
            procstat_freeprocs(prstat, p);
        }
        for (i = 0; i < argc; i++) {
            l = strtol(argv[i], &dummy, 10);
            if (*dummy == '\0') {
                if (l < 0)
                    usage();
                pid = l;

                p = procstat_getprocs(prstat, KERN_PROC_PID, pid, &cnt);
                if (p == NULL)
                    errx(1, "procstat_getprocs()");
                if (cnt != 0)
                    procstat(prstat, p);
                procstat_freeprocs(prstat, p);
            } else {
                cprstat = procstat_open_core(argv[i]);
                if (cprstat == NULL) {
                    warnx("procstat_open()");
                    continue;
                }
                p = procstat_getprocs(cprstat, KERN_PROC_PID,
                                      -1, &cnt);
                if (p == NULL)
                    errx(1, "procstat_getprocs()");
                if (cnt != 0)
                    procstat(cprstat, p);
                procstat_freeprocs(cprstat, p);
                procstat_close(cprstat);
            }
            /* Suppress header after first process. */
            hflag = 1;
        }
        if (interval)
            sleep(interval);
    } while (interval);
    procstat_close(prstat);
    exit(0);
}