dumptree.c revision 88282
13741Sjlahoda#include <sys/param.h> 23741Sjlahoda#include <sys/time.h> 33741Sjlahoda#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 11 12#include <netsmb/smb_lib.h> 13#include <netsmb/smb_conn.h> 14 15#include "common.h" 16 17#define DEFBIT(bit) {bit, #bit} 18 19static 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} 28}; 29 30static 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} 38}; 39 40static struct smb_bitname ss_flags[] = { 41 DEFBIT(SMBS_PERMANENT), 42 {0, NULL} 43}; 44 45static 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" 53}; 54 55static char *iod_state[] = { 56 "Not connected", 57 "Reconnecting", 58 "Transport activated", 59 "Session active", 60 "Session dead" 61}; 62 63static void 64print_vcinfo(struct smb_vc_info *vip) 65{ 66 char buf[200]; 67 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); 84} 85 86static void 87print_shareinfo(struct smb_share_info *sip) 88{ 89 char buf[200]; 90 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); 100} 101 102int 103cmd_dumptree(int argc, char *argv[]) 104{ 105 void *p, *op; 106 int *itype; 107 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; 117 } 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; 136 137 } 138 } 139 free(op); 140 printf("\n"); 141 return 0; 142} 143