diff --git a/README.md b/README.md index 77d99b1..1a90a2f 100644 --- a/README.md +++ b/README.md @@ -5,41 +5,33 @@ You need to both install the Chrome extension and run the native filesystem. +### Run the C filesystem + +First, make sure you `git submodule update --init` to get the +`fs/cJSON` and `fs/base64` dependencies. + +And make sure you have FUSE. On Linux, for example, `sudo apt install +libfuse-dev`. On macOS, get FUSE for macOS. + +``` +$ cd fs +$ mkdir mnt +$ make +``` + ### Install the Chrome extension Go to the [Chrome extensions page](chrome://extensions). Enable Developer mode. Load-unpacked the `extension/` folder in this repo. -### Run the C filesystem - -First, make sure you `git submodule update --init` to get the `mmx` -and `cJSON` dependencies. And make sure you have FUSE. - -``` -$ cd fs -$ mkdir mnt -$ make [unmount] mount -``` - -### Connect the browser extension to the filesystem - -Once the filesystem is running and awaiting a WebSocket connection, -you need to tell the browser extension to connect to it. - -Click the 'T' icon the extension put in your browser toolbar. The icon -badge should change from red to blue, and the filesystem program -should print that it's connected in the terminal. - Now your browser tabs should be mounted in `fs/mnt`! ## Design - `extension/`: Browser extension, written in JS - `fs/`: Native FUSE filesystem, written in C - - `tabfs.c`: Main thread. Talks to FUSE, implements fs operations. - - `ws.c`: Side thread. Runs WebSocket server. Talks to browser. - - `common.c`: Communications interface between tabfs and ws. + - `tabfs.c`: Talks to FUSE, implements fs operations, talks to browser. When you, say, `cat` a file in the tab filesystem: @@ -51,18 +43,14 @@ When you, say, `cat` a file in the tab filesystem: userspace filesystem in `fs/tabfs.c`, 4. then `tabfs_read` rephrases the request as a JSON string and - forwards it using `common_send_tabfs_to_ws` to `fs/ws.c`, - -5. and `fs/ws.c` forwards it to our browser extension over WebSocket - connection; + forwards it to the browser extension over 'native messaging', 6. our browser extension in `extension/background.js` handles the incoming message and calls the browser APIs to construct the data for that synthetic file; -7. then the data gets sent back in a JSON message to `ws.c` and then - back to `tabfs.c` and finally back to FUSE and the kernel and - `cat`. +7. then the data gets sent back in a JSON native message to `tabfs.c` + and and finally back to FUSE and the kernel and `cat`. (very little actual work happened here, tbh. it's all just marshalling) diff --git a/fs/Makefile b/fs/Makefile index f393c20..e3b6477 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -4,24 +4,21 @@ TARGETS = tabfs OSXFUSE_ROOT = /usr/local #OSXFUSE_ROOT = /opt/local -INCLUDE_DIR = $(OSXFUSE_ROOT)/include/osxfuse/fuse -LIBRARY_DIR = $(OSXFUSE_ROOT)/lib +CFLAGS_EXTRA = -DFUSE_USE_VERSION=26 -D_FILE_OFFSET_BITS=64 -Wall -Wno-unused-function -g -CC ?= gcc - -CFLAGS_OSXFUSE = -I$(INCLUDE_DIR) -L$(LIBRARY_DIR) -CFLAGS_OSXFUSE += -DFUSE_USE_VERSION=26 -CFLAGS_OSXFUSE += -D_FILE_OFFSET_BITS=64 -CFLAGS_OSXFUSE += -D_DARWIN_USE_64_BIT_INODE - -CFLAGS_EXTRA = -Wall -Wno-unused-function -g $(CFLAGS) - -LIBS = -losxfuse +ifeq ($(shell uname -s),Linux) + CFLAGS = $(CFLAGS_EXTRA) + LIBS = -lfuse +endif +ifeq ($(shell uname -s),Darwin) + CFLAGS = -I$(OSXFUSE_ROOT)/include/osxfuse/fuse -L$(OSXFUSE_ROOT)/lib -D_DARWIN_USE_64_BIT_INODE $(CFLAGS_EXTRA) + LIBS = -losxfuse +endif all: $(TARGETS) tabfs: tabfs.c - $(CC) $(CFLAGS_OSXFUSE) $(CFLAGS_EXTRA) -o $@ $^ $(LIBS) + cc $(CFLAGS) -o $@ $^ $(LIBS) clean: rm -f $(TARGETS) *.o @@ -30,9 +27,3 @@ clean: unmount: killall -9 tabfs || true diskutil unmount force mnt || true - -mount: tabfs - ./tabfs -odirect_io -s -f mnt - -debugmount: tabfs - lldb -- ./tabfs -odirect_io -s -f mnt