📄 _nfs.c
字号:
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);
/* 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);
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)
PUTS (" PRE:");
if ((dp = parse_pre_op_attr (dp, verbose)) == NULL)
return (NULL);
if (verbose)
PUTS (" 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)) == NULL)
return (NULL);
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)) == NULL)
return (NULL);
if (verbose)
{
if ((dp = parse_post_op_attr (dp, verbose)) == NULL)
return (NULL);
if (vflag > 1)
{
PUTS ("dir attr:");
dp = parse_wcc_data (dp, verbose);
}
}
}
return (dp);
trunc:
return (NULL);
}
static __inline int parsewccres (const u_int32_t *dp, int verbose)
{
int er;
if ((dp = parsestatus (dp, &er)) == NULL)
return (0);
return parse_wcc_data (dp, verbose) != NULL;
}
static const u_int32_t *parsev3rddirres (const u_int32_t *dp, int verbose)
{
int er;
if ((dp = parsestatus (dp, &er)) == NULL)
return (NULL);
if (vflag)
PUTS (" POST:");
if ((dp = parse_post_op_attr (dp, verbose)) == NULL)
return (NULL);
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 int parsefsinfo (const u_int32_t *dp)
{
struct nfsv3_fsinfo *sfp;
int er;
if ((dp = parsestatus (dp, &er)) == NULL)
return (0);
if (vflag)
PUTS (" POST:");
if ((dp = parse_post_op_attr (dp, vflag)) == NULL)
return (0);
if (er)
return (1);
sfp = (struct nfsv3_fsinfo*)dp;
TCHECK (*sfp);
PRINTF (" rtmax %lu rtpref %lu wtmax %lu wtpref %lu dtpref %lu",
ntohl (sfp->fs_rtmax), ntohl (sfp->fs_rtpref),
ntohl (sfp->fs_wtmax), ntohl (sfp->fs_wtpref),
ntohl (sfp->fs_dtpref));
if (vflag)
{
PRINTF (" rtmult %lu wtmult %lu maxfsz ",
ntohl (sfp->fs_rtmult), ntohl (sfp->fs_wtmult));
print_int64 ((u_int32_t*)&sfp->fs_maxfilesize, UNSIGNED);
PRINTF (" delta %lu.%06lu ",
ntohl (sfp->fs_timedelta.nfsv3_sec),
ntohl (sfp->fs_timedelta.nfsv3_nsec));
}
return (1);
trunc:
return (0);
}
static int parsepathconf (const u_int32_t * dp)
{
struct nfsv3_pathconf *spp;
int er;
if ((dp = parsestatus (dp, &er)) == NULL)
return (0);
if (vflag)
PUTS (" POST:");
if ((dp = parse_post_op_attr (dp, vflag)) == NULL)
return (0);
if (er)
return (1);
spp = (struct nfsv3_pathconf*)dp;
TCHECK (*spp);
PRINTF (" linkmax %lu namemax %lu %s %s %s %s",
ntohl (spp->pc_linkmax),
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 (1);
trunc:
return (0);
}
static void interp_reply (const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int length)
{
const u_int32_t *dp;
int v3, er;
v3 = (vers == NFS_VER3);
if (!v3 && proc < DIM(nfsv3_procid))
proc = nfsv3_procid[proc];
switch (proc)
{
case NFSPROC_NOOP:
PUTS (" nop");
return;
case NFSPROC_NULL:
PUTS (" null");
return;
case NFSPROC_GETATTR:
PUTS (" getattr");
dp = parserep (rp, length);
if (dp && parseattrstat (dp, !qflag, v3))
return;
break;
case NFSPROC_SETATTR:
PUTS (" setattr");
if ((dp = parserep (rp, length)) == NULL)
return;
if (v3)
{
if (parsewccres (dp, vflag))
return;
}
else
{
if (parseattrstat (dp, !qflag, 0))
return;
}
break;
case NFSPROC_LOOKUP:
PUTS (" lookup");
if ((dp = parserep (rp, length)) == NULL)
break;
if (v3)
{
if ((dp = parsestatus (dp, &er)) == NULL)
break;
if (er)
{
if (vflag > 1)
{
PUTS (" post dattr:");
dp = parse_post_op_attr (dp, vflag);
}
}
else
{
if ((dp = parsefh (dp, v3)) == NULL)
break;
if (((dp = parse_post_op_attr (dp, vflag)) != NULL) && (vflag > 1))
{
PUTS (" post dattr:");
dp = parse_post_op_attr (dp, vflag);
}
}
if (dp)
return;
}
else
{
if (parsediropres (dp))
return;
}
break;
case NFSPROC_ACCESS:
PUTS (" access");
dp = parserep (rp, length);
if ((dp = parsestatus (dp, &er)) == NULL)
break;
if (vflag)
PUTS (" attr:");
if ((dp = parse_post_op_attr (dp, vflag)) == NULL)
break;
if (!er)
PRINTF (" c %04lx", ntohl (dp[0]));
return;
case NFSPROC_READLINK:
PUTS (" readlink");
dp = parserep (rp, length);
if (dp && parselinkres (dp, v3))
return;
break;
case NFSPROC_READ:
PUTS (" read");
if ((dp = parserep (rp, length)) == NULL)
break;
if (v3)
{
if ((dp = parsestatus (dp, &er)) == NULL)
break;
if ((dp = parse_post_op_attr (dp, vflag)) == NULL)
break;
if (er)
return;
if (vflag)
{
TCHECK2 (*dp, 8);
PRINTF ("%lu bytes", ntohl (dp[0]));
if (ntohl (dp[1]))
PUTS (" EOF");
}
return;
}
else
{
if (parseattrstat (dp, vflag, 0))
return;
}
break;
case NFSPROC_WRITE:
PUTS (" write");
if ((dp = parserep (rp, length)) == NULL)
break;
if (v3)
{
if ((dp = parsestatus (dp, &er)) == NULL)
break;
if ((dp = parse_wcc_data (dp, vflag)) == NULL)
break;
if (er)
return;
if (vflag)
{
TCHECK2 (*dp, 4);
PRINTF ("%lu bytes", ntohl (dp[0]));
if (vflag > 1)
{
TCHECK2 (*dp, 4);
PRINTF (" <%s>", nfsv3_writemodes[ntohl (dp[1])]);
}
return;
}
}
else
{
if (parseattrstat (dp, vflag, v3))
return;
}
break;
case NFSPROC_CREATE:
PUTS (" create");
if ((dp = parserep (rp, length)) == NULL)
break;
if (v3)
{
if (parsecreateopres (dp, vflag))
return;
}
else
{
if (parsediropres (dp))
return;
}
break;
case NFSPROC_MKDIR:
PUTS (" mkdir");
if ((dp = parserep (rp, length)) == NULL)
break;
if (v3)
{
if (parsecreateopres (dp, vflag))
return;
}
else
{
if (parsediropres (dp))
return;
}
break;
case NFSPROC_SYMLINK:
PUTS (" symlink");
if ((dp = parserep (rp, length)) == NULL)
break;
if (v3)
{
if (parsecreateopres (dp, vflag))
return;
}
else
{
if (parsestatus (dp, &er))
return;
}
break;
case NFSPROC_MKNOD:
PUTS (" mknod");
if ((dp = parserep (rp, length)) == NULL)
break;
if (parsecreateopres (dp, vflag))
return;
break;
case NFSPROC_REMOVE:
PUTS (" remove");
if ((dp = parserep (rp, length)) == NULL)
break;
if (v3)
{
if (parsewccres (dp, vflag))
return;
}
else
{
if (parsestatus (dp, &er))
return;
}
break;
case NFSPROC_RMDIR:
PUTS (" rmdir");
if ((dp = parserep (rp, length)) == NULL)
break;
if (v3)
{
if (parsewccres (dp, vflag))
return;
}
else
{
if (parsestatus (dp, &er))
return;
}
break;
case NFSPROC_RENAME:
PUTS (" rename");
if ((dp = parserep (rp, length)) == NULL)
break;
if (v3)
{
if ((dp = parsestatus (dp, &er)) == NULL)
break;
if (vflag)
{
PUTS (" from:");
if ((dp = parse_wcc_data (dp, vflag)) == NULL)
break;
PUTS (" to:");
if ((dp = parse_wcc_data (dp, vflag)) == NULL)
break;
}
return;
}
else
{
if (parsestatus (dp, &er))
return;
}
break;
case NFSPROC_LINK:
PUTS (" link");
if ((dp = parserep (rp, length)) == NULL)
break;
if (v3)
{
if ((dp = parsestatus (dp, &er)) == NULL)
break;
if (vflag)
{
PUTS (" file POST:");
if ((dp = parse_post_op_attr (dp, vflag)) == NULL)
break;
PUTS (" dir:");
if ((dp = parse_wcc_data (dp, vflag)) == NULL)
break;
return;
}
}
else
{
if (parsestatus (dp, &er))
return;
}
break;
case NFSPROC_READDIR:
PUTS (" readdir");
if ((dp = parserep (rp, length)) == NULL)
break;
if (v3)
{
if (parsev3rddirres (dp, vflag))
return;
}
else
{
if (parserddires (dp))
return;
}
break;
case NFSPROC_READDIRPLUS:
PUTS (" readdirplus");
if ((dp = parserep (rp, length)) == NULL)
break;
if (parsev3rddirres (dp, vflag))
return;
break;
case NFSPROC_FSSTAT:
PUTS (" fsstat");
dp = parserep (rp, length);
if (dp && parsestatfs (dp, v3))
return;
break;
case NFSPROC_FSINFO:
PUTS (" fsinfo");
dp = parserep (rp, length);
if (dp && parsefsinfo (dp))
return;
break;
case NFSPROC_PATHCONF:
PUTS (" pathconf");
dp = parserep (rp, length);
if (dp && parsepathconf(dp))
return;
break;
case NFSPROC_COMMIT:
PUTS (" commit");
dp = parserep (rp, length);
if (dp && parsewccres (dp, vflag))
return;
break;
default:
PRINTF (" proc-%u", proc);
return;
}
trunc:
if (!nfserr)
PUTS (" [|nfs]");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -