157843Smckusick /*- 257843Smckusick * Copyright (c) 1982, 1986, 1989, 1993 Regents of the University of California. 339963Smarc * All rights reserved. 439963Smarc * 557843Smckusick * This code is derived from software contributed to Berkeley by 657843Smckusick * Mike Karels at Berkeley Software Design, Inc. 757843Smckusick * 844435Sbostic * %sccs.include.redist.c% 939963Smarc * 10*58128Sralph * @(#)kern_sysctl.c 7.28 (Berkeley) 02/21/93 1139963Smarc */ 1239963Smarc 1357843Smckusick /* 1457843Smckusick * sysctl system call. 1557843Smckusick */ 1657843Smckusick 1756517Sbostic #include <sys/param.h> 1857843Smckusick #include <sys/systm.h> 1957843Smckusick #include <sys/malloc.h> 2056517Sbostic #include <sys/proc.h> 2157843Smckusick #include <sys/file.h> 2257843Smckusick #include <sys/sysctl.h> 2357843Smckusick #include <sys/unistd.h> 2457843Smckusick #include <sys/buf.h> 2556517Sbostic #include <sys/ioctl.h> 2656517Sbostic #include <sys/tty.h> 2739963Smarc 2856517Sbostic #include <vm/vm.h> 2948407Skarels 3056517Sbostic #include <sys/kinfo_proc.h> 3148407Skarels 3257843Smckusick sysctlfn kern_sysctl; 3357843Smckusick sysctlfn hw_sysctl; 3457843Smckusick extern sysctlfn vm_sysctl; 3557843Smckusick extern sysctlfn fs_sysctl; 3657843Smckusick extern sysctlfn net_sysctl; 3757843Smckusick extern sysctlfn cpu_sysctl; 3840068Smarc 3957843Smckusick /* 4057843Smckusick * Locking and stats 4157843Smckusick */ 4257843Smckusick static struct sysctl_lock { 4357843Smckusick int sl_lock; 4457843Smckusick int sl_want; 4557843Smckusick int sl_locked; 4657843Smckusick } memlock; 4757843Smckusick 4857843Smckusick struct sysctl_args { 4957843Smckusick int *name; 5057843Smckusick u_int namelen; 5157843Smckusick void *old; 5257843Smckusick u_int *oldlenp; 5357843Smckusick void *new; 5457843Smckusick u_int newlen; 5554923Storek }; 5657843Smckusick 5757843Smckusick #define STK_PARAMS 32 /* largest old/new values on stack */ 5857843Smckusick 5957843Smckusick sysctl(p, uap, retval) 6043444Smckusick struct proc *p; 6157843Smckusick register struct sysctl_args *uap; 6243444Smckusick int *retval; 6343444Smckusick { 6457843Smckusick int error, dolock = 1; 6557843Smckusick u_int savelen, oldlen = 0; 6657843Smckusick sysctlfn *fn; 6757843Smckusick int name[CTL_MAXNAME]; 6839963Smarc 6957843Smckusick if (uap->new != NULL && (error = suser(p->p_ucred, &p->p_acflag))) 7057843Smckusick return (error); 7157843Smckusick /* 7257843Smckusick * all top-level sysctl names are non-terminal 7357843Smckusick */ 7457843Smckusick if (uap->namelen > CTL_MAXNAME || uap->namelen < 2) 7557843Smckusick return (EINVAL); 7657843Smckusick if (error = copyin(uap->name, &name, uap->namelen * sizeof(int))) 7757843Smckusick return (error); 7839963Smarc 7957843Smckusick switch (name[0]) { 8057843Smckusick case CTL_KERN: 8157843Smckusick fn = kern_sysctl; 8257843Smckusick if (name[2] != KERN_VNODE) /* XXX */ 8357843Smckusick dolock = 0; 8439963Smarc break; 8557843Smckusick case CTL_HW: 8657843Smckusick fn = hw_sysctl; 8740068Smarc break; 8857843Smckusick case CTL_VM: 8957843Smckusick fn = vm_sysctl; 9041181Smarc break; 9157843Smckusick case CTL_NET: 9257843Smckusick fn = net_sysctl; 9350149Smarc break; 9457843Smckusick #ifdef notyet 9557843Smckusick case CTL_FS: 9657843Smckusick fn = fs_sysctl; 9750909Smckusick break; 9857843Smckusick case CTL_DEBUG: 9957843Smckusick fn = debug_sysctl; 10052669Smckusick break; 10157843Smckusick case CTL_MACHDEP: 10257843Smckusick fn = cpu_sysctl; 10352669Smckusick break; 10457843Smckusick #endif 10539963Smarc default: 10657843Smckusick return (EOPNOTSUPP); 10739963Smarc } 10857843Smckusick 10957843Smckusick if (uap->oldlenp && 11057843Smckusick (error = copyin(uap->oldlenp, &oldlen, sizeof(oldlen)))) 11157843Smckusick return (error); 11257843Smckusick if (uap->old != NULL) { 11357843Smckusick if (!useracc(uap->old, oldlen, B_WRITE)) 11457843Smckusick return (EFAULT); 11557843Smckusick while (memlock.sl_lock) { 11657843Smckusick memlock.sl_want = 1; 11757843Smckusick sleep((caddr_t)&memlock, PRIBIO+1); 11857843Smckusick memlock.sl_locked++; 11957843Smckusick } 12057843Smckusick memlock.sl_lock = 1; 12157843Smckusick if (dolock) 12257843Smckusick vslock(uap->old, oldlen); 12357843Smckusick savelen = oldlen; 12440813Smarc } 12557843Smckusick error = (*fn)(name + 1, uap->namelen - 1, uap->old, &oldlen, 12657843Smckusick uap->new, uap->newlen); 12757843Smckusick if (uap->old != NULL) { 12857843Smckusick if (dolock) 12957843Smckusick vsunlock(uap->old, savelen, B_WRITE); 13057843Smckusick memlock.sl_lock = 0; 13157843Smckusick if (memlock.sl_want) { 13257843Smckusick memlock.sl_want = 0; 13357843Smckusick wakeup((caddr_t)&memlock); 13457843Smckusick } 13540206Smarc } 13657843Smckusick if (error) 13757843Smckusick return (error); 13857843Smckusick if (uap->oldlenp) 13957843Smckusick error = copyout(&oldlen, uap->oldlenp, sizeof(oldlen)); 14057843Smckusick *retval = oldlen; 14157843Smckusick return (0); 14257843Smckusick } 14340206Smarc 14457843Smckusick /* 14557843Smckusick * Attributes stored in the kernel. 14657843Smckusick */ 14757843Smckusick char hostname[MAXHOSTNAMELEN]; 14857843Smckusick int hostnamelen; 14957843Smckusick long hostid; 15057843Smckusick 15157843Smckusick kern_sysctl(name, namelen, oldp, oldlenp, newp, newlen) 15257843Smckusick int *name; 15357843Smckusick u_int namelen; 15457843Smckusick void *oldp; 15557843Smckusick u_int *oldlenp; 15657843Smckusick void *newp; 15757843Smckusick u_int newlen; 15857843Smckusick { 15957843Smckusick int error; 16057843Smckusick extern char ostype[], osrelease[], version[]; 16157843Smckusick 16257843Smckusick /* all sysctl names at this level are terminal */ 16357843Smckusick if (namelen != 1 && name[0] != KERN_PROC) 16457843Smckusick return (ENOTDIR); /* overloaded */ 16557843Smckusick 16657843Smckusick switch (name[0]) { 16757843Smckusick case KERN_OSTYPE: 16857843Smckusick return (sysctl_rdstring(oldp, oldlenp, newp, ostype)); 16957843Smckusick case KERN_OSRELEASE: 17057843Smckusick return (sysctl_rdstring(oldp, oldlenp, newp, osrelease)); 17157843Smckusick case KERN_OSREV: 17257843Smckusick return (sysctl_rdint(oldp, oldlenp, newp, BSD)); 17357843Smckusick case KERN_VERSION: 17457843Smckusick return (sysctl_rdstring(oldp, oldlenp, newp, version)); 17557843Smckusick case KERN_POSIX1: 17657843Smckusick return (sysctl_rdint(oldp, oldlenp, newp, _POSIX_VERSION)); 17757843Smckusick case KERN_MAXPROC: 17857843Smckusick return (sysctl_int(oldp, oldlenp, newp, newlen, &maxproc)); 17957843Smckusick case KERN_MAXFILES: 18057843Smckusick return (sysctl_int(oldp, oldlenp, newp, newlen, &maxfiles)); 18157843Smckusick case KERN_ARGMAX: 18257843Smckusick return (sysctl_rdint(oldp, oldlenp, newp, ARG_MAX)); 18357843Smckusick case KERN_HOSTNAME: 18457843Smckusick error = sysctl_string(oldp, oldlenp, newp, newlen, 18557843Smckusick hostname, sizeof(hostname)); 18657843Smckusick if (!error) 18757843Smckusick hostnamelen = newlen; 18857843Smckusick return (error); 18957843Smckusick case KERN_HOSTID: 19057843Smckusick return (sysctl_int(oldp, oldlenp, newp, newlen, &hostid)); 19157843Smckusick case KERN_CLOCKRATE: 19257843Smckusick return (sysctl_clockrate(oldp, oldlenp)); 19357843Smckusick case KERN_FILE: 19457843Smckusick return (sysctl_file(oldp, oldlenp)); 19557843Smckusick case KERN_VNODE: 19657843Smckusick return (sysctl_vnode(oldp, oldlenp)); 19757843Smckusick case KERN_PROC: 19857843Smckusick return (sysctl_doproc(name + 1, namelen - 1, oldp, oldlenp)); 19957843Smckusick default: 20057843Smckusick return (EOPNOTSUPP); 20152405Storek } 20257843Smckusick /* NOTREACHED */ 20357843Smckusick } 20457843Smckusick 20557843Smckusick hw_sysctl(name, namelen, oldp, oldlenp, newp, newlen) 20657843Smckusick int *name; 20757843Smckusick u_int namelen; 20857843Smckusick void *oldp; 20957843Smckusick u_int *oldlenp; 21057843Smckusick void *newp; 21157843Smckusick u_int newlen; 21257843Smckusick { 21357843Smckusick extern char machine[], cpu_model[]; 21457843Smckusick 21557843Smckusick /* all sysctl names at this level are terminal */ 21657843Smckusick if (namelen != 1) 21757843Smckusick return (ENOTDIR); /* overloaded */ 21857843Smckusick 21957843Smckusick switch (name[0]) { 22057843Smckusick case HW_MACHINE: 22157843Smckusick return (sysctl_rdstring(oldp, oldlenp, newp, machine)); 22257843Smckusick case HW_MODEL: 22357843Smckusick return (sysctl_rdstring(oldp, oldlenp, newp, cpu_model)); 22457843Smckusick case HW_NCPU: 22557843Smckusick return (sysctl_rdint(oldp, oldlenp, newp, 1)); /* XXX */ 22657843Smckusick case HW_CPUSPEED: 22757843Smckusick return (sysctl_rdint(oldp, oldlenp, newp, cpuspeed)); 22857843Smckusick case HW_PHYSMEM: 22957843Smckusick return (sysctl_rdint(oldp, oldlenp, newp, ctob(physmem))); 23057843Smckusick case HW_USERMEM: 23157843Smckusick return (sysctl_rdint(oldp, oldlenp, newp, 23257843Smckusick ctob(physmem - cnt.v_wire_count))); 23357843Smckusick case HW_PAGESIZE: 23457843Smckusick return (sysctl_rdint(oldp, oldlenp, newp, PAGE_SIZE)); 23557843Smckusick default: 23657843Smckusick return (EOPNOTSUPP); 23757843Smckusick } 23857843Smckusick /* NOTREACHED */ 23957843Smckusick } 24057843Smckusick 24157843Smckusick /* 24257843Smckusick * Validate parameters and get old / set new parameters 24357843Smckusick * for an integer-valued sysctl function. 24457843Smckusick */ 24557843Smckusick sysctl_int(oldp, oldlenp, newp, newlen, valp) 24657843Smckusick void *oldp; 24757843Smckusick u_int *oldlenp; 24857843Smckusick void *newp; 24957843Smckusick u_int newlen; 25057843Smckusick int *valp; 25157843Smckusick { 25257843Smckusick int error = 0; 25357843Smckusick 25457843Smckusick if (oldp && *oldlenp < sizeof(int)) 25557843Smckusick return (ENOMEM); 25657843Smckusick if (newp && newlen != sizeof(int)) 25757843Smckusick return (EINVAL); 25857843Smckusick *oldlenp = sizeof(int); 25957843Smckusick if (oldp) 26057843Smckusick error = copyout(valp, oldp, sizeof(int)); 26157843Smckusick if (error == 0 && newp) 26257843Smckusick error = copyin(newp, valp, sizeof(int)); 26343444Smckusick return (error); 26439963Smarc } 26539963Smarc 26657843Smckusick /* 26757843Smckusick * As above, but read-only. 26857843Smckusick */ 26957843Smckusick sysctl_rdint(oldp, oldlenp, newp, val) 27057843Smckusick void *oldp; 27157843Smckusick u_int *oldlenp; 27257843Smckusick void *newp; 27357843Smckusick int val; 27457843Smckusick { 27557843Smckusick int error = 0; 27657843Smckusick 27757843Smckusick if (oldp && *oldlenp < sizeof(int)) 27857843Smckusick return (ENOMEM); 27957843Smckusick if (newp) 28057843Smckusick return (EPERM); 28157843Smckusick *oldlenp = sizeof(int); 28257843Smckusick if (oldp) 28357843Smckusick error = copyout((caddr_t)&val, oldp, sizeof(int)); 28457843Smckusick return (error); 28557843Smckusick } 28657843Smckusick 28757843Smckusick /* 28857843Smckusick * Validate parameters and get old / set new parameters 28957843Smckusick * for a string-valued sysctl function. 29057843Smckusick */ 29157843Smckusick sysctl_string(oldp, oldlenp, newp, newlen, str, maxlen) 29257843Smckusick void *oldp; 29357843Smckusick u_int *oldlenp; 29457843Smckusick void *newp; 29557843Smckusick u_int newlen; 29657843Smckusick char *str; 29757843Smckusick int maxlen; 29857843Smckusick { 29957843Smckusick int len, error = 0; 30057843Smckusick 30157843Smckusick len = strlen(str) + 1; 30257843Smckusick if (oldp && *oldlenp < len) 30357843Smckusick return (ENOMEM); 30457843Smckusick if (newp && newlen >= maxlen) 30557843Smckusick return (EINVAL); 306*58128Sralph if (oldp) { 307*58128Sralph *oldlenp = len; 30857843Smckusick error = copyout(str, oldp, len); 309*58128Sralph } 31057843Smckusick if (error == 0 && newp) { 31157843Smckusick error = copyin(newp, str, newlen); 31257843Smckusick str[newlen] = 0; 31357843Smckusick } 31457843Smckusick return (error); 31557843Smckusick } 31657843Smckusick 31757843Smckusick /* 31857843Smckusick * As above, but read-only. 31957843Smckusick */ 32057843Smckusick sysctl_rdstring(oldp, oldlenp, newp, str) 32157843Smckusick void *oldp; 32257843Smckusick u_int *oldlenp; 32357843Smckusick void *newp; 32457843Smckusick char *str; 32557843Smckusick { 32657843Smckusick int len, error = 0; 32757843Smckusick 32857843Smckusick len = strlen(str) + 1; 32957843Smckusick if (oldp && *oldlenp < len) 33057843Smckusick return (ENOMEM); 33157843Smckusick if (newp) 33257843Smckusick return (EPERM); 33357843Smckusick *oldlenp = len; 33457843Smckusick if (oldp) 33557843Smckusick error = copyout(str, oldp, len); 33657843Smckusick return (error); 33757843Smckusick } 33857843Smckusick 33957843Smckusick /* 34057843Smckusick * Validate parameters and get old parameters 34157843Smckusick * for a structure oriented sysctl function. 34257843Smckusick */ 34357843Smckusick sysctl_rdstruct(oldp, oldlenp, newp, sp, len) 34457843Smckusick void *oldp; 34557843Smckusick u_int *oldlenp; 34657843Smckusick void *newp; 34757843Smckusick void *sp; 34857843Smckusick int len; 34957843Smckusick { 35057843Smckusick int error = 0; 35157843Smckusick 35257843Smckusick if (oldp && *oldlenp < len) 35357843Smckusick return (ENOMEM); 35457843Smckusick if (newp) 35557843Smckusick return (EPERM); 35657843Smckusick *oldlenp = len; 35757843Smckusick if (oldp) 35857843Smckusick error = copyout(sp, oldp, len); 35957843Smckusick return (error); 36057843Smckusick } 36157843Smckusick 36257843Smckusick /* 36357843Smckusick * Get file structures. 36457843Smckusick */ 36557843Smckusick sysctl_file(where, sizep) 36657843Smckusick char *where; 36757843Smckusick int *sizep; 36857843Smckusick { 36957843Smckusick int buflen, error; 37057843Smckusick struct file *fp; 37157843Smckusick char *start = where; 37257843Smckusick 37357843Smckusick buflen = *sizep; 37457843Smckusick if (where == NULL) { 37557843Smckusick /* 37657843Smckusick * overestimate by 10 files 37757843Smckusick */ 37857843Smckusick *sizep = sizeof(filehead) + (nfiles + 10) * sizeof(struct file); 37957843Smckusick return (0); 38057843Smckusick } 38157843Smckusick 38257843Smckusick /* 38357843Smckusick * first copyout filehead 38457843Smckusick */ 38557843Smckusick if (buflen < sizeof(filehead)) { 38657843Smckusick *sizep = 0; 38757843Smckusick return (0); 38857843Smckusick } 38957843Smckusick if (error = copyout((caddr_t)&filehead, where, sizeof(filehead))) 39057843Smckusick return (error); 39157843Smckusick buflen += sizeof(filehead); 39257843Smckusick where += sizeof(filehead); 39357843Smckusick 39457843Smckusick /* 39557843Smckusick * followed by an array of file structures 39657843Smckusick */ 39757843Smckusick for (fp = filehead; fp != NULL; fp = fp->f_filef) { 39857843Smckusick if (buflen < sizeof(struct file)) { 39957843Smckusick *sizep = where - start; 40057843Smckusick return (ENOMEM); 40157843Smckusick } 40257843Smckusick if (error = copyout((caddr_t)fp, where, sizeof (struct file))) 40357843Smckusick return (error); 40457843Smckusick buflen -= sizeof(struct file); 40557843Smckusick where += sizeof(struct file); 40657843Smckusick } 40757843Smckusick *sizep = where - start; 40857843Smckusick return (0); 40957843Smckusick } 41057843Smckusick 41139963Smarc /* 41239963Smarc * try over estimating by 5 procs 41339963Smarc */ 41457843Smckusick #define KERN_PROCSLOP (5 * sizeof (struct kinfo_proc)) 41539963Smarc 41657843Smckusick sysctl_doproc(name, namelen, where, sizep) 41757843Smckusick int *name; 41857843Smckusick int namelen; 41939963Smarc char *where; 42057843Smckusick int *sizep; 42139963Smarc { 42239963Smarc register struct proc *p; 42343419Smarc register struct kinfo_proc *dp = (struct kinfo_proc *)where; 42457843Smckusick register int needed = 0; 42557843Smckusick int buflen = where != NULL ? *sizep : 0; 42639963Smarc int doingzomb; 42740067Smarc struct eproc eproc; 42839963Smarc int error = 0; 42939963Smarc 43057843Smckusick if (namelen != 2) 43157843Smckusick return (EINVAL); 43254755Storek p = (struct proc *)allproc; 43339963Smarc doingzomb = 0; 43439963Smarc again: 43539963Smarc for (; p != NULL; p = p->p_nxt) { 43653819Smckusick /* 43753819Smckusick * Skip embryonic processes. 43853819Smckusick */ 43953819Smckusick if (p->p_stat == SIDL) 44053819Smckusick continue; 44139963Smarc /* 44239963Smarc * TODO - make more efficient (see notes below). 44339963Smarc * do by session. 44439963Smarc */ 44557843Smckusick switch (name[0]) { 44639963Smarc 44757843Smckusick case KERN_PROC_PID: 44839963Smarc /* could do this with just a lookup */ 44957843Smckusick if (p->p_pid != (pid_t)name[1]) 45039963Smarc continue; 45139963Smarc break; 45239963Smarc 45357843Smckusick case KERN_PROC_PGRP: 45439963Smarc /* could do this by traversing pgrp */ 45557843Smckusick if (p->p_pgrp->pg_id != (pid_t)name[1]) 45639963Smarc continue; 45739963Smarc break; 45839963Smarc 45957843Smckusick case KERN_PROC_TTY: 46039963Smarc if ((p->p_flag&SCTTY) == 0 || 46139963Smarc p->p_session->s_ttyp == NULL || 46257843Smckusick p->p_session->s_ttyp->t_dev != (dev_t)name[1]) 46339963Smarc continue; 46439963Smarc break; 46539963Smarc 46657843Smckusick case KERN_PROC_UID: 46757843Smckusick if (p->p_ucred->cr_uid != (uid_t)name[1]) 46839963Smarc continue; 46939963Smarc break; 47039963Smarc 47157843Smckusick case KERN_PROC_RUID: 47257843Smckusick if (p->p_cred->p_ruid != (uid_t)name[1]) 47339963Smarc continue; 47439963Smarc break; 47539963Smarc } 47657843Smckusick if (buflen >= sizeof(struct kinfo_proc)) { 47748407Skarels fill_eproc(p, &eproc); 47843419Smarc if (error = copyout((caddr_t)p, &dp->kp_proc, 47957843Smckusick sizeof(struct proc))) 48039963Smarc return (error); 48143419Smarc if (error = copyout((caddr_t)&eproc, &dp->kp_eproc, 48257843Smckusick sizeof(eproc))) 48339963Smarc return (error); 48443419Smarc dp++; 48557843Smckusick buflen -= sizeof(struct kinfo_proc); 48639963Smarc } 48757843Smckusick needed += sizeof(struct kinfo_proc); 48839963Smarc } 48939963Smarc if (doingzomb == 0) { 49039963Smarc p = zombproc; 49139963Smarc doingzomb++; 49239963Smarc goto again; 49339963Smarc } 49457843Smckusick if (where != NULL) { 49557843Smckusick *sizep = (caddr_t)dp - where; 49657843Smckusick if (needed > *sizep) 49757843Smckusick return (ENOMEM); 49857843Smckusick } else { 49957843Smckusick needed += KERN_PROCSLOP; 50057843Smckusick *sizep = needed; 50157843Smckusick } 50239963Smarc return (0); 50339963Smarc } 50448407Skarels 50548407Skarels /* 50648407Skarels * Fill in an eproc structure for the specified process. 50748407Skarels */ 50848407Skarels void 50948407Skarels fill_eproc(p, ep) 51048407Skarels register struct proc *p; 51148407Skarels register struct eproc *ep; 51248407Skarels { 51348407Skarels register struct tty *tp; 51448407Skarels 51548407Skarels ep->e_paddr = p; 51648407Skarels ep->e_sess = p->p_pgrp->pg_session; 51748407Skarels ep->e_pcred = *p->p_cred; 51848407Skarels ep->e_ucred = *p->p_ucred; 51952405Storek if (p->p_stat == SIDL || p->p_stat == SZOMB) { 52052405Storek ep->e_vm.vm_rssize = 0; 52152405Storek ep->e_vm.vm_tsize = 0; 52252405Storek ep->e_vm.vm_dsize = 0; 52352405Storek ep->e_vm.vm_ssize = 0; 52452405Storek #ifndef sparc 52552405Storek /* ep->e_vm.vm_pmap = XXX; */ 52652405Storek #endif 52752405Storek } else { 52852405Storek register struct vmspace *vm = p->p_vmspace; 52952405Storek 53052405Storek ep->e_vm.vm_rssize = vm->vm_rssize; 53152405Storek ep->e_vm.vm_tsize = vm->vm_tsize; 53252405Storek ep->e_vm.vm_dsize = vm->vm_dsize; 53352405Storek ep->e_vm.vm_ssize = vm->vm_ssize; 53452405Storek #ifndef sparc 53552405Storek ep->e_vm.vm_pmap = vm->vm_pmap; 53652405Storek #endif 53752405Storek } 53849141Skarels if (p->p_pptr) 53949141Skarels ep->e_ppid = p->p_pptr->p_pid; 54049141Skarels else 54149141Skarels ep->e_ppid = 0; 54248407Skarels ep->e_pgid = p->p_pgrp->pg_id; 54348407Skarels ep->e_jobc = p->p_pgrp->pg_jobc; 54448407Skarels if ((p->p_flag&SCTTY) && 54548407Skarels (tp = ep->e_sess->s_ttyp)) { 54648407Skarels ep->e_tdev = tp->t_dev; 54750022Skarels ep->e_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID; 54848407Skarels ep->e_tsess = tp->t_session; 54948407Skarels } else 55048407Skarels ep->e_tdev = NODEV; 55148407Skarels ep->e_flag = ep->e_sess->s_ttyvp ? EPROC_CTTY : 0; 55248407Skarels if (SESS_LEADER(p)) 55348407Skarels ep->e_flag |= EPROC_SLEADER; 55448407Skarels if (p->p_wmesg) 55548407Skarels strncpy(ep->e_wmesg, p->p_wmesg, WMESGLEN); 55648407Skarels ep->e_xsize = ep->e_xrssize = 0; 55748407Skarels ep->e_xccount = ep->e_xswrss = 0; 55848407Skarels } 55950149Smarc 56057843Smckusick #ifdef COMPAT_43 56157843Smckusick #include <sys/socket.h> 56257906Smckusick #define KINFO_PROC (0<<8) 56357906Smckusick #define KINFO_RT (1<<8) 56457906Smckusick #define KINFO_VNODE (2<<8) 56557906Smckusick #define KINFO_FILE (3<<8) 56657906Smckusick #define KINFO_METER (4<<8) 56757906Smckusick #define KINFO_LOADAVG (5<<8) 56857906Smckusick #define KINFO_CLOCKRATE (6<<8) 56957843Smckusick 57057843Smckusick struct getkerninfo_args { 57157843Smckusick int op; 57257843Smckusick char *where; 57357843Smckusick int *size; 57457843Smckusick int arg; 57557843Smckusick }; 57657843Smckusick 57757843Smckusick getkerninfo(p, uap, retval) 57857843Smckusick struct proc *p; 57957843Smckusick register struct getkerninfo_args *uap; 58057843Smckusick int *retval; 58150149Smarc { 58257843Smckusick int error, name[5]; 58357843Smckusick u_int size; 58450149Smarc 58557843Smckusick if (error = copyin((caddr_t)uap->size, (caddr_t)&size, sizeof(size))) 58657843Smckusick return (error); 58750149Smarc 58857906Smckusick switch (uap->op & 0xff00) { 58950149Smarc 59057843Smckusick case KINFO_RT: 59157843Smckusick name[0] = PF_ROUTE; 59257843Smckusick name[1] = 0; 59357843Smckusick name[2] = (uap->op & 0xff0000) >> 16; 59457843Smckusick name[3] = uap->op & 0xff; 59557843Smckusick name[4] = uap->arg; 59657843Smckusick error = net_sysctl(name, 5, uap->where, &size, NULL, 0); 59757843Smckusick break; 59857843Smckusick 59957843Smckusick case KINFO_VNODE: 60057843Smckusick name[0] = KERN_VNODE; 60157843Smckusick error = kern_sysctl(name, 1, uap->where, &size, NULL, 0); 60257843Smckusick break; 60357843Smckusick 60457843Smckusick case KINFO_PROC: 60557843Smckusick name[0] = KERN_PROC; 60657843Smckusick name[1] = uap->op & 0xff; 60757843Smckusick name[2] = uap->arg; 60857843Smckusick error = kern_sysctl(name, 3, uap->where, &size, NULL, 0); 60957843Smckusick break; 61057843Smckusick 61157843Smckusick case KINFO_FILE: 61257843Smckusick name[0] = KERN_FILE; 61357843Smckusick error = kern_sysctl(name, 1, uap->where, &size, NULL, 0); 61457843Smckusick break; 61557843Smckusick 61657843Smckusick case KINFO_METER: 61757843Smckusick name[0] = VM_METER; 61857843Smckusick error = vm_sysctl(name, 1, uap->where, &size, NULL, 0); 61957843Smckusick break; 62057843Smckusick 62157843Smckusick case KINFO_LOADAVG: 62257843Smckusick name[0] = VM_LOADAVG; 62357843Smckusick error = vm_sysctl(name, 1, uap->where, &size, NULL, 0); 62457843Smckusick break; 62557843Smckusick 62657843Smckusick case KINFO_CLOCKRATE: 62757843Smckusick name[0] = KERN_CLOCKRATE; 62857843Smckusick error = kern_sysctl(name, 1, uap->where, &size, NULL, 0); 62957843Smckusick break; 63057843Smckusick 63157843Smckusick default: 63257843Smckusick return (EINVAL); 63350149Smarc } 63457843Smckusick if (error) 63557843Smckusick return (error); 63657843Smckusick *retval = size; 63757843Smckusick return (copyout((caddr_t)&size, (caddr_t)uap->size, sizeof(size))); 63850149Smarc } 63957843Smckusick #endif /* COMPAT_43 */ 640