Merge branch 'vendor/LIBARCHIVE'
[dragonfly.git] / contrib / smbfs / smbutil / dumptree.c
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
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
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
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 }