Changeset 3306 for trunk/src/kernel32/oslibdos.cpp
- Timestamp:
- Apr 2, 2000, 5:12:48 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/oslibdos.cpp
r3269 r3306 1 /* $Id: oslibdos.cpp,v 1.2 3 2000-03-29 15:17:28cbratschi Exp $ */1 /* $Id: oslibdos.cpp,v 1.24 2000-04-02 15:11:12 cbratschi Exp $ */ 2 2 /* 3 3 * Wrappers for OS/2 Dos* API … … 6 6 * Copyright 1999-2000 Edgar Buerkle <Edgar.Buerkle@gmx.net> 7 7 * Copyright 2000 Przemyslaw Dobrowolski <dobrawka@asua.org.pl> 8 * Copyright 2000 Christoph Bratschi (cbratschi@datacomm.ch) 8 9 * 9 10 * Project Odin Software License can be found in LICENSE.TXT … … 20 21 #include <stdio.h> 21 22 #include <string.h> 23 #include <ctype.h> 22 24 #include <win32api.h> 23 25 #include <winconst.h> … … 30 32 #include "dbglocal.h" 31 33 34 //****************************************************************************** 35 // translate OS/2 error codes to Windows codes 36 // NOTE: add all codes you need, list is not complete! 37 //****************************************************************************** 38 DWORD error2WinError(APIRET rc,DWORD defaultCode = ERROR_NOT_ENOUGH_MEMORY_W) 39 { 40 switch (rc) 41 { 42 case NO_ERROR: //0 43 return ERROR_SUCCESS_W; 44 45 case ERROR_FILE_NOT_FOUND: //2 46 return ERROR_FILE_NOT_FOUND_W; 47 48 case ERROR_PATH_NOT_FOUND: //3 49 return ERROR_PATH_NOT_FOUND_W; 50 51 case ERROR_ACCESS_DENIED: //5 52 return ERROR_ACCESS_DENIED_W; 53 54 case ERROR_INVALID_HANDLE: //6 55 return ERROR_INVALID_HANDLE_W; 56 57 case ERROR_NOT_ENOUGH_MEMORY: //8 58 return ERROR_NOT_ENOUGH_MEMORY_W; 59 60 case ERROR_BAD_FORMAT: //11 61 return ERROR_BAD_FORMAT_W; 62 63 case ERROR_NO_MORE_FILES: //18 64 return ERROR_NO_MORE_FILES_W; 65 66 case ERROR_NOT_DOS_DISK: //26 67 return ERROR_NOT_DOS_DISK_W; 68 69 case ERROR_OUT_OF_STRUCTURES: //84 70 return ERROR_OUT_OF_STRUCTURES_W; 71 72 case ERROR_INVALID_PARAMETER: //87 73 return ERROR_INVALID_PARAMETER_W; 74 75 case ERROR_INTERRUPT: //95 76 return ERROR_INVALID_AT_INTERRUPT_TIME_W; //CB: right??? 77 78 case ERROR_DRIVE_LOCKED: //108 79 return ERROR_DRIVE_LOCKED_W; 80 81 case ERROR_BROKEN_PIPE: //109 82 return ERROR_BROKEN_PIPE_W; 83 84 case ERROR_BUFFER_OVERFLOW: //111 85 return ERROR_BUFFER_OVERFLOW_W; 86 87 case ERROR_NO_MORE_SEARCH_HANDLES: //113 88 return ERROR_NO_MORE_SEARCH_HANDLES_W; 89 90 case ERROR_SEM_TIMEOUT: //121 91 return ERROR_SEM_TIMEOUT_W; 92 93 case ERROR_DISCARDED: //157 94 return ERROR_DISCARDED_W; 95 96 case ERROR_FILENAME_EXCED_RANGE: //206 97 return ERROR_FILENAME_EXCED_RANGE_W; 98 99 case ERROR_META_EXPANSION_TOO_LONG: //208 100 return ERROR_META_EXPANSION_TOO_LONG_W; 101 102 case ERROR_BAD_PIPE: //230 103 return ERROR_BAD_PIPE_W; 104 105 case ERROR_PIPE_BUSY: //231 106 return ERROR_PIPE_BUSY_W; 107 108 case ERROR_PIPE_NOT_CONNECTED: //233 109 return ERROR_PIPE_NOT_CONNECTED_W; 110 111 case ERROR_MORE_DATA: //234 112 return ERROR_MORE_DATA_W; 113 114 case ERROR_INVALID_EA_NAME: //254 115 return ERROR_INVALID_EA_NAME_W; 116 117 case ERROR_EA_LIST_INCONSISTENT: //255 118 return ERROR_EA_LIST_INCONSISTENT_W; 119 120 case ERROR_EAS_DIDNT_FIT: //275 121 return ERROR_EAS_DIDNT_FIT; 122 123 default: 124 return defaultCode; 125 } 126 } 32 127 //****************************************************************************** 33 128 //TODO: Assumes entire memory range has the same protection flags! … … 336 431 //****************************************************************************** 337 432 //****************************************************************************** 433 #define NOT_NORMAL (FILE_ATTRIBUTE_READONLY_W | \ 434 FILE_ATTRIBUTE_HIDDEN_W | \ 435 FILE_ATTRIBUTE_SYSTEM_W | \ 436 FILE_ATTRIBUTE_ARCHIVE_W) 437 438 inline DWORD pm2WinFileAttributes(DWORD attrFile) 439 { 440 DWORD res = 0; 441 442 if (!(attrFile & NOT_NORMAL)) 443 res |= FILE_ATTRIBUTE_NORMAL_W; 444 if (attrFile & FILE_READONLY) 445 res |= FILE_ATTRIBUTE_READONLY_W; 446 if (attrFile & FILE_HIDDEN) 447 res |= FILE_ATTRIBUTE_HIDDEN_W; 448 if (attrFile & FILE_SYSTEM) 449 res |= FILE_ATTRIBUTE_SYSTEM_W; 450 if (attrFile & FILE_DIRECTORY) 451 res |= FILE_ATTRIBUTE_DIRECTORY_W; 452 if (attrFile & FILE_ARCHIVED) 453 res |= FILE_ATTRIBUTE_ARCHIVE_W; 454 455 //CB: not used: FILE_ATTRIBUTE_COMPRESSED_W 456 457 return res; 458 } 459 //****************************************************************************** 460 //****************************************************************************** 338 461 BOOL OSLibDosGetFileAttributesEx(PSZ pszName, 339 462 ULONG ulDummy, … … 353 476 354 477 // convert structure 355 lpFad->dwFileAttributes = fs3.attrFile; // directly interchangeable478 lpFad->dwFileAttributes = pm2WinFileAttributes(fs3.attrFile); 356 479 pmDateTimeToFileTime(&fs3.fdateCreation, &fs3.ftimeCreation, &lpFad->ftCreationTime); 357 480 pmDateTimeToFileTime(&fs3.fdateLastAccess, &fs3.ftimeLastAccess, &lpFad->ftLastAccessTime); … … 668 791 if (rc) 669 792 { 670 if ( rc == ERROR_PIPE_BUSY ) SetLastError(ERROR_PIPE_BUSY_W); 671 else 672 if ( rc == ERROR_PATH_NOT_FOUND ) SetLastError(ERROR_PATH_NOT_FOUND_W); 673 else 674 if ( rc == ERROR_NOT_ENOUGH_MEMORY ) SetLastError(ERROR_NOT_ENOUGH_MEMORY_W); 675 else 676 if ( rc == ERROR_INVALID_PARAMETER ) SetLastError(ERROR_INVALID_PARAMETER_W); 677 else 678 if ( rc == ERROR_OUT_OF_STRUCTURES ) SetLastError(ERROR_OUT_OF_STRUCTURES_W); 679 else 680 // Unknown error 681 SetLastError(ERROR_INVALID_PARAMETER_W); // fixme! 682 return -1; // INVALID_HANDLE_VALUE 793 SetLastError(error2WinError(rc,ERROR_INVALID_PARAMETER_W)); 794 return -1; // INVALID_HANDLE_VALUE 683 795 } 684 796 return hPipe; … … 696 808 697 809 if (!rc) return (TRUE); 698 else 699 if (rc==ERROR_BROKEN_PIPE) SetLastError(ERROR_BROKEN_PIPE_W); 700 else 701 if (rc==ERROR_BAD_PIPE) SetLastError(ERROR_BAD_PIPE_W); 702 else 703 if (rc==ERROR_PIPE_NOT_CONNECTED) SetLastError(ERROR_PIPE_NOT_CONNECTED_W); 704 else 705 // TODO: Implemnt this using Windows Errors 706 // if (rc==ERROR_INTERRUPT) 707 SetLastError(ERROR_PIPE_NOT_CONNECTED_W); 810 SetLastError(error2WinError(rc,ERROR_PIPE_NOT_CONNECTED_W)); 708 811 709 812 return (FALSE); … … 743 846 744 847 if (!rc) return (TRUE); 745 else 746 if ( rc==ERROR_FILE_NOT_FOUND ) SetLastError(ERROR_FILE_NOT_FOUND_W); 747 else 748 if ( rc==ERROR_PATH_NOT_FOUND ) SetLastError(ERROR_PATH_NOT_FOUND_W); 749 else 750 if ( rc==ERROR_ACCESS_DENIED ) SetLastError(ERROR_ACCESS_DENIED_W); 751 else 752 if ( rc==ERROR_MORE_DATA ) SetLastError(ERROR_MORE_DATA_W); 753 else 754 if ( rc==ERROR_PIPE_BUSY ) SetLastError(ERROR_PIPE_BUSY_W); 755 else 756 if ( rc==ERROR_BAD_FORMAT ) SetLastError(ERROR_BAD_FORMAT_W); 757 else 758 if ( rc==ERROR_BROKEN_PIPE ) SetLastError(ERROR_BROKEN_PIPE_W); 759 else 760 if ( rc==ERROR_BAD_PIPE ) SetLastError(ERROR_BAD_PIPE_W); 761 else 762 if ( rc==ERROR_PIPE_NOT_CONNECTED ) SetLastError(ERROR_PIPE_NOT_CONNECTED_W); 763 else 764 // TODO: Implemnt this using Windows Errors 765 // if (rc==ERROR_INTERRUPT) 766 SetLastError(ERROR_PIPE_NOT_CONNECTED_W); 848 SetLastError(error2WinError(rc,ERROR_PIPE_NOT_CONNECTED_W)); 767 849 768 850 return (FALSE); … … 790 872 dprintf(("DosTransactNPipe returned rc=%d");) 791 873 if (!rc) return (TRUE); 792 else 793 if ( rc==ERROR_ACCESS_DENIED ) SetLastError(ERROR_ACCESS_DENIED_W); 794 else 795 if ( rc==ERROR_MORE_DATA ) SetLastError(ERROR_MORE_DATA_W); 796 else 797 if ( rc==ERROR_PIPE_BUSY ) SetLastError(ERROR_PIPE_BUSY_W); 798 else 799 if ( rc==ERROR_BAD_FORMAT ) SetLastError(ERROR_BAD_FORMAT_W); 800 else 801 if ( rc==ERROR_BROKEN_PIPE ) SetLastError(ERROR_BROKEN_PIPE_W); 802 else 803 if ( rc==ERROR_BAD_PIPE ) SetLastError(ERROR_BAD_PIPE_W); 804 else 805 if ( rc==ERROR_PIPE_NOT_CONNECTED ) SetLastError(ERROR_PIPE_NOT_CONNECTED_W); 806 else 807 // Unknown error 808 SetLastError(ERROR_PIPE_NOT_CONNECTED_W); 874 SetLastError(error2WinError(rc,ERROR_PIPE_NOT_CONNECTED_W)); 809 875 810 876 return (FALSE); … … 834 900 return (TRUE); 835 901 } 836 else 837 if ( rc==ERROR_ACCESS_DENIED ) SetLastError(ERROR_ACCESS_DENIED_W); 838 else 839 if ( rc==ERROR_PIPE_BUSY ) SetLastError(ERROR_PIPE_BUSY_W); 840 else 841 if ( rc==ERROR_BAD_PIPE ) SetLastError(ERROR_BAD_PIPE_W); 842 else 843 if ( rc==ERROR_PIPE_NOT_CONNECTED ) SetLastError(ERROR_PIPE_NOT_CONNECTED_W); 844 else 845 // Unknown error 846 SetLastError(ERROR_PIPE_NOT_CONNECTED_W); 902 SetLastError(error2WinError(rc,ERROR_PIPE_NOT_CONNECTED_W)); 847 903 848 904 return (FALSE); … … 859 915 860 916 if (!rc) return TRUE; 861 else 862 if ( rc==ERROR_BROKEN_PIPE ) SetLastError(ERROR_BROKEN_PIPE_W); 863 else 864 if ( rc==ERROR_BAD_PIPE ) SetLastError(ERROR_BAD_PIPE_W); 865 else 866 // Unknown error 867 SetLastError(ERROR_PIPE_NOT_CONNECTED_W); // Maybe another? 917 SetLastError(error2WinError(rc,ERROR_PIPE_NOT_CONNECTED_W)); 868 918 869 919 return (FALSE); … … 892 942 893 943 if (!rc) return TRUE; 894 else 895 if ( rc == ERROR_PATH_NOT_FOUND ) SetLastError(ERROR_PATH_NOT_FOUND_W); 896 else 897 if ( rc==ERROR_BAD_PIPE ) SetLastError(ERROR_BAD_PIPE_W); 898 else 899 if ( rc == ERROR_PIPE_BUSY ) SetLastError(ERROR_PIPE_BUSY_W); 900 else 901 if ( rc == ERROR_SEM_TIMEOUT_W ) SetLastError(ERROR_SEM_TIMEOUT_W); 902 else 903 // TODO: Implemnt this using Windows Errors 904 // if (rc==ERROR_INTERRUPT) 905 SetLastError(ERROR_PIPE_NOT_CONNECTED_W); 944 SetLastError(error2WinError(rc,ERROR_PIPE_NOT_CONNECTED_W)); 906 945 907 946 return (FALSE); … … 909 948 //****************************************************************************** 910 949 //****************************************************************************** 911 #define NOT_NORMAL (FILE_ATTRIBUTE_READONLY_W | \ 912 FILE_ATTRIBUTE_HIDDEN_W | \ 913 FILE_ATTRIBUTE_SYSTEM_W | \ 914 FILE_ATTRIBUTE_ARCHIVE_W) 915 950 BOOL isRoot(CHAR* name) 951 { 952 if (name[1] == ':') 953 { 954 //local name (x:\) 955 return (name[2] == 0) || !strchr(&name[3],'\\'); 956 } else if (name[0] == '\\') 957 { 958 //UNC name (\\resource\drive\) 959 CHAR *drive,*dir; 960 961 drive = strchr(&name[2],'\\'); 962 if (!drive) return FALSE; 963 dir = strchr(&drive[1],'\\'); 964 if (!dir) return TRUE; 965 return !strchr(&dir[1],'\\'); 966 } else return FALSE; //unknown 967 } 968 //****************************************************************************** 969 //****************************************************************************** 970 inline CHAR system2DOSCharacter(CHAR ch) 971 { 972 switch(ch) 973 { 974 case ' ': 975 case '.': 976 case '~': 977 return '_'; 978 979 default: 980 return toupper(ch); 981 } 982 } 983 984 VOID long2ShortName(CHAR* longName,CHAR* shortName) 985 { 986 INT x; 987 CHAR *source = longName,*dest = shortName,*ext = strrchr(longName,'.'); 988 989 if ((strcmp(longName,".") == 0) || (strcmp(longName,"..") == 0)) 990 { 991 strcpy(shortName,longName); 992 return; 993 } 994 995 //CB: quick and dirty, real FILE~12.EXT is too slow 996 997 //8 character file name 998 for (x = 0;x < 8;x++) 999 { 1000 if ((source == ext) || (source[0] == 0)) break; 1001 dest[0] = system2DOSCharacter(source[0]); 1002 source++; 1003 dest++; 1004 } 1005 1006 if (source[0] == 0) 1007 { 1008 dest[0] = 0; 1009 return; 1010 } 1011 1012 if (source != ext) 1013 { 1014 //longName > 8 characters, insert ~1 1015 shortName[6] = '~'; 1016 shortName[7] = '1'; 1017 } 1018 1019 if (ext) 1020 { 1021 //add extension, 3 characters 1022 dest[0] = ext[0]; 1023 dest++; 1024 ext++; 1025 for (x = 0;x < 3;x++) 1026 { 1027 if (ext[0] == 0) break; 1028 dest[0] = system2DOSCharacter(ext[0]); 1029 ext++; 1030 dest++; 1031 } 1032 } 1033 dest[0] = 0; 1034 } 1035 //****************************************************************************** 1036 //****************************************************************************** 916 1037 VOID translateFileResults(FILESTATUS3 *pResult,LPWIN32_FIND_DATAA pFind,CHAR* achName) 917 1038 { 918 pFind->dwFileAttributes = 0; 919 if (!(pResult->attrFile & NOT_NORMAL)) 920 pFind->dwFileAttributes |= FILE_ATTRIBUTE_NORMAL_W; 921 if (pResult->attrFile & FILE_READONLY) 922 pFind->dwFileAttributes |= FILE_ATTRIBUTE_READONLY_W; 923 if (pResult->attrFile & FILE_HIDDEN) 924 pFind->dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN_W; 925 if (pResult->attrFile & FILE_SYSTEM) 926 pFind->dwFileAttributes |= FILE_ATTRIBUTE_SYSTEM_W; 927 if (pResult->attrFile & FILE_DIRECTORY) 928 pFind->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY_W; 929 if (pResult->attrFile & FILE_ARCHIVED) 930 pFind->dwFileAttributes |= FILE_ATTRIBUTE_ARCHIVE_W; 1039 CHAR* name; 1040 1041 pFind->dwFileAttributes = pm2WinFileAttributes(pResult->attrFile); 931 1042 932 1043 pmDateTimeToFileTime(&pResult->fdateCreation,&pResult->ftimeCreation,&pFind->ftCreationTime); … … 936 1047 pFind->nFileSizeHigh = 0; //CB: fixme 937 1048 pFind->nFileSizeLow = pResult->cbFile; 938 strcpy(pFind->cFileName,achName); 939 pFind->cAlternateFileName[0] = 0; //CB: fixme: store 8.3 file name 1049 name = strrchr(achName,'\\'); 1050 if (name) 1051 { 1052 name++; 1053 strcpy(pFind->cFileName,name); 1054 } else pFind->cFileName[0] = 0; 1055 long2ShortName(pFind->cFileName,pFind->cAlternateFileName); 940 1056 } 941 1057 942 1058 VOID translateFindResults(FILEFINDBUF3 *pResult,LPWIN32_FIND_DATAA pFind) 943 1059 { 944 pFind->dwFileAttributes = 0; 945 if (!(pResult->attrFile & NOT_NORMAL)) 946 pFind->dwFileAttributes |= FILE_ATTRIBUTE_NORMAL_W; 947 if (pResult->attrFile & FILE_READONLY) 948 pFind->dwFileAttributes |= FILE_ATTRIBUTE_READONLY_W; 949 if (pResult->attrFile & FILE_HIDDEN) 950 pFind->dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN_W; 951 if (pResult->attrFile & FILE_SYSTEM) 952 pFind->dwFileAttributes |= FILE_ATTRIBUTE_SYSTEM_W; 953 if (pResult->attrFile & FILE_DIRECTORY) 954 pFind->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY_W; 955 if (pResult->attrFile & FILE_ARCHIVED) 956 pFind->dwFileAttributes |= FILE_ATTRIBUTE_ARCHIVE_W; 1060 pFind->dwFileAttributes = pm2WinFileAttributes(pResult->attrFile); 957 1061 958 1062 pmDateTimeToFileTime(&pResult->fdateCreation,&pResult->ftimeCreation,&pFind->ftCreationTime); … … 963 1067 pFind->nFileSizeLow = pResult->cbFile; 964 1068 strcpy(pFind->cFileName,pResult->achName); 965 pFind->cAlternateFileName[0] = 0; //CB: fixme: store 8.3 file name1069 long2ShortName(pFind->cFileName,pFind->cAlternateFileName); 966 1070 } 967 1071 //****************************************************************************** … … 979 1083 APIRET rc = DosFindFirst((PSZ)lpFileName,&hDir,attrs,&result,sizeof(result),&searchCount,FIL_STANDARD); 980 1084 DosError(FERR_ENABLEHARDERR | FERR_ENABLEEXCEPTION); 981 if (rc) 982 { 983 SetLastError(ERROR_PATH_NOT_FOUND_W); //CB: fixme: better error handling 984 985 return INVALID_HANDLE_VALUE_W; 986 } 987 1085 1086 //check root: skip "." and ".." (HPFS, not on FAT) 1087 //check in OSLibDosFindNext not necessary: "." and ".." are the first two entries 1088 if ((rc == 0) && isRoot((LPSTR)lpFileName)) 1089 { 1090 while ((strcmp(result.achName,".") == 0) || (strcmp(result.achName,"..") == 0)) 1091 { 1092 DosError(FERR_DISABLEHARDERR | FERR_DISABLEEXCEPTION); 1093 searchCount = 1; 1094 APIRET rc = DosFindNext(hDir,&result,sizeof(result),&searchCount); 1095 DosError(FERR_ENABLEHARDERR | FERR_ENABLEEXCEPTION); 1096 if (rc) 1097 { 1098 DosFindClose(hDir); 1099 SetLastError(error2WinError(rc)); 1100 1101 return INVALID_HANDLE_VALUE_W; 1102 } 1103 } 1104 } 988 1105 translateFindResults(&result,lpFindFileData); 989 1106 … … 991 1108 } 992 1109 //****************************************************************************** 1110 // NOTE: returns "." and ".." in root 993 1111 //****************************************************************************** 994 1112 DWORD OSLibDosFindFirstMulti(LPCSTR lpFileName,WIN32_FIND_DATAA *lpFindFileData,DWORD *count) … … 1009 1127 free(result); 1010 1128 *count = 0; 1011 SetLastError( ERROR_PATH_NOT_FOUND_W); //CB: fixme: better error handling1129 SetLastError(error2WinError(rc)); 1012 1130 1013 1131 return INVALID_HANDLE_VALUE_W; … … 1035 1153 if (rc) 1036 1154 { 1037 SetLastError( ERROR_INVALID_HANDLE_W); //CB: fixme: better error code1155 SetLastError(error2WinError(rc)); 1038 1156 1039 1157 return FALSE; … … 1057 1175 free(result); 1058 1176 *count = 0; 1059 SetLastError( ERROR_INVALID_HANDLE_W); //CB: fixme: better error code1177 SetLastError(error2WinError(rc)); 1060 1178 1061 1179 return FALSE; … … 1080 1198 if (rc) 1081 1199 { 1082 SetLastError( ERROR_INVALID_HANDLE_W);1200 SetLastError(error2WinError(rc)); 1083 1201 1084 1202 return FALSE;
Note:
See TracChangeset
for help on using the changeset viewer.