author | Henrik Mattsson <henrik.mattsson@delphix.com> |
Mon, 11 Mar 2013 10:48:46 -0800 | |
changeset 13981 | e0b637c317fa |
parent 13688 | 32dde9989090 |
child 14006 | 09f0146de94b |
permissions | -rw-r--r-- |
13688
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
1 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
2 |
* CDDL HEADER START |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
3 |
* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
4 |
* The contents of this file are subject to the terms of the |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
5 |
* Common Development and Distribution License (the "License"). |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
6 |
* You may not use this file except in compliance with the License. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
7 |
* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
8 |
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
9 |
* or http://www.opensolaris.org/os/licensing. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
10 |
* See the License for the specific language governing permissions |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
11 |
* and limitations under the License. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
12 |
* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
13 |
* When distributing Covered Code, include this CDDL HEADER in each |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
14 |
* file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
15 |
* If applicable, add the following below this CDDL HEADER, with the |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
16 |
* fields enclosed by brackets "[]" replaced with your own identifying |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
17 |
* information: Portions Copyright [yyyy] [name of copyright owner] |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
18 |
* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
19 |
* CDDL HEADER END |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
20 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
21 |
/* |
13981
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
22 |
* Copyright (c) 2013 by Delphix. All rights reserved. |
13688
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
23 |
* Copyright (c) 2012 Joyent, Inc. All rights reserved. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
24 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
25 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
26 |
* This file contains all of the interfaces for mdb's tab completion engine. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
27 |
* Currently some interfaces are private to mdb and its internal implementation, |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
28 |
* those are in mdb_tab.h. Other pieces are public interfaces. Those are in |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
29 |
* mdb_modapi.h. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
30 |
* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
31 |
* Memory allocations in tab completion context have to be done very carefully. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
32 |
* We need to think of ourselves as the same as any other command that is being |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
33 |
* executed by the user, which means we must use UM_GC to handle being |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
34 |
* interrupted. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
35 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
36 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
37 |
#include <mdb/mdb_modapi.h> |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
38 |
#include <mdb/mdb_ctf.h> |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
39 |
#include <mdb/mdb_ctf_impl.h> |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
40 |
#include <mdb/mdb_string.h> |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
41 |
#include <mdb/mdb_module.h> |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
42 |
#include <mdb/mdb_debug.h> |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
43 |
#include <mdb/mdb_print.h> |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
44 |
#include <mdb/mdb_nv.h> |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
45 |
#include <mdb/mdb_tab.h> |
13981
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
46 |
#include <mdb/mdb_target.h> |
13688
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
47 |
#include <mdb/mdb.h> |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
48 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
49 |
#include <ctype.h> |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
50 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
51 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
52 |
* There may be another way to do this, but this works well enough. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
53 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
54 |
#define COMMAND_SEPARATOR "::" |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
55 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
56 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
57 |
* find_command_start -- |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
58 |
* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
59 |
* Given a buffer find the start of the last command. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
60 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
61 |
static char * |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
62 |
tab_find_command_start(char *buf) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
63 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
64 |
char *offset = strstr(buf, COMMAND_SEPARATOR); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
65 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
66 |
if (offset == NULL) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
67 |
return (NULL); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
68 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
69 |
for (;;) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
70 |
char *next = strstr(offset + strlen(COMMAND_SEPARATOR), |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
71 |
COMMAND_SEPARATOR); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
72 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
73 |
if (next == NULL) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
74 |
return (offset); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
75 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
76 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
77 |
offset = next; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
78 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
79 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
80 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
81 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
82 |
* get_dcmd -- |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
83 |
* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
84 |
* Given a buffer containing a command and its argument return |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
85 |
* the name of the command and the offset in the buffer where |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
86 |
* the command arguments start. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
87 |
* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
88 |
* Note: This will modify the buffer. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
89 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
90 |
char * |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
91 |
tab_get_dcmd(char *buf, char **args, uint_t *flags) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
92 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
93 |
char *start = buf + strlen(COMMAND_SEPARATOR); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
94 |
char *separator = start; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
95 |
const char *end = buf + strlen(buf); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
96 |
uint_t space = 0; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
97 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
98 |
while (separator < end && !isspace(*separator)) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
99 |
separator++; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
100 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
101 |
if (separator == end) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
102 |
*args = NULL; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
103 |
} else { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
104 |
if (isspace(*separator)) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
105 |
space = 1; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
106 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
107 |
*separator++ = '\0'; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
108 |
*args = separator; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
109 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
110 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
111 |
if (space) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
112 |
*flags |= DCMD_TAB_SPACE; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
113 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
114 |
return (start); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
115 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
116 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
117 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
118 |
* count_args -- |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
119 |
* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
120 |
* Given a buffer containing dmcd arguments return the total number |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
121 |
* of arguments. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
122 |
* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
123 |
* While parsing arguments we need to keep track of whether or not the last |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
124 |
* arguments ends with a trailing space. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
125 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
126 |
static int |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
127 |
tab_count_args(const char *input, uint_t *flags) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
128 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
129 |
const char *index; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
130 |
int argc = 0; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
131 |
uint_t space = *flags & DCMD_TAB_SPACE; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
132 |
index = input; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
133 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
134 |
while (*index != '\0') { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
135 |
while (*index != '\0' && isspace(*index)) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
136 |
index++; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
137 |
space = 1; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
138 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
139 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
140 |
if (*index != '\0' && !isspace(*index)) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
141 |
argc++; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
142 |
space = 0; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
143 |
while (*index != '\0' && !isspace (*index)) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
144 |
index++; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
145 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
146 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
147 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
148 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
149 |
if (space) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
150 |
*flags |= DCMD_TAB_SPACE; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
151 |
else |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
152 |
*flags &= ~DCMD_TAB_SPACE; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
153 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
154 |
return (argc); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
155 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
156 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
157 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
158 |
* copy_args -- |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
159 |
* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
160 |
* Given a buffer containing dcmd arguments and an array of mdb_arg_t's |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
161 |
* initialize the string value of each mdb_arg_t. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
162 |
* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
163 |
* Note: This will modify the buffer. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
164 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
165 |
static int |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
166 |
tab_copy_args(char *input, int argc, mdb_arg_t *argv) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
167 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
168 |
int i = 0; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
169 |
char *index; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
170 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
171 |
index = input; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
172 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
173 |
while (*index) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
174 |
while (*index && isspace(*index)) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
175 |
index++; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
176 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
177 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
178 |
if (*index && !isspace(*index)) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
179 |
char *end = index; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
180 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
181 |
while (*end && !isspace(*end)) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
182 |
end++; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
183 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
184 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
185 |
if (*end) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
186 |
*end++ = '\0'; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
187 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
188 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
189 |
argv[i].a_type = MDB_TYPE_STRING; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
190 |
argv[i].a_un.a_str = index; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
191 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
192 |
index = end; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
193 |
i++; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
194 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
195 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
196 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
197 |
if (i != argc) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
198 |
return (-1); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
199 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
200 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
201 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
202 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
203 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
204 |
* parse-buf -- |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
205 |
* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
206 |
* Parse the given buffer and return the specified dcmd, the number |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
207 |
* of arguments, and array of mdb_arg_t containing the argument |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
208 |
* values. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
209 |
* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
210 |
* Note: this will modify the specified buffer. Caller is responisble |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
211 |
* for freeing argvp. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
212 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
213 |
static int |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
214 |
tab_parse_buf(char *buf, char **dcmdp, int *argcp, mdb_arg_t **argvp, |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
215 |
uint_t *flags) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
216 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
217 |
char *data = tab_find_command_start(buf); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
218 |
char *args_data = NULL; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
219 |
char *dcmd = NULL; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
220 |
int argc = 0; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
221 |
mdb_arg_t *argv = NULL; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
222 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
223 |
if (data == NULL) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
224 |
return (-1); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
225 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
226 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
227 |
dcmd = tab_get_dcmd(data, &args_data, flags); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
228 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
229 |
if (dcmd == NULL) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
230 |
return (-1); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
231 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
232 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
233 |
if (args_data != NULL) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
234 |
argc = tab_count_args(args_data, flags); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
235 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
236 |
if (argc != 0) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
237 |
argv = mdb_alloc(sizeof (mdb_arg_t) * argc, |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
238 |
UM_SLEEP | UM_GC); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
239 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
240 |
if (tab_copy_args(args_data, argc, argv) == -1) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
241 |
return (-1); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
242 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
243 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
244 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
245 |
*dcmdp = dcmd; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
246 |
*argcp = argc; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
247 |
*argvp = argv; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
248 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
249 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
250 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
251 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
252 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
253 |
* tab_command -- |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
254 |
* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
255 |
* This function is executed anytime a tab is entered. It checks |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
256 |
* the current buffer to determine if there is a valid dmcd, |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
257 |
* if that dcmd has a tab completion handler it will invoke it. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
258 |
* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
259 |
* This function returns the string (if any) that should be added to the |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
260 |
* existing buffer to complete it. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
261 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
262 |
int |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
263 |
mdb_tab_command(mdb_tab_cookie_t *mcp, const char *buf) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
264 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
265 |
char *data; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
266 |
char *dcmd = NULL; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
267 |
int argc = 0; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
268 |
mdb_arg_t *argv = NULL; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
269 |
int ret = 0; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
270 |
mdb_idcmd_t *cp; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
271 |
uint_t flags = 0; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
272 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
273 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
274 |
* Parsing the command and arguments will modify the buffer |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
275 |
* (replacing spaces with \0), so make a copy of the specified |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
276 |
* buffer first. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
277 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
278 |
data = mdb_alloc(strlen(buf) + 1, UM_SLEEP | UM_GC); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
279 |
(void) strcpy(data, buf); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
280 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
281 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
282 |
* Get the specified dcmd and arguments from the buffer. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
283 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
284 |
ret = tab_parse_buf(data, &dcmd, &argc, &argv, &flags); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
285 |
|
13981
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
286 |
/* |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
287 |
* Match against global symbols if the input is not a dcmd |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
288 |
*/ |
13688
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
289 |
if (ret != 0) { |
13981
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
290 |
(void) mdb_tab_complete_global(mcp, buf); |
13688
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
291 |
goto out; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
292 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
293 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
294 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
295 |
* Check to see if the buffer contains a valid dcmd |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
296 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
297 |
cp = mdb_dcmd_lookup(dcmd); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
298 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
299 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
300 |
* When argc is zero it indicates that we are trying to tab complete |
13981
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
301 |
* a dcmd or a global symbol. Note, that if there isn't the start of |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
302 |
* a dcmd, i.e. ::, then we will have already bailed in the call to |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
303 |
* tab_parse_buf. |
13688
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
304 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
305 |
if (cp == NULL && argc != 0) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
306 |
goto out; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
307 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
308 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
309 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
310 |
* Invoke the command specific tab completion handler or the built in |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
311 |
* dcmd one if there is no dcmd. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
312 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
313 |
if (cp == NULL) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
314 |
(void) mdb_tab_complete_dcmd(mcp, dcmd); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
315 |
else |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
316 |
mdb_call_tab(cp, mcp, flags, argc, argv); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
317 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
318 |
out: |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
319 |
return (mdb_tab_size(mcp)); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
320 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
321 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
322 |
static int |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
323 |
tab_complete_dcmd(mdb_var_t *v, void *arg) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
324 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
325 |
mdb_idcmd_t *idcp = mdb_nv_get_cookie(mdb_nv_get_cookie(v)); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
326 |
mdb_tab_cookie_t *mcp = (mdb_tab_cookie_t *)arg; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
327 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
328 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
329 |
* The way that mdb is implemented, even commands like $C will show up |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
330 |
* here. As such, we don't want to match anything that doesn't start |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
331 |
* with an alpha or number. While nothing currently appears (via a |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
332 |
* cursory search with mdb -k) to start with a capital letter or a |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
333 |
* number, we'll support them anyways. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
334 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
335 |
if (!isalnum(idcp->idc_name[0])) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
336 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
337 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
338 |
mdb_tab_insert(mcp, idcp->idc_name); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
339 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
340 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
341 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
342 |
int |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
343 |
mdb_tab_complete_dcmd(mdb_tab_cookie_t *mcp, const char *dcmd) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
344 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
345 |
mdb_tab_setmbase(mcp, dcmd); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
346 |
mdb_nv_sort_iter(&mdb.m_dcmds, tab_complete_dcmd, mcp, |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
347 |
UM_GC | UM_SLEEP); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
348 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
349 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
350 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
351 |
static int |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
352 |
tab_complete_walker(mdb_var_t *v, void *arg) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
353 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
354 |
mdb_iwalker_t *iwp = mdb_nv_get_cookie(mdb_nv_get_cookie(v)); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
355 |
mdb_tab_cookie_t *mcp = arg; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
356 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
357 |
mdb_tab_insert(mcp, iwp->iwlk_name); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
358 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
359 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
360 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
361 |
int |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
362 |
mdb_tab_complete_walker(mdb_tab_cookie_t *mcp, const char *walker) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
363 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
364 |
if (walker != NULL) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
365 |
mdb_tab_setmbase(mcp, walker); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
366 |
mdb_nv_sort_iter(&mdb.m_walkers, tab_complete_walker, mcp, |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
367 |
UM_GC | UM_SLEEP); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
368 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
369 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
370 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
371 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
372 |
mdb_tab_cookie_t * |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
373 |
mdb_tab_init(void) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
374 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
375 |
mdb_tab_cookie_t *mcp; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
376 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
377 |
mcp = mdb_zalloc(sizeof (mdb_tab_cookie_t), UM_SLEEP | UM_GC); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
378 |
(void) mdb_nv_create(&mcp->mtc_nv, UM_SLEEP | UM_GC); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
379 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
380 |
return (mcp); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
381 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
382 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
383 |
size_t |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
384 |
mdb_tab_size(mdb_tab_cookie_t *mcp) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
385 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
386 |
return (mdb_nv_size(&mcp->mtc_nv)); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
387 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
388 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
389 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
390 |
* Determine whether the specified name is a valid tab completion for |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
391 |
* the given command. If the name is a valid tab completion then |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
392 |
* it will be saved in the mdb_tab_cookie_t. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
393 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
394 |
void |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
395 |
mdb_tab_insert(mdb_tab_cookie_t *mcp, const char *name) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
396 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
397 |
size_t len, matches, index; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
398 |
uint_t flags; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
399 |
mdb_var_t *v; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
400 |
char *n; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
401 |
const char *nvn; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
402 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
403 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
404 |
* If we have a match set, then we want to verify that we actually match |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
405 |
* it. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
406 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
407 |
if (mcp->mtc_base != NULL && |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
408 |
strncmp(name, mcp->mtc_base, strlen(mcp->mtc_base)) != 0) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
409 |
return; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
410 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
411 |
v = mdb_nv_lookup(&mcp->mtc_nv, name); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
412 |
if (v != NULL) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
413 |
return; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
414 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
415 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
416 |
* Names that we get passed in may be longer than MDB_NV_NAMELEN which |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
417 |
* is currently 31 including the null terminator. If that is the case, |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
418 |
* then we're going to take care of allocating a string and holding it |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
419 |
* for our caller. Note that we don't need to free it, because we're |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
420 |
* allocating this with UM_GC. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
421 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
422 |
flags = 0; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
423 |
len = strlen(name); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
424 |
if (len > MDB_NV_NAMELEN - 1) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
425 |
n = mdb_alloc(len + 1, UM_SLEEP | UM_GC); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
426 |
(void) strcpy(n, name); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
427 |
nvn = n; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
428 |
flags |= MDB_NV_EXTNAME; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
429 |
} else { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
430 |
nvn = name; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
431 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
432 |
flags |= MDB_NV_RDONLY; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
433 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
434 |
(void) mdb_nv_insert(&mcp->mtc_nv, nvn, NULL, 0, flags); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
435 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
436 |
matches = mdb_tab_size(mcp); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
437 |
if (matches == 1) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
438 |
(void) strlcpy(mcp->mtc_match, nvn, MDB_SYM_NAMLEN); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
439 |
} else { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
440 |
index = 0; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
441 |
while (mcp->mtc_match[index] && |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
442 |
mcp->mtc_match[index] == nvn[index]) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
443 |
index++; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
444 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
445 |
mcp->mtc_match[index] = '\0'; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
446 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
447 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
448 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
449 |
/*ARGSUSED*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
450 |
static int |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
451 |
tab_print_cb(mdb_var_t *v, void *ignored) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
452 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
453 |
mdb_printf("%s\n", mdb_nv_get_name(v)); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
454 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
455 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
456 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
457 |
void |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
458 |
mdb_tab_print(mdb_tab_cookie_t *mcp) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
459 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
460 |
mdb_nv_sort_iter(&mcp->mtc_nv, tab_print_cb, NULL, UM_SLEEP | UM_GC); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
461 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
462 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
463 |
const char * |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
464 |
mdb_tab_match(mdb_tab_cookie_t *mcp) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
465 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
466 |
size_t blen; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
467 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
468 |
if (mcp->mtc_base == NULL) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
469 |
blen = 0; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
470 |
else |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
471 |
blen = strlen(mcp->mtc_base); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
472 |
return (mcp->mtc_match + blen); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
473 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
474 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
475 |
void |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
476 |
mdb_tab_setmbase(mdb_tab_cookie_t *mcp, const char *base) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
477 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
478 |
(void) strlcpy(mcp->mtc_base, base, MDB_SYM_NAMLEN); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
479 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
480 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
481 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
482 |
* This function is currently a no-op due to the fact that we have to GC because |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
483 |
* we're in command context. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
484 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
485 |
/*ARGSUSED*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
486 |
void |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
487 |
mdb_tab_fini(mdb_tab_cookie_t *mcp) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
488 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
489 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
490 |
|
13981
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
491 |
/*ARGSUSED*/ |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
492 |
static int |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
493 |
tab_complete_global(void *arg, const GElf_Sym *sym, const char *name, |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
494 |
const mdb_syminfo_t *sip, const char *obj) |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
495 |
{ |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
496 |
mdb_tab_cookie_t *mcp = arg; |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
497 |
mdb_tab_insert(mcp, name); |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
498 |
return (0); |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
499 |
} |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
500 |
|
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
501 |
/* |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
502 |
* This function tab completes against all loaded global symbols. |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
503 |
*/ |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
504 |
int |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
505 |
mdb_tab_complete_global(mdb_tab_cookie_t *mcp, const char *name) |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
506 |
{ |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
507 |
mdb_tab_setmbase(mcp, name); |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
508 |
(void) mdb_tgt_symbol_iter(mdb.m_target, MDB_TGT_OBJ_EVERY, |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
509 |
MDB_TGT_SYMTAB, MDB_TGT_BIND_GLOBAL | MDB_TGT_TYPE_OBJECT | |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
510 |
MDB_TGT_TYPE_FUNC, tab_complete_global, mcp); |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
511 |
return (0); |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
512 |
} |
e0b637c317fa
3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents:
13688
diff
changeset
|
513 |
|
13688
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
514 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
515 |
* This function takes a ctf id and determines whether or not the associated |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
516 |
* type should be considered as a potential match for the given tab |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
517 |
* completion command. We verify that the type itself is valid |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
518 |
* for completion given the current context of the command, resolve |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
519 |
* its actual name, and then pass it off to mdb_tab_insert to determine |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
520 |
* if it's an actual match. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
521 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
522 |
static int |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
523 |
tab_complete_type(mdb_ctf_id_t id, void *arg) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
524 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
525 |
int rkind; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
526 |
char buf[MDB_SYM_NAMLEN]; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
527 |
mdb_ctf_id_t rid; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
528 |
mdb_tab_cookie_t *mcp = arg; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
529 |
uint_t flags = (uint_t)(uintptr_t)mcp->mtc_cba; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
530 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
531 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
532 |
* CTF data includes types that mdb commands don't understand. Before |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
533 |
* we resolve the actual type prune any entry that is a type we |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
534 |
* don't care about. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
535 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
536 |
switch (mdb_ctf_type_kind(id)) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
537 |
case CTF_K_CONST: |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
538 |
case CTF_K_RESTRICT: |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
539 |
case CTF_K_VOLATILE: |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
540 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
541 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
542 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
543 |
if (mdb_ctf_type_resolve(id, &rid) != 0) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
544 |
return (1); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
545 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
546 |
rkind = mdb_ctf_type_kind(rid); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
547 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
548 |
if ((flags & MDB_TABC_MEMBERS) && rkind != CTF_K_STRUCT && |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
549 |
rkind != CTF_K_UNION) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
550 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
551 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
552 |
if ((flags & MDB_TABC_NOPOINT) && rkind == CTF_K_POINTER) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
553 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
554 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
555 |
if ((flags & MDB_TABC_NOARRAY) && rkind == CTF_K_ARRAY) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
556 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
557 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
558 |
(void) mdb_ctf_type_name(id, buf, sizeof (buf)); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
559 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
560 |
mdb_tab_insert(mcp, buf); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
561 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
562 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
563 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
564 |
/*ARGSUSED*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
565 |
static int |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
566 |
mdb_tab_complete_module(void *data, const mdb_map_t *mp, const char *name) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
567 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
568 |
(void) mdb_ctf_type_iter(name, tab_complete_type, data); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
569 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
570 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
571 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
572 |
int |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
573 |
mdb_tab_complete_type(mdb_tab_cookie_t *mcp, const char *name, uint_t flags) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
574 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
575 |
mdb_tgt_t *t = mdb.m_target; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
576 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
577 |
mcp->mtc_cba = (void *)(uintptr_t)flags; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
578 |
if (name != NULL) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
579 |
mdb_tab_setmbase(mcp, name); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
580 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
581 |
(void) mdb_tgt_object_iter(t, mdb_tab_complete_module, mcp); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
582 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
583 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
584 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
585 |
/*ARGSUSED*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
586 |
static int |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
587 |
tab_complete_member(const char *name, mdb_ctf_id_t id, ulong_t off, void *arg) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
588 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
589 |
mdb_tab_cookie_t *mcp = arg; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
590 |
mdb_tab_insert(mcp, name); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
591 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
592 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
593 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
594 |
int |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
595 |
mdb_tab_complete_member_by_id(mdb_tab_cookie_t *mcp, mdb_ctf_id_t id, |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
596 |
const char *member) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
597 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
598 |
if (member != NULL) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
599 |
mdb_tab_setmbase(mcp, member); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
600 |
(void) mdb_ctf_member_iter(id, tab_complete_member, mcp); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
601 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
602 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
603 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
604 |
int |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
605 |
mdb_tab_complete_member(mdb_tab_cookie_t *mcp, const char *type, |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
606 |
const char *member) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
607 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
608 |
mdb_ctf_id_t id; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
609 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
610 |
if (mdb_ctf_lookup_by_name(type, &id) != 0) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
611 |
return (-1); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
612 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
613 |
return (mdb_tab_complete_member_by_id(mcp, id, member)); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
614 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
615 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
616 |
int |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
617 |
mdb_tab_complete_mt(mdb_tab_cookie_t *mcp, uint_t flags, int argc, |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
618 |
const mdb_arg_t *argv) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
619 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
620 |
char tn[MDB_SYM_NAMLEN]; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
621 |
int ret; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
622 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
623 |
if (argc == 0 && !(flags & DCMD_TAB_SPACE)) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
624 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
625 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
626 |
if (argc == 0) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
627 |
return (mdb_tab_complete_type(mcp, NULL, MDB_TABC_MEMBERS)); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
628 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
629 |
if ((ret = mdb_tab_typename(&argc, &argv, tn, sizeof (tn))) < 0) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
630 |
return (ret); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
631 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
632 |
if (argc == 1 && (!(flags & DCMD_TAB_SPACE) || ret == 1)) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
633 |
return (mdb_tab_complete_type(mcp, tn, MDB_TABC_MEMBERS)); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
634 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
635 |
if (argc == 1 && (flags & DCMD_TAB_SPACE)) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
636 |
return (mdb_tab_complete_member(mcp, tn, NULL)); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
637 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
638 |
if (argc == 2) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
639 |
return (mdb_tab_complete_member(mcp, tn, argv[1].a_un.a_str)); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
640 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
641 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
642 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
643 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
644 |
/* |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
645 |
* This is similar to mdb_print.c's args_to_typename, but it has subtle |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
646 |
* differences surrounding how the strings of one element are handled that have |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
647 |
* 'struct', 'enum', or 'union' in them and instead works with them for tab |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
648 |
* completion purposes. |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
649 |
*/ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
650 |
int |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
651 |
mdb_tab_typename(int *argcp, const mdb_arg_t **argvp, char *buf, size_t len) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
652 |
{ |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
653 |
int argc = *argcp; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
654 |
const mdb_arg_t *argv = *argvp; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
655 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
656 |
if (argc < 1 || argv->a_type != MDB_TYPE_STRING) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
657 |
return (DCMD_USAGE); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
658 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
659 |
if (strcmp(argv->a_un.a_str, "struct") == 0 || |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
660 |
strcmp(argv->a_un.a_str, "enum") == 0 || |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
661 |
strcmp(argv->a_un.a_str, "union") == 0) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
662 |
if (argc == 1) { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
663 |
(void) mdb_snprintf(buf, len, "%s ", |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
664 |
argv[0].a_un.a_str); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
665 |
return (1); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
666 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
667 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
668 |
if (argv[1].a_type != MDB_TYPE_STRING) |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
669 |
return (DCMD_USAGE); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
670 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
671 |
(void) mdb_snprintf(buf, len, "%s %s", |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
672 |
argv[0].a_un.a_str, argv[1].a_un.a_str); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
673 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
674 |
*argcp = argc - 1; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
675 |
*argvp = argv + 1; |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
676 |
} else { |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
677 |
(void) mdb_snprintf(buf, len, "%s", argv[0].a_un.a_str); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
678 |
} |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
679 |
|
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
680 |
return (0); |
32dde9989090
2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff
changeset
|
681 |
} |