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_attr_set(shfs_ino_t *file, int attr) { shfs_attr_t cur_flag; shmime_t *mime; int err_code; if (!file || !attr) return (SHERR_INVAL); cur_flag = shfs_attr(file); if (cur_flag & attr) return (0); /* already set */ err_code = SHERR_OPNOTSUPP; switch (attr) { case SHATTR_ARCH: if (shfs_type(file) == SHINODE_DIRECTORY) { err_code = 0; } break; case SHATTR_COMP: if (shfs_type(file) == SHINODE_DIRECTORY) { /* files inherit */ err_code = 0; break; } err_code = shfs_format_set(file, SHINODE_COMPRESS); break; case SHATTR_SYNC: err_code = 0; //err_code = shfs_file_notify(file); break; case SHATTR_TEMP: err_code = 0; break; case SHATTR_VER: err_code = shfs_rev_init(file); break; case SHATTR_READ: case SHATTR_WRITE: case SHATTR_EXE: err_code = 0; break; case SHATTR_DB: if (shfs_type(file) != SHINODE_FILE || shfs_format(file) != SHINODE_NULL) { /* not a file or already contains content */ err_code = SHERR_INVAL; break; } err_code = 0; #if 0 err_code = shfs_format_set(file, SHINODE_DATABASE); #endif #if 0 if (shfs_size(file) == 0) { /* new database. */ err_code = 0; } mime = shmime_file(file); if (!mime || 0 == strcmp(mime->mime_name, SHMIME_APP_SQLITE)) { err_code = SHERR_INVAL; break; } /* DEBUG: move to copy file area */ #endif break; } if (!err_code) { file->blk.hdr.attr |= attr; err_code = shfs_inode_write_entity(file); } if (!err_code && ((file->blk.hdr.attr & SHATTR_SYNC) || (cur_flag & cur_flag))) { /* notify share daemon of altered attribute state for synchronized inode. */ shfs_file_notify(file); } return (err_code); }
int shfs_attr_unset(shfs_ino_t *file, int attr) { shfs_attr_t cur_attr; shfs_attr_t new_attr; int err_code; int format; if (!file || !attr) return (SHERR_INVAL); cur_attr = shfs_attr(file); if (!(cur_attr & attr)) return (0); /* already unset */ new_attr = cur_attr; new_attr &= ~attr; err_code = SHERR_OPNOTSUPP; switch (attr) { case SHATTR_COMP: err_code = 0; format = SHINODE_DEFAULT_ATTR_FORMAT(new_attr); if (format != shfs_format(file)) err_code = shfs_format_set(file, format); break; case SHATTR_SYNC: err_code = 0; break; case SHATTR_TEMP: err_code = 0; break; case SHATTR_VER: err_code = shfs_rev_clear(file); break; case SHATTR_LINK: /* unimplemented. */ err_code = SHERR_OPNOTSUPP; /* this is now a local copy */ file->blk.hdr.attr &= ~SHATTR_SYNC; break; case SHATTR_READ: case SHATTR_WRITE: case SHATTR_EXE: err_code = 0; break; case SHATTR_DB: /* DEBUG: TODO: write file pertaining to original aux contents. */ err_code = 0; break; } if (!err_code) { file->blk.hdr.attr = new_attr; err_code = shfs_inode_write_entity(file); } if (!err_code && (file->blk.hdr.attr & SHATTR_SYNC)) shfs_file_notify(file); return (err_code); }