Пример #1
0
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);
}
Пример #2
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);
}