/* return 1 if it works, or 0 for failure */ static gboolean stat2proc (pid_t pid, CkProcessStat *P) { struct kinfo_proc2 p; char *ttname; int num; int tty_maj; int tty_min; if (! get_kinfo_proc (pid, &p)) { return FALSE; } num = KI_MAXCOMLEN; if (num >= sizeof(P->cmd)) { num = sizeof(P->cmd) - 1; } memcpy (P->cmd, p.p_comm, num); P->cmd[num] = '\0'; P->pid = p.p_pid; P->ppid = p.p_ppid; P->pgrp = p.p__pgid; P->session = p.p_sid; P->rss = p.p_vm_rssize; P->vsize = p.p_vm_dsize + p.p_vm_dsize + p.p_vm_ssize; /* XXX */ P->start_time = p.p_ustart_sec; P->wchan = (unsigned long) p.p_wchan; P->state = p.p_stat; P->nice = p.p_nice; P->flags = p.p_realflag; P->tpgid = p.p_tpgid; P->processor = p.p_cpuid; P->nlwp = p.p_nlwps; /* we like it Linux-encoded :-) */ tty_maj = major (p.p_tdev); tty_min = minor (p.p_tdev); P->tty = DEV_ENCODE (tty_maj,tty_min); snprintf (P->tty_text, sizeof(P->tty_text), "%3d,%-3d", tty_maj, tty_min); if (p.p_tdev != NODEV && (ttname = devname (p.p_tdev, S_IFCHR)) != NULL) { memcpy (P->tty_text, ttname, sizeof(P->tty_text)); } if (p.p_tdev == NODEV) { /* XXXJDM nasty hack */ memcpy (P->tty_text, "/dev/ttyE4", sizeof(P->tty_text)); } if (P->pid != pid) { return FALSE; } return TRUE; }
/* return 1 if it works, or 0 for failure */ static gboolean stat2proc (pid_t pid, CkProcessStat *P) { struct kinfo_proc p; char *ttname; int num; int tty_maj; int tty_min; if (! get_kinfo_proc (pid, &p)) { return FALSE; } num = KI_MAXCOMLEN; if (num >= sizeof P->cmd) { num = sizeof P->cmd - 1; } memcpy (P->cmd, p.p_comm, num); P->cmd[num] = '\0'; P->pid = p.p_pid; P->ppid = p.p_ppid; P->pgrp = p.p__pgid; P->session = p.p_sid; P->rss = p.p_vm_rssize; P->vsize = p.p_vm_dsize + p.p_vm_dsize + p.p_vm_ssize; /* XXX */ P->start_time = p.p_ustart_sec; P->wchan = (unsigned long) p.p_wchan; P->state = p.p_stat; P->nice = p.p_nice; P->flags = p.p_psflags; P->tpgid = p.p_tpgid; P->processor = p.p_cpuid; /* we like it Linux-encoded :-) */ tty_maj = major (p.p_tdev); tty_min = minor (p.p_tdev); P->tty = DEV_ENCODE (tty_maj,tty_min); snprintf (P->tty_text, sizeof P->tty_text, "%3d,%-3d", tty_maj, tty_min); if (p.p_tdev != NODEV && (ttname = devname (p.p_tdev, S_IFCHR)) != NULL) { memcpy (P->tty_text, ttname, sizeof (P->tty_text)); } if (p.p_tdev == NODEV) { /* XXX how do we associate X with its tty? */ #if defined(__i386__) || defined(__amd64__) || defined(__powerpc__) memcpy (P->tty_text, "/dev/ttyC4", sizeof (P->tty_text)); #else memcpy (P->tty_text, "/dev/ttyC0", sizeof (P->tty_text)); #endif } if (P->pid != pid) { return FALSE; } return TRUE; }
/* return 1 if it works, or 0 for failure */ static gboolean stat2proc (pid_t pid, CkProcessStat *P) { struct psinfo p; char buf[32]; int num; int fd; int tty_maj; int tty_min; snprintf (buf, sizeof buf, "/proc/%d/psinfo", pid); if ((fd = open (buf, O_RDONLY, 0) ) == -1 ) { return FALSE; } num = read (fd, &p, sizeof p); close (fd); if (num != sizeof p) { return FALSE; } num = PRFNSZ; if (num >= sizeof P->cmd) { num = sizeof P->cmd - 1; } memcpy (P->cmd, p.pr_fname, num); /* p.pr_fname or p.pr_lwp.pr_name */ P->cmd[num] = '\0'; P->pid = p.pr_pid; P->ppid = p.pr_ppid; P->pgrp = p.pr_pgid; P->session = p.pr_sid; P->rss = p.pr_rssize; P->vsize = p.pr_size; P->start_time = p.pr_start.tv_sec; P->wchan = p.pr_lwp.pr_wchan; P->state = p.pr_lwp.pr_sname; P->nice = p.pr_lwp.pr_nice; P->priority = p.pr_lwp.pr_pri; /* or pr_oldpri */ P->penv = p.pr_envp; /* we like it Linux-encoded :-) */ tty_maj = major (p.pr_ttydev); tty_min = minor (p.pr_ttydev); P->tty = DEV_ENCODE (tty_maj,tty_min); snprintf (P->tty_text, sizeof P->tty_text, "%3d,%-3d", tty_maj, tty_min); if (tty_maj == get_system_vt_major ()) { snprintf (P->tty_text, sizeof P->tty_text, "/dev/vt/%u", tty_min); } if (P->tty == NO_TTY_VALUE) { memcpy (P->tty_text, " ? ", 8); } if (P->pid != pid) { return FALSE; } return TRUE; }