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