xref: /freebsd/contrib/smbfs/smbutil/dumptree.c (revision 76efe32555c7456c226cf6e4279fa41bfc6b91ef)
176efe325SR. Imura /* $FreeBSD$ */
276efe325SR. Imura 
3f1b9d127SSheldon Hearn #include <sys/param.h>
4f1b9d127SSheldon Hearn #include <sys/time.h>
576efe325SR. Imura #include <grp.h>
676efe325SR. Imura #include <pwd.h>
7f1b9d127SSheldon Hearn #include <stdio.h>
876efe325SR. Imura #include <stdlib.h>
9f1b9d127SSheldon Hearn #include <string.h>
10f1b9d127SSheldon Hearn #include <unistd.h>
11df3342d6SSheldon Hearn #ifdef APPLE
12df3342d6SSheldon Hearn #include <err.h>
13df3342d6SSheldon Hearn #include <sysexits.h>
14df3342d6SSheldon Hearn #endif
15f1b9d127SSheldon Hearn 
16f1b9d127SSheldon Hearn #include <netsmb/smb_lib.h>
17f1b9d127SSheldon Hearn #include <netsmb/smb_conn.h>
18f1b9d127SSheldon Hearn 
19f1b9d127SSheldon Hearn #include "common.h"
20f1b9d127SSheldon Hearn 
21f1b9d127SSheldon Hearn #define	DEFBIT(bit)	{bit, #bit}
22f1b9d127SSheldon Hearn 
23f1b9d127SSheldon Hearn static struct smb_bitname conn_caps[] = {
24f1b9d127SSheldon Hearn 	DEFBIT(SMB_CAP_RAW_MODE),
25f1b9d127SSheldon Hearn 	DEFBIT(SMB_CAP_MPX_MODE),
26f1b9d127SSheldon Hearn 	DEFBIT(SMB_CAP_UNICODE),
27f1b9d127SSheldon Hearn 	DEFBIT(SMB_CAP_LARGE_FILES),
28f1b9d127SSheldon Hearn 	DEFBIT(SMB_CAP_NT_SMBS),
29f1b9d127SSheldon Hearn 	DEFBIT(SMB_CAP_NT_FIND),
30f1b9d127SSheldon Hearn 	DEFBIT(SMB_CAP_EXT_SECURITY),
31f1b9d127SSheldon Hearn 	{0, NULL}
32f1b9d127SSheldon Hearn };
33f1b9d127SSheldon Hearn 
34f1b9d127SSheldon Hearn static struct smb_bitname vc_flags[] = {
35f1b9d127SSheldon Hearn 	DEFBIT(SMBV_PERMANENT),
36f1b9d127SSheldon Hearn 	{SMBV_PRIVATE,	"private"},
37f1b9d127SSheldon Hearn 	{SMBV_SINGLESHARE, "singleshare"},
38f1b9d127SSheldon Hearn 	{SMBV_ENCRYPT,	"encpwd"},
39f1b9d127SSheldon Hearn 	{SMBV_WIN95,	"win95"},
40f1b9d127SSheldon Hearn 	{SMBV_LONGNAMES,"longnames"},
41f1b9d127SSheldon Hearn 	{0, NULL}
42f1b9d127SSheldon Hearn };
43f1b9d127SSheldon Hearn 
44f1b9d127SSheldon Hearn static struct smb_bitname ss_flags[] = {
45f1b9d127SSheldon Hearn 	DEFBIT(SMBS_PERMANENT),
46f1b9d127SSheldon Hearn 	{0, NULL}
47f1b9d127SSheldon Hearn };
48f1b9d127SSheldon Hearn 
49f1b9d127SSheldon Hearn static char *conn_proto[] = {
50f1b9d127SSheldon Hearn 	"unknown",
51f1b9d127SSheldon Hearn 	"PC NETWORK PROGRAM 1.0, PCLAN1.0",
52f1b9d127SSheldon Hearn 	"MICROSOFT NETWORKS 1.03",
53f1b9d127SSheldon Hearn 	"MICROSOFT NETWORKS 3.0, LANMAN1.0",
54f1b9d127SSheldon Hearn 	"LM1.2X002, DOS LM1.2X002",
55f1b9d127SSheldon Hearn 	"DOS LANMAN2.1, LANMAN2.1",
56f1b9d127SSheldon Hearn 	"NT LM 0.12, Windows for Workgroups 3.1a, NT LANMAN 1.0"
57f1b9d127SSheldon Hearn };
58f1b9d127SSheldon Hearn 
59f1b9d127SSheldon Hearn static char *iod_state[] = {
60f1b9d127SSheldon Hearn 	"Not connected",
61f1b9d127SSheldon Hearn 	"Reconnecting",
62f1b9d127SSheldon Hearn 	"Transport activated",
63f1b9d127SSheldon Hearn 	"Session active",
64f1b9d127SSheldon Hearn 	"Session dead"
65f1b9d127SSheldon Hearn };
66f1b9d127SSheldon Hearn 
67f1b9d127SSheldon Hearn static void
print_vcinfo(struct smb_vc_info * vip)68f1b9d127SSheldon Hearn print_vcinfo(struct smb_vc_info *vip)
69f1b9d127SSheldon Hearn {
70f1b9d127SSheldon Hearn 	char buf[200];
71f1b9d127SSheldon Hearn 
72f1b9d127SSheldon Hearn 	printf("VC: \\\\%s\\%s\n", vip->srvname, vip->vcname);
73f1b9d127SSheldon Hearn 	printf("(%s:%s) %o", user_from_uid(vip->uid, 0),
74f1b9d127SSheldon Hearn 	    group_from_gid(vip->gid, 0), vip->mode);
75f1b9d127SSheldon Hearn 	printf("\n");
76f1b9d127SSheldon Hearn 	if (!verbose)
77f1b9d127SSheldon Hearn 		return;
78f1b9d127SSheldon Hearn 	iprintf(4, "state:    %s\n", iod_state[vip->iodstate]);
79f1b9d127SSheldon Hearn 	iprintf(4, "flags:    0x%04x %s\n", vip->flags,
80f1b9d127SSheldon Hearn 	    smb_printb(buf, vip->flags, vc_flags));
81f1b9d127SSheldon Hearn 	iprintf(4, "usecount: %d\n", vip->usecount);
82f1b9d127SSheldon Hearn 	iprintf(4, "dialect:  %d (%s)\n", vip->sopt.sv_proto, conn_proto[vip->sopt.sv_proto]);
83f1b9d127SSheldon Hearn 	iprintf(4, "smode:    %d\n", vip->sopt.sv_sm);
84f1b9d127SSheldon Hearn 	iprintf(4, "caps:     0x%04x %s\n", vip->sopt.sv_caps,
85f1b9d127SSheldon Hearn 	    smb_printb(buf, vip->sopt.sv_caps, conn_caps));
86f1b9d127SSheldon Hearn 	iprintf(4, "maxmux:   %d\n", vip->sopt.sv_maxmux);
87f1b9d127SSheldon Hearn 	iprintf(4, "maxvcs:   %d\n", vip->sopt.sv_maxvcs);
88f1b9d127SSheldon Hearn }
89f1b9d127SSheldon Hearn 
90f1b9d127SSheldon Hearn static void
print_shareinfo(struct smb_share_info * sip)91f1b9d127SSheldon Hearn print_shareinfo(struct smb_share_info *sip)
92f1b9d127SSheldon Hearn {
93f1b9d127SSheldon Hearn 	char buf[200];
94f1b9d127SSheldon Hearn 
95f1b9d127SSheldon Hearn 	iprintf(4, "Share:    %s", sip->sname);
96f1b9d127SSheldon Hearn 	printf("(%s:%s) %o", user_from_uid(sip->uid, 0),
97f1b9d127SSheldon Hearn 	    group_from_gid(sip->gid, 0), sip->mode);
98f1b9d127SSheldon Hearn 	printf("\n");
99f1b9d127SSheldon Hearn 	if (!verbose)
100f1b9d127SSheldon Hearn 		return;
101f1b9d127SSheldon Hearn 	iprintf(8, "flags:    0x%04x %s\n", sip->flags,
102f1b9d127SSheldon Hearn 	    smb_printb(buf, sip->flags, ss_flags));
103f1b9d127SSheldon Hearn 	iprintf(8, "usecount: %d\n", sip->usecount);
104f1b9d127SSheldon Hearn }
105f1b9d127SSheldon Hearn 
106f1b9d127SSheldon Hearn int
cmd_dumptree(int argc,char * argv[])107f1b9d127SSheldon Hearn cmd_dumptree(int argc, char *argv[])
108f1b9d127SSheldon Hearn {
109f1b9d127SSheldon Hearn 	void *p, *op;
110f1b9d127SSheldon Hearn 	int *itype;
111f1b9d127SSheldon Hearn 
112f1b9d127SSheldon Hearn 	printf("SMB connections:\n");
113df3342d6SSheldon Hearn #ifdef APPLE
114df3342d6SSheldon Hearn 	if (loadsmbvfs())
115df3342d6SSheldon Hearn 		errx(EX_OSERR, "SMB filesystem is not available");
116df3342d6SSheldon Hearn #endif
117f1b9d127SSheldon Hearn 	p = smb_dumptree();
118f1b9d127SSheldon Hearn 	if (p == NULL) {
119f1b9d127SSheldon Hearn 		printf("None\n");
120f1b9d127SSheldon Hearn 		return 0;
121f1b9d127SSheldon Hearn 	}
122f1b9d127SSheldon Hearn 	op = p;
123f1b9d127SSheldon Hearn 	for (;;) {
124f1b9d127SSheldon Hearn 		itype = p;
125f1b9d127SSheldon Hearn 		if (*itype == SMB_INFO_NONE)
126f1b9d127SSheldon Hearn 			break;
127f1b9d127SSheldon Hearn 		switch (*itype) {
128f1b9d127SSheldon Hearn 		    case SMB_INFO_VC:
129f1b9d127SSheldon Hearn 			print_vcinfo(p);
130f1b9d127SSheldon Hearn 			p = (struct smb_vc_info*)p + 1;
131f1b9d127SSheldon Hearn 			break;
132f1b9d127SSheldon Hearn 		    case SMB_INFO_SHARE:
133f1b9d127SSheldon Hearn 			print_shareinfo(p);
134f1b9d127SSheldon Hearn 			p = (struct smb_share_info*)p + 1;
135f1b9d127SSheldon Hearn 			break;
136f1b9d127SSheldon Hearn 		    default:
137f1b9d127SSheldon Hearn 			printf("Out of sync\n");
138f1b9d127SSheldon Hearn 			free(op);
139f1b9d127SSheldon Hearn 			return 1;
140f1b9d127SSheldon Hearn 
141f1b9d127SSheldon Hearn 		}
142f1b9d127SSheldon Hearn 	}
143f1b9d127SSheldon Hearn 	free(op);
144f1b9d127SSheldon Hearn 	printf("\n");
145f1b9d127SSheldon Hearn 	return 0;
146f1b9d127SSheldon Hearn }
147