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