int shfs_rev_ref_write(shfs_ino_t *file, char *group, char *name, shbuf_t *buff) { shfs_ino_t *ref; shfs_ino_t *aux; char buf[SHFS_PATH_MAX]; int err; memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf) - 1, "%s/%s", group, name); ref = shfs_inode(file, buf, SHINODE_OBJECT); err = shfs_bin_write(ref, buff); if (err) return (err); #if 0 err = shfs_aux_write(aux, buff); if (err) return (err); #endif err = shfs_inode_write_entity(ref); if (err) { sherr(err, "shfs_rev_ref_write [shfs_inode_write_entity]"); return (err); } #if 0 /* copy aux stats to file inode. */ file->blk.hdr.mtime = ref->blk.hdr.mtime; file->blk.hdr.size = ref->blk.hdr.size; file->blk.hdr.crc = ref->blk.hdr.crc; file->blk.hdr.format = SHINODE_OBJECT; #endif return (0); }
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); }