豫言操作系统底层文件〇点一点〇
状:草案。汉语本见汉语版。通用之规,见[调用约定](../调用约定.文言.md);状态之码表,见[底层基础](../底层基础/规范.文言.md);读写与寻址,见[底层句柄](../底层句柄/规范.文言.md)。
范围
按目录柄授权之文件系统操作:打开、取状态、读目录、建目录、删文件、删目录、改名、读符号链接。既开之后,读写、寻址、同步、设长度、关闭,皆用底层句柄之函数。本包依底层句柄。
授权与越界
- 诸路径皆相对一目录柄(出自初始柄表,或由
打开所得之目录柄)。路径为 UTF-8,分隔以/,不带尾零;空路径返 44。 - 路径之解不得越出其目录柄之子树:
..可用于子树之内,而出子树者、绝对路径(以/起者)、经符号链接而出子树者,皆返 76。 - 符号链接:路径中间者,恒循之(受上条所限);末段循否,视标志(
打开之标志 128,取路径状态之标志 1)。 - 当前目录、路径之规整(
.、..、重叠之斜线),垫层持之;后端唯按字面解之,而守其界。
函数(文件。接口。豫)
| 函数 | 参 | 用 | | --- | --- | --- | | 打开 | 目录句柄, 路径址, 路径长, 标志, 出 | 开文件或目录,新柄四字节书于出址;标志见下 | | 取状态 | 句柄, 出 | 六十四字节之状态块 | | 取路径状态 | 目录句柄, 路径址, 路径长, 标志, 出 | 标志 1 谓循末段符号链接,0 谓取链接本身;六十四字节之状态块 | | 读目录 | 目录句柄, 缓冲址, 缓冲长, 游标址, 出 | 见下;已用字节数四字节 | | 建目录 | 目录句柄, 路径址, 路径长 | 已有则返 20,上级无则返 44 | | 删文件 | 目录句柄, 路径址, 路径长 | 删文件或符号链接;遇目录返 31 | | 删目录 | 目录句柄, 路径址, 路径长 | 唯删空目录;非空返 55,非目录返 54 | | 改名 | 旧目录, 旧路径址, 旧路径长, 新目录, 新路径址, 新路径长 | 改名或移;目标已有者,文件则代之,目录须空;跨文件系统返 75 | | 读链接 | 目录句柄, 路径址, 路径长, 缓冲址, 缓冲长, 出 | 链接之目标书于缓冲(不带零),其长四字节书于出址;缓冲不足返 61;非链接返 28;无符号链接之平台返 58 |
打开之标志
按位:
| 位 | 义 | | --- | --- | | 1 | 读 | | 2 | 写 | | 4 | 追加(每书皆至文件之末) | | 8 | 无则创;须兼有写;新文件之权限,平台默认 | | 16 | 独占:与创合用,已有则返 20;单用则返 28 | | 32 | 开时截为空;须兼有写 | | 64 | 须为目录:非目录返 54;对目录而兼求写返 31 | | 128 | 不循末段符号链接(末段为符号链接则返 32) |
读与写皆不设,则按读。不识之位返 28。
状态块
六十四字节,沿 WASI filestat 之布局,时以自一九七〇年正月朔日 UTC 起之纳秒:
| 偏移 | 宽 | 字段 | | --- | --- | --- | | 0 | 8 | 设备 | | 8 | 8 | 索引节点 | | 16 | 1 | 类型:0 未知、1 块设备、2 字符设备、3 目录、4 普通文件、5 数据报套接字、6 流套接字、7 符号链接 | | 20 | 4 | 权限位(占 WASI 之填充位,WASI 垫层略之;平台无则为零) | | 24 | 8 | 链接数 | | 32 | 8 | 大小(字节) | | 40 | 8 | 访问之时 | | 48 | 8 | 修改之时 | | 56 | 8 | 变更之时 |
目录项
沿 WASI dirent 之布局:下一游标八字节、索引节点八字节、名长四字节、类型一字节(同状态块之类型)、填充三字节,共二十四字节,其后为名之字节(不带零);诸项相接而排。
读目录 自游标(八字节,入而复书)之后而读,游标零谓自首;缓冲尽装完整之项,最后一项可被截断;已用之字节数书于出址:小于缓冲长,则已读毕;与缓冲长等,则或有余项,以所复书之游标再读。项中含 . 与 ..,居最前。
平台之注
- Linux:开用
openat2加RESOLVE_BENEATH守其界;返ENOSYS则逐段以O_PATH|O_NOFOLLOW解链接与..。路径之状态经受限之柄用statx取之;建删目录、改名及读链接先安全开其父目录。目录用getdents64。逐段退路遇并发更名仍有竞态,待办。 - macOS:今之后端,
openat以O_RESOLVE_BENEATH,fstatat以AT_RESOLVE_BENEATH守界;建删、改名、读链接无此标,则先受界开其父目录。旧系统不识此标之退路,尚待为。 - Windows:路径转 UTF-16,以
NtCreateFile之 RootDirectory 相对而开;无一步到位之越界防,逐段解析而察重解析点;大小写不敏感,后端如实映之,接口不掩。 - 裸机:文件系统今在执行器内,按整文件读写,日志之构(见[客体文件系统](../../豫言操作系统/裸机/文档/客体文件系统.文言.md))。柄接口首版可于后端内以整文件缓存行之(读改写,闭或同步时写回);块级读写另案。裸机无符号链接,
读链接返 58,权限位为零。