int psbuf_get_vattr(struct puffs_framebuf *pb, struct vattr *vap) { uint32_t flags; uint32_t val; uint32_t tmpval; puffs_vattr_null(vap); FAILRV(psbuf_get_4(pb, &flags)); if (flags & SSH_FILEXFER_ATTR_SIZE) { FAILRV(psbuf_get_8(pb, &vap->va_size)); vap->va_bytes = vap->va_size; } if (flags & SSH_FILEXFER_ATTR_UIDGID) { FAILRV(psbuf_get_4(pb, &vap->va_uid)); FAILRV(psbuf_get_4(pb, &vap->va_gid)); } if (flags & SSH_FILEXFER_ATTR_PERMISSIONS) { FAILRV(psbuf_get_4(pb, &tmpval)); vap->va_mode = tmpval; vap->va_type = puffs_mode2vt(vap->va_mode); } if (flags & SSH_FILEXFER_ATTR_ACCESSTIME) { /* * XXX: this is utterly wrong if we want to speak * protocol version 3, but it seems like the * "internet standard" for doing this */ FAILRV(psbuf_get_4(pb, &val)); vap->va_atime.tv_sec = val; FAILRV(psbuf_get_4(pb, &val)); vap->va_mtime.tv_sec = val; /* make ctime the same as mtime */ vap->va_ctime.tv_sec = val; vap->va_atime.tv_nsec = 0; vap->va_ctime.tv_nsec = 0; vap->va_mtime.tv_nsec = 0; } return 0; }
int psshfs_fs_statvfs(struct puffs_usermount *pu, struct statfs *sbp) { PSSHFSAUTOVAR(pu); uint64_t tmpval; uint8_t type; memset(sbp, 0, sizeof(*sbp)); sbp->f_bsize = sbp->f_iosize = 512; if ((pctx->extensions & SFTP_EXT_STATVFS) == 0) goto out; psbuf_req_str(pb, SSH_FXP_EXTENDED, reqid, "*****@*****.**"); psbuf_put_str(pb, pctx->mountpath); GETRESPONSE(pb, pctx->sshfd); type = psbuf_get_type(pb); if (type != SSH_FXP_EXTENDED_REPLY) { /* use the default */ goto out; } psbuf_get_8(pb, &tmpval); sbp->f_iosize = tmpval; /* statvfs.f_bsize */ psbuf_get_8(pb, &tmpval); sbp->f_bsize = tmpval; /* statvfs.f_frsize */ psbuf_get_8(pb, &sbp->f_blocks); psbuf_get_8(pb, &sbp->f_bfree); psbuf_get_8(pb, &sbp->f_bavail); psbuf_get_8(pb, &sbp->f_files); psbuf_get_8(pb, &sbp->f_ffree); psbuf_get_8(pb, &tmpval); /* favail */ psbuf_get_8(pb, &tmpval); /* fsid */ psbuf_get_8(pb, &tmpval); /* flag */ psbuf_get_8(pb, &tmpval); sbp->f_namemax = tmpval; out: PSSHFSRETURN(rv); }