📄 rfc1094.txt
字号:
在"to.dir"目录中创建文件"to.name",它是已存在的文件"from"的一个硬链接。如果返回值是NFS_OK,一个链接创立。如何返回其它的值表明出错,这个链接没有创建。
硬链接应该具有这样的属性,链接的文件中的任何一个改变都将影响到两个文件。当硬链接指向一个文件的时候,文件属性中应该有一个表示"nlink"的值,这个值比链接前大。
注意:可能不是幂等地操作。
2.2.14 创建符号链接
struct symlinkargs {
diropargs from;
path to;
sattr attributes;
};
stat NFSPROC_SYMLINK(symlinkargs) = 13;
在给定的目录"from.dir"中创建一个文件类型是NFLNK的文件"from.name"。这个新文件包含着路径名 "to",具有"attributes"指定的初始属性。如果返回值是NFS_OK,一个链接被创建。任何其它的返回值指示错误,链接没有创建。
符号链接是指向另一个文件的指针。在"to"中给定的名字不被服务器解释,只存储在新建的文件中。当客户端引用一个符号链接文件的时候,符号链接中的内容通常作为一个代替的路径名重新被解释。READLINK的操作返回给客户端要解释的数据。
注意:在UNIX服务器上,attributes从不使用,因为符号链接总是具有0777的模式。
2.2.15 创建目录
diropres NFSPROC_MKDIR (createargs) = 14;
新目录"where.name"创建在给定的目录"where.dir"中。新目录的初始属性由"attributes"确定。一个NFS_OK的返回值表示新目录被创建,响应"file"和响应"attributes"是这个新目录的文件句柄和属性。返回任何其它的响应状态"status"都意味着操作失败,没有目录被创建。
注意:可能不是幂等地操作。
2.2.16 删除目录
stat NFSPROC_RMDIR(diropargs) = 15;
在"dir"指定的目录中的空的目录"name"将被删除,如果响应是NFS_OK,目录被删除。
注意:可能不是幂等地操作。
2.2.17 从目录中读
struct readdirargs {
fhandle dir;
nfscookie cookie;
unsigned count;
};
struct entry {
unsigned fileid;
filename name;
nfscookie cookie;
entry *nextentry;
};
union readdirres switch (stat status) {
case NFS_OK:
struct {
entry *entries;
bool eof;
} readdirok;
default:
void;
};
readdirres NFSPROC_READDIR (readdirargs) = 16;
从 "dir"指定的目录中返回一个可变数目的目录项集合,总的大小是 "count"个字节。如果返回的状态值"status"是NFS_OK,那么后跟一组可变数目的"entry"。每一个"entry"包含着一个"fileid",这个"fileid"是由文件系统中唯一标识这个文件的号码,文件名和一个指向目录中下一个目录项的不透明指针"cookie"组成。Cookie使用在下面的READDIR调用中,以便在这个目录中从一个指定的开始点获得更多的目录项。特殊的cookie值0(所有比特都是0)使得从目录的开始点得到目录项。"fileid"字段应该和在文件属性中的"fileid"字段中有同样的值。(见“基本数据类型”中的2.3.5节“fattr” ) 如果在目录中没有更多的目录项,"eof"标志的值是TRUE。
2.2.18 获得文件系统属性
union statfsres (stat status) {
case NFS_OK:
struct {
unsigned tsize;
unsigned bsize;
unsigned blocks;
unsigned bfree;
unsigned bavail;
} info;
default:
void;
};
statfsres NFSPROC_STATFS(fhandle) = 17;
如果响应状态"status"是NFS_OK,那么响应"info"给出包含着由输入文件句柄fhandle引用的文件的文件系统的属性。属性字段包含着下列值:
tsize 用字节表示的最优化的传输尺寸。这是服务器在READ 和 WRITE请求中的
最想要的数据字节数。
bsize 文件系统用字节表示的块尺寸。.
blocks 文件系统中 "bsize"块的总数。
bfree 文件系统中自由的“bsize”块的数目。
bavail 无特权用户可用的"bsize"块的数目。
注意:如果文件系统具有可变尺寸的块,这个调用不能很好的工作。
2.3 基本数据类型
以下XDR定义是在描述其它结构中使用的基本的结构和类型。
2.3.1. stat(统计类型)
enum stat {
NFS_OK = 0,
NFSERR_PERM=1,
NFSERR_NOENT=2,
NFSERR_IO=5,
NFSERR_NXIO=6,
NFSERR_ACCES=13,
NFSERR_EXIST=17,
NFSERR_NODEV=19,
NFSERR_NOTDIR=20,
NFSERR_ISDIR=21,
NFSERR_FBIG=27,
NFSERR_NOSPC=28,
NFSERR_ROFS=30,
NFSERR_NAMETOOLONG=63,
NFSERR_NOTEMPTY=66,
NFSERR_DQUOT=69,
NFSERR_STALE=70,
NFSERR_WFLUSH=99
};
在每一个过程调用结果中都有统计类型 "stat"被返回。NFS_OK的值表示调用执行成功,结果有效。其它值表示服务器一侧在过程服务中产生的某种错误。这些错误值来源于UNIX错误号。
NFSERR_PERM
不是所有者,调用者不是所请求操作的正确的所有者。
NFSERR_NOENT
不存在这样的文件或者目录。指定的文件或者目录不存在。
NFSERR_IO
在操作执行的时候出现某种硬件错误。例如,这可能是一个磁盘错误。
NFSERR_NXIO
没有这样的设备或者地址。
NFSERR_ACCES
许可权限拒绝。调用者没有执行请求操作的正确的权限。
NFSERR_EXIST
文件存在。指定的文件已经存在。
NFSERR_NODEV
没有这样的设备。
NFSERR_NOTDIR
不是一个目录。在目录操作中调用者指定一个非目录。
NFSERR_ISDIR
是一个目录。调用者在一个非目录操作中指定一个目录。
NFSERR_FBIG
文件太大。操作造成文件增长超过服务器的限制。
NFSERR_NOSPC
在设备上没有剩余的空间。这个操作导致服务器文件系统达到它的极限。
NFSERR_ROFS
只读文件系统。在一个只读文件系统上试图写。
NFSERR_NAMETOOLONG
文件名太长。在操作中文件名太长。
NFSERR_NOTEMPTY
目录不空。试图删除一个不空的目录。
NFSERR_DQUOT
磁盘限额超出。客户在服务器上的磁盘限额已经超出。
NFSERR_STALE
在参数中给的文件句柄"fhandle"无效。也就是说,这个文件句柄引用的文件不再存在。
或者访问它的设置已经被撤销。
NFSERR_WFLUSH
使用"WRITECACHE"调用中的服务器写缓冲区得到磁盘刷新。
2.3.2. ftype(文件类型)
enum ftype {
NFNON = 0,
NFREG = 1,
NFDIR = 2,
NFBLK = 3,
NFCHR = 4,
NFLNK = 5
};
枚举"ftype"类型给出文件的类型。NFNON类型表示不是一个文件,NFREG表示一个正常的文件, NFDIR表示一个目录。NFBLK表示一个特定的块设备, NFCHR表示一个特定的字符设备,NFLNK表示一个符号链接。
2.3.3. fhandle(文件句柄)
typedef opaque fhandle[FHSIZE];
"fhandle"是一个在服务器和客户端之间传送的文件句柄。所有文件操作都使用文件句柄来引用一个文件或者目录。文件句柄包含着服务器需要的区分一个单独文件的信息。
2.3.4. timeval(时间值)
struct timeval {
unsigned int seconds;
unsigned int useconds;
};
"timeval"结构是一个秒和微秒的数值,从格林威治时间1970年一月一日凌晨起计时。它使用在传递时间和日期的信息中。
2.3.5. fattr(文件属性)
struct fattr {
ftype type;
unsigned int mode;
unsigned int nlink;
unsigned int uid;
unsigned int gid;
unsigned int size;
unsigned int blocksize;
unsigned int rdev;
unsigned int blocks;
unsigned int fsid;
unsigned int fileid;
timeval atime;
timeval mtime;
timeval ctime;
};
"fattr"结构包含着文件的属性; "type"是文件的类型;"nlink"是一个文件的硬链接数(对同一个文件不同的名字的数目); "uid"是这个文件的所有者的用户标识号码; "gid"是拥有这个文件的组的组标识号码; "size"是这个文件以字节数计算的大小;"blocksize"是这个文件的一个块以字节计数的大小;如果文件的类型是NFCHR 或者 NFBLK,"rdev"是这个文件的设备号; "blocks"是文件在磁盘上块的数量;"fsid"是包含这个文件的文件系统的系统标识符; "fileid"是这个文件在它的文件系统中唯一的标识符号码; "atime"是上次文件读访问或者写访问的时间; "mtime"是文件数据上次被修改时的时间(写); "ctime"是文件状态上次改变的时间。如果文件的尺寸改变,写一个文件也将改变"ctime"。
"Mode"是被编码成一个比特集合的访问模式。注意文件类型要么在模式比特中指定,要么在文件类型中指定。这实际上是此协议中的一个缺陷,将在未来的版本中修订。下面的描述使用八进制数确定比特的位置
0040000这是一个目录,"type"字段应该是NFDIR。
0020000 这是一个字符特殊文件,"type"字段应该是NFCHR。
0060000这是一个块特殊文件,"type"字段应该是NFBLK。
0100000这是一个正常的文件,"type"字段应该是NFREG。
0120000这是一个符号链接文件,"type"字段应该是NFLNK。
0140000这是一个命名的socket;"type"字段应该是NFNON。
0004000设置在执行中的用户ID
0002000 设置在执行中的组ID
0001000 在使用后保存交换文本。
0000400 对所有者的读权限许可。
0000200 对所有者的写权限许可。
0000100 对所有者的执行和搜索权限许可。
0000040 对组的读权限许可。
0000020 对组的写权限许可。
0000010 对组的执行和搜索权限许可。
0000004 对其他人的读权限许可。
0000002 对其他人的写权限许可。
0000001 对其他人的执行和搜索权限许可。
注意:这些比特与UNIX中stat(2)系统调用中返回的模式比特是一样的。文件类型要
么在模式比特中要么在文件类型中确定。这在未来的版本中将修改。
在属性结构中"rdev"字段是一个操作系统特定设备的标识符。在这个协议的下一个
修订版中将删除。
2.3.6. sattr(设置文件属性)
struct sattr {
unsigned int mode;
unsigned int uid;
unsigned int gid;
unsigned int size;
timeval atime;
timeval mtime;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -