69e476dcd5 2019-05-02 rkeene: #include <xvfs-core.h>
69e476dcd5 2019-05-02 rkeene: #include <tcl.h>
69e476dcd5 2019-05-02 rkeene:
e5b6962adf 2019-05-02 rkeene: static int xvfs_tclvfs_standalone_pathInFilesystem(Tcl_Obj *path, ClientData *dataPtr) {
e5b6962adf 2019-05-02 rkeene: return(TCL_ERROR);
e5b6962adf 2019-05-02 rkeene: }
e5b6962adf 2019-05-02 rkeene:
e5b6962adf 2019-05-02 rkeene: static int xvfs_tclvfs_normalizePath(Tcl_Interp *interp, Tcl_Obj *path, int nextCheckpoint) {
e5b6962adf 2019-05-02 rkeene: return(TCL_ERROR);
e5b6962adf 2019-05-02 rkeene: }
e5b6962adf 2019-05-02 rkeene:
e5b6962adf 2019-05-02 rkeene: static Tcl_Obj *xvfs_tclvfs_listVolumes() {
e5b6962adf 2019-05-02 rkeene: return(NULL);
e5b6962adf 2019-05-02 rkeene: }
e5b6962adf 2019-05-02 rkeene:
32b55a907b 2019-05-02 rkeene: /*
32b55a907b 2019-05-02 rkeene: * There are three (3) modes of operation for Xvfs_Register:
32b55a907b 2019-05-02 rkeene: * 1. standalone -- We register our own Tcl_Filesystem
32b55a907b 2019-05-02 rkeene: * and handle requests under `//xvfs:/<fsName>`
32b55a907b 2019-05-02 rkeene: * 2. client -- A single Tcl_Filesystem is registered for the
32b55a907b 2019-05-02 rkeene: * interp to handle requests under `//xvfs:/` which
32b55a907b 2019-05-02 rkeene: * then dispatches to the appropriate registered
32b55a907b 2019-05-02 rkeene: * handler
32b55a907b 2019-05-02 rkeene: * 3. flexible -- Attempts to find a core Xvfs instance for the
32b55a907b 2019-05-02 rkeene: * process at runtime, if found do #2, otherwise
32b55a907b 2019-05-02 rkeene: * fallback to #1
32b55a907b 2019-05-02 rkeene: *
32b55a907b 2019-05-02 rkeene: */
e5b6962adf 2019-05-02 rkeene: static int xvfs_standalone_register(Tcl_Interp *interp, struct Xvfs_FSInfo *fsInfo) {
e5b6962adf 2019-05-02 rkeene: Tcl_Filesystem *xvfsInfo;
e5b6962adf 2019-05-02 rkeene: int tcl_ret;
e5b6962adf 2019-05-02 rkeene:
e5b6962adf 2019-05-02 rkeene: /*
e5b6962adf 2019-05-02 rkeene: * In standalone mode, we only support the same protocol we are
e5b6962adf 2019-05-02 rkeene: * compiling for.
e5b6962adf 2019-05-02 rkeene: */
e5b6962adf 2019-05-02 rkeene: if (fsInfo->protocolVersion != XVFS_PROTOCOL_VERSION) {
e5b6962adf 2019-05-02 rkeene: if (interp) {
e5b6962adf 2019-05-02 rkeene: Tcl_SetResult(interp, "Protocol mismatch", NULL);
e5b6962adf 2019-05-02 rkeene: }
e5b6962adf 2019-05-02 rkeene: return(TCL_ERROR);
e5b6962adf 2019-05-02 rkeene: }
e5b6962adf 2019-05-02 rkeene:
e5b6962adf 2019-05-02 rkeene: xvfsInfo = (Tcl_Filesystem *) Tcl_AttemptAlloc(sizeof(*xvfsInfo));
e5b6962adf 2019-05-02 rkeene: if (!xvfsInfo) {
e5b6962adf 2019-05-02 rkeene: if (interp) {
e5b6962adf 2019-05-02 rkeene: Tcl_SetResult(interp, "Unable to allocate Tcl_Filesystem object", NULL);
e5b6962adf 2019-05-02 rkeene: }
e5b6962adf 2019-05-02 rkeene: return(TCL_ERROR);
e5b6962adf 2019-05-02 rkeene: }
e5b6962adf 2019-05-02 rkeene:
e5b6962adf 2019-05-02 rkeene: xvfsInfo->typeName = "xvfs";
e5b6962adf 2019-05-02 rkeene: xvfsInfo->structureLength = sizeof(*xvfsInfo);
e5b6962adf 2019-05-02 rkeene: xvfsInfo->version = TCL_FILESYSTEM_VERSION_1;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->pathInFilesystemProc = xvfs_tclvfs_standalone_pathInFilesystem;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->dupInternalRepProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->freeInternalRepProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->internalToNormalizedProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->createInternalRepProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->normalizePathProc = xvfs_tclvfs_normalizePath;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->filesystemPathTypeProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->filesystemSeparatorProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->statProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->accessProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->openFileChannelProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->matchInDirectoryProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->utimeProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->linkProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->listVolumesProc = xvfs_tclvfs_listVolumes;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->fileAttrStringsProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->fileAttrsGetProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->fileAttrsSetProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->createDirectoryProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->removeDirectoryProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->deleteFileProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->copyFileProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->renameFileProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->copyDirectoryProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->lstatProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->loadFileProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->getCwdProc = NULL;
e5b6962adf 2019-05-02 rkeene: xvfsInfo->chdirProc = NULL;
e5b6962adf 2019-05-02 rkeene:
e5b6962adf 2019-05-02 rkeene: tcl_ret = Tcl_FSRegister(NULL, xvfsInfo);
e5b6962adf 2019-05-02 rkeene: if (tcl_ret != TCL_OK) {
e5b6962adf 2019-05-02 rkeene: if (interp) {
e5b6962adf 2019-05-02 rkeene: Tcl_SetResult(interp, "Tcl_FSRegister() failed", NULL);
e5b6962adf 2019-05-02 rkeene: }
e5b6962adf 2019-05-02 rkeene:
e5b6962adf 2019-05-02 rkeene: return(tcl_ret);
e5b6962adf 2019-05-02 rkeene: }
e5b6962adf 2019-05-02 rkeene:
e5b6962adf 2019-05-02 rkeene: return(TCL_OK);
32b55a907b 2019-05-02 rkeene: }
32b55a907b 2019-05-02 rkeene:
e5b6962adf 2019-05-02 rkeene: int Xvfs_Register(Tcl_Interp *interp, struct Xvfs_FSInfo *fsInfo) {
e5b6962adf 2019-05-02 rkeene: return(xvfs_standalone_register(interp, fsInfo));
69e476dcd5 2019-05-02 rkeene: }