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