Update of /cvsroot/arcem/arcem In directory vz-cvs-4.sog:/tmp/cvs-serv11622
Modified Files: Tag: arcem-fast arminit.c hostfs.c Log Message: HostFS fixes and improvements * arminit.c - Cope properly with the unlikely event of finding a SWI instruction at 0x0 or 0x4 * arch/filecommon.c - Fixed the new file caching code being broken when reading/writing more data than will fit inside the file buffer (1MB) * hostfs.c, support_modules/hostfs/hostfs,ffa, support/hostfs/hostfs.s - Improved error detection and reporting. Failsafe error of HOSTFS_ERROR_UNKNOWN is used if we can't find a specific error to return. Index: arminit.c =================================================================== RCS file: /cvsroot/arcem/arcem/arminit.c,v retrieving revision 1.8.2.6 retrieving revision 1.8.2.7 diff -u -d -r1.8.2.6 -r1.8.2.7 --- arminit.c 27 Oct 2011 20:57:31 -0000 1.8.2.6 +++ arminit.c 5 Nov 2011 17:47:14 -0000 1.8.2.7 @@ -174,7 +174,7 @@ case ARMul_SWIV: /* Software Interrupt */ { - ARMword addr = ARMul_GetPC(state)-8; + ARMword addr = (state->Reg[15]-8) & R15PCBITS; FastMapEntry *entry = FastMap_GetEntryNoWrap(state,addr); FastMapRes res = FastMap_DecodeRead(entry,state->FastMapMode); ARMword instr; Index: hostfs.c =================================================================== RCS file: /cvsroot/arcem/arcem/hostfs.c,v retrieving revision 1.17.2.10 retrieving revision 1.17.2.11 diff -u -d -r1.17.2.10 -r1.17.2.11 --- hostfs.c 30 Oct 2011 17:42:22 -0000 1.17.2.10 +++ hostfs.c 5 Nov 2011 17:47:14 -0000 1.17.2.11 @@ -128,11 +128,14 @@ enum FILECORE_ERROR { FILECORE_ERROR_BADRENAME = 0xb0, FILECORE_ERROR_DIRNOTEMPTY = 0xb4, + FILECORE_ERROR_ACCESS = 0xbd, FILECORE_ERROR_TOOMANYOPEN = 0xc0, /* Too many open files */ FILECORE_ERROR_OPEN = 0xc2, /* File open */ FILECORE_ERROR_LOCKED = 0xc3, FILECORE_ERROR_EXISTS = 0xc4, /* Already exists */ FILECORE_ERROR_DISCFULL = 0xc6, + FILECORE_ERROR_NOTFOUND = 0xd6, /* Not found */ + HOSTFS_ERROR_UNKNOWN = 0x100, /* Not a filecore error, but causes HostFS to return 'an unknown error occured' */ }; enum RISC_OS_FILE_TYPE { @@ -166,8 +169,6 @@ #define MAX_OPEN_FILES 255 -#define NOT_IMPLEMENTED 255 - #define DEFAULT_ATTRIBUTES 0x03 #define DEFAULT_FILE_TYPE RISC_OS_FILE_TYPE_TEXT #define MINIMUM_BUFFER_SIZE 32768 @@ -202,6 +203,53 @@ path_construct(const char *old_path, const char *ro_path, char *new_path, size_t len, ARMword load, ARMword exec); +static ARMword +errno_to_hostfs_error(const char *filename,const char *function,const char *op) +{ + switch(errno) { + case ENOMEM: /* Out of memory */ + fprintf(stderr, "HostFS out of memory in %s: \'%s\'\n",function,strerror(errno)); + exit(EXIT_FAILURE); + break; + + case ENOENT: /* Object not found */ + return FILECORE_ERROR_NOTFOUND; + + case EACCES: /* Access violation */ + case EPERM: + return FILECORE_ERROR_ACCESS; + + case EEXIST: + case ENOTEMPTY: /* POSIX permits either error for directory not empty */ + return FILECORE_ERROR_DIRNOTEMPTY; + + case ENOSPC: /* No space for the directory (either physical or quota) */ + return FILECORE_ERROR_DISCFULL; + +#ifdef __riscos__ + case EOPSYS: /* RISC OS error */ + { + _kernel_oserror *err = _kernel_last_oserror(); + if(err && ((err->errnum >> 16) == 1) && ((err->errnum & 0xff) >= 0xb0)) + { + /* Filesystem error, in the range HostFS will accept. Return it directly. */ + return err->errnum & 0xff; + } + else + { + fprintf(stderr,"%s() could not %s '%s': %s %d\n",function,op,filename,strerror(errno),errno); + return HOSTFS_ERROR_UNKNOWN; + } + } +#endif + + default: + fprintf(stderr,"%s() could not %s '%s': %s %d\n",function,op,filename,strerror(errno),errno); + return HOSTFS_ERROR_UNKNOWN; + } +} + + /** * @param buffer_size_needed Required buffer */ @@ -934,23 +982,9 @@ /* Check for errors from opening the file */ if (open_file[idx] == NULL) { - switch (errno) { - case ENOMEM: /* Out of memory */ - fprintf(stderr, "HostFS out of memory in hostfs_open(): \'%s\'\n", - strerror(errno)); - exit(EXIT_FAILURE); - break; - - case ENOENT: /* File not found */ - state->Reg[1] = 0; /* Signal to RISC OS file not found */ - return; - - default: - dbug_hostfs("HostFS could not open file \'%s\': %s %d\n", - host_pathname, strerror(errno), errno); - state->Reg[1] = 0; /* Signal to RISC OS file not found */ - return; - } + state->Reg[1] = 0; /* Signal to RISC OS file not found */ + state->Reg[9] = errno_to_hostfs_error(host_pathname,__FUNCTION__,"open"); + return; } /* Find the extent of the file */ @@ -958,6 +992,8 @@ state->Reg[3] = (ARMword) ftello64(open_file[idx]); rewind(open_file[idx]); /* Return to start */ + dbug_hostfs("\tFile opened OK, handle %u, size %u\n",idx,state->Reg[3]); + state->Reg[1] = idx; /* Our filing system's handle */ state->Reg[2] = 1024; /* Buffer size to use in range 64-1024. Must be power of 2 */ @@ -1209,27 +1245,24 @@ new_pathname, sizeof(new_pathname), state->Reg[2], state->Reg[3]); if (rename(host_pathname, new_pathname)) { - fprintf(stderr, "hostfs_file_7_create_file(): could not rename \'%s\'" - " to \'%s\': %s %d\n", host_pathname, new_pathname, - strerror(errno), errno); + state->Reg[9] = errno_to_hostfs_error(host_pathname,__FUNCTION__,"rename"); return; } break; case OBJECT_TYPE_DIRECTORY: /* TODO Find a suitable error */ + state->Reg[9] = HOSTFS_ERROR_UNKNOWN; return; } f = fopen64(new_pathname, "wb"); if (!f) { - /* TODO handle errors */ - fprintf(stderr, "HostFS could not create file \'%s\': %s %d\n", - new_pathname, strerror(errno), errno); + state->Reg[9] = errno_to_hostfs_error(new_pathname,__FUNCTION__,"open"); return; } - size_t bytes_written; + size_t bytes_written=0; if (with_data) { bytes_written = File_WriteRAM(f,ptr,length); } else { @@ -1247,7 +1280,12 @@ } } - /* TODO - Check for errors */ + if(bytes_written != length) + { + fprintf(stderr,"hostfs_write_file(): Failed to write full extent of file\n"); + /* TODO - Examine errno? */ + state->Reg[9] = HOSTFS_ERROR_UNKNOWN; + } fclose(f); /* TODO check for errors */ @@ -1355,7 +1393,10 @@ get_string(state, state->Reg[1], ro_path, sizeof(ro_path)); dbug_hostfs("\tPATH = %s\n", ro_path); - /* TODO Ensure we do not try to delete the root object: i.e. $ */ + /* Prevent being asked to delete root directory */ + if (STREQ(ro_path, "$")) { + return; + } hostfs_path_process(ro_path, host_pathname, &object_info); @@ -1373,26 +1414,13 @@ switch (object_info.type) { case OBJECT_TYPE_FILE: if (unlink(host_pathname)) { - /* Error while deleting the file */ - fprintf(stderr, "HostFS: Error deleting file \'%s\': %s %d\n", - host_pathname, strerror(errno), errno); + state->Reg[9] = errno_to_hostfs_error(host_pathname,__FUNCTION__,"delete file"); } break; case OBJECT_TYPE_DIRECTORY: if (rmdir(host_pathname)) { - /* Error while deleting the directory */ - switch (errno) { - case EEXIST: - case ENOTEMPTY: /* POSIX permits either error for directory not empty */ - state->Reg[9] = FILECORE_ERROR_DIRNOTEMPTY; - break; - - default: - fprintf(stderr, "HostFS: Error deleting directory \'%s\': %s %d\n", - host_pathname, strerror(errno), errno); - break; - } + state->Reg[9] = errno_to_hostfs_error(host_pathname,__FUNCTION__,"delete directory"); } break; @@ -1469,22 +1497,7 @@ /* Create directory */ if (mkdir(host_pathname, 0777)) { - /* An error occurred whilst creating the directory */ - - switch (errno) { - case EEXIST: - /* The object exists (not necessarily as a directory) - does it matter that it could be a file? TODO */ - return; /* Return with no error */ - - case ENOSPC: /* No space for the directory (either physical or quota) */ - state->Reg[9] = FILECORE_ERROR_DISCFULL; - return; - - default: - fprintf(stderr, "HostFS could not create directory \'%s\': %s\n", - host_pathname, strerror(errno)); - return; - } + state->Reg[9] = errno_to_hostfs_error(host_pathname,__FUNCTION__,"create directory"); } } @@ -1519,12 +1532,17 @@ f = fopen64(host_pathname, "rb"); if (!f) { - fprintf(stderr, "HostFS could not open file (File_255) \'%s\': %s %d\n", - host_pathname, strerror(errno), errno); + state->Reg[9] = errno_to_hostfs_error(host_pathname,__FUNCTION__,"open"); return; } - File_ReadRAM(f,ptr,state->Reg[4]); + ARMword bytes_read = File_ReadRAM(f,ptr,state->Reg[4]); + if(bytes_read != state->Reg[4]) + { + fprintf(stderr,"hostfs_file_255_load_file(): Failed to read full extent of file\n"); + /* TODO - Examine errno? */ + state->Reg[9] = HOSTFS_ERROR_UNKNOWN; + } fclose(f); } @@ -2022,7 +2040,7 @@ case 11: dbug_hostfs("\tRead disc name and boot option\n"); - state->Reg[9] = NOT_IMPLEMENTED; + state->Reg[9] = HOSTFS_ERROR_UNKNOWN; break; case 14: ------------------------------------------------------------------------------ RSA(R) Conference 2012 Save $700 by Nov 18 Register now http://p.sf.net/sfu/rsa-sfdev2dev1 -- arcem-cvs mailing list arcem-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/arcem-cvs