3e44e1def1 2019-05-02 1: #ifndef XVFS_CORE_H_1B4B28D60EBAA11D5FF85642FA7CA22C29E8E817
3e44e1def1 2019-05-02 2: #define XVFS_CORE_H_1B4B28D60EBAA11D5FF85642FA7CA22C29E8E817 1
f74a2e47ab 2019-05-02 3:
f74a2e47ab 2019-05-02 4: #include <tcl.h>
1ecab39ce5 2019-05-02 5:
1ecab39ce5 2019-05-02 6: #define XVFS_PROTOCOL_VERSION 1
d92ba3d36d 2019-05-08 7:
142a373444 2020-04-13 8: typedef const char **(*xvfs_proc_getChildren_t)(const char *path, long inode, Tcl_WideInt *count);
142a373444 2020-04-13 9: typedef const unsigned char *(*xvfs_proc_getData_t)(const char *path, long inode, Tcl_WideInt start, Tcl_WideInt *length);
142a373444 2020-04-13 10: typedef int (*xvfs_proc_getStat_t)(const char *path, long inode, Tcl_StatBuf *statBuf);
e5b6962adf 2019-05-02 11:
149aa89b7d 2019-09-13 12: /*
149aa89b7d 2019-09-13 13: * Interface for the filesystem to fill out before registering.
149aa89b7d 2019-09-13 14: * The protocolVersion is provided first so that if this
149aa89b7d 2019-09-13 15: * needs to change over time it can be appropriately handled.
149aa89b7d 2019-09-13 16: */
e5b6962adf 2019-05-02 17: struct Xvfs_FSInfo {
e5b6962adf 2019-05-02 18: int protocolVersion;
d121970301 2019-05-02 19: const char *name;
e5b6962adf 2019-05-02 20: xvfs_proc_getChildren_t getChildrenProc;
e5b6962adf 2019-05-02 21: xvfs_proc_getData_t getDataProc;
daf25f5222 2019-05-03 22: xvfs_proc_getStat_t getStatProc;
e5b6962adf 2019-05-02 23: };
149aa89b7d 2019-09-13 24:
149aa89b7d 2019-09-13 25: /*
149aa89b7d 2019-09-13 26: * Error codes for various calls. This is part of the ABI and must
149aa89b7d 2019-09-13 27: * not be changed.
149aa89b7d 2019-09-13 28: */
149aa89b7d 2019-09-13 29: #define XVFS_RV_ERR_ENOENT (-8192)
149aa89b7d 2019-09-13 30: #define XVFS_RV_ERR_EINVAL (-8193)
149aa89b7d 2019-09-13 31: #define XVFS_RV_ERR_EISDIR (-8194)
149aa89b7d 2019-09-13 32: #define XVFS_RV_ERR_ENOTDIR (-8195)
149aa89b7d 2019-09-13 33: #define XVFS_RV_ERR_EFAULT (-8196)
10f67b2ced 2019-09-16 34: #define XVFS_RV_ERR_EROFS (-8197)
5583d77f1c 2019-09-14 35: #define XVFS_RV_ERR_INTERNAL (-16383)
142a373444 2020-04-13 36:
142a373444 2020-04-13 37: /*
142a373444 2020-04-13 38: * Functions allow user to specify either a path or a inode.
142a373444 2020-04-13 39: * If a path is specified, the inode must be specified as
142a373444 2020-04-13 40: * XVFS_INODE_NULL.
142a373444 2020-04-13 41: */
142a373444 2020-04-13 42: #define XVFS_INODE_NULL (-1)
3e44e1def1 2019-05-02 43:
3e44e1def1 2019-05-02 44: #define XVFS_REGISTER_INTERFACE(name) int name(Tcl_Interp *interp, struct Xvfs_FSInfo *fsInfo);
3e44e1def1 2019-05-02 45:
3e44e1def1 2019-05-02 46: #if defined(XVFS_MODE_STANDALONE)
3e44e1def1 2019-05-02 47: /*
3e44e1def1 2019-05-02 48: * In standalone mode, we just redefine calls to
3e44e1def1 2019-05-02 49: * Xvfs_Register() to go to the xvfs_standalone_register()
3e44e1def1 2019-05-02 50: * function
3e44e1def1 2019-05-02 51: */
3e44e1def1 2019-05-02 52: # define Xvfs_Register xvfs_standalone_register
b8cca3a6b4 2019-05-08 53: static XVFS_REGISTER_INTERFACE(Xvfs_Register)
3e44e1def1 2019-05-02 54:
3e44e1def1 2019-05-02 55: #elif defined(XVFS_MODE_FLEXIBLE)
3e44e1def1 2019-05-02 56: /*
b8cca3a6b4 2019-05-08 57: * In flexible mode, we just redefine calls to
b8cca3a6b4 2019-05-08 58: * Xvfs_Register() to go to the xvfs_flexible_register()
b8cca3a6b4 2019-05-08 59: * function which will either dispatch to a common
b8cca3a6b4 2019-05-08 60: * core XVFS or use the xvfs_standalone_register()
b8cca3a6b4 2019-05-08 61: * function as a standalone would.
3e44e1def1 2019-05-02 62: */
3e44e1def1 2019-05-02 63: # define Xvfs_Register xvfs_flexible_register
b8cca3a6b4 2019-05-08 64: static XVFS_REGISTER_INTERFACE(Xvfs_Register)
3e44e1def1 2019-05-02 65:
3e44e1def1 2019-05-02 66: #elif defined(XVFS_MODE_CLIENT)
3e44e1def1 2019-05-02 67: /*
3e44e1def1 2019-05-02 68: * In client mode we declare an external symbol named
3e44e1def1 2019-05-02 69: * Xvfs_Register() that must be provided by the environment
3e44e1def1 2019-05-02 70: * we are loaded into
3e44e1def1 2019-05-02 71: */
3e44e1def1 2019-05-02 72: extern XVFS_REGISTER_INTERFACE(Xvfs_Register)
3e44e1def1 2019-05-02 73:
3e44e1def1 2019-05-02 74: #elif defined(XVFS_MODE_SERVER)
3e44e1def1 2019-05-02 75: /*
3e44e1def1 2019-05-02 76: * In server mode we are going to implementing Xvfs_Register()
3e44e1def1 2019-05-02 77: * for flexible/client modes, just forward declare it
3e44e1def1 2019-05-02 78: */
3e44e1def1 2019-05-02 79: XVFS_REGISTER_INTERFACE(Xvfs_Register)
f1d16a3958 2019-09-17 80: int Xvfs_Init(Tcl_Interp *interp);
3e44e1def1 2019-05-02 81:
3e44e1def1 2019-05-02 82: #else
3e44e1def1 2019-05-02 83: # error Unsupported XVFS_MODE
acfc5037c6 2019-05-02 84: #endif
5f2895faba 2019-09-17 85: #undef XVFS_REGISTER_INTERFACE
acfc5037c6 2019-05-02 86:
b8cca3a6b4 2019-05-08 87: /*
b8cca3a6b4 2019-05-08 88: * In flexible or standalone mode, directly include what
b8cca3a6b4 2019-05-08 89: * would otherwise be a separate translation unit, to
b8cca3a6b4 2019-05-08 90: * avoid symbols leaking
b8cca3a6b4 2019-05-08 91: */
b8cca3a6b4 2019-05-08 92: #if defined(XVFS_MODE_FLEXIBLE) || defined(XVFS_MODE_STANDALONE)
b8cca3a6b4 2019-05-08 93: #include <xvfs-core.c>
b8cca3a6b4 2019-05-08 94: #endif
1ecab39ce5 2019-05-02 95:
1ecab39ce5 2019-05-02 96: #endif