Esempio n. 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);
}
Esempio n. 2
0
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));
}