mirror of
https://github.com/fuse-friends/fuse-native
synced 2024-10-27 18:34:01 +00:00
fixed C function signatures + added JS methods
This commit is contained in:
parent
a4f225b78b
commit
bd9d36fb2f
@ -294,10 +294,11 @@ FUSE_METHOD(opendir, 0, 0, (const char *path, struct fuse_file_info *info), {
|
||||
l->info = info;
|
||||
},
|
||||
{
|
||||
napi_create_string_utf8(env, l->path, NAPI_AUTO_LENGTH, &(argv[2]));
|
||||
if (l->info != NULL) {
|
||||
napi_create_uint32(env, l->info->fh, &(argv[2]));
|
||||
napi_create_uint32(env, l->info->fh, &(argv[3]));
|
||||
} else {
|
||||
napi_create_uint32(env, 0, &(argv[2]));
|
||||
napi_create_uint32(env, 0, &(argv[3]));
|
||||
}
|
||||
},
|
||||
{
|
||||
@ -329,8 +330,9 @@ FUSE_METHOD(utimens, 2, 0, (const char *path, const struct timespec tv[2]), {
|
||||
from_timespec(&tv[1], l->mtim);
|
||||
},
|
||||
{
|
||||
napi_create_external_arraybuffer(env, l->atim, 2 * sizeof(uint32_t), &fin, NULL, &argv[2]);
|
||||
napi_create_external_arraybuffer(env, l->mtim, 2 * sizeof(uint32_t), &fin, NULL, &argv[3]);
|
||||
napi_create_string_utf8(env, l->path, NAPI_AUTO_LENGTH, &(argv[2]));
|
||||
napi_create_external_arraybuffer(env, l->atim, 2 * sizeof(uint32_t), &fin, NULL, &argv[3]);
|
||||
napi_create_external_arraybuffer(env, l->mtim, 2 * sizeof(uint32_t), &fin, NULL, &argv[4]);
|
||||
},
|
||||
{})
|
||||
|
||||
|
347
index.js
347
index.js
@ -204,7 +204,7 @@ class Fuse {
|
||||
const boundSignal = signal.bind(arguments[0])
|
||||
const funcName = `_$name`
|
||||
if (!this[funcName] || !this._implemented.has(op)) return boundSignal(-1, defaults)
|
||||
this[funcName].apply(null, [boundSignal, [...arguments].slice(1) ])
|
||||
return this[funcName].apply(null, [boundSignal, [...arguments].slice(1) ])
|
||||
}
|
||||
|
||||
function signal (nativeHandler, err, args) {
|
||||
@ -216,78 +216,25 @@ class Fuse {
|
||||
}
|
||||
|
||||
_init (signal) {
|
||||
if (!this.ops.init) return signal(0)
|
||||
if (!this.ops.init) {
|
||||
signal(0)
|
||||
return
|
||||
}
|
||||
this.ops.init(err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_error (signal) {
|
||||
if (!this.ops.error) return signal(0)
|
||||
if (!this.ops.error) {
|
||||
signal(0)
|
||||
return
|
||||
}
|
||||
this.ops.error(err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_getattr (signal, path) {
|
||||
if (!this.ops.getattr) {
|
||||
if (path !== '/') return signal(Fuse.EPERM)
|
||||
return signal(0, getStatArray({ mtime: new Date(0), atime: new Date(0), ctime: new Date(0), mode: 16877, size: 4096 }))
|
||||
}
|
||||
this.ops.getattr(path, (err, stat) => {
|
||||
if (err) return signal(err)
|
||||
return signal(0, getStatArray(stat))
|
||||
})
|
||||
}
|
||||
|
||||
_fgetattr (signal, path, fd) {
|
||||
|
||||
}
|
||||
|
||||
_setxattr (signal, path, name, value, size, position, flags) {
|
||||
|
||||
}
|
||||
|
||||
_getxattr (signal, path, name, value, size, position) {
|
||||
|
||||
}
|
||||
|
||||
_listxattr (signal, path, list, size) {
|
||||
|
||||
}
|
||||
|
||||
_open (signal, path) {
|
||||
|
||||
}
|
||||
|
||||
_create (signal, path, mode) {
|
||||
|
||||
}
|
||||
|
||||
_read (signal, path, fd, buf, len, offset) {
|
||||
|
||||
}
|
||||
|
||||
_write (signal, path, fd, buf, len, offset) {
|
||||
|
||||
}
|
||||
|
||||
_release (signal, path, fd) {
|
||||
|
||||
}
|
||||
|
||||
_releasedir (signal, path, fd) {
|
||||
|
||||
}
|
||||
|
||||
_readdir (signal, path) {
|
||||
this.ops.readdir(path, (err, names, stats) => {
|
||||
if (err) return signal(err)
|
||||
if (stats) stats = stats.map(getStatArray)
|
||||
return signal(null, [names, stats || []])
|
||||
})
|
||||
}
|
||||
|
||||
_statfs (signal) {
|
||||
this.ops.statfs((err, statfs) => {
|
||||
if (err) return signal(err)
|
||||
@ -296,106 +243,218 @@ class Fuse {
|
||||
})
|
||||
}
|
||||
|
||||
_fd_op (handle, op, path, fd, buf, len, offset) {
|
||||
const signalFunc = binding.fuse_native_signal_buffer.bind(binding)
|
||||
if (!this._implemented.has(op)) return this._signal(signalFunc, [handle, -1])
|
||||
|
||||
const cb = (bytesProcessed) => {
|
||||
return this._signal(signalFunc, [handle, bytesProcessed || 0])
|
||||
_getattr (signal, path) {
|
||||
if (!this.ops.getattr) {
|
||||
if (path !== '/') {
|
||||
signal(Fuse.EPERM)
|
||||
} else {
|
||||
signal(0, getStatArray({ mtime: new Date(0), atime: new Date(0), ctime: new Date(0), mode: 16877, size: 4096 }))
|
||||
}
|
||||
return
|
||||
}
|
||||
this.ops.getattr(path, (err, stat) => {
|
||||
if (err) return signal(err)
|
||||
return signal(0, getStatArray(stat))
|
||||
})
|
||||
}
|
||||
|
||||
switch (op) {
|
||||
case (binding.op_read):
|
||||
this.ops.read(path, fd, buf, len, offset, cb)
|
||||
break
|
||||
case (binding.op_write):
|
||||
this.ops.write(path, fd, buf, len, offset, cb)
|
||||
break
|
||||
case(binding.op_release):
|
||||
this.ops.release(path, fd, cb)
|
||||
break
|
||||
case(binding.op_releasedir):
|
||||
this.ops.releasedir(path, fd, cb)
|
||||
break
|
||||
default:
|
||||
return this._signal(signalFunc, [handle, 0])
|
||||
_fgetattr (signal, path, fd) {
|
||||
if (!this.ops.fgetattr) {
|
||||
if (path !== '/') {
|
||||
signal(Fuse.EPERM)
|
||||
} else {
|
||||
signal(0, getStatArray({ mtime: new Date(0), atime: new Date(0), ctime: new Date(0), mode: 16877, size: 4096 }))
|
||||
}
|
||||
return
|
||||
}
|
||||
this.ops.getattr(path, (err, stat) => {
|
||||
if (err) return signal(err)
|
||||
return signal(0, getStatArray(stat))
|
||||
})
|
||||
}
|
||||
|
||||
on_stat_op (handle, op, path, fd) {
|
||||
const signalFunc = binding.fuse_native_signal_stat.bind(binding)
|
||||
if (!this._implemented.has(op)) return this._signal(signalFunc, [handle, -1, getStatArray()])
|
||||
|
||||
const cb = (err, stat) => {
|
||||
const arr = getStatArray(stat)
|
||||
return this._signal(signalFunc, [handle, err, arr])
|
||||
_access (signal, path, mode) {
|
||||
this.ops.access(path, mode, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
switch (op) {
|
||||
case (binding.op_getattr):
|
||||
this.ops.getattr(path, cb)
|
||||
break
|
||||
case (binding.op_fgetattr):
|
||||
this.ops.fgetattr(path, fd, cb)
|
||||
default:
|
||||
return this._signal(signalFunc, [handle, -1, getStatArray()])
|
||||
}
|
||||
_open (signal, path) {
|
||||
this.ops.open(path, (err, fd) => {
|
||||
return signal(err, fd)
|
||||
})
|
||||
}
|
||||
|
||||
on_path_op (handle, op, path, mode, flags, atim, mtim) {
|
||||
const signalFunc = binding.fuse_native_signal_path.bind(binding)
|
||||
if (!this._implemented.has(op)) return this._signal(signalFunc, [handle, -1, 0])
|
||||
|
||||
const cb = (err, fd) => {
|
||||
return this._signal(signalFunc, [handle, err, fd || 0])
|
||||
_opendir (signal, path) {
|
||||
this.ops.opendir(path, (err, fd) => {
|
||||
return signal(err, fd)
|
||||
})
|
||||
}
|
||||
|
||||
switch (op) {
|
||||
case (binding.op_open):
|
||||
this.ops.open(path, flags, cb)
|
||||
break
|
||||
case (binding.op_create):
|
||||
this.ops.create(path, mode, cb)
|
||||
break
|
||||
case (binding.op_access):
|
||||
this.ops.access(path, mode, cb)
|
||||
break
|
||||
case (binding.op_utimens):
|
||||
this.ops.utimens(path, getDoubleInt(atim, 0), getDoubleInt(mtim, 0), cb)
|
||||
break
|
||||
default:
|
||||
return this._signal(signalFunc, [handle, -1, 0])
|
||||
}
|
||||
_create (signal, path, mode) {
|
||||
this.ops.create(path, mode, (err, fd) => {
|
||||
return signal(err, fd)
|
||||
})
|
||||
}
|
||||
|
||||
on_xattr_op (handle, op, path, name, value, list, size, flags, position) {
|
||||
const signalFunc = binding.fuse_native_signal_xattr.bind(binding)
|
||||
if (!this._implemented.has(op)) return this._signal(signalFunc, [handle, -1, 0])
|
||||
|
||||
const cb = err => {
|
||||
return this._signal(signalFunc, [handle, -1])
|
||||
_utimens (signal, path, atim, mtim) {
|
||||
atim = getDoubleInt(atim, 0)
|
||||
mtim = getDoubleInt(mtim, 0)
|
||||
this.ops.utimens(path, atim, mtim, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
switch (op) {
|
||||
case (binding.op_setxattr):
|
||||
this.ops.setxattr(path, name, value, size, position || 0, flags, cb)
|
||||
break
|
||||
case (binding.op_getxattr):
|
||||
this.ops.getxattr(path, name, value, size, position || 0, cb)
|
||||
break
|
||||
case (binding.op_listxattr):
|
||||
this.ops.listxattr(path, list, size, cb)
|
||||
break
|
||||
case (binding.op_removexattr):
|
||||
this.ops.removexattr(path, name, cb)
|
||||
break
|
||||
default:
|
||||
return this._signal(signalFunc, [handle, -1])
|
||||
}
|
||||
_release (signal, path, fd) {
|
||||
this.ops.release(path, fd, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
on_symlink (path, target) {
|
||||
_releasedir (signal, path, fd) {
|
||||
this.ops.releasedir(path, fd, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_read (signal, path, fd, buf, len, offset) {
|
||||
this.ops.read(path, fd, buf, len, offset, (err, bytesRead) => {
|
||||
return signal(err, bytesRead)
|
||||
})
|
||||
}
|
||||
|
||||
_write (signal, path, fd, buf, len, offset) {
|
||||
this.ops.write(path, fd, buf, len, offset, (err, bytesWritten) => {
|
||||
return signal(err, bytesWritten)
|
||||
})
|
||||
}
|
||||
|
||||
_readdir (signal, path) {
|
||||
this.ops.readdir(path, (err, names, stats) => {
|
||||
if (err) return signal(err)
|
||||
if (stats) stats = stats.map(getStatArray)
|
||||
return signal(null, [names, stats || []])
|
||||
})
|
||||
}
|
||||
|
||||
_setxattr (signal, path, name, value, size, position, flags) {
|
||||
this.ops.setxattr(path, name, value, size, position, flags, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_getxattr (signal, path, name, value, size, position) {
|
||||
this.ops.getxattr(path, name, value, size, position, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_listxattr (signal, path, list, size) {
|
||||
this.ops.listxattr(path, list, size, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_removexattr (signal, path, name) {
|
||||
this.ops.removexattr(path, name, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_flush (signal, path, datasync, fd) {
|
||||
this.ops.flush(path, datasync, fd, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_fsync (signal, path, datasync, fd) {
|
||||
this.ops.fsync(path, datasync, fd, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_fsyncdir (signal, path, datasync, fd) {
|
||||
this.ops.fsyncdir(path, datasync, fd, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_truncate (signal, path, size) {
|
||||
this.ops.truncate(path, size, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_ftruncate (signal, path, size, fd) {
|
||||
this.ops.ftruncate(path, size, fd, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_readlink (signal, path) {
|
||||
this.ops.readlink(path, (err, linkname) => {
|
||||
return signal(err, linkname)
|
||||
})
|
||||
}
|
||||
|
||||
_chown (signal, path, uid, gid) {
|
||||
this.ops.chown(path, uid, gid, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_chmod (signal, path, mode) {
|
||||
this.ops.chmod(path, mode, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_mknod (signal, path, mode, dev) {
|
||||
this.ops.mknod(path, mode, dev, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_unlink (signal, path) {
|
||||
this.ops.unlink(path, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_rename (signal, src, dest, flags) {
|
||||
this.ops.rename(src, dest, flags, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_link (signal, src, dest) {
|
||||
this.ops.link(src, dest, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_symlink (signal, src, dest) {
|
||||
this.ops.symlink(src, dest, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_mkdir (signal, path, mode) {
|
||||
this.ops.mkdir(path, mode, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_rmdir (signal, path) {
|
||||
this.ops.rmdir(path, err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
_destroy (signal) {
|
||||
this.ops.destroy(err => {
|
||||
return signal(err)
|
||||
})
|
||||
}
|
||||
|
||||
// Public API
|
||||
|
Loading…
Reference in New Issue
Block a user