xref: /openbsd-src/sys/ddb/db_usrreq.c (revision ea4edfc257817296817ae1fa432db9b492ed74e7)
1*ea4edfc2Sgnezdo /*	$OpenBSD: db_usrreq.c,v 1.22 2021/01/09 20:58:12 gnezdo Exp $	*/
2d6c7fc58Smickey 
3d6c7fc58Smickey /*
4d6c7fc58Smickey  * Copyright (c) 1996 Michael Shalayeff.  All rights reserved.
5d6c7fc58Smickey  *
6d6c7fc58Smickey  * Redistribution and use in source and binary forms, with or without
7d6c7fc58Smickey  * modification, are permitted provided that the following conditions
8d6c7fc58Smickey  * are met:
9d6c7fc58Smickey  * 1. Redistributions of source code must retain the above copyright
10d6c7fc58Smickey  *    notice, this list of conditions and the following disclaimer.
11d6c7fc58Smickey  * 2. Redistributions in binary form must reproduce the above copyright
12d6c7fc58Smickey  *    notice, this list of conditions and the following disclaimer in the
13d6c7fc58Smickey  *    documentation and/or other materials provided with the distribution.
14d6c7fc58Smickey  *
15d6c7fc58Smickey  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16d6c7fc58Smickey  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17d6c7fc58Smickey  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18d6c7fc58Smickey  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19d6c7fc58Smickey  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20d6c7fc58Smickey  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21d6c7fc58Smickey  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22d6c7fc58Smickey  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23d6c7fc58Smickey  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24d6c7fc58Smickey  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25d6c7fc58Smickey  */
26d6c7fc58Smickey 
27d6c7fc58Smickey #include <sys/param.h>
280569f4dcSderaadt #include <sys/systm.h>
29d6c7fc58Smickey #include <sys/proc.h>
30ad129c42Smpf #include <sys/tty.h>
31d6c7fc58Smickey #include <sys/sysctl.h>
32ad129c42Smpf #include <dev/cons.h>
33d6c7fc58Smickey 
34d6c7fc58Smickey #include <ddb/db_var.h>
35d6c7fc58Smickey 
361c08e5f2Stedu int	db_log = 1;
376950c8e2Smpi int	db_profile;			/* Allow dynamic profiling */
384cb357ddStedu 
3965367353Sgnezdo const struct sysctl_bounded_args ddb_vars[] = {
4065367353Sgnezdo 	{ DBCTL_RADIX, &db_radix, 8, 16 },
4165367353Sgnezdo 	{ DBCTL_MAXWIDTH, &db_max_width, 0, INT_MAX },
4265367353Sgnezdo 	{ DBCTL_TABSTOP, &db_tab_stop_width, 1, 16 },
4365367353Sgnezdo 	{ DBCTL_MAXLINE, &db_max_line, 0, INT_MAX },
4465367353Sgnezdo 	{ DBCTL_LOG, &db_log, 0, 1 },
4565367353Sgnezdo };
4665367353Sgnezdo 
47d6c7fc58Smickey int
ddb_sysctl(int * name,u_int namelen,void * oldp,size_t * oldlenp,void * newp,size_t newlen,struct proc * p)486ecb06d0Sjsg ddb_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
496ecb06d0Sjsg     size_t newlen, struct proc *p)
50d6c7fc58Smickey {
51d6c7fc58Smickey 	/* All sysctl names at this level are terminal. */
52d6c7fc58Smickey 	if (namelen != 1)
53d6c7fc58Smickey 		return (ENOTDIR);
54d6c7fc58Smickey 
55d6c7fc58Smickey 	switch (name[0]) {
56c23dcd95Sderaadt 	case DBCTL_PANIC:
5710c0a3faSmiod 		if (securelevel > 0)
5810c0a3faSmiod 			return (sysctl_int_lower(oldp, oldlenp, newp, newlen,
5910c0a3faSmiod 			    &db_panic));
6010c0a3faSmiod 		else {
61*ea4edfc2Sgnezdo 			return (sysctl_int_bounded(oldp, oldlenp, newp, newlen,
62*ea4edfc2Sgnezdo 			    &db_panic, 0, 1));
6310c0a3faSmiod 		}
6410c0a3faSmiod 		break;
65c23dcd95Sderaadt 	case DBCTL_CONSOLE:
6610c0a3faSmiod 		if (securelevel > 0)
6710c0a3faSmiod 			return (sysctl_int_lower(oldp, oldlenp, newp, newlen,
6810c0a3faSmiod 			    &db_console));
6910c0a3faSmiod 		else {
70*ea4edfc2Sgnezdo 			return (sysctl_int_bounded(oldp, oldlenp, newp, newlen,
71*ea4edfc2Sgnezdo 			    &db_console, 0, 1));
7210c0a3faSmiod 		}
7310c0a3faSmiod 		break;
74ad129c42Smpf 	case DBCTL_TRIGGER:
75ad129c42Smpf 		if (newp && db_console) {
76207e4b38Sguenther 			struct process *pr = curproc->p_p;
77207e4b38Sguenther 
78ad129c42Smpf 			if (securelevel < 1 ||
79207e4b38Sguenther 			    (pr->ps_flags & PS_CONTROLT && cn_tab &&
80207e4b38Sguenther 			    cn_tab->cn_dev == pr->ps_session->s_ttyp->t_dev)) {
81e97088d6Smpi 				db_enter();
82ad129c42Smpf 				newp = NULL;
83ad129c42Smpf 			} else
84e2e7fbc0Sbluhm 				return (ENODEV);
85ad129c42Smpf 		}
86ad129c42Smpf 		return (sysctl_rdint(oldp, oldlenp, newp, 0));
876950c8e2Smpi #if defined(DDBPROF)
886950c8e2Smpi 	case DBCTL_PROFILE:
896950c8e2Smpi 		if (securelevel > 0)
906950c8e2Smpi 			return (sysctl_int_lower(oldp, oldlenp, newp, newlen,
916950c8e2Smpi 			    &db_profile));
926950c8e2Smpi 		else {
93*ea4edfc2Sgnezdo 			return (sysctl_int_bounded(oldp, oldlenp, newp, newlen,
94*ea4edfc2Sgnezdo 			    &db_profile, 0, 1));
956950c8e2Smpi 		}
966950c8e2Smpi 		break;
976950c8e2Smpi #endif /* DDBPROF */
98d6c7fc58Smickey 	default:
9965367353Sgnezdo 		return (sysctl_bounded_arr(ddb_vars, nitems(ddb_vars), name,
10065367353Sgnezdo 		    namelen, oldp, oldlenp, newp, newlen));
101d6c7fc58Smickey 	}
102d6c7fc58Smickey 	/* NOTREACHED */
103d6c7fc58Smickey }
104