45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
/* XXX:TODO: Should this use the native OS path separator ? */
if (pathStr[rootLen] != '/') {
return(NULL);
}
return(pathStr + rootLen + 1);
}
static const char *xvfs_perror(int xvfs_error) {
if (xvfs_error >= 0) {
return("Not an error");
}
switch (xvfs_error) {
case XVFS_RV_ERR_ENOENT:
return("No such file or directory");
case XVFS_RV_ERR_EINVAL:
return("Invalid argument");
case XVFS_RV_ERR_EISDIR:
return("Is a directory");
case XVFS_RV_ERR_ENOTDIR:
return("Not a directory");
case XVFS_RV_ERR_EFAULT:
return("Bad address");
default:
return("Unknown error");
}
}
/*
* Internal Tcl_Filesystem functions, with the appropriate instance info
*/
static int xvfs_tclfs_pathInFilesystem(Tcl_Obj *path, ClientData *dataPtr, struct xvfs_tclfs_instance_info *instanceInfo) {
const char *relativePath;
|
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
+
+
+
+
+
+
|
static int xvfs_tclfs_stat(Tcl_Obj *path, Tcl_StatBuf *statBuf, struct xvfs_tclfs_instance_info *instanceInfo) {
const char *pathStr;
int retval;
pathStr = xvfs_relativePath(path, instanceInfo);
retval = instanceInfo->fsInfo->getStatProc(pathStr, statBuf);
if (retval < 0) {
retval = -1;
}
return(retval);
}
static Tcl_Obj *xvfs_tclfs_listVolumes(struct xvfs_tclfs_instance_info *instanceInfo) {
return(NULL);
}
static Tcl_Channel xvfs_tclfs_openFileChannel(Tcl_Interp *interp, Tcl_Obj *path, int mode, int permissions, struct xvfs_tclfs_instance_info *instanceInfo) {
const char *pathStr;
Tcl_WideInt length;
const char *data;
pathStr = xvfs_relativePath(path, instanceInfo);
/*
* XXX:TODO: Do something to create the Tcl_Channel we
* need to return here
*/
return(NULL);
}
|