]> granicus.if.org Git - procps-ng/commitdiff
Solaris port
authoralbert <>
Wed, 5 May 2004 02:49:27 +0000 (02:49 +0000)
committeralbert <>
Wed, 5 May 2004 02:49:27 +0000 (02:49 +0000)
minimal.c

index 6c86c887bb56ee0c313201a66d084c14877e27f0..ef53f1d39da8b50352500a6aeddbc1f7e1a24635 100644 (file)
--- a/minimal.c
+++ b/minimal.c
   ( (M&0xfff) << 8)   |   ( (m&0xfff00) << 12)   |   (m&0xff)   \
 )
 
+///////////////////////////////////////////////////////
+#ifdef __sun__
+#include <sys/mkdev.h>
+#define _STRUCTURED_PROC 1
+#include <sys/procfs.h>
+#define NO_TTY_VALUE DEV_ENCODE(-1,-1)
+#define HZ 1    // only bother with seconds
+#endif
+
 ///////////////////////////////////////////////////////
 #ifdef __FreeBSD__
 #include <sys/param.h>
@@ -298,6 +307,68 @@ static void arg_parse(int argc, char *argv[]){
   if(bsd_c_option) show_args = 0;
 }
 
+#ifdef __sun__
+/* return 1 if it works, or 0 for failure */
+static int stat2proc(int pid) {
+    struct psinfo p;  //   /proc/*/psinfo, struct psinfo, psinfo_t
+    char buf[32];
+    int num;
+    int fd;
+    int tty_maj, tty_min;
+    snprintf(buf, sizeof buf, "/proc/%d/psinfo", pid);
+    if ( (fd = open(buf, O_RDONLY, 0) ) == -1 ) return 0;
+    num = read(fd, &p, sizeof p);
+    close(fd);
+    if(num != sizeof p) return 0;
+
+    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_euid    = p.pr_euid;
+    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_ruid    = p.pr_uid;
+//    P_rgid    = p.pr_gid;
+//    P_egid    = p.pr_egid;
+
+#if 0
+    // don't support these
+    P_tpgid; P_flags,
+    P_min_flt, P_cmin_flt, P_maj_flt, P_cmaj_flt, P_utime, P_stime;
+    P_cutime, P_cstime, P_timeout, P_alarm;
+    P_rss_rlim, P_start_code, P_end_code, P_start_stack, P_kstk_esp, P_kstk_eip;
+    P_signal, P_blocked, P_sigignore, P_sigcatch;
+    P_nswap, P_cnswap;
+#endif
+
+    // we like it Linux-encoded :-)
+    tty_maj = major(p.pr_ttydev);
+    tty_min = minor(p.pr_ttydev);
+    P_tty_num = DEV_ENCODE(tty_maj,tty_min);
+
+    snprintf(P_tty_text, sizeof P_tty_text, "%3d,%-3d", tty_maj, tty_min);
+#if 1
+    if (tty_maj == 24) snprintf(P_tty_text, sizeof P_tty_text, "pts/%-3u", tty_min);
+    if (P_tty_num == NO_TTY_VALUE)    memcpy(P_tty_text, "   ?   ", 8);
+    if (P_tty_num == DEV_ENCODE(0,0)) memcpy(P_tty_text, "console", 8);
+#endif
+
+    if(P_pid != pid) return 0;
+    return 1;
+}
+#endif
+
 #ifdef __FreeBSD__
 /* return 1 if it works, or 0 for failure */
 static int stat2proc(int pid) {