int frename (const char *oldname, const char *newname) { /* Rename a file from 'oldname' to 'newname'. */ IOB *fcb; int handle; int drv2; int i; char newname_w_path[81]; START_LOCK (int); /* Find an unused _iob structure. */ if ((handle = fs_find_iob ()) == EOF) { RETURN (1); } fcb = &_iob[handle]; fcb->drive = fs_get_drive (oldname); if (fcb->drive != DRV_NONE) { /* Skip drive letter 'X:' */ oldname += 2; } else { fcb->drive = _DEF_DRIVE; } drv2 = fs_get_drive (newname); if (drv2 != DRV_NONE) { newname += 2; if (drv2 != fcb->drive) { /* If provided, both drives must be the same. */ RETURN (1); } } if (fcb->drive == DRV_MCARD) { /* Find path part of old name. */ for (i = (strlen(oldname) - 1); i >= 0; i --) { if (oldname[i] == '\\') { break; } } if (i) { /* If path exists, add path to new name to search if it exists. */ memcpy(newname_w_path, oldname, i + 1); newname_w_path[i+1] = 0; strcat(newname_w_path, newname); } else { memcpy(newname_w_path, newname, strlen(newname)); } /* Rename a file located on Flash Memory Card. */ if (fat_find_file (newname_w_path, fcb) == __TRUE) { /* File with 'newname' already exists */ RETURN (1); } if (fat_rename (oldname, newname, fcb) == __TRUE) { RETURN (0); } RETURN (1); } /* Set drive parameters. */ if (fs_set_params (fcb) == __FALSE) { RETURN (1); } if (fs_Find_File (newname, fcb) == 0) { /* File with 'newname' already exists */ RETURN (1); } if (fs_Find_File (oldname, fcb) == 0) { RETURN (_frename (newname, fcb)); } /* File with 'oldname' not found */ RETURN (1); END_LOCK; }
int fat_request(DWORD Function, void *Params) { int Res; switch (Function) { case FD32_READ: { fd32_read_t *X = (fd32_read_t *) Params; tFile *F; if (X->Size < sizeof(fd32_read_t)) return EINVAL; F = (tFile *) X->DeviceId; if (F->FilSig != FAT_FILSIG) return EBADF; #ifdef FATREMOVABLE if ((Res = fat_mediachange(F->V)) < 0) return Res; #endif return fat_read(F, X->Buffer, X->BufferBytes); } case FD32_WRITE: { #ifdef FATWRITE fd32_write_t *X = (fd32_write_t *) Params; tFile *F; if (X->Size < sizeof(fd32_write_t)) return EINVAL; F = (tFile *) X->DeviceId; if (F->FilSig != FAT_FILSIG) return EBADF; #ifdef FATREMOVABLE if ((Res = fat_mediachange(F->V)) < 0) return Res; #endif return fat_write(F, X->Buffer, X->BufferBytes); #else return EROFS; #endif } case FD32_LSEEK: { fd32_lseek_t *X = (fd32_lseek_t *) Params; if (X->Size < sizeof(fd32_lseek_t)) return EINVAL; if (((tFile *) X->DeviceId)->FilSig != FAT_FILSIG) return EBADF; return fat_lseek((tFile *) X->DeviceId, &X->Offset, X->Origin); } case FD32_OPENFILE: { fd32_openfile_t *X = (fd32_openfile_t *) Params; tVolume *V; if (X->Size < sizeof(fd32_openfile_t)) return EINVAL; V = (tVolume *) X->DeviceId; if (V->VolSig != FAT_VOLSIG) return ENODEV; #ifdef FATREMOVABLE if ((Res = fat_mediachange(V)) < 0) return Res; #endif return fat_open(V, X->FileName, X->Mode, X->Attr, X->AliasHint, (tFile **) &X->FileId); } case FD32_CLOSE: { fd32_close_t *X = (fd32_close_t *) Params; tFile *F; if (X->Size < sizeof(fd32_close_t)) return EINVAL; F = (tFile *) X->DeviceId; if (F->FilSig != FAT_FILSIG) return EBADF; #ifdef FATREMOVABLE if ((Res = fat_mediachange(F->V)) < 0) return Res; #endif return fat_close(F); } case FD32_READDIR: { fd32_readdir_t *X = (fd32_readdir_t *) Params; tFile *F; if (X->Size < sizeof(fd32_readdir_t)) return EINVAL; F = (tFile *) X->DirId; if (F->FilSig != FAT_FILSIG) return EBADF; #ifdef FATREMOVABLE if ((Res = fat_mediachange(F->V)) < 0) return Res; #endif return fat_readdir(F, (fd32_fs_lfnfind_t *) X->Entry); } case FD32_FFLUSH: { #ifdef FATWRITE fd32_fflush_t *X = (fd32_fflush_t *) Params; tFile *F; if (X->Size < sizeof(fd32_fflush_t)) return EINVAL; F = (tFile *) X->DeviceId; if (F->FilSig != FAT_FILSIG) return EBADF; #ifdef FATREMOVABLE if ((Res = fat_mediachange(F->V)) < 0) return Res; #endif return fat_fflush(F); #else return EROFS; #endif } case FD32_OPEN: { fd32_open_t *X = (fd32_open_t *) Params; if (X->Size < sizeof(fd32_open_t)) return EINVAL; if (((tFile *) X->DeviceId)->FilSig != FAT_FILSIG) return EBADF; return ++((tFile *) X->DeviceId)->References; } case FD32_GETATTR: { fd32_getattr_t *X = (fd32_getattr_t *) Params; if (X->Size < sizeof(fd32_getattr_t)) return EINVAL; if (((tFile *) X->FileId)->FilSig != FAT_FILSIG) return EBADF; return fat_get_attr((tFile *) X->FileId, (fd32_fs_attr_t *) X->Attr); } case FD32_SETATTR: { #ifdef FATWRITE fd32_setattr_t *X = (fd32_setattr_t *) Params; tFile *F; if (X->Size < sizeof(fd32_setattr_t)) return EINVAL; F = (tFile *) X->FileId; if (F->FilSig != FAT_FILSIG) return EBADF; #ifdef FATREMOVABLE if ((Res = fat_mediachange(F->V)) < 0) return Res; #endif return fat_set_attr(F, (fd32_fs_attr_t *) X->Attr); #else return EROFS; #endif } case FD32_REOPENDIR: { fd32_reopendir_t *X = (fd32_reopendir_t *) Params; tVolume *V; if (X->Size < sizeof(fd32_reopendir_t)) return EINVAL; V = (tVolume *) X->DeviceId; if (V->VolSig != FAT_VOLSIG) return ENODEV; #ifdef FATREMOVABLE if ((Res = fat_mediachange(V)) < 0) return Res; #endif return fat_reopendir(V, (tFindRes *) X->DtaReserved, (tFile **) &X->DirId); } case FD32_UNLINK: { #ifdef FATWRITE fd32_unlink_t *X = (fd32_unlink_t *) Params; tVolume *V; if (X->Size < sizeof(fd32_unlink_t)) return EINVAL; V = (tVolume *) X->DeviceId; if (V->VolSig != FAT_VOLSIG) return ENODEV; #ifdef FATREMOVABLE if ((Res = fat_mediachange(V)) < 0) return Res; #endif return fat_unlink(V, X->FileName, X->Flags); #else return EROFS; #endif } case FD32_RENAME: { #ifdef FATWRITE fd32_rename_t *X = (fd32_rename_t *) Params; tVolume *V; if (X->Size < sizeof(fd32_rename_t)) return EINVAL; V = (tVolume *) X->DeviceId; if (V->VolSig != FAT_VOLSIG) return ENODEV; #ifdef FATREMOVABLE if ((Res = fat_mediachange(V)) < 0) return Res; #endif return fat_rename(V, X->OldName, X->NewName); #else return EROFS; #endif } case FD32_MKDIR: { #ifdef FATWRITE fd32_mkdir_t *X = (fd32_mkdir_t *) Params; tVolume *V; if (X->Size < sizeof(fd32_mkdir_t)) return EINVAL; V = (tVolume *) X->DeviceId; if (V->VolSig != FAT_VOLSIG) return ENODEV; #ifdef FATREMOVABLE if ((Res = fat_mediachange(V)) < 0) return Res; #endif return fat_mkdir(V, X->DirName); #else return FD32_EROFS; #endif } case FD32_RMDIR: { #ifdef FATWRITE fd32_rmdir_t *X = (fd32_rmdir_t *) Params; tVolume *V; if (X->Size < sizeof(fd32_rmdir_t)) return EINVAL; V = (tVolume *) X->DeviceId; if (V->VolSig != FAT_VOLSIG) return ENODEV; #ifdef FATREMOVABLE if ((Res = fat_mediachange(V)) < 0) return Res; #endif return fat_rmdir(V, X->DirName); #else return FD32_EROFS; #endif } case FD32_MOUNT: { fd32_mount_t *X = (fd32_mount_t *) Params; if (X->Size < sizeof(fd32_mount_t)) return EINVAL; return fat_mount(X->hDev, (tVolume **) &X->FsDev); } case FD32_UNMOUNT: { fd32_unmount_t *X = (fd32_unmount_t *) Params; tVolume *V; if (X->Size < sizeof(fd32_unmount_t)) return EINVAL; V = (tVolume *) X->DeviceId; if (V->VolSig != FAT_VOLSIG) return ENODEV; #ifdef FATREMOVABLE if ((Res = fat_mediachange(V)) < 0) return Res; #endif return fat_unmount(V); } case FD32_PARTCHECK: { fd32_partcheck_t *X = (fd32_partcheck_t *) Params; if (X->Size < sizeof(fd32_partcheck_t)) return EINVAL; return fat_partcheck(X->PartId); } case FD32_GETFSINFO: { fd32_getfsinfo_t *X = (fd32_getfsinfo_t *) Params; if (X->Size < sizeof(fd32_getfsinfo_t)) return EINVAL; return fat_get_fsinfo((fd32_fs_info_t *) X->FSInfo); } case FD32_GETFSFREE: return fat_get_fsfree((fd32_getfsfree_t *) Params); } return EINVAL; }