root/nfs/nfsm_subs.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    1 /*      $OpenBSD: nfsm_subs.h,v 1.16 2006/04/02 18:35:11 otto Exp $     */
    2 /*      $NetBSD: nfsm_subs.h,v 1.10 1996/03/20 21:59:56 fvdl Exp $      */
    3 
    4 /*
    5  * Copyright (c) 1989, 1993
    6  *      The Regents of the University of California.  All rights reserved.
    7  *
    8  * This code is derived from software contributed to Berkeley by
    9  * Rick Macklem at The University of Guelph.
   10  *
   11  * Redistribution and use in source and binary forms, with or without
   12  * modification, are permitted provided that the following conditions
   13  * are met:
   14  * 1. Redistributions of source code must retain the above copyright
   15  *    notice, this list of conditions and the following disclaimer.
   16  * 2. Redistributions in binary form must reproduce the above copyright
   17  *    notice, this list of conditions and the following disclaimer in the
   18  *    documentation and/or other materials provided with the distribution.
   19  * 3. Neither the name of the University nor the names of its contributors
   20  *    may be used to endorse or promote products derived from this software
   21  *    without specific prior written permission.
   22  *
   23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   33  * SUCH DAMAGE.
   34  *
   35  *      @(#)nfsm_subs.h 8.2 (Berkeley) 3/30/95
   36  */
   37 
   38 
   39 #ifndef _NFS_NFSM_SUBS_H_
   40 #define _NFS_NFSM_SUBS_H_
   41 
   42 
   43 /*
   44  * These macros do strange and peculiar things to mbuf chains for
   45  * the assistance of the nfs code. To attempt to use them for any
   46  * other purpose will be dangerous. (they make weird assumptions)
   47  */
   48 
   49 /*
   50  * First define what the actual subs. return
   51  */
   52 
   53 #define M_HASCL(m)      ((m)->m_flags & M_EXT)
   54 #define NFSMINOFF(m) \
   55                 if (M_HASCL(m)) \
   56                         (m)->m_data = (m)->m_ext.ext_buf; \
   57                 else if ((m)->m_flags & M_PKTHDR) \
   58                         (m)->m_data = (m)->m_pktdat; \
   59                 else \
   60                         (m)->m_data = (m)->m_dat
   61 #define NFSMADV(m, s)   (m)->m_data += (s)
   62 #define NFSMSIZ(m)      ((M_HASCL(m)) ? (m)->m_ext.ext_size : \
   63                                 (((m)->m_flags & M_PKTHDR) ? MHLEN : MLEN))
   64 
   65 /*
   66  * Now for the macros that do the simple stuff and call the functions
   67  * for the hard stuff.
   68  * These macros use several vars. declared in nfsm_reqhead and these
   69  * vars. must not be used elsewhere unless you are careful not to corrupt
   70  * them. The vars. starting with pN and tN (N=1,2,3,..) are temporaries
   71  * that may be used so long as the value is not expected to retained
   72  * after a macro.
   73  * I know, this is kind of dorkey, but it makes the actual op functions
   74  * fairly clean and deals with the mess caused by the xdr discriminating
   75  * unions.
   76  */
   77 
   78 #define nfsm_build(a,c,s) \
   79                 { if ((s) > M_TRAILINGSPACE(mb)) { \
   80                         MGET(mb2, M_WAIT, MT_DATA); \
   81                         if ((s) > MLEN) \
   82                                 panic("build > MLEN"); \
   83                         mb->m_next = mb2; \
   84                         mb = mb2; \
   85                         mb->m_len = 0; \
   86                         bpos = mtod(mb, caddr_t); \
   87                 } \
   88                 (a) = (c)(bpos); \
   89                 mb->m_len += (s); \
   90                 bpos += (s); }
   91 
   92 #define nfsm_dissect(a, c, s) \
   93                 { t1 = mtod(md, caddr_t)+md->m_len-dpos; \
   94                 if (t1 >= (s)) { \
   95                         (a) = (c)(dpos); \
   96                         dpos += (s); \
   97                 } else if ((t1 = nfsm_disct(&md, &dpos, (s), t1, &cp2)) != 0){ \
   98                         error = t1; \
   99                         m_freem(mrep); \
  100                         goto nfsmout; \
  101                 } else { \
  102                         (a) = (c)cp2; \
  103                 } }
  104 
  105 #define nfsm_fhtom(v, v3) \
  106               { if (v3) { \
  107                         t2 = nfsm_rndup(VTONFS(v)->n_fhsize) + NFSX_UNSIGNED; \
  108                         if (t2 <= M_TRAILINGSPACE(mb)) { \
  109                                 nfsm_build(tl, u_int32_t *, t2); \
  110                                 *tl++ = txdr_unsigned(VTONFS(v)->n_fhsize); \
  111                                 *(tl + ((t2>>2) - 2)) = 0; \
  112                                 bcopy((caddr_t)VTONFS(v)->n_fhp,(caddr_t)tl, \
  113                                         VTONFS(v)->n_fhsize); \
  114                         } else if ((t2 = nfsm_strtmbuf(&mb, &bpos, \
  115                                 (caddr_t)VTONFS(v)->n_fhp, \
  116                                   VTONFS(v)->n_fhsize)) != 0) { \
  117                                 error = t2; \
  118                                 m_freem(mreq); \
  119                                 goto nfsmout; \
  120                         } \
  121                 } else { \
  122                         nfsm_build(cp, caddr_t, NFSX_V2FH); \
  123                         bcopy((caddr_t)VTONFS(v)->n_fhp, cp, NFSX_V2FH); \
  124                 } }
  125 
  126 #define nfsm_srvfhtom(f, v3) \
  127                 { if (v3) { \
  128                         nfsm_build(tl, u_int32_t *, NFSX_UNSIGNED + NFSX_V3FH); \
  129                         *tl++ = txdr_unsigned(NFSX_V3FH); \
  130                         bcopy((caddr_t)(f), (caddr_t)tl, NFSX_V3FH); \
  131                 } else { \
  132                         nfsm_build(cp, caddr_t, NFSX_V2FH); \
  133                         bcopy((caddr_t)(f), cp, NFSX_V2FH); \
  134                 } }
  135 
  136 #define nfsm_srvpostop_fh(f) \
  137                 { nfsm_build(tl, u_int32_t *, 2 * NFSX_UNSIGNED + NFSX_V3FH); \
  138                 *tl++ = nfs_true; \
  139                 *tl++ = txdr_unsigned(NFSX_V3FH); \
  140                 bcopy((caddr_t)(f), (caddr_t)tl, NFSX_V3FH); \
  141                 }
  142 
  143 #define nfsm_mtofh(d, v, v3, f) \
  144                 { struct nfsnode *ttnp; nfsfh_t *ttfhp; int ttfhsize; \
  145                 if (v3) { \
  146                         nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
  147                         (f) = fxdr_unsigned(int, *tl); \
  148                 } else \
  149                         (f) = 1; \
  150                 if (f) { \
  151                         nfsm_getfh(ttfhp, ttfhsize, (v3)); \
  152                         if ((t1 = nfs_nget((d)->v_mount, ttfhp, ttfhsize, \
  153                                 &ttnp)) != 0) { \
  154                                 error = t1; \
  155                                 m_freem(mrep); \
  156                                 goto nfsmout; \
  157                         } \
  158                         (v) = NFSTOV(ttnp); \
  159                 } \
  160                 if (v3) { \
  161                         nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
  162                         if (f) \
  163                                 (f) = fxdr_unsigned(int, *tl); \
  164                         else if (fxdr_unsigned(int, *tl)) \
  165                                 nfsm_adv(NFSX_V3FATTR); \
  166                 } \
  167                 if (f) \
  168                         nfsm_loadattr((v), (struct vattr *)0); \
  169                 }
  170 
  171 #define nfsm_getfh(f, s, v3) \
  172                 { if (v3) { \
  173                         nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
  174                         if (((s) = fxdr_unsigned(int, *tl)) <= 0 || \
  175                                 (s) > NFSX_V3FHMAX) { \
  176                                 m_freem(mrep); \
  177                                 error = EBADRPC; \
  178                                 goto nfsmout; \
  179                         } \
  180                 } else \
  181                         (s) = NFSX_V2FH; \
  182                 nfsm_dissect((f), nfsfh_t *, nfsm_rndup(s)); }
  183 
  184 #define nfsm_loadattr(v, a) \
  185                 { struct vnode *ttvp = (v); \
  186                 if ((t1 = nfs_loadattrcache(&ttvp, &md, &dpos, (a))) != 0) { \
  187                         error = t1; \
  188                         m_freem(mrep); \
  189                         goto nfsmout; \
  190                 } \
  191                 (v) = ttvp; }
  192 
  193 #define nfsm_postop_attr(v, f) \
  194                 { struct vnode *ttvp = (v); \
  195                 nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
  196                 if (((f) = fxdr_unsigned(int, *tl)) != 0) { \
  197                         if ((t1 = nfs_loadattrcache(&ttvp, &md, &dpos, \
  198                                 (struct vattr *)0)) != 0) { \
  199                                 error = t1; \
  200                                 (f) = 0; \
  201                                 m_freem(mrep); \
  202                                 goto nfsmout; \
  203                         } \
  204                         (v) = ttvp; \
  205                 } }
  206 
  207 /* Used as (f) for nfsm_wcc_data() */
  208 #define NFSV3_WCCRATTR  0
  209 #define NFSV3_WCCCHK    1
  210 
  211 #define nfsm_wcc_data(v, f) \
  212                 { int ttattrf, ttretf = 0; \
  213                 nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
  214                 if (*tl == nfs_true) { \
  215                         nfsm_dissect(tl, u_int32_t *, 6 * NFSX_UNSIGNED); \
  216                         if (f) \
  217                                 ttretf = (VTONFS(v)->n_mtime == \
  218                                         fxdr_unsigned(u_int32_t, *(tl + 2))); \
  219                 } \
  220                 nfsm_postop_attr((v), ttattrf); \
  221                 if (f) { \
  222                         (f) = ttretf; \
  223                 } else { \
  224                         (f) = ttattrf; \
  225                 } }
  226 
  227 /* If full is true, set all fields, otherwise just set mode and time fields */
  228 #define nfsm_v3attrbuild(a, full)                                               \
  229                 { if ((a)->va_mode != (mode_t)VNOVAL) {                         \
  230                         nfsm_build(tl, u_int32_t *, 2 * NFSX_UNSIGNED);         \
  231                         *tl++ = nfs_true;                                       \
  232                         *tl = txdr_unsigned((a)->va_mode);                      \
  233                 } else {                                                        \
  234                         nfsm_build(tl, u_int32_t *, NFSX_UNSIGNED);             \
  235                         *tl = nfs_false;                                        \
  236                 }                                                               \
  237                 if ((full) && (a)->va_uid != (uid_t)VNOVAL) {                   \
  238                         nfsm_build(tl, u_int32_t *, 2 * NFSX_UNSIGNED);         \
  239                         *tl++ = nfs_true;                                       \
  240                         *tl = txdr_unsigned((a)->va_uid);                       \
  241                 } else {                                                        \
  242                         nfsm_build(tl, u_int32_t *, NFSX_UNSIGNED);             \
  243                         *tl = nfs_false;                                        \
  244                 }                                                               \
  245                 if ((full) && (a)->va_gid != (gid_t)VNOVAL) {                   \
  246                         nfsm_build(tl, u_int32_t *, 2 * NFSX_UNSIGNED);         \
  247                         *tl++ = nfs_true;                                       \
  248                         *tl = txdr_unsigned((a)->va_gid);                       \
  249                 } else {                                                        \
  250                         nfsm_build(tl, u_int32_t *, NFSX_UNSIGNED);             \
  251                         *tl = nfs_false;                                        \
  252                 }                                                               \
  253                 if ((full) && (a)->va_size != VNOVAL) {                         \
  254                         nfsm_build(tl, u_int32_t *, 3 * NFSX_UNSIGNED);         \
  255                         *tl++ = nfs_true;                                       \
  256                         txdr_hyper((a)->va_size, tl);                           \
  257                 } else {                                                        \
  258                         nfsm_build(tl, u_int32_t *, NFSX_UNSIGNED);             \
  259                         *tl = nfs_false;                                        \
  260                 }                                                               \
  261                 if ((a)->va_atime.tv_sec != VNOVAL) {                           \
  262                         if ((a)->va_atime.tv_sec != time_second) {              \
  263                                 nfsm_build(tl, u_int32_t *, 3 * NFSX_UNSIGNED); \
  264                                 *tl++ = txdr_unsigned(NFSV3SATTRTIME_TOCLIENT); \
  265                                 txdr_nfsv3time(&(a)->va_atime, tl);             \
  266                         } else {                                                \
  267                                 nfsm_build(tl, u_int32_t *, NFSX_UNSIGNED);     \
  268                                 *tl = txdr_unsigned(NFSV3SATTRTIME_TOSERVER);   \
  269                         }                                                       \
  270                 } else {                                                        \
  271                         nfsm_build(tl, u_int32_t *, NFSX_UNSIGNED);             \
  272                         *tl = txdr_unsigned(NFSV3SATTRTIME_DONTCHANGE);         \
  273                 }                                                               \
  274                 if ((a)->va_mtime.tv_sec != VNOVAL) {                           \
  275                         if ((a)->va_mtime.tv_sec != time_second) {              \
  276                                 nfsm_build(tl, u_int32_t *, 3 * NFSX_UNSIGNED); \
  277                                 *tl++ = txdr_unsigned(NFSV3SATTRTIME_TOCLIENT); \
  278                                 txdr_nfsv3time(&(a)->va_mtime, tl);             \
  279                         } else {                                                \
  280                                 nfsm_build(tl, u_int32_t *, NFSX_UNSIGNED);     \
  281                                 *tl = txdr_unsigned(NFSV3SATTRTIME_TOSERVER);   \
  282                         }                                                       \
  283                 } else {                                                        \
  284                         nfsm_build(tl, u_int32_t *, NFSX_UNSIGNED);             \
  285                         *tl = txdr_unsigned(NFSV3SATTRTIME_DONTCHANGE);         \
  286                 }                                                               \
  287                 }
  288                                 
  289 
  290 #define nfsm_strsiz(s,m) \
  291                 { nfsm_dissect(tl,u_int32_t *,NFSX_UNSIGNED); \
  292                 if (((s) = fxdr_unsigned(int32_t,*tl)) > (m)) { \
  293                         m_freem(mrep); \
  294                         error = EBADRPC; \
  295                         goto nfsmout; \
  296                 } }
  297 
  298 #define nfsm_srvstrsiz(s,m) \
  299                 { nfsm_dissect(tl,u_int32_t *,NFSX_UNSIGNED); \
  300                 if (((s) = fxdr_unsigned(int32_t,*tl)) > (m) || (s) <= 0) { \
  301                         error = EBADRPC; \
  302                         nfsm_reply(0); \
  303                 } }
  304 
  305 #define nfsm_srvnamesiz(s) \
  306                 { nfsm_dissect(tl,u_int32_t *,NFSX_UNSIGNED); \
  307                 if (((s) = fxdr_unsigned(int32_t,*tl)) > NFS_MAXNAMLEN) \
  308                         error = NFSERR_NAMETOL; \
  309                 if ((s) <= 0) \
  310                         error = EBADRPC; \
  311                 if (error) \
  312                         nfsm_reply(0); \
  313                 }
  314 
  315 #define nfsm_mtouio(p,s) \
  316                 if ((s) > 0 && \
  317                    (t1 = nfsm_mbuftouio(&md,(p),(s),&dpos)) != 0) { \
  318                         error = t1; \
  319                         m_freem(mrep); \
  320                         goto nfsmout; \
  321                 }
  322 
  323 #define nfsm_uiotom(p,s) \
  324                 if ((t1 = nfsm_uiotombuf((p),&mb,(s),&bpos)) != 0) { \
  325                         error = t1; \
  326                         m_freem(mreq); \
  327                         goto nfsmout; \
  328                 }
  329 
  330 #define nfsm_reqhead(v,a,s) \
  331                 mb = mreq = nfsm_reqh((v),(a),(s),&bpos)
  332 
  333 #define nfsm_reqdone    m_freem(mrep); \
  334                 nfsmout: 
  335 
  336 #define nfsm_rndup(a)   (((a)+3)&(~0x3))
  337 
  338 #define nfsm_request(v, t, p, c)        \
  339                 if ((error = nfs_request((v), mreq, (t), (p), \
  340                    (c), &mrep, &md, &dpos)) != 0) { \
  341                         if (error & NFSERR_RETERR) \
  342                                 error &= ~NFSERR_RETERR; \
  343                         else \
  344                                 goto nfsmout; \
  345                 }
  346 
  347 #define nfsm_strtom(a,s,m) \
  348                 if ((s) > (m)) { \
  349                         m_freem(mreq); \
  350                         error = ENAMETOOLONG; \
  351                         goto nfsmout; \
  352                 } \
  353                 t2 = nfsm_rndup(s)+NFSX_UNSIGNED; \
  354                 if (t2 <= M_TRAILINGSPACE(mb)) { \
  355                         nfsm_build(tl,u_int32_t *,t2); \
  356                         *tl++ = txdr_unsigned(s); \
  357                         *(tl+((t2>>2)-2)) = 0; \
  358                         bcopy((caddr_t)(a), (caddr_t)tl, (s)); \
  359                 } else if ((t2 = nfsm_strtmbuf(&mb, &bpos, (a), (s))) != 0) { \
  360                         error = t2; \
  361                         m_freem(mreq); \
  362                         goto nfsmout; \
  363                 }
  364 
  365 #define nfsm_srvdone \
  366                 nfsmout: \
  367                 return(error)
  368 
  369 #define nfsm_reply(s) \
  370                 { \
  371                 nfsd->nd_repstat = error; \
  372                 if (error && !(nfsd->nd_flag & ND_NFSV3)) \
  373                    (void) nfs_rephead(0, nfsd, slp, error, &frev, \
  374                         mrq, &mb, &bpos); \
  375                 else \
  376                    (void) nfs_rephead((s), nfsd, slp, error, &frev, \
  377                         mrq, &mb, &bpos); \
  378                 if (mrep != NULL) { \
  379                         m_freem(mrep); \
  380                         mrep = NULL; \
  381                 } \
  382                 mreq = *mrq; \
  383                 if (error && (!(nfsd->nd_flag & ND_NFSV3) || \
  384                         error == EBADRPC)) \
  385                         return(0); \
  386                 }
  387 
  388 #define nfsm_writereply(s, v3) \
  389                 { \
  390                 nfsd->nd_repstat = error; \
  391                 if (error && !(v3)) \
  392                    (void) nfs_rephead(0, nfsd, slp, error, &frev, \
  393                         &mreq, &mb, &bpos); \
  394                 else \
  395                    (void) nfs_rephead((s), nfsd, slp, error, &frev, \
  396                         &mreq, &mb, &bpos); \
  397                 }
  398 
  399 #define nfsm_adv(s) \
  400                 { t1 = mtod(md, caddr_t)+md->m_len-dpos; \
  401                 if (t1 >= (s)) { \
  402                         dpos += (s); \
  403                 } else if ((t1 = nfs_adv(&md, &dpos, (s), t1)) != 0) { \
  404                         error = t1; \
  405                         m_freem(mrep); \
  406                         goto nfsmout; \
  407                 } }
  408 
  409 #define nfsm_srvmtofh(f) \
  410                 { if (nfsd->nd_flag & ND_NFSV3) { \
  411                         nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
  412                         if (fxdr_unsigned(int, *tl) != NFSX_V3FH) { \
  413                                 error = EBADRPC; \
  414                                 nfsm_reply(0); \
  415                         } \
  416                 } \
  417                 nfsm_dissect(tl, u_int32_t *, NFSX_V3FH); \
  418                 bcopy((caddr_t)tl, (caddr_t)(f), NFSX_V3FH); \
  419                 if ((nfsd->nd_flag & ND_NFSV3) == 0) \
  420                         nfsm_adv(NFSX_V2FH - NFSX_V3FH); \
  421                 }
  422 
  423 #define nfsm_clget \
  424                 if (bp >= be) { \
  425                         if (mp == mb) \
  426                                 mp->m_len += bp-bpos; \
  427                         MGET(mp, M_WAIT, MT_DATA); \
  428                         MCLGET(mp, M_WAIT); \
  429                         mp->m_len = NFSMSIZ(mp); \
  430                         mp2->m_next = mp; \
  431                         mp2 = mp; \
  432                         bp = mtod(mp, caddr_t); \
  433                         be = bp+mp->m_len; \
  434                 } \
  435                 tl = (u_int32_t *)bp
  436 
  437 #define nfsm_srvfillattr(a, f) \
  438                 nfsm_srvfattr(nfsd, (a), (f))
  439 
  440 #define nfsm_srvwcc_data(br, b, ar, a) \
  441                 nfsm_srvwcc(nfsd, (br), (b), (ar), (a), &mb, &bpos)
  442 
  443 #define nfsm_srvpostop_attr(r, a) \
  444                 nfsm_srvpostopattr(nfsd, (r), (a), &mb, &bpos)
  445 
  446 #define nfsm_srvsattr(a) \
  447                 { nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
  448                 if (*tl == nfs_true) { \
  449                         nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
  450                         (a)->va_mode = nfstov_mode(*tl); \
  451                 } \
  452                 nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
  453                 if (*tl == nfs_true) { \
  454                         nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
  455                         (a)->va_uid = fxdr_unsigned(uid_t, *tl); \
  456                 } \
  457                 nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
  458                 if (*tl == nfs_true) { \
  459                         nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
  460                         (a)->va_gid = fxdr_unsigned(gid_t, *tl); \
  461                 } \
  462                 nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
  463                 if (*tl == nfs_true) { \
  464                         nfsm_dissect(tl, u_int32_t *, 2 * NFSX_UNSIGNED); \
  465                         (a)->va_size = fxdr_hyper(tl); \
  466                 } \
  467                 nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
  468                 switch (fxdr_unsigned(int, *tl)) { \
  469                 case NFSV3SATTRTIME_TOCLIENT: \
  470                         (a)->va_vaflags &= ~VA_UTIMES_NULL; \
  471                         nfsm_dissect(tl, u_int32_t *, 2 * NFSX_UNSIGNED); \
  472                         fxdr_nfsv3time(tl, &(a)->va_atime); \
  473                         break; \
  474                 case NFSV3SATTRTIME_TOSERVER: \
  475                         getnanotime(&(a)->va_atime); \
  476                         break; \
  477                 }; \
  478                 nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); \
  479                 switch (fxdr_unsigned(int, *tl)) { \
  480                 case NFSV3SATTRTIME_TOCLIENT: \
  481                         (a)->va_vaflags &= ~VA_UTIMES_NULL; \
  482                         nfsm_dissect(tl, u_int32_t *, 2 * NFSX_UNSIGNED); \
  483                         fxdr_nfsv3time(tl, &(a)->va_mtime); \
  484                         break; \
  485                 case NFSV3SATTRTIME_TOSERVER: \
  486                         getnanotime(&(a)->va_mtime); \
  487                         break; \
  488                 }; }
  489 
  490 #endif

/* [<][>][^][v][top][bottom][index][help] */