Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 322 lines (285 sloc) 11.149 kb
4d4d90b3 »
2012-09-23 o More legalese
1 // Folve - A fuse filesystem that convolves audio files on-the-fly.
2 //
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
3 // Copyright (C) 2012 Henner Zeller <h.zeller@acm.org>
1bce6345 »
2012-09-24 o Remove some trailing whitespaces
4 //
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 // Use latest version.
19 #define FUSE_USE_VERSION 26
49a4cd94 »
2012-09-25 o Provide an INSTALL.md that explains how to compile on older systems.
20 #include <fuse/fuse.h>
a9d3e538 »
2012-09-15 o Found a project name: "Folve". Some renamings because of that.
21
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
22 #include <dirent.h>
23 #include <errno.h>
b6988530 »
2012-09-15 o README updates.
24 #include <fcntl.h>
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
25 #include <limits.h>
b6988530 »
2012-09-15 o README updates.
26 #include <stdio.h>
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
27 #include <stdlib.h>
b6988530 »
2012-09-15 o README updates.
28 #include <string.h>
29 #include <sys/stat.h>
30 #include <sys/time.h>
49eca7f9 »
2012-09-16 o add syslog as preparation for parameter handling.
31 #include <syslog.h>
b6988530 »
2012-09-15 o README updates.
32 #include <unistd.h>
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
33
a9d3e538 »
2012-09-15 o Found a project name: "Folve". Some renamings because of that.
34 #include "folve-filesystem.h"
8d1fbe7c »
2012-09-13 o Move fuse-convolve.c to fuse-convolve.cc. Make filter-interface
35 #include "status-server.h"
7689c9a8 »
2012-09-22 o preparation to extract classes from folve-filesystem into their
36 #include "util.h"
e9c07dd6 »
2012-09-08 o add documentation
37
6c6dedb8 »
2012-09-16 o Some readme tweaks and readability improvements.
38 // Compilation unit variables to communicate with the fuse callbacks.
27c44cd1 »
2012-09-17 o Use fuse option handling to extract our flags and options.
39 static struct FolveRuntime {
a372a03d »
2012-09-22 o Make meta-refresh configurable.
40 FolveRuntime() : fs(NULL), mount_point(NULL),
fa525eec »
2012-09-22 o If we find problems in the options, complain and exit.
41 status_port(-1), refresh_time(10), parameter_error(false) {}
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
42 FolveFilesystem *fs;
27c44cd1 »
2012-09-17 o Use fuse option handling to extract our flags and options.
43 const char *mount_point;
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
44 int status_port;
a372a03d »
2012-09-22 o Make meta-refresh configurable.
45 int refresh_time;
fa525eec »
2012-09-22 o If we find problems in the options, complain and exit.
46 bool parameter_error;
ee675fea »
2012-09-17 o Provide a way to select between different filter diretories.
47 } folve_rt;
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
48
7c7bda6f »
2012-09-10 o attempt to create a sndfile for every file, if that fails, fall
49 static char *concat_path(char *buf, const char *a, const char *b) {
50 strcpy(buf, a);
51 strcat(buf, b);
52 return buf;
53 }
54
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
55 // Given a relative path from the root of the mounted file-system, get the
56 // original file from the source filesystem.
57 static const char *assemble_orig_path(char *buf, const char *path) {
08bbf282 »
2012-09-21 o First shot at gapless. Works pretty well for my test-case.
58 return concat_path(buf, folve_rt.fs->underlying_dir().c_str(), path);
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
59 }
60
7c7bda6f »
2012-09-10 o attempt to create a sndfile for every file, if that fails, fall
61 // Essentially lstat(). Just forward to the original filesystem (this
73093dcf »
2012-09-08 o Keep open file-descriptor.
62 // will by lying: our convolved files are of different size...)
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
63 static int folve_getattr(const char *path, struct stat *stbuf) {
9a8ea565 »
2012-09-12 o add infrastructure to provide Stat() output of currently open
64 // If this is a currently open filename, we might be able to output a better
65 // estimate.
ee675fea »
2012-09-17 o Provide a way to select between different filter diretories.
66 int result = folve_rt.fs->StatByFilename(path, stbuf);
369a0a71 »
2012-09-20 o Writing is not possible. Show permissions as readonly.
67 if (result != 0) {
68 char path_buf[PATH_MAX];
69 result = lstat(assemble_orig_path(path_buf, path), stbuf);
70 if (result == -1)
71 return -errno;
72 }
73 // Whatever write mode was there before: now things are readonly.
74 stbuf->st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH);
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
75 return 0;
76 }
77
73093dcf »
2012-09-08 o Keep open file-descriptor.
78 // readdir(). Just forward to original filesystem.
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
79 static int folve_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
80 off_t offset, struct fuse_file_info *fi) {
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
81 DIR *dp;
82 struct dirent *de;
83 char path_buf[PATH_MAX];
84
85 dp = opendir(assemble_orig_path(path_buf, path));
86 if (dp == NULL)
87 return -errno;
88
bf030afb »
2012-09-29 o use readdir_r() - looks like readdir is indeed not really multi-thread
89 // Entry size is a bit shaky to calculate, but this should be the upper bound.
90 const size_t entry_size = sizeof(struct dirent) + PATH_MAX;
91 struct dirent *entry_buf = (struct dirent *) malloc(entry_size);
92
93 while (readdir_r(dp, entry_buf, &de) == 0 && de != NULL) {
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
94 struct stat st;
95 memset(&st, 0, sizeof(st));
96 st.st_ino = de->d_ino;
97 st.st_mode = de->d_type << 12;
7c7bda6f »
2012-09-10 o attempt to create a sndfile for every file, if that fails, fall
98 const char *entry_name = de->d_name;
99 if (filler(buf, entry_name, &st, 0))
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
100 break;
101 }
bf030afb »
2012-09-29 o use readdir_r() - looks like readdir is indeed not really multi-thread
102 free(entry_buf);
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
103
104 closedir(dp);
105 return 0;
106 }
107
73093dcf »
2012-09-08 o Keep open file-descriptor.
108 // readlink(): forward to original filesystem.
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
109 static int folve_readlink(const char *path, char *buf, size_t size) {
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
110 char path_buf[PATH_MAX];
111 const int result = readlink(assemble_orig_path(path_buf, path),
112 buf, size - 1);
113 if (result == -1)
114 return -errno;
115
116 buf[result] = '\0';
117 return 0;
118 }
119
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
120 static int folve_open(const char *path, struct fuse_file_info *fi) {
8b18938f »
2012-09-09 o some comment changes. Ready to do some flac handling.
121 // We want to be allowed to only return part of the requested data in read().
122 // That way, we can separate reading the ID3-tags from
123 // decoding of the music stream - that way indexing should be fast.
124 // Setting the flag 'direct_io' allows us to return partial results.
125 fi->direct_io = 1;
126
e9c07dd6 »
2012-09-08 o add documentation
127 // The file-handle has the neat property to be 64 bit - so we can actually
b6988530 »
2012-09-15 o README updates.
128 // stuff a pointer to our file handler object in there :)
8b18938f »
2012-09-09 o some comment changes. Ready to do some flac handling.
129 // (Yay, someone was thinking while developing that API).
08bbf282 »
2012-09-21 o First shot at gapless. Works pretty well for my test-case.
130 FileHandler *handler = folve_rt.fs->GetOrCreateHandler(path);
680f5909 »
2012-09-13 o report opening error.
131 if (handler == NULL)
132 return -errno;
133 fi->fh = (uint64_t) handler;
134 return 0;
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
135 }
136
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
137 static int folve_read(const char *path, char *buf, size_t size, off_t offset,
138 struct fuse_file_info *fi) {
8d1fbe7c »
2012-09-13 o Move fuse-convolve.c to fuse-convolve.cc. Make filter-interface
139 return reinterpret_cast<FileHandler *>(fi->fh)->Read(buf, size, offset);
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
140 }
141
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
142 static int folve_release(const char *path, struct fuse_file_info *fi) {
ee675fea »
2012-09-17 o Provide a way to select between different filter diretories.
143 folve_rt.fs->Close(path, reinterpret_cast<FileHandler *>(fi->fh));
8d1fbe7c »
2012-09-13 o Move fuse-convolve.c to fuse-convolve.cc. Make filter-interface
144 return 0;
9a8ea565 »
2012-09-12 o add infrastructure to provide Stat() output of currently open
145 }
146
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
147 static int folve_fgetattr(const char *path, struct stat *result,
148 struct fuse_file_info *fi) {
8d1fbe7c »
2012-09-13 o Move fuse-convolve.c to fuse-convolve.cc. Make filter-interface
149 return reinterpret_cast<FileHandler *>(fi->fh)->Stat(result);
73093dcf »
2012-09-08 o Keep open file-descriptor.
150 }
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
151
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
152 static void *folve_init(struct fuse_conn_info *conn) {
153 const int ident_len = 20;
154 char *ident = (char*) malloc(ident_len); // openlog() keeps reference. Leaks.
27c44cd1 »
2012-09-17 o Use fuse option handling to extract our flags and options.
155 snprintf(ident, ident_len, "folve[%d]", getpid());
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
156 openlog(ident, LOG_CONS|LOG_PERROR, LOG_USER);
ee675fea »
2012-09-17 o Provide a way to select between different filter diretories.
157 syslog(LOG_INFO, "Version " FOLVE_VERSION " started. "
158 "Serving '%s' on mount point '%s'",
159 folve_rt.fs->underlying_dir().c_str(), folve_rt.mount_point);
7689c9a8 »
2012-09-22 o preparation to extract classes from folve-filesystem into their
160 if (folve::IsDebugLogEnabled()) {
5830c5a6 »
2012-09-17 o Switch logging to syslog()
161 syslog(LOG_INFO, "Debug logging enabled (-D)");
162 }
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
163
ee675fea »
2012-09-17 o Provide a way to select between different filter diretories.
164 if (folve_rt.status_port > 0) {
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
165 // Need to start status server after we're daemonized.
ee675fea »
2012-09-17 o Provide a way to select between different filter diretories.
166 StatusServer *status_server = new StatusServer(folve_rt.fs);
167 if (status_server->Start(folve_rt.status_port)) {
a372a03d »
2012-09-22 o Make meta-refresh configurable.
168 syslog(LOG_INFO, "HTTP status server on port %d; refresh=%d",
169 folve_rt.status_port, folve_rt.refresh_time);
170 status_server->set_meta_refresh(folve_rt.refresh_time);
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
171 } else {
172 syslog(LOG_ERR, "Couldn't start HTTP server on port %d\n",
ee675fea »
2012-09-17 o Provide a way to select between different filter diretories.
173 folve_rt.status_port);
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
174 }
175 }
ee675fea »
2012-09-17 o Provide a way to select between different filter diretories.
176
177 // Some sanity checks.
178 if (folve_rt.fs->config_dirs().size() == 1) {
179 syslog(LOG_NOTICE, "No filter configuration directories given. "
180 "Any files will be just passed through verbatim.");
181 }
182 if (folve_rt.fs->config_dirs().size() > 2 && folve_rt.status_port < 0) {
183 syslog(LOG_WARNING, "Multiple filter configurations given, but no HTTP "
184 "status port. You only can switch filters via the HTTP interface; "
185 "add -p <port>");
186 }
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
187 return NULL;
188 }
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
189
0a3400db »
2012-09-16 o Write when we're exiting.
190 static void folve_destroy(void *) {
db66f7df »
2012-09-17 o print which directory is serviced.
191 syslog(LOG_INFO, "Exiting.");
0a3400db »
2012-09-16 o Write when we're exiting.
192 }
193
b6988530 »
2012-09-15 o README updates.
194 static int usage(const char *prg) {
8fb28ec7 »
2012-09-24 Making README.md more readable thanks to wordsmithing input from
195 printf("usage: %s [options] <original-dir> <mount-point-dir>\n", prg);
5830c5a6 »
2012-09-17 o Switch logging to syslog()
196 printf("Options: (in sequence of usefulness)\n"
062a4354 »
2012-09-17 o change configuration directory wording.
197 "\t-c <cfg-dir> : Convolver configuration directory.\n"
8c7e5c11 »
2012-09-18 o Only if -D is given, the debug toggle is active in the UI.
198 "\t You can supply this option multiple times:\n"
1971a4a2 »
2012-09-23 o No more radio buttons.
199 "\t Select on the HTTP status page.\n"
5830c5a6 »
2012-09-17 o Switch logging to syslog()
200 "\t-p <port> : Port to run the HTTP status server on.\n"
436f57d8 »
2012-09-22 o Have a default refresh time of 10 seconds.
201 "\t-r <refresh> : Seconds between refresh of status page;\n"
202 "\t Default is %d seconds; switch off with -1.\n"
f9b9bc9d »
2012-09-21 o gapless not experimental anymore.
203 "\t-g : Gapless convolving alphabetically adjacent files.\n"
20e139ca »
2012-09-24 o Less cluttered output in UI if -D is not set.
204 "\t-D : Moderate volume Folve debug messages to syslog,\n"
205 "\t and some more detailed configuration info in UI\n"
5830c5a6 »
2012-09-17 o Switch logging to syslog()
206 "\t-f : Operate in foreground; useful for debugging.\n"
8fb28ec7 »
2012-09-24 Making README.md more readable thanks to wordsmithing input from
207 "\t-o <mnt-opt> : other generic mount parameters passed to FUSE.\n"
208 "\t-d : High volume FUSE debug log. Implies -f.\n",
436f57d8 »
2012-09-22 o Have a default refresh time of 10 seconds.
209 folve_rt.refresh_time);
8b18938f »
2012-09-09 o some comment changes. Ready to do some flac handling.
210 return 1;
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
211 }
212
27c44cd1 »
2012-09-17 o Use fuse option handling to extract our flags and options.
213 struct FolveConfig {
214 FolveConfig() : base_dir(NULL), config_dir(NULL), port(-1) {}
215 const char *base_dir;
216 const char *mount_point;
217 const char *config_dir;
218 int port;
219 };
220
221 enum {
222 FOLVE_OPT_PORT = 42,
a372a03d »
2012-09-22 o Make meta-refresh configurable.
223 FOLVE_OPT_REFRESH_TIME,
27c44cd1 »
2012-09-17 o Use fuse option handling to extract our flags and options.
224 FOLVE_OPT_CONFIG,
5830c5a6 »
2012-09-17 o Switch logging to syslog()
225 FOLVE_OPT_DEBUG,
08bbf282 »
2012-09-21 o First shot at gapless. Works pretty well for my test-case.
226 FOLVE_OPT_GAPLESS,
27c44cd1 »
2012-09-17 o Use fuse option handling to extract our flags and options.
227 };
228
229 int FolveOptionHandling(void *data, const char *arg, int key,
230 struct fuse_args *outargs) {
df18f637 »
2012-09-22 o Make path-names to filters and base-directory absolute
231 char realpath_buf[PATH_MAX]; // running as daemon, need absolute names.
ee675fea »
2012-09-17 o Provide a way to select between different filter diretories.
232 FolveRuntime *rt = (FolveRuntime*) data;
27c44cd1 »
2012-09-17 o Use fuse option handling to extract our flags and options.
233 switch (key) {
234 case FUSE_OPT_KEY_NONOPT:
ee675fea »
2012-09-17 o Provide a way to select between different filter diretories.
235 // First non-opt: our underlying dir.
236 if (rt->fs->underlying_dir().empty()) {
cf1b0e09 »
2012-09-22 o README demo tweaking
237 const char *base_dir = realpath(arg, realpath_buf);
238 if (base_dir != NULL) {
239 rt->fs->set_underlying_dir(base_dir);
240 } else {
241 fprintf(stderr, "Invalid base path '%s': %s\n",
242 arg, strerror(errno));
fa525eec »
2012-09-22 o If we find problems in the options, complain and exit.
243 rt->parameter_error = true;
cf1b0e09 »
2012-09-22 o README demo tweaking
244 }
ee675fea »
2012-09-17 o Provide a way to select between different filter diretories.
245 return 0; // we consumed this.
27c44cd1 »
2012-09-17 o Use fuse option handling to extract our flags and options.
246 } else {
ee675fea »
2012-09-17 o Provide a way to select between different filter diretories.
247 rt->mount_point = strdup(arg); // remmber as FYI
248 return 1; // .. but leave it to fuse
27c44cd1 »
2012-09-17 o Use fuse option handling to extract our flags and options.
249 }
250 case FOLVE_OPT_PORT:
ee675fea »
2012-09-17 o Provide a way to select between different filter diretories.
251 rt->status_port = atoi(arg + 2); // strip "-p"
27c44cd1 »
2012-09-17 o Use fuse option handling to extract our flags and options.
252 return 0;
a372a03d »
2012-09-22 o Make meta-refresh configurable.
253 case FOLVE_OPT_REFRESH_TIME:
254 rt->refresh_time = atoi(arg + 2); // strip "-r"
255 return 0;
cf1b0e09 »
2012-09-22 o README demo tweaking
256 case FOLVE_OPT_CONFIG: {
257 const char *config_dir = realpath(arg + 2, realpath_buf); // strip "-c"
258 if (config_dir != NULL) {
259 rt->fs->add_config_dir(config_dir);
260 } else {
261 fprintf(stderr, "Invalid config dir '%s': %s\n",
262 arg + 2, strerror(errno));
fa525eec »
2012-09-22 o If we find problems in the options, complain and exit.
263 rt->parameter_error = true;
cf1b0e09 »
2012-09-22 o README demo tweaking
264 }
27c44cd1 »
2012-09-17 o Use fuse option handling to extract our flags and options.
265 return 0;
cf1b0e09 »
2012-09-22 o README demo tweaking
266 }
5830c5a6 »
2012-09-17 o Switch logging to syslog()
267 case FOLVE_OPT_DEBUG:
537e34b8 »
2012-09-23 o cleanup UI: no radio buttons anymore, just simple links.
268 // rt->fs->set_debug_ui_enabled(true); // Disabled in status-server.
7689c9a8 »
2012-09-22 o preparation to extract classes from folve-filesystem into their
269 folve::EnableDebugLog(true);
5830c5a6 »
2012-09-17 o Switch logging to syslog()
270 return 0;
08bbf282 »
2012-09-21 o First shot at gapless. Works pretty well for my test-case.
271 case FOLVE_OPT_GAPLESS:
272 rt->fs->set_gapless_processing(true);
273 return 0;
27c44cd1 »
2012-09-17 o Use fuse option handling to extract our flags and options.
274 }
275 return 1;
276 }
277
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
278 int main(int argc, char *argv[]) {
1e9ff217 »
2012-09-15 o main: report if parameters are not directories.
279 const char *progname = argv[0];
8b18938f »
2012-09-09 o some comment changes. Ready to do some flac handling.
280 if (argc < 4) {
1e9ff217 »
2012-09-15 o main: report if parameters are not directories.
281 return usage(progname);
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
282 }
49eca7f9 »
2012-09-16 o add syslog as preparation for parameter handling.
283
ee675fea »
2012-09-17 o Provide a way to select between different filter diretories.
284 folve_rt.fs = new FolveFilesystem();
285
27c44cd1 »
2012-09-17 o Use fuse option handling to extract our flags and options.
286 static struct fuse_opt folve_options[] = {
5830c5a6 »
2012-09-17 o Switch logging to syslog()
287 FUSE_OPT_KEY("-p ", FOLVE_OPT_PORT),
a372a03d »
2012-09-22 o Make meta-refresh configurable.
288 FUSE_OPT_KEY("-r ", FOLVE_OPT_REFRESH_TIME),
5830c5a6 »
2012-09-17 o Switch logging to syslog()
289 FUSE_OPT_KEY("-c ", FOLVE_OPT_CONFIG),
290 FUSE_OPT_KEY("-D", FOLVE_OPT_DEBUG),
08bbf282 »
2012-09-21 o First shot at gapless. Works pretty well for my test-case.
291 FUSE_OPT_KEY("-g", FOLVE_OPT_GAPLESS),
cca212e5 »
2012-09-24 o document compile error with old version of fuse.
292 FUSE_OPT_END // This fails to compile for fuse <= 2.8.1; get >= 2.8.4
27c44cd1 »
2012-09-17 o Use fuse option handling to extract our flags and options.
293 };
294 struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
ee675fea »
2012-09-17 o Provide a way to select between different filter diretories.
295 fuse_opt_parse(&args, &folve_rt, folve_options, FolveOptionHandling);
27c44cd1 »
2012-09-17 o Use fuse option handling to extract our flags and options.
296
fa525eec »
2012-09-22 o If we find problems in the options, complain and exit.
297 if (folve_rt.parameter_error || !folve_rt.fs->CheckInitialized()) {
1e9ff217 »
2012-09-15 o main: report if parameters are not directories.
298 return usage(progname);
299 }
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
300
301 struct fuse_operations folve_operations;
302 memset(&folve_operations, 0, sizeof(folve_operations));
8d1fbe7c »
2012-09-13 o Move fuse-convolve.c to fuse-convolve.cc. Make filter-interface
303
0a3400db »
2012-09-16 o Write when we're exiting.
304 // Start/stop. Will write to syslog and start auxiliary http service.
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
305 folve_operations.init = folve_init;
0a3400db »
2012-09-16 o Write when we're exiting.
306 folve_operations.destroy = folve_destroy;
8d1fbe7c »
2012-09-13 o Move fuse-convolve.c to fuse-convolve.cc. Make filter-interface
307
308 // Basic operations to make navigation work.
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
309 folve_operations.readdir = folve_readdir;
310 folve_operations.readlink = folve_readlink;
8d1fbe7c »
2012-09-13 o Move fuse-convolve.c to fuse-convolve.cc. Make filter-interface
311
312 // open() and close() file.
38cdeb1a »
2012-09-20 o whitespace changes.
313 folve_operations.open = folve_open;
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
314 folve_operations.release = folve_release;
8d1fbe7c »
2012-09-13 o Move fuse-convolve.c to fuse-convolve.cc. Make filter-interface
315
316 // Actual workhorse: reading a file and returning predicted file-size
0330f769 »
2012-09-16 o Only start status server after we're daemonized, otherwise
317 folve_operations.read = folve_read;
318 folve_operations.fgetattr = folve_fgetattr;
319 folve_operations.getattr = folve_getattr;
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
320
27c44cd1 »
2012-09-17 o Use fuse option handling to extract our flags and options.
321 return fuse_main(args.argc, args.argv, &folve_operations, NULL);
98a57256 »
2012-09-08 o Start implementation. Just a basic forwarding filesystem for
322 }
Something went wrong with that request. Please try again.