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