📄 print-nfs.c
字号:
if (dp == NULL || (!v3 && er)) return (0); if (qflag) return(1); if (v3) { if (vflag) printf(" POST:"); if (!(dp = parse_post_op_attr(dp, vflag))) return (0); } TCHECK2(dp, (v3 ? NFSX_V3STATFS : NFSX_V2STATFS)); sfsp = (const struct nfs_statfs *)dp; if (v3) { printf(" tbytes "); print_int64((u_int32_t *)&sfsp->sf_tbytes, UNSIGNED); printf(" fbytes "); print_int64((u_int32_t *)&sfsp->sf_fbytes, UNSIGNED); printf(" abytes "); print_int64((u_int32_t *)&sfsp->sf_abytes, UNSIGNED); if (vflag) { printf(" tfiles "); print_int64((u_int32_t *)&sfsp->sf_tfiles, UNSIGNED); printf(" ffiles "); print_int64((u_int32_t *)&sfsp->sf_ffiles, UNSIGNED); printf(" afiles "); print_int64((u_int32_t *)&sfsp->sf_afiles, UNSIGNED); printf(" invar %u", (u_int32_t) ntohl(sfsp->sf_invarsec)); } } else { printf(" tsize %d bsize %d blocks %d bfree %d bavail %d", (u_int32_t)ntohl(sfsp->sf_tsize), (u_int32_t)ntohl(sfsp->sf_bsize), (u_int32_t)ntohl(sfsp->sf_blocks), (u_int32_t)ntohl(sfsp->sf_bfree), (u_int32_t)ntohl(sfsp->sf_bavail)); } return (1);trunc: return (0);}static intparserddires(const u_int32_t *dp){ int er; dp = parsestatus(dp, &er); if (dp == 0 || er) return (0); if (qflag) return (1); TCHECK(dp[2]); printf(" offset %x size %d ", (u_int32_t)ntohl(dp[0]), (u_int32_t)ntohl(dp[1])); if (dp[2] != 0) printf(" eof"); return (1);trunc: return (0);}static const u_int32_t *parse_wcc_attr(const u_int32_t *dp){ printf(" sz "); print_int64(dp, UNSIGNED); printf(" mtime %u.%06u ctime %u.%06u", (u_int32_t)ntohl(dp[2]), (u_int32_t)ntohl(dp[3]), (u_int32_t)ntohl(dp[4]), (u_int32_t)ntohl(dp[5])); return (dp + 6);}/* * Pre operation attributes. Print only if vflag > 1. */static const u_int32_t *parse_pre_op_attr(const u_int32_t *dp, int verbose){ TCHECK(dp[0]); if (!ntohl(dp[0])) return (dp + 1); dp++; TCHECK2(dp, 24); if (verbose > 1) { return parse_wcc_attr(dp); } else { /* If not verbose enough, just skip over wcc_attr */ return (dp + 6); }trunc: return (NULL);}/* * Post operation attributes are printed if vflag >= 1 */static const u_int32_t *parse_post_op_attr(const u_int32_t *dp, int verbose){ TCHECK(dp[0]); if (!ntohl(dp[0])) return (dp + 1); dp++; if (verbose) { return parsefattr(dp, verbose, 1); } else return (dp + (NFSX_V3FATTR / sizeof (u_int32_t)));trunc: return (NULL);}static const u_int32_t *parse_wcc_data(const u_int32_t *dp, int verbose){ if (verbose > 1) printf(" PRE:"); if (!(dp = parse_pre_op_attr(dp, verbose))) return (0); if (verbose) printf(" POST:"); return parse_post_op_attr(dp, verbose);}static const u_int32_t *parsecreateopres(const u_int32_t *dp, int verbose){ int er; if (!(dp = parsestatus(dp, &er))) return (0); if (er) dp = parse_wcc_data(dp, verbose); else { TCHECK(dp[0]); if (!ntohl(dp[0])) return (dp + 1); dp++; if (!(dp = parsefh(dp, 1))) return (0); if (verbose) { if (!(dp = parse_post_op_attr(dp, verbose))) return (0); if (vflag > 1) { printf("dir attr:"); dp = parse_wcc_data(dp, verbose); } } } return (dp);trunc: return (NULL);}static intparsewccres(const u_int32_t *dp, int verbose){ int er; if (!(dp = parsestatus(dp, &er))) return (0); return parse_wcc_data(dp, verbose) != 0;}static const u_int32_t *parsev3rddirres(const u_int32_t *dp, int verbose){ int er; if (!(dp = parsestatus(dp, &er))) return (0); if (vflag) printf(" POST:"); if (!(dp = parse_post_op_attr(dp, verbose))) return (0); if (er) return dp; if (vflag) { TCHECK(dp[1]); printf(" verf %08x%08x", dp[0], dp[1]); dp += 2; } return dp;trunc: return (NULL);}static intparsefsinfo(const u_int32_t *dp){ struct nfsv3_fsinfo *sfp; int er; if (!(dp = parsestatus(dp, &er))) return (0); if (vflag) printf(" POST:"); if (!(dp = parse_post_op_attr(dp, vflag))) return (0); if (er) return (1); sfp = (struct nfsv3_fsinfo *)dp; TCHECK(*sfp); printf(" rtmax %u rtpref %u wtmax %u wtpref %u dtpref %u", (u_int32_t) ntohl(sfp->fs_rtmax), (u_int32_t) ntohl(sfp->fs_rtpref), (u_int32_t) ntohl(sfp->fs_wtmax), (u_int32_t) ntohl(sfp->fs_wtpref), (u_int32_t) ntohl(sfp->fs_dtpref)); if (vflag) { printf(" rtmult %u wtmult %u maxfsz ", (u_int32_t) ntohl(sfp->fs_rtmult), (u_int32_t) ntohl(sfp->fs_wtmult)); print_int64((u_int32_t *)&sfp->fs_maxfilesize, UNSIGNED); printf(" delta %u.%06u ", (u_int32_t) ntohl(sfp->fs_timedelta.nfsv3_sec), (u_int32_t) ntohl(sfp->fs_timedelta.nfsv3_nsec)); } return (0);trunc: return (1);}static intparsepathconf(const u_int32_t *dp){ int er; struct nfsv3_pathconf *spp; if (!(dp = parsestatus(dp, &er))) return (0); if (vflag) printf(" POST:"); if (!(dp = parse_post_op_attr(dp, vflag))) return (0); if (er) return (1); spp = (struct nfsv3_pathconf *)dp; TCHECK(*spp); printf(" linkmax %u namemax %u %s %s %s %s", (u_int32_t) ntohl(spp->pc_linkmax), (u_int32_t) ntohl(spp->pc_namemax), ntohl(spp->pc_notrunc) ? "notrunc" : "", ntohl(spp->pc_chownrestricted) ? "chownres" : "", ntohl(spp->pc_caseinsensitive) ? "igncase" : "", ntohl(spp->pc_casepreserving) ? "keepcase" : ""); return (0);trunc: return (1);}static voidinterp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int length){ register const u_int32_t *dp; register int v3; int er; v3 = (vers == NFS_VER3); if (!v3 && proc < NFS_NPROCS) proc = nfsv3_procid[proc]; switch (proc) { case NFSPROC_NOOP: printf(" nop"); return; case NFSPROC_NULL: printf(" null"); return; case NFSPROC_GETATTR: printf(" getattr"); dp = parserep(rp, length); if (dp != NULL && parseattrstat(dp, !qflag, v3) != 0) return; break; case NFSPROC_SETATTR: printf(" setattr"); if (!(dp = parserep(rp, length))) return; if (v3) { if (parsewccres(dp, vflag)) return; } else { if (parseattrstat(dp, !qflag, 0) != 0) return; } break; case NFSPROC_LOOKUP: printf(" lookup"); if (!(dp = parserep(rp, length))) break; if (v3) { if (!(dp = parsestatus(dp, &er))) break; if (er) { if (vflag > 1) { printf(" post dattr:"); dp = parse_post_op_attr(dp, vflag); } } else { if (!(dp = parsefh(dp, v3))) break; if ((dp = parse_post_op_attr(dp, vflag)) && vflag > 1) { printf(" post dattr:"); dp = parse_post_op_attr(dp, vflag); } } if (dp) return; } else { if (parsediropres(dp) != 0) return; } break; case NFSPROC_ACCESS: printf(" access"); dp = parserep(rp, length); if (!(dp = parsestatus(dp, &er))) break; if (vflag) printf(" attr:"); if (!(dp = parse_post_op_attr(dp, vflag))) break; if (!er) printf(" c %04x", (u_int32_t)ntohl(dp[0])); return; case NFSPROC_READLINK: printf(" readlink"); dp = parserep(rp, length); if (dp != NULL && parselinkres(dp, v3) != 0) return; break; case NFSPROC_READ: printf(" read"); if (!(dp = parserep(rp, length))) break; if (v3) { if (!(dp = parsestatus(dp, &er))) break; if (!(dp = parse_post_op_attr(dp, vflag))) break; if (er) return; if (vflag) { TCHECK(dp[1]); printf("%u bytes", (u_int32_t) ntohl(dp[0])); if (ntohl(dp[1])) printf(" EOF"); } return; } else { if (parseattrstat(dp, vflag, 0) != 0) return; } break; case NFSPROC_WRITE: printf(" write"); if (!(dp = parserep(rp, length))) break; if (v3) { if (!(dp = parsestatus(dp, &er))) break; if (!(dp = parse_wcc_data(dp, vflag))) break; if (er) return; if (vflag) { TCHECK(dp[0]); printf("%u bytes", (u_int32_t) ntohl(dp[0])); if (vflag > 1) { TCHECK(dp[1]); printf(" <%s>", tok2str(nfsv3_writemodes, NULL, ntohl(dp[1]))); } return; } } else { if (parseattrstat(dp, vflag, v3) != 0) return; } break; case NFSPROC_CREATE: printf(" create"); if (!(dp = parserep(rp, length))) break; if (v3) { if (parsecreateopres(dp, vflag) != 0) return; } else { if (parsediropres(dp) != 0) return; } break; case NFSPROC_MKDIR: printf(" mkdir"); if (!(dp = parserep(rp, length))) break; if (v3) { if (parsecreateopres(dp, vflag) != 0) return; } else { if (parsediropres(dp) != 0) return; } break; case NFSPROC_SYMLINK: printf(" symlink"); if (!(dp = parserep(rp, length))) break; if (v3) { if (parsecreateopres(dp, vflag) != 0) return; } else { if (parsestatus(dp, &er) != 0) return; } break; case NFSPROC_MKNOD: printf(" mknod"); if (!(dp = parserep(rp, length))) break; if (parsecreateopres(dp, vflag) != 0) return; break; case NFSPROC_REMOVE: printf(" remove"); if (!(dp = parserep(rp, length))) break; if (v3) { if (parsewccres(dp, vflag)) return; } else { if (parsestatus(dp, &er) != 0) return; } break; case NFSPROC_RMDIR: printf(" rmdir"); if (!(dp = parserep(rp, length))) break; if (v3) { if (parsewccres(dp, vflag)) return; } else { if (parsestatus(dp, &er) != 0) return; } break; case NFSPROC_RENAME: printf(" rename"); if (!(dp = parserep(rp, length))) break; if (v3) { if (!(dp = parsestatus(dp, &er))) break; if (vflag) { printf(" from:"); if (!(dp = parse_wcc_data(dp, vflag))) break; printf(" to:"); if (!(dp = parse_wcc_data(dp, vflag))) break; } return; } else { if (parsestatus(dp, &er) != 0) return; } break; case NFSPROC_LINK: printf(" link"); if (!(dp = parserep(rp, length))) break; if (v3) { if (!(dp = parsestatus(dp, &er))) break; if (vflag) { printf(" file POST:"); if (!(dp = parse_post_op_attr(dp, vflag))) break; printf(" dir:"); if (!(dp = parse_wcc_data(dp, vflag))) break; return; } } else { if (parsestatus(dp, &er) != 0) return; } break; case NFSPROC_READDIR: printf(" readdir"); if (!(dp = parserep(rp, length))) break; if (v3) { if (parsev3rddirres(dp, vflag)) return; } else { if (parserddires(dp) != 0) return; } break; case NFSPROC_READDIRPLUS: printf(" readdirplus"); if (!(dp = parserep(rp, length))) break; if (parsev3rddirres(dp, vflag)) return; break; case NFSPROC_FSSTAT: printf(" fsstat"); dp = parserep(rp, length); if (dp != NULL && parsestatfs(dp, v3) != 0) return; break; case NFSPROC_FSINFO: printf(" fsinfo"); dp = parserep(rp, length); if (dp != NULL && parsefsinfo(dp) != 0) return; break; case NFSPROC_PATHCONF: printf(" pathconf"); dp = parserep(rp, length); if (dp != NULL && parsepathconf(dp) != 0) return; break; case NFSPROC_COMMIT: printf(" commit"); dp = parserep(rp, length); if (dp != NULL && parsewccres(dp, vflag) != 0) return; break; default: printf(" proc-%u", proc); return; }trunc: if (!nfserr) fputs(" [|nfs]", stdout);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -