78 lines
1.9 KiB
C
78 lines
1.9 KiB
C
|
/* This file contains open file and directory handle management functions.
|
||
|
*
|
||
|
* The entry points into this file are:
|
||
|
* get_handle open a handle for an inode and store the handle
|
||
|
* put_handle close any handles associated with an inode
|
||
|
*
|
||
|
* Created:
|
||
|
* April 2009 (D.C. van Moolenbroek)
|
||
|
*/
|
||
|
|
||
|
#include "inc.h"
|
||
|
|
||
|
#include <fcntl.h>
|
||
|
|
||
|
/*===========================================================================*
|
||
|
* get_handle *
|
||
|
*===========================================================================*/
|
||
|
int get_handle(struct inode *ino)
|
||
|
{
|
||
|
/* Get an open file or directory handle for an inode.
|
||
|
*/
|
||
|
char path[PATH_MAX];
|
||
|
int r;
|
||
|
|
||
|
/* If we don't have a file handle yet, try to open the file now. */
|
||
|
if (ino->i_flags & I_HANDLE)
|
||
|
return OK;
|
||
|
|
||
|
if ((r = verify_inode(ino, path, NULL)) != OK)
|
||
|
return r;
|
||
|
|
||
|
if (IS_DIR(ino)) {
|
||
|
r = sffs_table->t_opendir(path, &ino->i_dir);
|
||
|
}
|
||
|
else {
|
||
|
if (!state.s_read_only)
|
||
|
r = sffs_table->t_open(path, O_RDWR, 0, &ino->i_file);
|
||
|
|
||
|
/* Protection or mount status might prevent us from writing. With the
|
||
|
* information that we have available, this is the best we can do..
|
||
|
*/
|
||
|
if (state.s_read_only || r != OK)
|
||
|
r = sffs_table->t_open(path, O_RDONLY, 0, &ino->i_file);
|
||
|
}
|
||
|
|
||
|
if (r != OK)
|
||
|
return r;
|
||
|
|
||
|
ino->i_flags |= I_HANDLE;
|
||
|
|
||
|
return OK;
|
||
|
}
|
||
|
|
||
|
/*===========================================================================*
|
||
|
* put_handle *
|
||
|
*===========================================================================*/
|
||
|
void put_handle(struct inode *ino)
|
||
|
{
|
||
|
/* Close an open file or directory handle associated with an inode.
|
||
|
*/
|
||
|
int r;
|
||
|
|
||
|
if (!(ino->i_flags & I_HANDLE))
|
||
|
return;
|
||
|
|
||
|
/* We ignore any errors here, because we can't deal with them anyway. */
|
||
|
if (IS_DIR(ino))
|
||
|
r = sffs_table->t_closedir(ino->i_dir);
|
||
|
else
|
||
|
r = sffs_table->t_close(ino->i_file);
|
||
|
|
||
|
if (r != OK)
|
||
|
printf("%s: put_handle: handle close operation returned %d\n",
|
||
|
sffs_name, r);
|
||
|
|
||
|
ino->i_flags &= ~I_HANDLE;
|
||
|
}
|