1*0605fe78SGordon Ross /*
2*0605fe78SGordon Ross * This file and its contents are supplied under the terms of the
3*0605fe78SGordon Ross * Common Development and Distribution License ("CDDL"), version 1.0.
4*0605fe78SGordon Ross * You may only use this file in accordance with the terms of version
5*0605fe78SGordon Ross * 1.0 of the CDDL.
6*0605fe78SGordon Ross *
7*0605fe78SGordon Ross * A full copy of the text of the CDDL should have accompanied this
8*0605fe78SGordon Ross * source. A copy of the CDDL is also available via the Internet at
9*0605fe78SGordon Ross * http://www.illumos.org/license/CDDL.
10*0605fe78SGordon Ross */
11*0605fe78SGordon Ross
12*0605fe78SGordon Ross /*
13*0605fe78SGordon Ross * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
14*0605fe78SGordon Ross */
15*0605fe78SGordon Ross
16*0605fe78SGordon Ross #include <mdb/mdb_modapi.h>
17*0605fe78SGordon Ross #include <sys/types.h>
18*0605fe78SGordon Ross #include <sys/cred_impl.h>
19*0605fe78SGordon Ross #include <sys/sid.h>
20*0605fe78SGordon Ross
21*0605fe78SGordon Ross #include "cred.h"
22*0605fe78SGordon Ross
23*0605fe78SGordon Ross #define OPT_VERBOSE 1
24*0605fe78SGordon Ross
25*0605fe78SGordon Ross static void print_ksid(const ksid_t *);
26*0605fe78SGordon Ross
27*0605fe78SGordon Ross /*
28*0605fe78SGordon Ross * dcmd ::cred - display a credential (cred_t)
29*0605fe78SGordon Ross */
30*0605fe78SGordon Ross int
cmd_cred(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)31*0605fe78SGordon Ross cmd_cred(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
32*0605fe78SGordon Ross {
33*0605fe78SGordon Ross credgrp_t cr_grps;
34*0605fe78SGordon Ross cred_t *cr;
35*0605fe78SGordon Ross mdb_arg_t cmdarg;
36*0605fe78SGordon Ross uint_t opts = FALSE;
37*0605fe78SGordon Ross
38*0605fe78SGordon Ross if (mdb_getopts(argc, argv,
39*0605fe78SGordon Ross 'v', MDB_OPT_SETBITS, OPT_VERBOSE, &opts, NULL) != argc)
40*0605fe78SGordon Ross return (DCMD_USAGE);
41*0605fe78SGordon Ross
42*0605fe78SGordon Ross if (!(flags & DCMD_ADDRSPEC)) {
43*0605fe78SGordon Ross return (DCMD_USAGE);
44*0605fe78SGordon Ross }
45*0605fe78SGordon Ross
46*0605fe78SGordon Ross cr = mdb_alloc(sizeof (*cr), UM_SLEEP | UM_GC);
47*0605fe78SGordon Ross if (mdb_vread(cr, sizeof (*cr), addr) == -1) {
48*0605fe78SGordon Ross mdb_warn("error reading cred_t at %p", addr);
49*0605fe78SGordon Ross return (DCMD_ERR);
50*0605fe78SGordon Ross }
51*0605fe78SGordon Ross
52*0605fe78SGordon Ross if (cr->cr_grps == NULL) {
53*0605fe78SGordon Ross bzero(&cr_grps, sizeof (cr_grps));
54*0605fe78SGordon Ross } else {
55*0605fe78SGordon Ross if (mdb_vread(&cr_grps, sizeof (cr_grps),
56*0605fe78SGordon Ross (uintptr_t)cr->cr_grps) == -1) {
57*0605fe78SGordon Ross mdb_warn("error reading credgrp_t at %p",
58*0605fe78SGordon Ross cr->cr_grps);
59*0605fe78SGordon Ross return (DCMD_ERR);
60*0605fe78SGordon Ross }
61*0605fe78SGordon Ross }
62*0605fe78SGordon Ross
63*0605fe78SGordon Ross if (opts & OPT_VERBOSE) {
64*0605fe78SGordon Ross cmdarg.a_type = MDB_TYPE_STRING;
65*0605fe78SGordon Ross cmdarg.a_un.a_str = "cred_t";
66*0605fe78SGordon Ross (void) mdb_call_dcmd("print", addr, flags, 1, &cmdarg);
67*0605fe78SGordon Ross cmdarg.a_un.a_str = "-v";
68*0605fe78SGordon Ross
69*0605fe78SGordon Ross mdb_printf("%<u>cr_grps:%</u>\n");
70*0605fe78SGordon Ross mdb_inc_indent(4);
71*0605fe78SGordon Ross if (cr->cr_grps == NULL) {
72*0605fe78SGordon Ross mdb_printf("(null)\n");
73*0605fe78SGordon Ross } else {
74*0605fe78SGordon Ross (void) mdb_call_dcmd("credgrp",
75*0605fe78SGordon Ross (uintptr_t)cr->cr_grps, flags, 1, &cmdarg);
76*0605fe78SGordon Ross }
77*0605fe78SGordon Ross mdb_dec_indent(4);
78*0605fe78SGordon Ross
79*0605fe78SGordon Ross mdb_printf("%<u>cr_ksid:%</u>\n");
80*0605fe78SGordon Ross mdb_inc_indent(4);
81*0605fe78SGordon Ross if (cr->cr_ksid == NULL) {
82*0605fe78SGordon Ross mdb_printf("(null)\n");
83*0605fe78SGordon Ross } else {
84*0605fe78SGordon Ross (void) mdb_call_dcmd("credsid",
85*0605fe78SGordon Ross (uintptr_t)cr->cr_ksid, flags, 1, &cmdarg);
86*0605fe78SGordon Ross }
87*0605fe78SGordon Ross mdb_dec_indent(4);
88*0605fe78SGordon Ross
89*0605fe78SGordon Ross return (DCMD_OK);
90*0605fe78SGordon Ross }
91*0605fe78SGordon Ross
92*0605fe78SGordon Ross if (DCMD_HDRSPEC(flags))
93*0605fe78SGordon Ross mdb_printf("%<u>%?s %8s %8s %8s %8s% %8s%</u>\n",
94*0605fe78SGordon Ross "ADDR", "UID", "GID", "RUID", "RGID", "#GRP(+SIDS)");
95*0605fe78SGordon Ross
96*0605fe78SGordon Ross mdb_printf("%0?p %8u %8u %8u %8u %4u%s\n", addr,
97*0605fe78SGordon Ross cr->cr_uid, cr->cr_gid,
98*0605fe78SGordon Ross cr->cr_ruid, cr->cr_rgid,
99*0605fe78SGordon Ross cr_grps.crg_ngroups,
100*0605fe78SGordon Ross (cr->cr_ksid == NULL) ? "" : "+");
101*0605fe78SGordon Ross
102*0605fe78SGordon Ross return (DCMD_OK);
103*0605fe78SGordon Ross }
104*0605fe78SGordon Ross
105*0605fe78SGordon Ross /*
106*0605fe78SGordon Ross * dcmd ::credgrp - display cred_t groups
107*0605fe78SGordon Ross */
108*0605fe78SGordon Ross int
cmd_credgrp(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)109*0605fe78SGordon Ross cmd_credgrp(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
110*0605fe78SGordon Ross {
111*0605fe78SGordon Ross credgrp_t grps;
112*0605fe78SGordon Ross gid_t gid;
113*0605fe78SGordon Ross uint_t i, opts = FALSE;
114*0605fe78SGordon Ross int rv = DCMD_OK;
115*0605fe78SGordon Ross
116*0605fe78SGordon Ross if (mdb_getopts(argc, argv,
117*0605fe78SGordon Ross 'v', MDB_OPT_SETBITS, OPT_VERBOSE, &opts, NULL) != argc)
118*0605fe78SGordon Ross return (DCMD_USAGE);
119*0605fe78SGordon Ross
120*0605fe78SGordon Ross if (!(flags & DCMD_ADDRSPEC)) {
121*0605fe78SGordon Ross return (DCMD_USAGE);
122*0605fe78SGordon Ross }
123*0605fe78SGordon Ross
124*0605fe78SGordon Ross if (mdb_vread(&grps, sizeof (grps), addr) == -1) {
125*0605fe78SGordon Ross mdb_warn("error reading credgrp_t at %p", addr);
126*0605fe78SGordon Ross return (DCMD_ERR);
127*0605fe78SGordon Ross }
128*0605fe78SGordon Ross
129*0605fe78SGordon Ross if (opts & OPT_VERBOSE) {
130*0605fe78SGordon Ross mdb_printf("crg_ref = 0x%x\n", grps.crg_ref);
131*0605fe78SGordon Ross mdb_printf("crg_ngroups = 0x%x\n", grps.crg_ngroups);
132*0605fe78SGordon Ross }
133*0605fe78SGordon Ross mdb_printf("crg_groups = [\n");
134*0605fe78SGordon Ross
135*0605fe78SGordon Ross addr += OFFSETOF(credgrp_t, crg_groups);
136*0605fe78SGordon Ross mdb_inc_indent(4);
137*0605fe78SGordon Ross for (i = 0; i < grps.crg_ngroups; i++, addr += sizeof (gid_t)) {
138*0605fe78SGordon Ross if (mdb_vread(&gid, sizeof (gid), addr) == -1) {
139*0605fe78SGordon Ross mdb_warn("error reading gid_t at %p", addr);
140*0605fe78SGordon Ross rv = DCMD_ERR;
141*0605fe78SGordon Ross break;
142*0605fe78SGordon Ross }
143*0605fe78SGordon Ross mdb_printf("\t%u,", gid);
144*0605fe78SGordon Ross }
145*0605fe78SGordon Ross mdb_dec_indent(4);
146*0605fe78SGordon Ross mdb_printf("\n]\n");
147*0605fe78SGordon Ross
148*0605fe78SGordon Ross return (rv);
149*0605fe78SGordon Ross }
150*0605fe78SGordon Ross
151*0605fe78SGordon Ross /*
152*0605fe78SGordon Ross * dcmd ::credsid - display a credsid_t
153*0605fe78SGordon Ross */
154*0605fe78SGordon Ross int
cmd_credsid(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)155*0605fe78SGordon Ross cmd_credsid(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
156*0605fe78SGordon Ross {
157*0605fe78SGordon Ross credsid_t kr;
158*0605fe78SGordon Ross uint_t opts = FALSE;
159*0605fe78SGordon Ross int rv = DCMD_OK;
160*0605fe78SGordon Ross
161*0605fe78SGordon Ross if (mdb_getopts(argc, argv,
162*0605fe78SGordon Ross 'v', MDB_OPT_SETBITS, OPT_VERBOSE, &opts, NULL) != argc)
163*0605fe78SGordon Ross return (DCMD_USAGE);
164*0605fe78SGordon Ross
165*0605fe78SGordon Ross if (!(flags & DCMD_ADDRSPEC)) {
166*0605fe78SGordon Ross return (DCMD_USAGE);
167*0605fe78SGordon Ross }
168*0605fe78SGordon Ross
169*0605fe78SGordon Ross if (mdb_vread(&kr, sizeof (kr), addr) == -1) {
170*0605fe78SGordon Ross mdb_warn("error reading credsid_t at %p", addr);
171*0605fe78SGordon Ross return (DCMD_ERR);
172*0605fe78SGordon Ross }
173*0605fe78SGordon Ross
174*0605fe78SGordon Ross if (opts & OPT_VERBOSE)
175*0605fe78SGordon Ross mdb_printf("kr_ref = 0x%x\n", kr.kr_ref);
176*0605fe78SGordon Ross
177*0605fe78SGordon Ross mdb_printf("kr_sidx[USER] = ");
178*0605fe78SGordon Ross print_ksid(&kr.kr_sidx[KSID_USER]);
179*0605fe78SGordon Ross
180*0605fe78SGordon Ross mdb_printf("kr_sidx[GROUP] = ");
181*0605fe78SGordon Ross print_ksid(&kr.kr_sidx[KSID_GROUP]);
182*0605fe78SGordon Ross
183*0605fe78SGordon Ross mdb_printf("kr_sidx[OWNER] = ");
184*0605fe78SGordon Ross print_ksid(&kr.kr_sidx[KSID_OWNER]);
185*0605fe78SGordon Ross
186*0605fe78SGordon Ross mdb_printf("kr_sidlist = %p\n", kr.kr_sidlist);
187*0605fe78SGordon Ross if (kr.kr_sidlist != NULL && (opts & OPT_VERBOSE) != 0) {
188*0605fe78SGordon Ross mdb_printf("*kr_sidlist = {\n");
189*0605fe78SGordon Ross mdb_inc_indent(4);
190*0605fe78SGordon Ross rv = mdb_call_dcmd("ksidlist",
191*0605fe78SGordon Ross (uintptr_t)kr.kr_sidlist, flags, argc, argv);
192*0605fe78SGordon Ross mdb_dec_indent(4);
193*0605fe78SGordon Ross mdb_printf("}\n");
194*0605fe78SGordon Ross }
195*0605fe78SGordon Ross
196*0605fe78SGordon Ross return (rv);
197*0605fe78SGordon Ross }
198*0605fe78SGordon Ross
199*0605fe78SGordon Ross /*
200*0605fe78SGordon Ross * dcmd ::ksidlist - display a ksidlist_t
201*0605fe78SGordon Ross */
202*0605fe78SGordon Ross int
cmd_ksidlist(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)203*0605fe78SGordon Ross cmd_ksidlist(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
204*0605fe78SGordon Ross {
205*0605fe78SGordon Ross ksidlist_t ksl;
206*0605fe78SGordon Ross ksid_t ks;
207*0605fe78SGordon Ross uint_t i, opts = FALSE;
208*0605fe78SGordon Ross int rv = DCMD_OK;
209*0605fe78SGordon Ross
210*0605fe78SGordon Ross if (mdb_getopts(argc, argv,
211*0605fe78SGordon Ross 'v', MDB_OPT_SETBITS, OPT_VERBOSE, &opts, NULL) != argc)
212*0605fe78SGordon Ross return (DCMD_USAGE);
213*0605fe78SGordon Ross
214*0605fe78SGordon Ross if (!(flags & DCMD_ADDRSPEC)) {
215*0605fe78SGordon Ross return (DCMD_USAGE);
216*0605fe78SGordon Ross }
217*0605fe78SGordon Ross
218*0605fe78SGordon Ross if (mdb_vread(&ksl, sizeof (ksl), addr) == -1) {
219*0605fe78SGordon Ross mdb_warn("error reading ksidlist_t at %p", addr);
220*0605fe78SGordon Ross return (DCMD_ERR);
221*0605fe78SGordon Ross }
222*0605fe78SGordon Ross
223*0605fe78SGordon Ross if (opts & OPT_VERBOSE) {
224*0605fe78SGordon Ross mdb_printf("ksl_ref = 0x%x\n", ksl.ksl_ref);
225*0605fe78SGordon Ross mdb_printf("ksl_nsid = 0x%x\n", ksl.ksl_nsid);
226*0605fe78SGordon Ross mdb_printf("ksl_neid = 0x%x\n", ksl.ksl_neid);
227*0605fe78SGordon Ross }
228*0605fe78SGordon Ross
229*0605fe78SGordon Ross mdb_printf("ksl_sids = [\n");
230*0605fe78SGordon Ross addr += OFFSETOF(ksidlist_t, ksl_sids);
231*0605fe78SGordon Ross mdb_inc_indent(4);
232*0605fe78SGordon Ross for (i = 0; i < ksl.ksl_nsid; i++, addr += sizeof (ksid_t)) {
233*0605fe78SGordon Ross if (mdb_vread(&ks, sizeof (ks), addr) == -1) {
234*0605fe78SGordon Ross mdb_warn("error reading ksid_t at %p", addr);
235*0605fe78SGordon Ross rv = DCMD_ERR;
236*0605fe78SGordon Ross break;
237*0605fe78SGordon Ross }
238*0605fe78SGordon Ross print_ksid(&ks);
239*0605fe78SGordon Ross }
240*0605fe78SGordon Ross mdb_dec_indent(4);
241*0605fe78SGordon Ross mdb_printf("]\n");
242*0605fe78SGordon Ross
243*0605fe78SGordon Ross return (rv);
244*0605fe78SGordon Ross }
245*0605fe78SGordon Ross
246*0605fe78SGordon Ross static void
print_ksid(const ksid_t * ks)247*0605fe78SGordon Ross print_ksid(const ksid_t *ks)
248*0605fe78SGordon Ross {
249*0605fe78SGordon Ross char str[80];
250*0605fe78SGordon Ross ksiddomain_t kd;
251*0605fe78SGordon Ross uintptr_t da, sa;
252*0605fe78SGordon Ross
253*0605fe78SGordon Ross /* in case of errors */
254*0605fe78SGordon Ross strcpy(str, "(domain?)");
255*0605fe78SGordon Ross
256*0605fe78SGordon Ross da = (uintptr_t)ks->ks_domain;
257*0605fe78SGordon Ross if (da == 0 || mdb_vread(&kd, sizeof (kd), da) < 0)
258*0605fe78SGordon Ross bzero(&kd, sizeof (kd));
259*0605fe78SGordon Ross sa = (uintptr_t)kd.kd_name;
260*0605fe78SGordon Ross if (sa != 0)
261*0605fe78SGordon Ross (void) mdb_readstr(str, sizeof (str), sa);
262*0605fe78SGordon Ross
263*0605fe78SGordon Ross mdb_printf("%s-%u,\n", str, ks->ks_rid);
264*0605fe78SGordon Ross }
265