Index: sys/compat/linprocfs/linprocfs.c =================================================================== --- sys/compat/linprocfs/linprocfs.c +++ sys/compat/linprocfs/linprocfs.c @@ -767,6 +767,40 @@ return (0); } +static int +linprocfs_get_tty_nr(struct proc *p) +{ + struct session *sp; + struct tty *tp; + const char *ttyname; + int error, major, minor, nr; + + sx_assert(&proctree_lock, SX_LOCKED); + + if ((p->p_flag & P_CONTROLT) == 0) + return (-1); + + sp = p->p_pgrp->pg_session; + if (sp == NULL) + return (-1); + + tp = sp->s_ttyp; + + //printf("%s: tp->t_dev = %p\n", __func__, tp->t_dev); + ttyname = devtoname(tp->t_dev); + + //printf("%s: ttyname = %s\n", __func__, ttyname); + error = linux_driver_get_major_minor(ttyname, &major, &minor); + //printf("%s: error = %d, major = %d, minor = %d\n", __func__, error, major, minor); + if (error != 0) + return (-1); + + nr = makedev(major, minor); + //printf("%s: nr = %d <%#x>\n", __func__, nr, nr); + + return (nr); +} + /* * Filler function for proc/pid/stat */ @@ -777,12 +811,14 @@ struct timeval boottime; char state; static int ratelimit = 0; + int tty_nr; vm_offset_t startcode, startdata; getboottime(&boottime); sx_slock(&proctree_lock); PROC_LOCK(p); fill_kinfo_proc(p, &kp); + tty_nr = linprocfs_get_tty_nr(p); sx_sunlock(&proctree_lock); if (p->p_vmspace) { startcode = (vm_offset_t)p->p_vmspace->vm_taddr; @@ -809,10 +845,7 @@ PS_ADD("pgrp", "%d", p->p_pgid); PS_ADD("session", "%d", p->p_session->s_sid); PROC_UNLOCK(p); - if (kp.ki_tdev == NODEV) - PS_ADD("tty", "%s", "-1"); - else - PS_ADD("tty", "%ju", (uintmax_t)kp.ki_tdev); + PS_ADD("tty", "%d", tty_nr); PS_ADD("tpgid", "%d", kp.ki_tpgid); PS_ADD("flags", "%u", 0); /* XXX */ PS_ADD("minflt", "%lu", kp.ki_rusage.ru_minflt); @@ -825,8 +858,8 @@ PS_ADD("cstime", "%ld", TV2J(&kp.ki_rusage_ch.ru_stime)); PS_ADD("priority", "%d", kp.ki_pri.pri_user); PS_ADD("nice", "%d", kp.ki_nice); /* 19 (nicest) to -19 */ - PS_ADD("0", "%d", 0); /* removed field */ - PS_ADD("itrealvalue", "%d", 0); /* XXX */ + PS_ADD("0", "%d", 0); /* removed field */ // XXX: num_threads + PS_ADD("itrealvalue", "%d", 0); PS_ADD("starttime", "%lu", TV2J(&kp.ki_start) - TV2J(&boottime)); PS_ADD("vsize", "%ju", P2K((uintmax_t)kp.ki_size)); PS_ADD("rss", "%ju", (uintmax_t)kp.ki_rssize); @@ -847,6 +880,7 @@ PS_ADD("processor", "%u", kp.ki_lastcpu); PS_ADD("rt_priority", "%u", 0); /* XXX */ /* >= 2.5.19 */ PS_ADD("policy", "%u", kp.ki_pri.pri_class); /* >= 2.5.19 */ + // XXX: more stuff missing #undef PS_ADD sbuf_putc(sb, '\n'); @@ -1391,6 +1425,19 @@ } /* + * Filler function for proc/sys/kernel/ngroups_max + * XXX: truss id + * XXX: porównać z ubuntu + */ +static int +linprocfs_dongroups_max(PFS_FILL_ARGS) +{ + + sbuf_printf(sb, "%d\n", NGROUPS); + return (0); +} + +/* * Filler function for proc/sys/kernel/pid_max */ static int @@ -1812,6 +1859,7 @@ /* /proc/sys/... */ sys = pfs_create_dir(root, "sys", NULL, NULL, NULL, 0); + /* /proc/sys/kernel/... */ dir = pfs_create_dir(sys, "kernel", NULL, NULL, NULL, 0); pfs_create_file(dir, "osrelease", &linprocfs_doosrelease, @@ -1821,6 +1869,8 @@ pfs_create_file(dir, "version", &linprocfs_doosbuild, NULL, NULL, NULL, PFS_RD); pfs_create_file(dir, "msgmni", &linprocfs_domsgmni, + NULL, NULL, NULL, PFS_RD); + pfs_create_file(dir, "ngroups_max", &linprocfs_dongroups_max, NULL, NULL, NULL, PFS_RD); pfs_create_file(dir, "pid_max", &linprocfs_dopid_max, NULL, NULL, NULL, PFS_RD);