#![allow(dead_code)]
#![allow(non_camel_case_types)]
use std::io::{Error, ErrorKind, Read, Write};
use num_derive::{FromPrimitive, ToPrimitive};
use super::{
cookie3, cookieverf3, count3, deserialize, diropargs3, fileid3, filename3, ftype3, nfs_fh3,
post_op_attr, post_op_fh3, sattr3, specdata3, symlinkdata3, Deserialize, DeserializeEnum,
DeserializeStruct, Serialize, SerializeEnum, SerializeStruct,
};
#[allow(non_camel_case_types)]
#[derive(Copy, Clone, Debug, Default, FromPrimitive, ToPrimitive)]
#[repr(u32)]
pub enum devicetype3 {
#[default]
NF3CHR = 0,
NF3BLK = 1,
NF3SOCK = 2,
NF3FIFO = 3,
}
impl SerializeEnum for devicetype3 {}
impl DeserializeEnum for devicetype3 {}
#[allow(non_camel_case_types)]
#[derive(Debug, Default)]
pub struct MKDIR3args {
pub dirops: diropargs3,
pub attributes: sattr3,
}
DeserializeStruct!(MKDIR3args, dirops, attributes);
SerializeStruct!(MKDIR3args, dirops, attributes);
#[allow(non_camel_case_types)]
#[derive(Debug, Default)]
pub struct SYMLINK3args {
pub dirops: diropargs3,
pub symlink: symlinkdata3,
}
DeserializeStruct!(SYMLINK3args, dirops, symlink);
SerializeStruct!(SYMLINK3args, dirops, symlink);
#[allow(non_camel_case_types)]
#[derive(Debug, Default)]
pub struct entry3 {
pub fileid: fileid3,
pub name: filename3,
pub cookie: cookie3,
}
DeserializeStruct!(entry3, fileid, name, cookie);
SerializeStruct!(entry3, fileid, name, cookie);
#[allow(non_camel_case_types)]
#[derive(Debug, Default)]
pub struct READDIR3args {
pub dir: nfs_fh3,
pub cookie: cookie3,
pub cookieverf: cookieverf3,
pub dircount: count3,
}
DeserializeStruct!(READDIR3args, dir, cookie, cookieverf, dircount);
SerializeStruct!(READDIR3args, dir, cookie, cookieverf, dircount);
#[allow(non_camel_case_types)]
#[derive(Debug, Default)]
pub struct entryplus3 {
pub fileid: fileid3,
pub name: filename3,
pub cookie: cookie3,
pub name_attributes: post_op_attr,
pub name_handle: post_op_fh3,
}
DeserializeStruct!(entryplus3, fileid, name, cookie, name_attributes, name_handle);
SerializeStruct!(entryplus3, fileid, name, cookie, name_attributes, name_handle);
#[allow(non_camel_case_types)]
#[derive(Debug, Default)]
pub struct READDIRPLUS3args {
pub dir: nfs_fh3,
pub cookie: cookie3,
pub cookieverf: cookieverf3,
pub dircount: count3,
pub maxcount: count3,
}
DeserializeStruct!(READDIRPLUS3args, dir, cookie, cookieverf, dircount, maxcount);
SerializeStruct!(READDIRPLUS3args, dir, cookie, cookieverf, dircount, maxcount);
#[allow(non_camel_case_types)]
#[derive(Debug, Default)]
pub struct MKNOD3args {
pub where_dir: diropargs3,
pub what: mknoddata3,
}
DeserializeStruct!(MKNOD3args, where_dir, what);
SerializeStruct!(MKNOD3args, where_dir, what);
#[allow(non_camel_case_types)]
#[derive(Debug, Default)]
pub struct devicedata3 {
pub dev_attributes: sattr3,
pub spec: specdata3,
}
DeserializeStruct!(devicedata3, dev_attributes, spec);
SerializeStruct!(devicedata3, dev_attributes, spec);
#[allow(non_camel_case_types)]
#[derive(Debug, Default)]
pub struct mknoddata3 {
pub mknod_type: ftype3,
pub device: Option<devicedata3>,
pub pipe_attributes: Option<sattr3>,
}
impl Serialize for mknoddata3 {
fn serialize<R: Write>(&self, dest: &mut R) -> std::io::Result<()> {
self.mknod_type.serialize(dest)?;
match self.mknod_type {
ftype3::NF3CHR | ftype3::NF3BLK => {
let device = self
.device
.as_ref()
.ok_or_else(|| Error::new(ErrorKind::InvalidData, "missing device data"))?;
device.serialize(dest)?;
}
ftype3::NF3SOCK | ftype3::NF3FIFO => {
let attrs = self
.pipe_attributes
.as_ref()
.ok_or_else(|| Error::new(ErrorKind::InvalidData, "missing pipe attributes"))?;
attrs.serialize(dest)?;
}
_ => {}
}
Ok(())
}
}
impl Deserialize for mknoddata3 {
fn deserialize<R: Read>(&mut self, src: &mut R) -> std::io::Result<()> {
self.mknod_type.deserialize(src)?;
self.device = None;
self.pipe_attributes = None;
match self.mknod_type {
ftype3::NF3CHR | ftype3::NF3BLK => {
self.device = Some(deserialize::<devicedata3>(src)?);
}
ftype3::NF3SOCK | ftype3::NF3FIFO => {
self.pipe_attributes = Some(deserialize::<sattr3>(src)?);
}
_ => {}
}
Ok(())
}
}