xref: /minix/minix/lib/libsffs/handle.c (revision e3b78ef1)
1 /* This file contains open file and directory handle management functions.
2  *
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
6  *
7  * Created:
8  *   April 2009 (D.C. van Moolenbroek)
9  */
10 
11 #include "inc.h"
12 
13 #include <fcntl.h>
14 
15 /*===========================================================================*
16  *				get_handle				     *
17  *===========================================================================*/
18 int get_handle(struct inode *ino)
19 {
20 /* Get an open file or directory handle for an inode.
21  */
22   char path[PATH_MAX];
23   int r;
24 
25   /* If we don't have a file handle yet, try to open the file now. */
26   if (ino->i_flags & I_HANDLE)
27 	return OK;
28 
29   if ((r = verify_inode(ino, path, NULL)) != OK)
30 	return r;
31 
32   if (IS_DIR(ino)) {
33 	r = sffs_table->t_opendir(path, &ino->i_dir);
34   }
35   else {
36 	if (!read_only)
37 		r = sffs_table->t_open(path, O_RDWR, 0, &ino->i_file);
38 
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..
41 	 */
42 	if (read_only || r != OK)
43 		r = sffs_table->t_open(path, O_RDONLY, 0, &ino->i_file);
44   }
45 
46   if (r != OK)
47 	return r;
48 
49   ino->i_flags |= I_HANDLE;
50 
51   return OK;
52 }
53 
54 /*===========================================================================*
55  *				put_handle				     *
56  *===========================================================================*/
57 void put_handle(struct inode *ino)
58 {
59 /* Close an open file or directory handle associated with an inode.
60  */
61   int r;
62 
63   if (!(ino->i_flags & I_HANDLE))
64 	return;
65 
66   /* We ignore any errors here, because we can't deal with them anyway. */
67   if (IS_DIR(ino))
68 	r = sffs_table->t_closedir(ino->i_dir);
69   else
70 	r = sffs_table->t_close(ino->i_file);
71 
72   if (r != OK)
73 	printf("%s: put_handle: handle close operation returned %d\n",
74 		sffs_name, r);
75 
76   ino->i_flags &= ~I_HANDLE;
77 }
78