1 /* This file contains open file and directory handle management functions.
3 * The entry points into this file are:
4 * get_handle open a handle for an inode and store the handle
5 * put_handle close any handles associated with an inode
8 * April 2009 (D.C. van Moolenbroek)
15 /*===========================================================================*
17 *===========================================================================*/
18 int get_handle(struct inode
*ino
)
20 /* Get an open file or directory handle for an inode.
25 /* If we don't have a file handle yet, try to open the file now. */
26 if (ino
->i_flags
& I_HANDLE
)
29 if ((r
= verify_inode(ino
, path
, NULL
)) != OK
)
33 r
= sffs_table
->t_opendir(path
, &ino
->i_dir
);
37 r
= sffs_table
->t_open(path
, O_RDWR
, 0, &ino
->i_file
);
39 /* Protection or mount status might prevent us from writing. With the
40 * information that we have available, this is the best we can do..
42 if (read_only
|| r
!= OK
)
43 r
= sffs_table
->t_open(path
, O_RDONLY
, 0, &ino
->i_file
);
49 ino
->i_flags
|= I_HANDLE
;
54 /*===========================================================================*
56 *===========================================================================*/
57 void put_handle(struct inode
*ino
)
59 /* Close an open file or directory handle associated with an inode.
63 if (!(ino
->i_flags
& I_HANDLE
))
66 /* We ignore any errors here, because we can't deal with them anyway. */
68 r
= sffs_table
->t_closedir(ino
->i_dir
);
70 r
= sffs_table
->t_close(ino
->i_file
);
73 printf("%s: put_handle: handle close operation returned %d\n",
76 ino
->i_flags
&= ~I_HANDLE
;