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
00073 #include <errno.h>
00074 #include <sys/device.h>
00075 #include <string.h>
00076
00077 #include <fs/fs.h>
00078 #include <unistd.h>
00079 #include <sys/stat.h>
00080
00085
00086 static int PathOperation(CONST char *path, int opcode)
00087 {
00088 NUTDEVICE *dev;
00089 char dev_name[9];
00090 uint8_t nidx;
00091 CONST char *nptr = path;
00092
00093
00094
00095
00096 for (nidx = 0; *nptr && *nptr != ':' && nidx < 8; nidx++) {
00097 dev_name[nidx] = *nptr++;
00098 }
00099 dev_name[nidx] = 0;
00100 nptr++;
00101
00102
00103
00104
00105
00106 if ((dev = NutDeviceLookup(dev_name)) == 0) {
00107 errno = ENOENT;
00108 return -1;
00109 }
00110 return (*dev->dev_ioctl) (dev, opcode, (void *) nptr);
00111 }
00112
00127 int access(CONST char *path, int what)
00128 {
00129 struct stat s;
00130
00131 if (stat(path, &s)) {
00132 return -1;
00133 }
00134 return 0;
00135 }
00136
00146 long lseek(int fh, long pos, int whence)
00147 {
00148
00149
00150
00151
00152
00153
00154 return -1;
00155 }
00156
00166 int rmdir(CONST char *path)
00167 {
00168 return PathOperation(path, FS_DIR_REMOVE);
00169 }
00170
00176 int unlink(CONST char *path)
00177 {
00178 return PathOperation(path, FS_FILE_DELETE);
00179 }
00180
00181
00187 int stat(CONST char *path, struct stat *s)
00188 {
00189 NUTDEVICE *dev;
00190 char dev_name[9];
00191 uint8_t nidx;
00192 CONST char *nptr = path;
00193 FSCP_STATUS parms;
00194
00195
00196 for (nidx = 0; *nptr && *nptr != ':' && nidx < 8; nidx++) {
00197 dev_name[nidx] = *nptr++;
00198 }
00199 dev_name[nidx] = 0;
00200
00201
00202 if ((dev = NutDeviceLookup(dev_name)) != 0) {
00203 if (*nptr == ':') {
00204 nptr++;
00205 }
00206 parms.par_path = nptr;
00207 parms.par_stp = s;
00208 return (*dev->dev_ioctl) (dev, FS_STATUS, (void *) &parms);
00209 }
00210 return -1;
00211 }
00212
00218 int fstat(int fh, struct stat *s)
00219 {
00220 return -1;
00221 }
00222
00228 int mkdir(CONST char *path, int mode)
00229 {
00230 return PathOperation(path, FS_DIR_CREATE);
00231 }
00232
00245 int rename(CONST char *old_name, CONST char *new_name)
00246 {
00247 int rc = -1;
00248 NUTDEVICE *dev;
00249 char old_devname[9];
00250 char new_devname[9];
00251 uint8_t nidx;
00252 CONST char *nptr;
00253 FSCP_RENAME parms;
00254
00255
00256 nptr = old_name;
00257 for (nidx = 0; *nptr && *nptr != ':' && nidx < 8; nidx++, nptr++) {
00258 old_devname[nidx] = *nptr;
00259 }
00260 old_devname[nidx] = 0;
00261
00262
00263 if (*nptr++ == ':') {
00264
00265 parms.par_old = nptr;
00266
00267
00268 nptr = new_name;
00269
00270 for (nidx = 0; *nptr && *nptr != ':' && nidx < 8; nidx++, nptr++) {
00271 new_devname[nidx] = *nptr;
00272 }
00273 new_devname[nidx] = 0;
00274
00275
00276 if (*nptr++ == ':') {
00277
00278 parms.par_new = nptr;
00279
00280
00281 if (strcmp(new_devname, old_devname) == 0) {
00282
00283 if ((dev = NutDeviceLookup(old_devname)) == 0) {
00284 errno = ENOENT;
00285 } else {
00286 rc = (*dev->dev_ioctl) (dev, FS_RENAME, (void *) &parms);
00287 }
00288 }
00289 }
00290 }
00291 return rc;
00292 }
00293