00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00077 #include <errno.h>
00078 #include <sys/device.h>
00079 #include <string.h>
00080
00081 #include <fs/fs.h>
00082 #include <unistd.h>
00083 #include <sys/stat.h>
00084
00089
00090 static int PathOperation(CONST char *path, int opcode)
00091 {
00092 NUTDEVICE *dev;
00093 char dev_name[9];
00094 uint8_t nidx;
00095 CONST char *nptr = path;
00096
00097
00098
00099
00100 for (nidx = 0; *nptr && *nptr != ':' && nidx < 8; nidx++) {
00101 dev_name[nidx] = *nptr++;
00102 }
00103 dev_name[nidx] = 0;
00104 nptr++;
00105
00106
00107
00108
00109
00110 if ((dev = NutDeviceLookup(dev_name)) == 0) {
00111 errno = ENOENT;
00112 return -1;
00113 }
00114 return (*dev->dev_ioctl) (dev, opcode, (void *) nptr);
00115 }
00116
00131 int access(CONST char *path, int what)
00132 {
00133 struct stat s;
00134
00135 if (stat(path, &s)) {
00136 return -1;
00137 }
00138 return 0;
00139 }
00140
00150 long lseek(int fh, long pos, int whence)
00151 {
00152
00153
00154
00155
00156
00157
00158 return -1;
00159 }
00160
00170 int rmdir(CONST char *path)
00171 {
00172 return PathOperation(path, FS_DIR_REMOVE);
00173 }
00174
00180 int unlink(CONST char *path)
00181 {
00182 return PathOperation(path, FS_FILE_DELETE);
00183 }
00184
00185
00191 int stat(CONST char *path, struct stat *s)
00192 {
00193 NUTDEVICE *dev;
00194 char dev_name[9];
00195 uint8_t nidx;
00196 CONST char *nptr = path;
00197 FSCP_STATUS parms;
00198
00199
00200 for (nidx = 0; *nptr && *nptr != ':' && nidx < 8; nidx++) {
00201 dev_name[nidx] = *nptr++;
00202 }
00203 dev_name[nidx] = 0;
00204
00205
00206 if ((dev = NutDeviceLookup(dev_name)) != 0) {
00207 if (*nptr == ':') {
00208 nptr++;
00209 }
00210 parms.par_path = nptr;
00211 parms.par_stp = s;
00212 return (*dev->dev_ioctl) (dev, FS_STATUS, (void *) &parms);
00213 }
00214 return -1;
00215 }
00216
00222 int fstat(int fh, struct stat *s)
00223 {
00224 return -1;
00225 }
00226
00232 int mkdir(CONST char *path, int mode)
00233 {
00234 return PathOperation(path, FS_DIR_CREATE);
00235 }
00236
00249 int rename(CONST char *old_name, CONST char *new_name)
00250 {
00251 int rc = -1;
00252 NUTDEVICE *dev;
00253 char old_devname[9];
00254 char new_devname[9];
00255 uint8_t nidx;
00256 CONST char *nptr;
00257 FSCP_RENAME parms;
00258
00259
00260 nptr = old_name;
00261 for (nidx = 0; *nptr && *nptr != ':' && nidx < 8; nidx++, nptr++) {
00262 old_devname[nidx] = *nptr;
00263 }
00264 old_devname[nidx] = 0;
00265
00266
00267 if (*nptr++ == ':') {
00268
00269 parms.par_old = nptr;
00270
00271
00272 nptr = new_name;
00273
00274 for (nidx = 0; *nptr && *nptr != ':' && nidx < 8; nidx++, nptr++) {
00275 new_devname[nidx] = *nptr;
00276 }
00277 new_devname[nidx] = 0;
00278
00279
00280 if (*nptr++ == ':') {
00281
00282 parms.par_new = nptr;
00283
00284
00285 if (strcmp(new_devname, old_devname) == 0) {
00286
00287 if ((dev = NutDeviceLookup(old_devname)) == 0) {
00288 errno = ENOENT;
00289 } else {
00290 rc = (*dev->dev_ioctl) (dev, FS_RENAME, (void *) &parms);
00291 }
00292 }
00293 }
00294 }
00295 return rc;
00296 }
00297