/* This function closes the session file, given its handle */ void blkclose (BLK *buf) /* buffer, holds superblock */ { blkread (buf, 0); buf->super.inuse = 0L; blkwrite (buf, 0); (void)DosClose (fd); fd = NULLHANDLE; if (o_tempsession) { (void)DosDelete (tochar8(o_session)); } /* if */ }
int ufs_dir_iterate(uufsd_t *ufs, ino_t dirino, int (*func)( struct direct *dirent, int n, char *buf, void *priv_data), void *priv_data) { int i, ret = 0; ufs2_daddr_t ndb; ufs2_daddr_t blkno; int blksize = ufs->d_fs.fs_bsize; u_int64_t dir_size; char *dirbuf = NULL; struct ufs_vnode *vnode; vnode = vnode_get(ufs, dirino); if (vnode == NULL) { ret = -ENOMEM; goto out; } dir_size = vnode2inode(vnode)->i_size; dirbuf = malloc(blksize); if (!dirbuf) { ret = -ENOMEM; goto out; } ndb = howmany(dir_size, ufs->d_fs.fs_bsize); int offset, pos = 0; for (i = 0; i < ndb ; i++) { ret = ufs_bmap(ufs, vnode, i, &blkno); if (ret) { ret = -EIO; goto out; } blksize = ufs_inode_io_size(vnode2inode(vnode), pos, 0); if (blkread(ufs, fsbtodb(&ufs->d_fs, blkno), dirbuf, blksize) == -1) { debugf("Unable to read block %d\n",blkno); ret = -EIO; goto out; } offset = 0; while (offset < blksize && pos + offset < dir_size) { struct direct *de = (struct direct *)(dirbuf + offset); /* HACK: Restrict frame for func() operations * to blocks of DIRBLKSIZ bytes */ int blockoff = offset % DIRBLKSIZ; char * dirblock = dirbuf + (offset-blockoff); ret = (*func)(de, blockoff, dirblock, priv_data); if (ret & DIRENT_CHANGED) { if (blkwrite(ufs, fsbtodb(&ufs->d_fs, blkno), dirbuf, blksize) == -1) { debugf("Unable to write block %d\n",blkno); ret = -EIO; goto out; } } if (ret & DIRENT_ABORT) { ret = 0; goto out; } offset += de->d_reclen; } pos += blksize; } out: if (vnode) { vnode_put(vnode, 0); } if (dirbuf) { free(dirbuf); } return ret; }