1/*
2 *		plugin.h : define interface for plugin development
3 *
4 * Copyright (c) 2015-2021 Jean-Pierre Andre
5 *
6 */
7
8/*
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program (in the main directory of the NTFS-3G
21 * distribution in the file COPYING); if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 */
24
25/*
26 *	This file defines the interface to ntfs-3g plugins which
27 *	add support for processing some type of reparse points.
28 */
29
30#ifndef _NTFS_PLUGIN_H
31#define _NTFS_PLUGIN_H
32
33#include "layout.h"
34#include "inode.h"
35#include "dir.h"
36
37struct fuse_file_info;
38struct stat;
39
40	/*
41	 *	The plugin operations currently defined.
42	 * These functions should return a non-negative value when they
43	 * succeed, or a negative errno value when they fail.
44	 * They must not close or free their arguments.
45	 * The file system must be left in a consistent state after
46	 * each individual call.
47	 * If an operation is not defined, an EOPNOTSUPP error is
48	 * returned to caller.
49	 */
50typedef struct plugin_operations {
51	/*
52	 *	Set the attributes st_size, st_blocks and st_mode
53	 * into a struct stat. The returned st_mode must at least
54	 * define the file type. Depending on the permissions options
55	 * used for mounting, the umask will be applied to the returned
56	 * permissions, or the permissions will be changed according
57	 * to the ACL set on the file.
58	 */
59	int (*getattr)(ntfs_inode *ni, const REPARSE_POINT *reparse,
60			struct stat *stbuf);
61
62	/*
63	 *	Open a file for reading or writing
64	 * The field fi->flags indicates the kind of opening.
65	 * The field fi->fh may be used to store some information which
66	 * will be available to subsequent reads and writes. When used
67	 * this field must be non-null.
68	 * The returned value is zero for success and a negative errno
69	 * value for failure.
70	 */
71	int (*open)(ntfs_inode *ni, const REPARSE_POINT *reparse,
72			struct fuse_file_info *fi);
73
74	/*
75	 *	Release an open file or directory
76	 * This is only called if fi->fh has been set to a non-null
77	 * value while opening. It may be used to free some context
78	 * specific to the open file or directory
79	 * The returned value is zero for success or a negative errno
80	 * value for failure.
81	 */
82	int (*release)(ntfs_inode *ni, const REPARSE_POINT *reparse,
83			struct fuse_file_info *fi);
84
85	/*
86	 *	Read from an open file
87	 * The returned value is the count of bytes which were read
88	 * or a negative errno value for failure.
89	 * If the returned value is positive, the access time stamp
90	 * will be updated after the call.
91	 */
92	int (*read)(ntfs_inode *ni, const REPARSE_POINT *reparse,
93			char *buf, size_t size,
94			off_t offset, struct fuse_file_info *fi);
95
96	/*
97	 *	Write to an open file
98	 * The file system must be left consistent after each write call,
99	 * the file itself must be at least deletable if the application
100	 * writing to it is killed for some reason.
101	 * The returned value is the count of bytes which were written
102	 * or a negative errno value for failure.
103	 * If the returned value is positive, the modified time stamp
104	 * will be updated after the call.
105	 */
106	int (*write)(ntfs_inode *ni, const REPARSE_POINT *reparse,
107			const char *buf, size_t size,
108			off_t offset, struct fuse_file_info *fi);
109
110	/*
111	 *	Get a symbolic link
112	 * The symbolic link must be returned in an allocated buffer,
113	 * encoded in a zero terminated multibyte string compatible
114	 * with the locale mount option.
115	 * The returned value is zero for success or a negative errno
116	 * value for failure.
117	 */
118	int (*readlink)(ntfs_inode *ni, const REPARSE_POINT *reparse,
119			char **pbuf);
120
121	/*
122	 *	Truncate a file (shorten or append zeroes)
123	 * The returned value is zero for success or a negative errno
124	 * value for failure.
125	 * If the returned value is zero, the modified time stamp
126	 * will be updated after the call.
127	 */
128	int (*truncate)(ntfs_inode *ni, const REPARSE_POINT *reparse,
129			off_t size);
130	/*
131	 *	Open a directory
132	 * The field fi->flags indicates the kind of opening.
133	 * The field fi->fh may be used to store some information which
134	 * will be available to subsequent readdir(). When used
135	 * this field must be non-null and freed in release().
136	 * The returned value is zero for success and a negative errno
137	 * value for failure.
138	 */
139	int (*opendir)(ntfs_inode *ni, const REPARSE_POINT *reparse,
140			struct fuse_file_info *fi);
141
142	/*
143	 *	Get entries from a directory
144	 *
145	 * Use the filldir() function with fillctx argument to return
146	 * the directory entries.
147	 * Names "." and ".." are expected to be returned.
148	 * The returned value is zero for success and a negative errno
149	 * value for failure.
150	 */
151	int (*readdir)(ntfs_inode *ni, const REPARSE_POINT *reparse,
152			s64 *pos, void *fillctx, ntfs_filldir_t filldir,
153			struct fuse_file_info *fi);
154	/*
155	 *	Create a new file of any type
156	 *
157	 * The returned value is a pointer to the inode created, or
158	 * NULL if failed, with errno telling why.
159	 */
160	ntfs_inode *(*create)(ntfs_inode *dir_ni, const REPARSE_POINT *reparse,
161			le32 securid, ntfschar *name, int name_len,
162			mode_t type);
163	/*
164	 *	Link a new name to a file or directory
165	 * Linking a directory is needed for renaming a directory
166	 * The returned value is zero for success or a negative errno
167	 * value for failure.
168	 * If the returned value is zero, the modified time stamp
169	 * will be updated after the call.
170	 */
171	int (*link)(ntfs_inode *dir_ni, const REPARSE_POINT *reparse,
172			ntfs_inode *ni, ntfschar *name, int name_len);
173	/*
174	 *	Unlink a name from a directory
175	 * The argument pathname may be NULL
176	 * The returned value is zero for success or a negative errno
177	 * value for failure.
178	 */
179	int (*unlink)(ntfs_inode *dir_ni, const REPARSE_POINT *reparse,
180			const char *pathname,
181			ntfs_inode *ni, ntfschar *name, int name_len);
182} plugin_operations_t;
183
184
185/*
186 *		Plugin initialization routine
187 *	Returns the entry table if successful, otherwise returns NULL
188 *	and sets errno (e.g. to EINVAL if the tag is not supported by
189 *	the plugin.)
190 */
191typedef const struct plugin_operations *(*plugin_init_t)(le32 tag);
192const struct plugin_operations *init(le32 tag);
193
194#endif /* _NTFS_PLUGIN_H */
195