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