Exemple #1
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);
}
Exemple #2
0
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);
}
Exemple #3
0
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);
}