let emulator = this.emulator let me = this emulator.fs9p.update_file = async function(file,data){ const convert = ISOTerminal.prototype.convert const p = this.SearchPath(file); if(p.id === -1) { return emulator.create_file(file,data) } const inode = this.GetInode(p.id); const buf = typeof data == 'string' ? convert.toUint8Array(data) : data || "" if( buf.length == 0 ) return new Promise( (resolve,reject) => resolve(data) ) try{ await this.Write(p.id,0, buf.length, buf ) // update inode inode.size = buf.length const now = Math.round(Date.now() / 1000); inode.atime = inode.mtime = now; return new Promise( (resolve,reject) => resolve(buf) ) }catch(e){ console.error({file,data}) return new Promise( (resolve,reject) => reject(e) ) } } emulator.fs9p.append_file = async function(file,data){ const convert = ISOTerminal.prototype.convert const p = this.SearchPath(file); if(p.id === -1) { return Promise.resolve(null); } const inode = this.GetInode(p.id); const buf = typeof data == 'string' ? convert.toUint8Array(data) : data await this.Write(p.id, inode.size, buf.length, buf ) // update inode inode.size = inode.size + buf.length const now = Math.round(Date.now() / 1000); inode.atime = inode.mtime = now; return new Promise( (resolve,reject) => resolve(buf) ) } emulator.fs9p.read_file_world = async function(file){ const p = this.SearchPath(file); if(p.id === -1) { return Promise.resolve(null); } const inode = this.GetInode(p.id); const perms = this.parseFilePermissions(inode.mode) if( !perms.world.read ){ return Promise.resolve(null); } return this.Read(p.id, 0, inode.size); } emulator.fs9p.parseFilePermissions = function(permissionInt) { // Convert the permission integer to octal const octalPermissions = permissionInt.toString(8); // Extract the permission bits (last 3 digits in octal) const permissionBits = octalPermissions.slice(-3); function parsePermission(digit) { const num = parseInt(digit, 10); return { read: Boolean(num & 4), // 4 = read write: Boolean(num & 2), // 2 = write execute: Boolean(num & 1) // 1 = execute }; } // Decode the permissions const permissions = { owner: parsePermission(permissionBits[0]), group: parsePermission(permissionBits[1]), world: parsePermission(permissionBits[2]), }; return permissions; }