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 } 145