mirror of
https://github.com/osnr/TabFS.git
synced 2024-05-19 14:06:34 +02:00
checkpoint: starting work on truncate. more README stubs.
This commit is contained in:
parent
d21c9eace1
commit
bb0376c407
|
@ -64,6 +64,13 @@ $ cat mnt/tabs/by-id/*/text > text.txt
|
|||
|
||||
I do this
|
||||
|
||||
### TODO: Live edit
|
||||
|
||||
|
||||
|
||||
### TODO: Something with live view of variables
|
||||
|
||||
|
||||
## Setup
|
||||
|
||||
**disclaimer**: security, functionality, blah blah. applications may
|
||||
|
|
|
@ -142,15 +142,25 @@ const defineFile = (getData, setData) => ({
|
|||
st_size: toArray(await getData(path)).length
|
||||
};
|
||||
},
|
||||
|
||||
async open({path}) { return { fh: Cache.storeObject(toArray(await getData(path))) }; },
|
||||
async read({path, fh, size, offset}) {
|
||||
return { buf: String.fromCharCode(...Cache.getObjectForHandle(fh).slice(offset, offset + size)) }
|
||||
},
|
||||
async write({path, buf}) {
|
||||
// FIXME: patch
|
||||
// I guess caller should override write() if they want to actually
|
||||
// patch and not just re-set the whole string (for example,
|
||||
// if they want to hot-reload just one function the user modified)
|
||||
setData(path, buf); return { size: utf8(buf).length };
|
||||
},
|
||||
async release({fh}) { Cache.removeObjectForHandle(fh); return {}; }
|
||||
async release({fh}) { Cache.removeObjectForHandle(fh); return {}; },
|
||||
|
||||
async truncate({path, size}) {
|
||||
// TODO: weird case if they truncate while the file is open
|
||||
// (but `echo hi > foo.txt` uses O_TRUNC which doesn't do that)
|
||||
setData(path, (await getData(path)).truncate(size)); return {};
|
||||
}
|
||||
});
|
||||
|
||||
router["/tabs/by-id"] = {
|
||||
|
@ -169,12 +179,15 @@ router["/tabs/by-id"] = {
|
|||
// TODO: mem (?)
|
||||
// TODO: cpu (?)
|
||||
|
||||
// TODO: dom/ ?
|
||||
// TODO: globals/ ?
|
||||
|
||||
// screenshot.png (FIXME: how to keep from blocking when unfocused?)
|
||||
// TODO: archive.mhtml ?
|
||||
// TODO: printed.pdf
|
||||
// control
|
||||
// resources/
|
||||
// TODO: scripts/
|
||||
// TODO: scripts/ TODO: allow creation, eval immediately
|
||||
|
||||
(function() {
|
||||
const withTab = (readHandler, writeHandler) => defineFile(async path => {
|
||||
|
|
76
fs/tabfs.c
76
fs/tabfs.c
|
@ -105,31 +105,6 @@ tabfs_read(const char *path, char *buf, size_t size, off_t offset,
|
|||
memcpy(buf, scan_buf, scan_len < size ? scan_len : size); free(scan_buf);
|
||||
|
||||
return scan_len;
|
||||
|
||||
/* MAKE_REQ("read", { */
|
||||
/* cJSON_AddStringToObject(req, "path", path); */
|
||||
/* cJSON_AddNumberToObject(req, "size", size); */
|
||||
/* cJSON_AddNumberToObject(req, "offset", offset); */
|
||||
|
||||
/* cJSON_AddNumberToObject(req, "fh", fi->fh); */
|
||||
/* cJSON_AddNumberToObject(req, "flags", fi->flags); */
|
||||
/* }, { */
|
||||
/* cJSON *resp_buf_item = cJSON_GetObjectItemCaseSensitive(resp, "buf"); */
|
||||
/* if (!resp_buf_item) return -EIO; */
|
||||
|
||||
/* char *resp_buf = cJSON_GetStringValue(resp_buf_item); */
|
||||
/* if (!resp_buf) return -EIO; */
|
||||
/* size_t resp_buf_len = strlen(resp_buf); */
|
||||
|
||||
/* cJSON *base64_encoded_item = cJSON_GetObjectItemCaseSensitive(resp, "base64Encoded"); */
|
||||
/* if (base64_encoded_item && cJSON_IsTrue(base64_encoded_item)) { */
|
||||
/* size = base64_decode(resp_buf, resp_buf_len, (unsigned char *) buf); */
|
||||
/* } else { */
|
||||
/* size = resp_buf_len < size ? resp_buf_len : size; */
|
||||
/* memcpy(buf, resp_buf, size); */
|
||||
/* } */
|
||||
/* ret = size; */
|
||||
/* }); */
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -140,18 +115,6 @@ tabfs_write(const char *path, const char *buf, size_t size, off_t offset,
|
|||
"write", path, buf, size, offset, fi->fh, fi->flags);
|
||||
|
||||
int ret; receive_response("{size: %d}", &ret); return ret;
|
||||
|
||||
/* MAKE_REQ("write", { */
|
||||
/* cJSON_AddStringToObject(req, "path", path); */
|
||||
|
||||
/* char base64_buf[size + 1]; // ughh. */
|
||||
/* base64_encode((const unsigned char *) buf, size, base64_buf); */
|
||||
|
||||
/* cJSON_AddStringToObject(req, "buf", base64_buf); */
|
||||
/* cJSON_AddNumberToObject(req, "offset", offset); */
|
||||
/* }, { */
|
||||
/* ret = size; */
|
||||
/* }); */
|
||||
}
|
||||
|
||||
static int tabfs_release(const char *path, struct fuse_file_info *fi) {
|
||||
|
@ -159,15 +122,7 @@ static int tabfs_release(const char *path, struct fuse_file_info *fi) {
|
|||
"release", path, fi->fh);
|
||||
|
||||
receive_response("{}", NULL);
|
||||
|
||||
return 0;
|
||||
|
||||
/* MAKE_REQ("release", { */
|
||||
/* cJSON_AddStringToObject(req, "path", path); */
|
||||
/* cJSON_AddNumberToObject(req, "fh", fi->fh); */
|
||||
/* }, { */
|
||||
/* ret = 0; */
|
||||
/* }); */
|
||||
}
|
||||
|
||||
static int tabfs_opendir(const char *path, struct fuse_file_info *fi) {
|
||||
|
@ -175,18 +130,7 @@ static int tabfs_opendir(const char *path, struct fuse_file_info *fi) {
|
|||
"opendir", path, fi->flags);
|
||||
|
||||
receive_response("{fh: %d}", &fi->fh);
|
||||
|
||||
return 0;
|
||||
|
||||
/* MAKE_REQ("opendir", { */
|
||||
/* cJSON_AddStringToObject(req, "path", path); */
|
||||
/* cJSON_AddNumberToObject(req, "flags", fi->flags); */
|
||||
/* }, { */
|
||||
/* cJSON *fh_item = cJSON_GetObjectItemCaseSensitive(resp, "fh"); */
|
||||
/* if (fh_item) fi->fh = fh_item->valueint; */
|
||||
|
||||
/* ret = 0; */
|
||||
/* }); */
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -209,27 +153,26 @@ tabfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
tabfs_releasedir(const char *path, struct fuse_file_info *fi) {
|
||||
static int tabfs_releasedir(const char *path, struct fuse_file_info *fi) {
|
||||
send_request("{op: %Q, path: %Q, fh: %d}",
|
||||
"releasedir", path, fi->fh);
|
||||
|
||||
receive_response("{}", NULL);
|
||||
|
||||
return 0;
|
||||
/* MAKE_REQ("releasedir", { */
|
||||
/* cJSON_AddStringToObject(req, "path", path); */
|
||||
/* cJSON_AddNumberToObject(req, "fh", fi->fh); */
|
||||
/* }, { */
|
||||
/* ret = 0; */
|
||||
/* }); */
|
||||
}
|
||||
|
||||
static int tabfs_truncate(const char *path, off_t size) {
|
||||
send_request("{op: %Q, path: %Q, size: %d}",
|
||||
"truncate", path, size);
|
||||
|
||||
receive_response("{}", NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tabfs_unlink(const char *path) {
|
||||
send_request("{op: %Q, path: %Q}", "unlink", path);
|
||||
|
||||
receive_response("{}", NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -246,6 +189,7 @@ static struct fuse_operations tabfs_filesystem_operations = {
|
|||
.readdir = tabfs_readdir, /* To provide directory listing. */
|
||||
.releasedir = tabfs_releasedir,
|
||||
|
||||
.truncate = tabfs_truncate,
|
||||
.unlink = tabfs_unlink
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue