⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _nfs.c

📁 This directory contains source code for tcpdump, a tool for network monitoring and data acquisition
💻 C
📖 第 1 页 / 共 3 页
字号:
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 + -