Index: .fossil-settings/ignore-glob ================================================================== --- .fossil-settings/ignore-glob +++ .fossil-settings/ignore-glob @@ -1,8 +1,12 @@ example.c.new example.c example.o example.so +example-client.o +example-client.so +example-server.o +example-server.so xvfs-core.o xvfs-create-standalone.new xvfs-create-standalone __test__.tcl Index: Makefile ================================================================== --- Makefile +++ Makefile @@ -2,11 +2,11 @@ CFLAGS := -fPIC -g3 -ggdb3 -Wall $(XVFS_ADD_CFLAGS) LDFLAGS := $(XVFS_ADD_LDFLAGS) LIBS := -ltclstub8.6 TCLSH := tclsh -all: example.so example-client-server.so +all: example.so example-client.so example-server.so example.c: $(shell find example -type f) $(shell find lib -type f) xvfs.c.rvt xvfs-create Makefile ./xvfs-create --directory example --name example > example.c.new mv example.c.new example.c @@ -17,29 +17,34 @@ $(CC) $(CFLAGS) $(LDFLAGS) -shared -o example.so example.o $(LIBS) example-client.o: example.c xvfs-core.h Makefile $(CC) $(CPPFLAGS) -DXVFS_MODE_FLEXIBLE $(CFLAGS) -o example-client.o -c example.c +example-client.so: example-client.o Makefile + $(CC) $(CFLAGS) $(LDFLAGS) -shared -o example-client.so example-client.o $(LIBS) + example-server.o: xvfs-core.h xvfs-core.c Makefile $(CC) $(CPPFLAGS) -DXVFS_MODE_SERVER $(CFLAGS) -o example-server.o -c xvfs-core.c -example-client-server.so: example-client.o example-server.o Makefile - $(CC) $(CFLAGS) $(LDFLAGS) -shared -o example-client-server.so example-client.o example-server.o $(LIBS) +example-server.so: example-server.o Makefile + $(CC) $(CFLAGS) $(LDFLAGS) -shared -o example-server.so example-server.o $(LIBS) # xvfs-create-standalone is a standalone (i.e., no external dependencies # like lib/minirivet, xvfs-core.c, etc) version of "xvfs-create" xvfs-create-standalone: $(shell find lib -type f) xvfs-create xvfs-core.c xvfs-core.h xvfs.c.rvt Makefile rm -f xvfs-create-standalone.new xvfs-create-standalone ./xvfs-create --dump-tcl --remove-debug > xvfs-create-standalone.new chmod +x xvfs-create-standalone.new mv xvfs-create-standalone.new xvfs-create-standalone -test: example.so example-client-server.so Makefile +test: example.so example-server.so example-client.so Makefile + rm -f __test__.tcl + echo 'if {[catch { load ./example.so Xvfs_example; source //xvfs:/example/main.tcl }]} { puts stderr $$::errorInfo; exit 1 }; exit 0' > __test__.tcl + $(GDB) $(TCLSH) __test__.tcl $(TCL_TEST_ARGS) rm -f __test__.tcl - echo 'if {[catch { load $$::env(XVFS_SHARED_OBJECT) Xvfs_example; source //xvfs:/example/main.tcl }]} { puts stderr $$::errorInfo; exit 1 }; exit 0' > __test__.tcl - XVFS_SHARED_OBJECT=./example.so $(GDB) $(TCLSH) __test__.tcl $(TCL_TEST_ARGS) - XVFS_SHARED_OBJECT=./example-client-server.so $(GDB) $(TCLSH) __test__.tcl $(TCL_TEST_ARGS) + echo 'if {[catch { load ./example-server.so Xvfs; load ./example-client.so Xvfs_example; source //xvfs:/example/main.tcl }]} { puts stderr $$::errorInfo; exit 1 }; exit 0' > __test__.tcl + $(GDB) $(TCLSH) __test__.tcl $(TCL_TEST_ARGS) rm -f __test__.tcl coverage: $(MAKE) clean $(MAKE) example.so XVFS_ADD_CFLAGS=-coverage XVFS_ADD_LDFLAGS=-coverage @@ -53,14 +58,15 @@ clean: rm -f xvfs-create-standalone.new xvfs-create-standalone rm -f example.c example.c.new rm -f example.so example.o - rm -f example-client.o example-server.o example-client-server.so + rm -f example-client.o example-server.o + rm -f example-client.so example-server.so rm -f example.gcda example.gcno rm -f __test__.tcl rm -f xvfs-test-coverage.info rm -rf xvfs-test-coverage distclean: clean .PHONY: all clean distclean test coverage Index: xvfs-core.c ================================================================== --- xvfs-core.c +++ xvfs-core.c @@ -986,11 +986,11 @@ #if defined(XVFS_MODE_SERVER) static Tcl_Filesystem xvfs_tclfs_dispatch_fs; static Tcl_HashTable xvfs_tclfs_dispatch_map; static struct xvfs_tclfs_server_info xvfs_tclfs_dispatch_fsdata; -static int xvfs_tclfs_dispatch_pathInFilesystem(Tcl_Obj *path, ClientData *dataPtr) { +static int xvfs_tclfs_dispatch_pathInFS(Tcl_Obj *path, ClientData *dataPtr) { const char *pathStr, *rootStr; int pathLen, rootLen; XVFS_DEBUG_ENTER; @@ -1026,11 +1026,11 @@ int rootLen; char *pathStr, *fsName, *fsNameEnds, origSep; XVFS_DEBUG_ENTER; - if (xvfs_tclfs_dispatch_pathInFilesystem(path, NULL) != TCL_OK) { + if (xvfs_tclfs_dispatch_pathInFS(path, NULL) != TCL_OK) { XVFS_DEBUG_LEAVE; return(NULL); } @@ -1112,10 +1112,19 @@ } int Xvfs_Init(Tcl_Interp *interp) { static int registered = 0; int tclRet; + +#ifdef USE_TCL_STUBS + const char *tclInitStubs_ret; + /* Initialize Stubs */ + tclInitStubs_ret = Tcl_InitStubs(interp, TCL_PATCH_LEVEL, 0); + if (!tclInitStubs_ret) { + return(TCL_ERROR); + } +#endif /* XXX:TODO: Make this thread-safe */ if (registered) { return(TCL_OK); } @@ -1122,11 +1131,11 @@ registered = 1; xvfs_tclfs_dispatch_fs.typeName = "xvfsDispatch"; xvfs_tclfs_dispatch_fs.structureLength = sizeof(xvfs_tclfs_dispatch_fs); xvfs_tclfs_dispatch_fs.version = TCL_FILESYSTEM_VERSION_1; - xvfs_tclfs_dispatch_fs.pathInFilesystemProc = xvfs_tclfs_dispatch_pathInFilesystem; + xvfs_tclfs_dispatch_fs.pathInFilesystemProc = xvfs_tclfs_dispatch_pathInFS; xvfs_tclfs_dispatch_fs.dupInternalRepProc = NULL; xvfs_tclfs_dispatch_fs.freeInternalRepProc = NULL; xvfs_tclfs_dispatch_fs.internalToNormalizedProc = NULL; xvfs_tclfs_dispatch_fs.createInternalRepProc = NULL; xvfs_tclfs_dispatch_fs.normalizePathProc = NULL;