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;
}
示例#2
0
文件: fs.c 项目: glk/puffs
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);
}