MFC: An off-by-one malloc size was corrupting the installer's memory,
[dragonfly.git] / contrib / smbfs / smbutil / dumptree.c
blob7d06142c3bd1e48bc13b347ae98f518a3ff9e44b
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
12 #include <netsmb/smb_lib.h>
13 #include <netsmb/smb_conn.h>
15 #include "common.h"
17 #define DEFBIT(bit) {bit, #bit}
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}
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}
40 static struct smb_bitname ss_flags[] = {
41 DEFBIT(SMBS_PERMANENT),
42 {0, NULL}
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"
55 static char *iod_state[] = {
56 "Not connected",
57 "Reconnecting",
58 "Transport activated",
59 "Session active",
60 "Session dead"
63 static void
64 print_vcinfo(struct smb_vc_info *vip)
66 char buf[200];
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);
86 static void
87 print_shareinfo(struct smb_share_info *sip)
89 char buf[200];
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);
103 cmd_dumptree(int argc, char *argv[])
105 void *p, *op;
106 int *itype;
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;
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;
139 free(op);
140 printf("\n");
141 return 0;