Ignore:
Timestamp:
Apr 2, 2000, 5:12:48 PM (25 years ago)
Author:
cbratschi
Message:

* empty log message *

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/oslibdos.cpp

    r3269 r3306  
    1 /* $Id: oslibdos.cpp,v 1.23 2000-03-29 15:17:28 cbratschi Exp $ */
     1/* $Id: oslibdos.cpp,v 1.24 2000-04-02 15:11:12 cbratschi Exp $ */
    22/*
    33 * Wrappers for OS/2 Dos* API
     
    66 * Copyright 1999-2000 Edgar Buerkle <Edgar.Buerkle@gmx.net>
    77 * Copyright 2000 Przemyslaw Dobrowolski <dobrawka@asua.org.pl>
     8 * Copyright 2000 Christoph Bratschi (cbratschi@datacomm.ch)
    89 *
    910 * Project Odin Software License can be found in LICENSE.TXT
     
    2021#include <stdio.h>
    2122#include <string.h>
     23#include <ctype.h>
    2224#include <win32api.h>
    2325#include <winconst.h>
     
    3032#include "dbglocal.h"
    3133
     34//******************************************************************************
     35// translate OS/2 error codes to Windows codes
     36// NOTE: add all codes you need, list is not complete!
     37//******************************************************************************
     38DWORD 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}
    32127//******************************************************************************
    33128//TODO: Assumes entire memory range has the same protection flags!
     
    336431//******************************************************************************
    337432//******************************************************************************
     433#define NOT_NORMAL (FILE_ATTRIBUTE_READONLY_W | \
     434                    FILE_ATTRIBUTE_HIDDEN_W |   \
     435                    FILE_ATTRIBUTE_SYSTEM_W |   \
     436                    FILE_ATTRIBUTE_ARCHIVE_W)
     437
     438inline 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//******************************************************************************
    338461BOOL OSLibDosGetFileAttributesEx(PSZ   pszName,
    339462                                 ULONG ulDummy,
     
    353476
    354477  // convert structure
    355   lpFad->dwFileAttributes = fs3.attrFile; // directly interchangeable
     478  lpFad->dwFileAttributes = pm2WinFileAttributes(fs3.attrFile);
    356479  pmDateTimeToFileTime(&fs3.fdateCreation,   &fs3.ftimeCreation,   &lpFad->ftCreationTime);
    357480  pmDateTimeToFileTime(&fs3.fdateLastAccess, &fs3.ftimeLastAccess, &lpFad->ftLastAccessTime);
     
    668791  if (rc)
    669792  {
    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
    683795  }
    684796  return hPipe;
     
    696808
    697809  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));
    708811
    709812  return (FALSE);
     
    743846
    744847  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));
    767849
    768850  return (FALSE);
     
    790872  dprintf(("DosTransactNPipe returned rc=%d");)
    791873  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));
    809875
    810876  return (FALSE);
     
    834900    return (TRUE);
    835901  }
    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));
    847903
    848904  return (FALSE);
     
    859915
    860916  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));
    868918
    869919  return (FALSE);
     
    892942
    893943  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));
    906945
    907946  return (FALSE);
     
    909948//******************************************************************************
    910949//******************************************************************************
    911 #define NOT_NORMAL (FILE_ATTRIBUTE_READONLY_W | \
    912                     FILE_ATTRIBUTE_HIDDEN_W |   \
    913                     FILE_ATTRIBUTE_SYSTEM_W |   \
    914                     FILE_ATTRIBUTE_ARCHIVE_W)
    915 
     950BOOL 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//******************************************************************************
     970inline 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
     984VOID 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//******************************************************************************
    9161037VOID translateFileResults(FILESTATUS3 *pResult,LPWIN32_FIND_DATAA pFind,CHAR* achName)
    9171038{
    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);
    9311042
    9321043  pmDateTimeToFileTime(&pResult->fdateCreation,&pResult->ftimeCreation,&pFind->ftCreationTime);
     
    9361047  pFind->nFileSizeHigh = 0; //CB: fixme
    9371048  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);
    9401056}
    9411057
    9421058VOID translateFindResults(FILEFINDBUF3 *pResult,LPWIN32_FIND_DATAA pFind)
    9431059{
    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);
    9571061
    9581062  pmDateTimeToFileTime(&pResult->fdateCreation,&pResult->ftimeCreation,&pFind->ftCreationTime);
     
    9631067  pFind->nFileSizeLow = pResult->cbFile;
    9641068  strcpy(pFind->cFileName,pResult->achName);
    965   pFind->cAlternateFileName[0] = 0; //CB: fixme: store 8.3 file name
     1069  long2ShortName(pFind->cFileName,pFind->cAlternateFileName);
    9661070}
    9671071//******************************************************************************
     
    9791083  APIRET rc = DosFindFirst((PSZ)lpFileName,&hDir,attrs,&result,sizeof(result),&searchCount,FIL_STANDARD);
    9801084  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  }
    9881105  translateFindResults(&result,lpFindFileData);
    9891106
     
    9911108}
    9921109//******************************************************************************
     1110// NOTE: returns "." and ".." in root
    9931111//******************************************************************************
    9941112DWORD OSLibDosFindFirstMulti(LPCSTR lpFileName,WIN32_FIND_DATAA *lpFindFileData,DWORD *count)
     
    10091127    free(result);
    10101128    *count = 0;
    1011     SetLastError(ERROR_PATH_NOT_FOUND_W);  //CB: fixme: better error handling
     1129    SetLastError(error2WinError(rc));
    10121130
    10131131    return INVALID_HANDLE_VALUE_W;
     
    10351153  if (rc)
    10361154  {
    1037     SetLastError(ERROR_INVALID_HANDLE_W); //CB: fixme: better error code
     1155    SetLastError(error2WinError(rc));
    10381156
    10391157    return FALSE;
     
    10571175    free(result);
    10581176    *count = 0;
    1059     SetLastError(ERROR_INVALID_HANDLE_W); //CB: fixme: better error code
     1177    SetLastError(error2WinError(rc));
    10601178
    10611179    return FALSE;
     
    10801198  if (rc)
    10811199  {
    1082     SetLastError(ERROR_INVALID_HANDLE_W);
     1200    SetLastError(error2WinError(rc));
    10831201
    10841202    return FALSE;
Note: See TracChangeset for help on using the changeset viewer.