mirror of
https://github.com/fuse-friends/fuse-native
synced 2025-06-13 12:53:54 +00:00
better error handling and mount callback
This commit is contained in:
parent
3bb1c62c88
commit
07352cfe10
@ -47,6 +47,9 @@ fuse.mount('./mnt', {
|
|||||||
buf.write(str)
|
buf.write(str)
|
||||||
return cb(str.length)
|
return cb(str.length)
|
||||||
}
|
}
|
||||||
|
}, function (err) {
|
||||||
|
if (err) throw err
|
||||||
|
console.log('filesystem mounted on ./mnt')
|
||||||
})
|
})
|
||||||
|
|
||||||
process.on('SIGINT', function () {
|
process.on('SIGINT', function () {
|
||||||
|
@ -18,6 +18,7 @@ using namespace v8;
|
|||||||
|
|
||||||
enum bindings_ops_t {
|
enum bindings_ops_t {
|
||||||
OP_INIT = 0,
|
OP_INIT = 0,
|
||||||
|
OP_ERROR,
|
||||||
OP_ACCESS,
|
OP_ACCESS,
|
||||||
OP_STATFS,
|
OP_STATFS,
|
||||||
OP_FGETATTR,
|
OP_FGETATTR,
|
||||||
@ -54,6 +55,7 @@ static Persistent<Function> buffer_constructor;
|
|||||||
static struct stat empty_stat;
|
static struct stat empty_stat;
|
||||||
|
|
||||||
// TODO support more than a single mount
|
// TODO support more than a single mount
|
||||||
|
static int bindings_in_use = 0;
|
||||||
static struct {
|
static struct {
|
||||||
// fuse data
|
// fuse data
|
||||||
char mnt[1024];
|
char mnt[1024];
|
||||||
@ -68,6 +70,7 @@ static struct {
|
|||||||
|
|
||||||
// methods
|
// methods
|
||||||
NanCallback *ops_init;
|
NanCallback *ops_init;
|
||||||
|
NanCallback *ops_error;
|
||||||
NanCallback *ops_access;
|
NanCallback *ops_access;
|
||||||
NanCallback *ops_statfs;
|
NanCallback *ops_statfs;
|
||||||
NanCallback *ops_getattr;
|
NanCallback *ops_getattr;
|
||||||
@ -471,11 +474,9 @@ static void *bindings_thread (void *) {
|
|||||||
(char *) bindings.mntopts
|
(char *) bindings.mntopts
|
||||||
};
|
};
|
||||||
|
|
||||||
// bindings_unmount(bindings.mnt); // should probably throw instead if mounted
|
|
||||||
|
|
||||||
if (fuse_main(!strcmp(bindings.mntopts, "-o") ? 4 : 5, argv, &ops, NULL)) {
|
if (fuse_main(!strcmp(bindings.mntopts, "-o") ? 4 : 5, argv, &ops, NULL)) {
|
||||||
// TODO: error handle somehow
|
bindings.op = OP_ERROR;
|
||||||
printf("fuse-binding: mount failed\n");
|
bindings_call();
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -623,6 +624,12 @@ static void bindings_dispatch (uv_async_t* handle, int status) {
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
case OP_ERROR: {
|
||||||
|
Local<Value> tmp[] = {callback};
|
||||||
|
bindings_call_op(bindings.ops_error, 1, tmp);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
case OP_STATFS: {
|
case OP_STATFS: {
|
||||||
Local<Value> tmp[] = {NanNew<String>(bindings.path), callback};
|
Local<Value> tmp[] = {NanNew<String>(bindings.path), callback};
|
||||||
bindings_call_op(bindings.ops_statfs, 2, tmp);
|
bindings_call_op(bindings.ops_statfs, 2, tmp);
|
||||||
@ -849,12 +856,17 @@ static void bindings_append_opt (char *name) {
|
|||||||
NAN_METHOD(Mount) {
|
NAN_METHOD(Mount) {
|
||||||
NanScope();
|
NanScope();
|
||||||
|
|
||||||
|
if (!args[0]->IsString()) return NanThrowError("mnt must be a string");
|
||||||
|
if (bindings_in_use) return NanThrowError("Currently only a single filesystem can be mounted at the time");
|
||||||
|
bindings_in_use = 1;
|
||||||
|
|
||||||
memset(&empty_stat, 0, sizeof(empty_stat)); // zero empty stat
|
memset(&empty_stat, 0, sizeof(empty_stat)); // zero empty stat
|
||||||
|
|
||||||
NanUtf8String path(args[0]);
|
NanUtf8String path(args[0]);
|
||||||
Local<Object> ops = args[1].As<Object>();
|
Local<Object> ops = args[1].As<Object>();
|
||||||
|
|
||||||
bindings.ops_init = ops->Has(NanNew<String>("init")) ? new NanCallback(ops->Get(NanNew<String>("init")).As<Function>()) : NULL;
|
bindings.ops_init = ops->Has(NanNew<String>("init")) ? new NanCallback(ops->Get(NanNew<String>("init")).As<Function>()) : NULL;
|
||||||
|
bindings.ops_error = ops->Has(NanNew<String>("error")) ? new NanCallback(ops->Get(NanNew<String>("error")).As<Function>()) : NULL;
|
||||||
bindings.ops_access = ops->Has(NanNew<String>("access")) ? new NanCallback(ops->Get(NanNew<String>("access")).As<Function>()) : NULL;
|
bindings.ops_access = ops->Has(NanNew<String>("access")) ? new NanCallback(ops->Get(NanNew<String>("access")).As<Function>()) : NULL;
|
||||||
bindings.ops_statfs = ops->Has(NanNew<String>("statfs")) ? new NanCallback(ops->Get(NanNew<String>("statfs")).As<Function>()) : NULL;
|
bindings.ops_statfs = ops->Has(NanNew<String>("statfs")) ? new NanCallback(ops->Get(NanNew<String>("statfs")).As<Function>()) : NULL;
|
||||||
bindings.ops_getattr = ops->Has(NanNew<String>("getattr")) ? new NanCallback(ops->Get(NanNew<String>("getattr")).As<Function>()) : NULL;
|
bindings.ops_getattr = ops->Has(NanNew<String>("getattr")) ? new NanCallback(ops->Get(NanNew<String>("getattr")).As<Function>()) : NULL;
|
||||||
@ -944,6 +956,8 @@ NAN_METHOD(SetBuffer) {
|
|||||||
|
|
||||||
NAN_METHOD(Unmount) {
|
NAN_METHOD(Unmount) {
|
||||||
NanScope();
|
NanScope();
|
||||||
|
|
||||||
|
if (!args[0]->IsString()) return NanThrowError("mnt must be a string");
|
||||||
NanUtf8String path(args[0]);
|
NanUtf8String path(args[0]);
|
||||||
Local<Function> callback = args[1].As<Function>();
|
Local<Function> callback = args[1].As<Function>();
|
||||||
|
|
||||||
|
29
index.js
29
index.js
@ -1,8 +1,10 @@
|
|||||||
var bindings = require('bindings')
|
var bindings = require('bindings')
|
||||||
var fuse = bindings('fuse_bindings')
|
var fuse = bindings('fuse_bindings')
|
||||||
|
var fs = require('fs')
|
||||||
var path = require('path')
|
var path = require('path')
|
||||||
|
|
||||||
var noop = function () {}
|
var noop = function () {}
|
||||||
|
var call = function (cb) { cb() }
|
||||||
|
|
||||||
var FuseBuffer = function () {
|
var FuseBuffer = function () {
|
||||||
this.length = 0
|
this.length = 0
|
||||||
@ -13,10 +15,33 @@ FuseBuffer.prototype = Buffer.prototype
|
|||||||
|
|
||||||
fuse.setBuffer(FuseBuffer)
|
fuse.setBuffer(FuseBuffer)
|
||||||
|
|
||||||
exports.mount = function (mnt, ops) {
|
exports.mount = function (mnt, ops, cb) {
|
||||||
|
if (!cb) cb = noop
|
||||||
if (!ops) ops = {}
|
if (!ops) ops = {}
|
||||||
|
|
||||||
if (/\*|(^,)fuse-bindings(,$)/.test(process.env.DEBUG)) ops.options = ['debug'].concat(ops.options || [])
|
if (/\*|(^,)fuse-bindings(,$)/.test(process.env.DEBUG)) ops.options = ['debug'].concat(ops.options || [])
|
||||||
return fuse.mount(path.resolve(mnt), ops)
|
mnt = path.resolve(mnt)
|
||||||
|
|
||||||
|
var init = ops.init || call
|
||||||
|
ops.init = function (next) {
|
||||||
|
cb()
|
||||||
|
init(next)
|
||||||
|
}
|
||||||
|
|
||||||
|
var error = ops.error || call
|
||||||
|
ops.error = function (next) {
|
||||||
|
cb(new Error('Mount failed'))
|
||||||
|
error(next)
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.stat(mnt, function (err, stat) {
|
||||||
|
if (err) return cb(new Error('Mountpoint does not exist'))
|
||||||
|
if (!stat.isDirectory()) return cb(new Error('Mountpoint is not a directory'))
|
||||||
|
fs.stat(path.join(mnt, '..'), function(_, parent) {
|
||||||
|
if (parent && parent.dev !== stat.dev) return cb(new Error('Mountpoint in use'))
|
||||||
|
fuse.mount(mnt, ops)
|
||||||
|
})
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.unmount = function (mnt, cb) {
|
exports.unmount = function (mnt, cb) {
|
||||||
|
Loading…
Reference in New Issue
Block a user