diff options
Diffstat (limited to 'sys/nfs/nfs_subs.c')
| -rw-r--r-- | sys/nfs/nfs_subs.c | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/sys/nfs/nfs_subs.c b/sys/nfs/nfs_subs.c index 3e493518f5c..c71113db558 100644 --- a/sys/nfs/nfs_subs.c +++ b/sys/nfs/nfs_subs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: nfs_subs.c,v 1.92 2009/01/24 23:30:42 thib Exp $ */ +/* $OpenBSD: nfs_subs.c,v 1.93 2009/03/30 19:58:50 blambert Exp $ */ /* $NetBSD: nfs_subs.c,v 1.27.4.3 1996/07/08 20:34:24 jtc Exp $ */ /* @@ -1948,3 +1948,69 @@ nfsm_build(struct mbuf **mp, u_int len) return (bpos); } + +int +nfsm_srvsattr(struct mbuf **mp, struct vattr *va, struct mbuf *mrep, + caddr_t *dposp) +{ + struct mbuf *md; + uint32_t *tl, t1; + caddr_t dpos, cp2; + int error = 0; + + md = *mp; + dpos = *dposp; + + nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); + if (*tl == nfs_true) { + nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); + va->va_mode = nfstov_mode(*tl); + } + + nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); + if (*tl == nfs_true) { + nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); + va->va_uid = fxdr_unsigned(uid_t, *tl); + } + + nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); + if (*tl == nfs_true) { + nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); + va->va_gid = fxdr_unsigned(gid_t, *tl); + } + + nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); + if (*tl == nfs_true) { + nfsm_dissect(tl, u_int32_t *, 2 * NFSX_UNSIGNED); + va->va_size = fxdr_hyper(tl); + } + + nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); + switch (fxdr_unsigned(int, *tl)) { + case NFSV3SATTRTIME_TOCLIENT: + va->va_vaflags &= ~VA_UTIMES_NULL; + nfsm_dissect(tl, u_int32_t *, 2 * NFSX_UNSIGNED); + fxdr_nfsv3time(tl, &va->va_atime); + break; + case NFSV3SATTRTIME_TOSERVER: + getnanotime(&va->va_atime); + break; + }; + + nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED); + switch (fxdr_unsigned(int, *tl)) { + case NFSV3SATTRTIME_TOCLIENT: + va->va_vaflags &= ~VA_UTIMES_NULL; + nfsm_dissect(tl, u_int32_t *, 2 * NFSX_UNSIGNED); + fxdr_nfsv3time(tl, &va->va_mtime); + break; + case NFSV3SATTRTIME_TOSERVER: + getnanotime(&va->va_mtime); + break; + }; + + *dposp = dpos; + *mp = md; +nfsmout: + return (error); +} |
