Date: 09 Oct 2002 18:51:29 +0400 From: "Vladimir B. " Grebenschikov <vova@sw.ru> To: Maxime Henrion <mux@freebsd.org> Cc: Bruce Evans <bde@zeta.org.au>, freebsd-current@freebsd.org Subject: Re: DDB sysctl function Message-ID: <1034175089.1028.6.camel@vbook.express.ru> In-Reply-To: <20021009122319.GS57622@elvis.mu.org> References: <20021009094616.GP57622@elvis.mu.org> <20021009222321.I4967-100000@gamplex.bde.org> <20021009122319.GS57622@elvis.mu.org>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
χ Wed, 09.10.2002, Χ 16:23, Maxime Henrion ΞΑΠΙΣΑΜ:
> Bruce Evans wrote:
> > On Wed, 9 Oct 2002, Maxime Henrion wrote:
> >
> > > What I meant in my previous mail is that you could malloc() these
> > > objects instead of putting them on the stack. Also, you don't need
> > > buffers that big since the size you need is bounded at max(sizeof(int),
> > > TOK_STRING_SIZE), which is likely to be TOK_STRING_SIZE :-).
> >
> > ddb can't call malloc() or any other general memory allocation function,
> > since it may be (and often is) invoked in the middle of such functions.
>
> I guess using a buffer of TOK_STRING_SIZE bytes for the tIDENT case and
> int for the tNUMBER case would be best then. We could use the same
> buffer if we don't plan to support platforms with ints bigger than 120
> bytes :-).
As final (I hope) solution:
- all buffers now are static
- for sysctlw now it is not need escape dots in passed strings
sysctlw 0.3 hw.model
- it is possible not to pass array of intergers to sysctlw
sysctlw 1.2.3.4 12323,345465,657,67,68787
> Maxime
--
Vladimir B. Grebenschikov
vova@sw.ru, SWsoft, Inc.
[-- Attachment #2 --]
Index: ddb/db_command.c
===================================================================
RCS file: /ext/ncvs/src/sys/ddb/db_command.c,v
retrieving revision 1.46
diff -u -r1.46 db_command.c
--- ddb/db_command.c 1 Oct 2002 21:59:46 -0000 1.46
+++ ddb/db_command.c 8 Oct 2002 19:53:05 -0000
@@ -422,6 +422,8 @@
{ "gdb", db_gdb, 0, 0 },
{ "reset", db_reset, 0, 0 },
{ "kill", db_kill, CS_OWN, 0 },
+ { "sysctl", db_sysctl_cmd, CS_OWN, 0 },
+ { "sysctlw", db_sysctlw_cmd, CS_OWN, 0 },
{ (char *)0, }
};
Index: ddb/db_examine.c
===================================================================
RCS file: /ext/ncvs/src/sys/ddb/db_examine.c,v
retrieving revision 1.29
diff -u -r1.29 db_examine.c
--- ddb/db_examine.c 25 Jun 2002 15:59:24 -0000 1.29
+++ ddb/db_examine.c 8 Oct 2002 20:10:10 -0000
@@ -44,7 +44,6 @@
static char db_examine_format[TOK_STRING_SIZE] = "x";
-static void db_examine(db_addr_t, char *, int);
static void db_search(db_addr_t, int, db_expr_t, db_expr_t, u_int);
/*
@@ -67,7 +66,7 @@
db_examine((db_addr_t) addr, db_examine_format, count);
}
-static void
+void
db_examine(addr, fmt, count)
register
db_addr_t addr;
Index: ddb/db_sysctl_cmd.c
===================================================================
RCS file: ddb/db_sysctl_cmd.c
diff -N ddb/db_sysctl_cmd.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ddb/db_sysctl_cmd.c 9 Oct 2002 14:41:26 -0000
@@ -0,0 +1,191 @@
+/*-
+ * Copyright (c) 2002 Potatin Mike
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: $
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+
+#include <ddb/ddb.h>
+
+#include <ddb/db_lex.h>
+#include <ddb/db_output.h>
+#include <ddb/db_command.h>
+#include <ddb/db_sym.h>
+#include <ddb/db_access.h>
+
+#include <sys/sysctl.h>
+#include <sys/proc.h>
+
+#define SYSCTL_DATA_BUFSIZE 256
+#define SYSCTL_MAX_MIB 64
+
+static int sysctl_mib [SYSCTL_MAX_MIB];
+static char sysctl_wbuf[SYSCTL_DATA_BUFSIZE];
+static char sysctl_buf [SYSCTL_DATA_BUFSIZE];
+
+/* fill sysctl mib */
+static int
+db_sysctl_getmib(int *miblen)
+{
+ int t;
+
+ *miblen = 0;
+ while((t = db_read_token()) == tNUMBER) {
+ if (*miblen >= SYSCTL_MAX_MIB)
+ return(tEOF);
+
+ sysctl_mib[*miblen] = db_tok_number;
+ (*miblen)++;
+
+ if((t = db_read_token()) != tDOT)
+ break;
+ }
+ return(t);
+}
+
+/*
+ * write into sysctl
+ * SYNTAX:
+ * sysctlw 0.3 <int>[,<int>,<int>...]
+ * or
+ * sysctlw 0.3 <string>
+ * where:
+ * 0.3 - mib of sysctl
+ * <int> - hexdecimal number
+ * <string> - some alphanumeric string
+ * all not-alnums should be escaped (except dot)
+ */
+void
+db_sysctlw_cmd(d1, d2, d3, d4)
+ db_expr_t d1;
+ boolean_t d2;
+ db_expr_t d3;
+ char * d4;
+{
+ int t;
+ size_t ret = 0;
+ size_t readcount = SYSCTL_DATA_BUFSIZE;
+ size_t wsize;
+ int miblen;
+ int *wp;
+ int err;
+
+ t = db_sysctl_getmib(&miblen);
+ switch (t) {
+ case tIDENT:
+ strncpy(sysctl_wbuf, db_tok_string, sizeof(sysctl_wbuf)-1);
+ wsize = strlen(sysctl_wbuf);
+ while(db_read_token() == tDOT) {
+ int l;
+ if (db_read_token() != tIDENT)
+ break;
+ l = strlen(db_tok_string) + 1;
+ if (wsize + l < sizeof(sysctl_wbuf)-1) {
+ strcat(sysctl_wbuf, ".");
+ strcat(sysctl_wbuf, db_tok_string);
+ wsize += l;
+ } else
+ break;
+ }
+ sysctl_wbuf[sizeof(sysctl_wbuf)-1] = '\0';
+ break;
+ case tNUMBER:
+ wp = (int *) sysctl_wbuf;
+ *wp++ = db_tok_number;
+ wsize = sizeof(int);
+ while(db_read_token() == tCOMMA) {
+ if (db_read_token() != tIDENT)
+ break;
+
+ if (wsize + sizeof(int) < sizeof(sysctl_wbuf)) {
+ *wp++ = db_tok_number;
+ wsize += sizeof(int);
+ } else
+ break;
+ }
+ break;
+ default:
+ db_printf("no ident\n");
+ db_flush_lex();
+ return;
+ }
+
+ db_skip_to_eol();
+
+ if(((err = kernel_sysctl(
+ FIRST_THREAD_IN_PROC(initproc),
+ sysctl_mib, miblen, sysctl_buf, &readcount,
+ sysctl_wbuf, wsize, &ret))) == 0) {
+ db_examine((db_addr_t) sysctl_buf, "x", ret/sizeof(int));
+ } else {
+ db_printf("sysctl error %d %d\n", err, ret);
+ }
+}
+
+/*
+ * get sysctl value
+ * SYNTAX:
+ * sysctl 0.3
+ * or
+ * sysctl 0.3 /s
+ * where
+ * 0.3 - mib of examined sysctl
+ * /s - standart ddb examine modifyer (can be used without slash)
+ */
+void
+db_sysctl_cmd(d1, d2, d3, d4)
+ db_expr_t d1;
+ boolean_t d2;
+ db_expr_t d3;
+ char * d4;
+{
+ int t;
+ int miblen;
+ size_t ret = 0;
+ size_t readcount = SYSCTL_DATA_BUFSIZE;
+ int err;
+ char modif[16]="x";
+
+ t = db_sysctl_getmib(&miblen);
+
+ if(t == tSLASH)
+ t = db_read_token();
+
+ if(t == tIDENT)
+ strncpy(modif, db_tok_string, 15);
+
+ db_skip_to_eol();
+
+ if(((err = kernel_sysctl(
+ FIRST_THREAD_IN_PROC(initproc),
+ sysctl_mib, miblen, sysctl_buf,
+ &readcount, NULL, 0, &ret))) == 0) {
+ db_examine((db_addr_t) sysctl_buf, modif, ret/sizeof(int));
+ } else {
+ db_printf("sysctl error %d %d\n", err, ret);
+ }
+}
Index: ddb/ddb.h
===================================================================
RCS file: /ext/ncvs/src/sys/ddb/ddb.h,v
retrieving revision 1.30
diff -u -r1.30 ddb.h
--- ddb/ddb.h 21 Sep 2002 17:29:36 -0000 1.30
+++ ddb/ddb.h 8 Oct 2002 20:09:28 -0000
@@ -84,6 +84,7 @@
db_addr_t db_disasm(db_addr_t loc, boolean_t altfmt);
/* instruction disassembler */
void db_error(const char *s);
+void db_examine(db_addr_t, char *, int);
int db_expression(db_expr_t *valuep);
int db_get_variable(db_expr_t *valuep);
void db_iprintf(const char *,...) __printflike(1, 2);
@@ -125,6 +126,8 @@
db_cmdfcn_t db_trace_until_matching_cmd;
db_cmdfcn_t db_watchpoint_cmd;
db_cmdfcn_t db_write_cmd;
+db_cmdfcn_t db_sysctl_cmd;
+db_cmdfcn_t db_sysctlw_cmd;
#if 0
db_cmdfcn_t db_help_cmd;
Index: conf/files
===================================================================
RCS file: /ext/ncvs/src/sys/conf/files,v
retrieving revision 1.713
diff -u -r1.713 files
--- conf/files 5 Oct 2002 16:35:26 -0000 1.713
+++ conf/files 8 Oct 2002 19:53:05 -0000
@@ -218,6 +218,7 @@
ddb/db_variables.c optional ddb
ddb/db_watch.c optional ddb
ddb/db_write_cmd.c optional ddb
+ddb/db_sysctl_cmd.c optional ddb
dev/aac/aac.c optional aac
dev/aac/aac_debug.c optional aac
dev/aac/aac_disk.c optional aac
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1034175089.1028.6.camel>
