int shfs_write(shfs_ino_t *file, shbuf_t *buff) { shfs_ino_t *aux; int format; int err; if (!file) return (SHERR_INVAL); err = 0; format = shfs_format(file); if (!buff) return (SHERR_INVAL); /* presume user wants to erase content. */ if (shfs_attr(file) & SHATTR_DB) format = SHINODE_DATABASE; switch (format) { case SHINODE_REFERENCE: err = shfs_ref_write(file, buff); break; case SHINODE_EXTERNAL: err = shfs_ext_write(file, buff); break; case SHINODE_COMPRESS: err = shfs_zlib_write(file, buff); break; case SHINODE_DATABASE: err = shfs_db_write(file, buff); break; case SHINODE_DIRECTORY: err = shfs_attr_set(file, SHATTR_ARCH); if (err) break; err = shfs_arch_write(file, buff); break; default: err = shfs_bin_write(file, buff); break; } if (!err) err = shfs_inode_write_entity(file); if (!err && (file->blk.hdr.attr & SHATTR_SYNC)) shfs_file_notify(file); return (err); }
int shfs_lock(shfs_ino_t *inode, int flags) { shstat st; int err; err = shfs_fstat(inode, &st); if (err) return (err); if (shfs_type(inode) == SHINODE_FILE_LOCK) return (SHERR_OPNOTSUPP); return (shfs_attr_set(inode, SHATTR_FLOCK)); }