| Commit | Line | Data |
|---|---|---|
| 984263bc MD |
1 | #include <sys/param.h> |
| 2 | #include <sys/time.h> | |
| 5b0d3e5e SW |
3 | #include <grp.h> |
| 4 | #include <pwd.h> | |
| 984263bc MD |
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 | } |