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); }
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_file_remove(shfs_ino_t *file) { shfs_ino_t *child; shbuf_t *buff; shfs_dirent_t *ents; size_t ent_max; int fmt; int err; int i; if (IS_INODE_CONTAINER(shfs_type(file))) { ents = NULL; ent_max = shfs_list(file, NULL, &ents); if (ent_max < 0) { return (ent_max); } if (ents) { for (i = 0; i < ent_max; i++) { if (IS_INODE_CONTAINER(ents[i].d_type)) { child = shfs_inode(file, ents[i].d_name, ents[i].d_type); err = shfs_file_remove(child); if (err) return (err); } else { child = shfs_inode(file, NULL, ents[i].d_type); shfs_inode_clear(child); } } free(ents); } else { /* version repository */ if (shfs_attr(file) & SHATTR_VER) { child = shfs_inode(file, NULL, SHINODE_REPOSITORY); err = shfs_file_remove(child); if (err) return (err); } /* specific format */ fmt = shfs_format(file); if (fmt == SHINODE_NULL && shfs_type(file) == SHINODE_BINARY) { fmt = SHINODE_AUX; } if (fmt != SHINODE_NULL) { child = shfs_inode(file, NULL, fmt); if (!IS_INODE_CONTAINER(shfs_type(child))) { err = shfs_inode_clear(child); } else { err = shfs_file_remove(child); } if (err) return (err); } } } if (shfs_type(file) != SHINODE_DIRECTORY) { #if 0 /* DEBUG: perform inode_clear on 'fpos' index */ /* clear previous format */ err = shfs_format_set(file, SHINODE_NULL); if (err) return (err); #endif /* reset stats on file inode. */ file->blk.hdr.mtime = 0; file->blk.hdr.size = 0; // file->blk.hdr.type = SHINODE_NULL; file->blk.hdr.format = SHINODE_NULL; file->blk.hdr.attr = SHINODE_NULL; file->blk.hdr.crc = 0; err = shfs_inode_write_entity(file); if (err) { return (err); } } return (0); }