Ignore:
Timestamp:
Mar 29, 2000, 5:17:29 PM (25 years ago)
Author:
cbratschi
Message:

FindFirst* changes

File:
1 edited

Legend:

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

    r3074 r3269  
    1 /* $Id: oslibdos.cpp,v 1.22 2000-03-10 16:12:00 sandervl Exp $ */
     1/* $Id: oslibdos.cpp,v 1.23 2000-03-29 15:17:28 cbratschi Exp $ */
    22/*
    33 * Wrappers for OS/2 Dos* API
     
    2727#include "dosqss.h"
    2828
    29 #define DBG_LOCALLOG    DBG_oslibdos
     29#define DBG_LOCALLOG    DBG_oslibdos
    3030#include "dbglocal.h"
    3131
     
    4545  rc = DosQueryMem(pb, &size, &attr);
    4646  if(rc) {
    47         dprintf(("OSLibDosAliasMem: DosQueryMem %x %x return %d", pb, size, rc));
    48         return rc;
     47        dprintf(("OSLibDosAliasMem: DosQueryMem %x %x return %d", pb, size, rc));
     48        return rc;
    4949  }
    5050  size = (size-1) & ~0xfff;
    5151  size+= PAGE_SIZE;
    5252  if(size != cb) {
    53         dprintf(("ERROR: OSLibDosAliasMem: size != cb (%x!=%x)!!!!!!!!", size, cb));
    54         //ignore this and continue return 5;
    55         attr = fl; //just use original protection flags (NOT CORRECT)
     53        dprintf(("ERROR: OSLibDosAliasMem: size != cb (%x!=%x)!!!!!!!!", size, cb));
     54        //ignore this and continue return 5;
     55        attr = fl; //just use original protection flags (NOT CORRECT)
    5656  }
    5757  attr &= (PAG_READ|PAG_WRITE|PAG_EXECUTE|PAG_GUARD|PAG_DEFAULT);
    5858  if(attr != fl) {
    59         rc = DosSetMem(pb, size, fl);
    60         if(rc) {
    61                 dprintf(("OSLibDosAliasMem: DosSetMem %x %x return %d", pb, size, rc));
    62                 attr = fl;
    63                 //just continue for now
    64                 //return rc;
    65         }
     59        rc = DosSetMem(pb, size, fl);
     60        if(rc) {
     61                dprintf(("OSLibDosAliasMem: DosSetMem %x %x return %d", pb, size, rc));
     62                attr = fl;
     63                //just continue for now
     64                //return rc;
     65        }
    6666  }
    6767  rc = DosAliasMem(pb, cb, ppbAlias, 2);
    6868  if(rc) {
    69         dprintf(("OSLibDosAliasMem: DosAliasMem %x %x returned %d", pb, cb, rc));
    70         return rc;
     69        dprintf(("OSLibDosAliasMem: DosAliasMem %x %x returned %d", pb, cb, rc));
     70        return rc;
    7171  }
    7272  if(attr != fl) {
    73         rc = DosSetMem(pb, size, attr);
    74         if(rc) {
    75                 dprintf(("OSLibDosAliasMem: DosSetMem (2) %x %x return %d", pb, size, rc));
    76                 return rc;
    77         }
     73        rc = DosSetMem(pb, size, attr);
     74        if(rc) {
     75                dprintf(("OSLibDosAliasMem: DosSetMem (2) %x %x return %d", pb, size, rc));
     76                return rc;
     77        }
    7878  }
    7979  return 0;
     
    9090  rc = DosAllocMem(&memaddr, size, PAG_READ | flAllocMem);
    9191  if(rc) {
    92         return rc;
     92        return rc;
    9393  }
    9494  DosEnterCritSec();
     
    9696  offset = (DWORD)memaddr & 0xFFFF;
    9797  if(offset) {
    98         DosAllocMem(&memaddr, 64*1024 - offset, PAG_READ | flAllocMem);
     98        DosAllocMem(&memaddr, 64*1024 - offset, PAG_READ | flAllocMem);
    9999  }
    100100  rc = DosAllocMem(lplpMemAddr, size, flags | flAllocMem);
    101101  DosExitCritSec();
    102102  if((DWORD)*lplpMemAddr & 0xFFFF) {//still not at 64k boundary?
    103         DosFreeMem(*lplpMemAddr);
    104         rc = OSLibDosAllocMem(lplpMemAddr, size, flags);
     103        DosFreeMem(*lplpMemAddr);
     104        rc = OSLibDosAllocMem(lplpMemAddr, size, flags);
    105105  }
    106106  if(offset) {
    107         DosFreeMem(memaddr);
     107        DosFreeMem(memaddr);
    108108  }
    109109
     
    123123 APIRET rc;
    124124 char  *sharedmemname = NULL;
    125  
     125
    126126  if(name) {
    127         sharedmemname = (char *)malloc(strlen(name) + 16);
    128         strcpy(sharedmemname, "\\SHAREMEM\\");
    129         strcat(sharedmemname, name);
    130   }
    131   else  flags |= OBJ_GETTABLE;
    132  
     127        sharedmemname = (char *)malloc(strlen(name) + 16);
     128        strcpy(sharedmemname, "\\SHAREMEM\\");
     129        strcat(sharedmemname, name);
     130  }
     131  else  flags |= OBJ_GETTABLE;
     132
    133133  rc = DosAllocSharedMem(lplpMemAddr, sharedmemname, size, flags);
    134   if(name) { 
    135         free(sharedmemname);
     134  if(name) {
     135        free(sharedmemname);
    136136  }
    137137  return rc;
     
    144144 APIRET rc;
    145145 char  *sharedmemname = NULL;
    146  
     146
    147147  if(name) {
    148         sharedmemname = (char *)malloc(strlen(name) + 16);
    149         strcpy(sharedmemname, "\\SHAREMEM\\");
    150         strcat(sharedmemname, name);
    151         rc = DosGetNamedSharedMem(lplpMemAddr, sharedmemname, PAG_READ|PAG_WRITE);
    152         if(name) {
    153                 free(sharedmemname);
    154         }
    155   }
    156   else  rc = DosGetSharedMem((LPVOID)*(DWORD *)lplpMemAddr, PAG_READ|PAG_WRITE);
     148        sharedmemname = (char *)malloc(strlen(name) + 16);
     149        strcpy(sharedmemname, "\\SHAREMEM\\");
     150        strcat(sharedmemname, name);
     151        rc = DosGetNamedSharedMem(lplpMemAddr, sharedmemname, PAG_READ|PAG_WRITE);
     152        if(name) {
     153                free(sharedmemname);
     154        }
     155  }
     156  else  rc = DosGetSharedMem((LPVOID)*(DWORD *)lplpMemAddr, PAG_READ|PAG_WRITE);
    157157
    158158  return rc;
     
    172172  rc = DosSetMem(lpMemAddr, size, flags);
    173173  switch(rc) {
    174         case ERROR_INVALID_ADDRESS:
    175                 return OSLIB_ERROR_INVALID_ADDRESS;
    176         case ERROR_ACCESS_DENIED:
    177                 return OSLIB_ERROR_ACCESS_DENIED;
    178         default:
    179                 return rc;
     174        case ERROR_INVALID_ADDRESS:
     175                return OSLIB_ERROR_INVALID_ADDRESS;
     176        case ERROR_ACCESS_DENIED:
     177                return OSLIB_ERROR_ACCESS_DENIED;
     178        default:
     179                return rc;
    180180  }
    181181}
     
    191191
    192192  if(flags & OSLIB_ACCESS_READONLY)
    193         os2flags |= OPEN_ACCESS_READONLY;
     193        os2flags |= OPEN_ACCESS_READONLY;
    194194  else
    195195  if(flags & OSLIB_ACCESS_READWRITE)
    196         os2flags |= OPEN_ACCESS_READWRITE;
     196        os2flags |= OPEN_ACCESS_READWRITE;
    197197
    198198  if(flags & OSLIB_ACCESS_SHAREDENYNONE)
    199         os2flags |= OPEN_SHARE_DENYNONE;
     199        os2flags |= OPEN_SHARE_DENYNONE;
    200200  else
    201201  if(flags & OSLIB_ACCESS_SHAREDENYREAD)
    202         os2flags |= OPEN_SHARE_DENYREAD;
     202        os2flags |= OPEN_SHARE_DENYREAD;
    203203  else
    204204  if(flags & OSLIB_ACCESS_SHAREDENYWRITE)
    205         os2flags |= OPEN_SHARE_DENYWRITE;
     205        os2flags |= OPEN_SHARE_DENYWRITE;
    206206
    207207tryopen:
     
    217217
    218218  if(rc) {
    219         if(rc == ERROR_TOO_MANY_OPEN_FILES) {
    220         ULONG CurMaxFH;
     219        if(rc == ERROR_TOO_MANY_OPEN_FILES) {
     220        ULONG CurMaxFH;
    221221         LONG  ReqCount = 32;
    222222
    223                 rc = DosSetRelMaxFH(&ReqCount, &CurMaxFH);
    224                 if(rc) {
    225                         dprintf(("DosSetRelMaxFH returned %d", rc));
    226                         return 0;
    227                 }
    228                 dprintf(("DosOpen failed -> increased nr open files to %d", CurMaxFH));
    229                 goto tryopen;
    230         }
    231         return 0;
    232   }
    233   else  return hFile;
     223                rc = DosSetRelMaxFH(&ReqCount, &CurMaxFH);
     224                if(rc) {
     225                        dprintf(("DosSetRelMaxFH returned %d", rc));
     226                        return 0;
     227                }
     228                dprintf(("DosOpen failed -> increased nr open files to %d", CurMaxFH));
     229                goto tryopen;
     230        }
     231        return 0;
     232  }
     233  else  return hFile;
    234234}
    235235//******************************************************************************
     
    247247 APIRET rc;
    248248
    249         rc = DosSetRelMaxFH(&ReqCount, &CurMaxFH);
    250         if(rc) {
    251                 dprintf(("DosSetRelMaxFH returned %d", rc));
    252                 return rc;
    253         }
    254         if(ReqCount + ODIN_INCREMENT_MAX_FILEHANDLES > CurMaxFH) {
    255                 ReqCount = CurMaxFH + ODIN_INCREMENT_MAX_FILEHANDLES;
    256                 rc = DosSetRelMaxFH(&ReqCount, &CurMaxFH);
    257                 if(rc) {
    258                         dprintf(("DosSetRelMaxFH returned %d", rc));
    259                         return rc;
    260                 }
    261         }
    262         return 0;
     249        rc = DosSetRelMaxFH(&ReqCount, &CurMaxFH);
     250        if(rc) {
     251                dprintf(("DosSetRelMaxFH returned %d", rc));
     252                return rc;
     253        }
     254        if(ReqCount + ODIN_INCREMENT_MAX_FILEHANDLES > CurMaxFH) {
     255                ReqCount = CurMaxFH + ODIN_INCREMENT_MAX_FILEHANDLES;
     256                rc = DosSetRelMaxFH(&ReqCount, &CurMaxFH);
     257                if(rc) {
     258                        dprintf(("DosSetRelMaxFH returned %d", rc));
     259                        return rc;
     260                }
     261        }
     262        return 0;
    263263}
    264264//******************************************************************************
     
    270270 APIRET rc;
    271271
    272         rc = DosSetRelMaxFH(&ReqCount, &CurMaxFH);
    273         if(rc) {
    274                 dprintf(("DosSetRelMaxFH returned %d", rc));
    275                 return rc;
    276         }
    277         if(CurMaxFH < maxhandles) {
    278                 rc = DosSetMaxFH(maxhandles);
    279                 if(rc) {
    280                         dprintf(("DosSetMaxFH returned %d", rc));
    281                         return rc;
    282                 }
    283         }
    284         return 0;
     272        rc = DosSetRelMaxFH(&ReqCount, &CurMaxFH);
     273        if(rc) {
     274                dprintf(("DosSetRelMaxFH returned %d", rc));
     275                return rc;
     276        }
     277        if(CurMaxFH < maxhandles) {
     278                rc = DosSetMaxFH(maxhandles);
     279                if(rc) {
     280                        dprintf(("DosSetMaxFH returned %d", rc));
     281                        return rc;
     282                }
     283        }
     284        return 0;
    285285}
    286286//******************************************************************************
     
    306306  switch(method) {
    307307  case OSLIB_SETPTR_FILE_CURRENT:
    308         os2method = FILE_CURRENT;
    309         break;
     308        os2method = FILE_CURRENT;
     309        break;
    310310  case OSLIB_SETPTR_FILE_BEGIN:
    311         os2method = FILE_BEGIN  ;
    312         break;
     311        os2method = FILE_BEGIN  ;
     312        break;
    313313  case OSLIB_SETPTR_FILE_END:
    314         os2method = FILE_END;
    315         break;
     314        os2method = FILE_END;
     315        break;
    316316  default:
    317         return OSLIB_ERROR_INVALID_PARAMETER;
     317        return OSLIB_ERROR_INVALID_PARAMETER;
    318318  }
    319319  rc = DosSetFilePtr(hFile, offset, os2method, &newoffset);
    320320  if(rc) {
    321         return -1;
    322   }
    323   else  return newoffset;
    324 }
    325 //******************************************************************************
    326 //******************************************************************************
    327 //@@@PH Note: this routine is nothing but a QUICK'N'DIRTY HACK!
    328 //@@@PH       this function should be implemented accordingly to NTDLL's
    329 //            RtlSecondsSince1980ToTime
    330 //            RtlTimeToSecondsSince1980
    331 static void iFDATEFTIME2FILETIME(FDATE fdOS2, FTIME ftOS2, LPFILETIME pftWin32)
    332 {
    333   float f;
    334   #define facSECOND 2                // as encoded in OS/2
    335   #define facMINUTE 60
    336   #define facHOUR   3600
    337   #define facDAY    86400
    338   #define facMONTH  facDAY * 30      // cough, cough :)
    339   #define facYEAR   facDAY * 365
    340 
    341   /* pftWin32 is 100ns based from 01.01.1601 00:00:00 */
    342   f =   (fdOS2.year  +  379) * facYEAR        // 1980 - 1601
    343       + (fdOS2.month - 0   ) * facMONTH
    344       + (fdOS2.day   - 1   ) * facDAY
    345       + (ftOS2.hours       ) * facHOUR
    346       + (ftOS2.minutes     ) * facMINUTE
    347       + (ftOS2.twosecs     ) * facSECOND;
    348 
    349   f *= 10000; // convert to 100ns base
    350   pftWin32->dwHighDateTime = (f / (float)(0xffffffff) );
    351   pftWin32->dwLowDateTime  = (f - (float)((float)pftWin32->dwHighDateTime *
    352                                           (float)0xffffffff) );
    353 }
    354 
     321        return -1;
     322  }
     323  else  return newoffset;
     324}
     325//******************************************************************************
     326//******************************************************************************
     327BOOL pmDateTimeToFileTime(FDATE *pDate,FTIME *pTime,FILETIME *pFT)
     328{
     329  USHORT dosTime, dosDate;
     330
     331  dosTime = *(USHORT*)pTime;
     332  dosDate = *(USHORT*)pDate;
     333
     334  return DosDateTimeToFileTime(dosDate,dosTime,pFT);
     335}
     336//******************************************************************************
     337//******************************************************************************
    355338BOOL OSLibDosGetFileAttributesEx(PSZ   pszName,
    356339                                 ULONG ulDummy,
     
    371354  // convert structure
    372355  lpFad->dwFileAttributes = fs3.attrFile; // directly interchangeable
    373   iFDATEFTIME2FILETIME(fs3.fdateCreation,   fs3.ftimeCreation,   &lpFad->ftCreationTime);
    374   iFDATEFTIME2FILETIME(fs3.fdateLastAccess, fs3.ftimeLastAccess, &lpFad->ftLastAccessTime);
    375   iFDATEFTIME2FILETIME(fs3.fdateLastWrite,  fs3.ftimeLastWrite,  &lpFad->ftLastWriteTime);
     356  pmDateTimeToFileTime(&fs3.fdateCreation,   &fs3.ftimeCreation,   &lpFad->ftCreationTime);
     357  pmDateTimeToFileTime(&fs3.fdateLastAccess, &fs3.ftimeLastAccess, &lpFad->ftLastAccessTime);
     358  pmDateTimeToFileTime(&fs3.fdateLastWrite,  &fs3.ftimeLastWrite,  &lpFad->ftLastWriteTime);
    376359
    377360  /* @@@PH we might add Aurora support ...
     
    386369DWORD WIN32API GetEnvironmentVariableA(LPCSTR, LPSTR, DWORD );
    387370//******************************************************************************
    388 DWORD OSLibDosSearchPath(DWORD cmd, char *path, char *name, char *full_name, 
     371DWORD OSLibDosSearchPath(DWORD cmd, char *path, char *name, char *full_name,
    389372                         DWORD length_fullname)
    390373{
    391374  switch(cmd) {
    392375  case OSLIB_SEARCHDIR:
    393         if(DosSearchPath(SEARCH_IGNORENETERRS, path,
     376        if(DosSearchPath(SEARCH_IGNORENETERRS, path,
    394377                         name, full_name, length_fullname) != 0) {
    395                 return 0;
    396         }
    397         return strlen(full_name);
     378                return 0;
     379        }
     380        return strlen(full_name);
    398381
    399382
    400383  case OSLIB_SEARCHCURDIR:
    401         if(DosSearchPath(SEARCH_IGNORENETERRS | SEARCH_CUR_DIRECTORY, path,
     384        if(DosSearchPath(SEARCH_IGNORENETERRS | SEARCH_CUR_DIRECTORY, path,
    402385                         name, full_name, length_fullname) != 0) {
    403                 return 0;
    404         }
    405         return strlen(full_name);
     386                return 0;
     387        }
     388        return strlen(full_name);
    406389
    407390  case OSLIB_SEARCHFILE:
     
    409392    FILESTATUS3 fileinfo;
    410393
    411         if(DosQueryPathInfo(name, FIL_STANDARD, &fileinfo, sizeof(fileinfo)) != 0) {
    412                 return 0;
    413         }
    414         strncpy(full_name, name, length_fullname);
    415         return strlen(full_name);
     394        if(DosQueryPathInfo(name, FIL_STANDARD, &fileinfo, sizeof(fileinfo)) != 0) {
     395                return 0;
     396        }
     397        strncpy(full_name, name, length_fullname);
     398        return strlen(full_name);
    416399  }
    417400
     
    422405   CHAR  szResult[CCHMAXPATH];
    423406
    424         envsize = GetEnvironmentVariableA(path, NULL, 0);
    425         envstring = (LPSTR)malloc(envsize+1);
    426         GetEnvironmentVariableA(path, envstring, envsize);
    427         if(DosSearchPath(SEARCH_IGNORENETERRS, envstring,
     407        envsize = GetEnvironmentVariableA(path, NULL, 0);
     408        envstring = (LPSTR)malloc(envsize+1);
     409        GetEnvironmentVariableA(path, envstring, envsize);
     410        if(DosSearchPath(SEARCH_IGNORENETERRS, envstring,
    428411                         name, szResult, sizeof(szResult)) != 0) {
    429                 free(envstring);
    430                 return 0;
    431         }
    432         free(envstring);
    433         strcpy(full_name, szResult);
    434         return strlen(full_name);
     412                free(envstring);
     413                return 0;
     414        }
     415        free(envstring);
     416        strcpy(full_name, szResult);
     417        return strlen(full_name);
    435418  }
    436419  }
     
    554537    return -1;
    555538  }
    556   else  return newoffset;
     539  else  return newoffset;
    557540}
    558541//******************************************************************************
     
    579562//Returns time spent in kernel & user mode in milliseconds
    580563//******************************************************************************
    581 BOOL OSLibDosQueryProcTimes(DWORD procid, ULONG *kerneltime, ULONG *usertime) 
     564BOOL OSLibDosQueryProcTimes(DWORD procid, ULONG *kerneltime, ULONG *usertime)
    582565{
    583566 APIRET rc;
     
    592575
    593576  if(rc) {
    594         free(buf);
    595         if(rc == ERROR_BUFFER_OVERFLOW) {
    596                 nrthreads += 4;
    597                 goto tryagain;
    598         }
    599         return FALSE;
     577        free(buf);
     578        if(rc == ERROR_BUFFER_OVERFLOW) {
     579                nrthreads += 4;
     580                goto tryagain;
     581        }
     582        return FALSE;
    600583  }
    601584  PQTOPLEVEL top = (PQTOPLEVEL)buf;
     
    604587  *usertime = 0;
    605588  for(int i=0;i<top->procdata->threadcnt;i++) {
    606         *kerneltime += top->procdata->threads[i].systime;
    607         *usertime   += top->procdata->threads[i].usertime;
     589        *kerneltime += top->procdata->threads[i].systime;
     590        *usertime   += top->procdata->threads[i].usertime;
    608591  }
    609592  free(buf);
     
    613596//******************************************************************************
    614597// TODO: implement SecurityAttributes parameter
    615 DWORD OSLibDosCreateNamedPipe(LPCTSTR lpName, 
    616                                DWORD   dwOpenMode, 
     598DWORD OSLibDosCreateNamedPipe(LPCTSTR lpName,
     599                               DWORD   dwOpenMode,
    617600                               DWORD   dwPipeMode,
    618                                DWORD   nMaxInstances, 
     601                               DWORD   nMaxInstances,
    619602                               DWORD   nOutBufferSize,
    620                                DWORD   nInBufferSize, 
     603                               DWORD   nInBufferSize,
    621604                               DWORD   nDefaultTimeOut,
    622605                               void*   lpSecurityAttributes)
    623606{  DWORD dwOS2Mode     = 0;
    624607   DWORD dwOS2PipeMode = 0;
    625    LPSTR lpOS2Name; 
     608   LPSTR lpOS2Name;
    626609   DWORD hPipe;
    627610   DWORD rc;
    628    
     611
    629612  if (dwOpenMode & PIPE_ACCESS_DUPLEX_W)
    630613    dwOS2Mode |= NP_ACCESS_DUPLEX;
     
    679662                    dwOS2PipeMode,
    680663                    nInBufferSize,
    681                     nInBufferSize, 
     664                    nInBufferSize,
    682665                    nDefaultTimeOut); // Timeouts must be tested!
    683666
     
    706689// TODO: implement lpOverlapped parameter!
    707690BOOL OSLibDosConnectNamedPipe(DWORD hNamedPipe, LPOVERLAPPED lpOverlapped)
    708 { 
     691{
    709692 DWORD rc;
    710693
     
    714697  if (!rc) return (TRUE);
    715698    else
    716   if (rc==ERROR_BROKEN_PIPE) SetLastError(ERROR_BROKEN_PIPE_W);   
     699  if (rc==ERROR_BROKEN_PIPE) SetLastError(ERROR_BROKEN_PIPE_W);
    717700    else
    718701  if (rc==ERROR_BAD_PIPE) SetLastError(ERROR_BAD_PIPE_W);
     
    723706  // if (rc==ERROR_INTERRUPT)
    724707  SetLastError(ERROR_PIPE_NOT_CONNECTED_W);
    725  
     708
    726709  return (FALSE);
    727710}
     
    761744  if (!rc) return (TRUE);
    762745   else
    763   if ( rc==ERROR_FILE_NOT_FOUND     ) SetLastError(ERROR_FILE_NOT_FOUND_W);   
    764     else
    765   if ( rc==ERROR_PATH_NOT_FOUND     ) SetLastError(ERROR_PATH_NOT_FOUND_W);   
    766     else
    767   if ( rc==ERROR_ACCESS_DENIED      ) SetLastError(ERROR_ACCESS_DENIED_W);   
    768     else
    769   if ( rc==ERROR_MORE_DATA          ) SetLastError(ERROR_MORE_DATA_W);   
    770     else
    771   if ( rc==ERROR_PIPE_BUSY          ) SetLastError(ERROR_PIPE_BUSY_W);   
    772     else
    773   if ( rc==ERROR_BAD_FORMAT         ) SetLastError(ERROR_BAD_FORMAT_W);   
    774     else
    775   if ( rc==ERROR_BROKEN_PIPE        ) SetLastError(ERROR_BROKEN_PIPE_W);   
     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);
    776759    else
    777760  if ( rc==ERROR_BAD_PIPE           ) SetLastError(ERROR_BAD_PIPE_W);
     
    808791  if (!rc) return (TRUE);
    809792   else
    810   if ( rc==ERROR_ACCESS_DENIED      ) SetLastError(ERROR_ACCESS_DENIED_W);   
    811     else
    812   if ( rc==ERROR_MORE_DATA          ) SetLastError(ERROR_MORE_DATA_W);   
    813     else
    814   if ( rc==ERROR_PIPE_BUSY          ) SetLastError(ERROR_PIPE_BUSY_W);   
    815     else
    816   if ( rc==ERROR_BAD_FORMAT         ) SetLastError(ERROR_BAD_FORMAT_W);   
    817     else
    818   if ( rc==ERROR_BROKEN_PIPE        ) SetLastError(ERROR_BROKEN_PIPE_W);   
     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);
    819802    else
    820803  if ( rc==ERROR_BAD_PIPE           ) SetLastError(ERROR_BAD_PIPE_W);
     
    830813//******************************************************************************
    831814//******************************************************************************
    832 BOOL OSLibDosPeekNamedPipe(DWORD   hPipe, 
    833                         LPVOID  lpvBuffer, 
     815BOOL OSLibDosPeekNamedPipe(DWORD   hPipe,
     816                        LPVOID  lpvBuffer,
    834817                        DWORD   cbBuffer,
    835                         LPDWORD lpcbRead, 
    836                         LPDWORD lpcbAvail, 
     818                        LPDWORD lpcbRead,
     819                        LPDWORD lpcbAvail,
    837820                        LPDWORD lpcbMessage)
    838821{
     
    842825
    843826  rc=DosPeekNPipe(hPipe,lpvBuffer,cbBuffer,lpcbRead,&availData,&ulDummy);
    844  
     827
    845828  dprintf(("DosPeekNPipe returned rc=%d",rc));
    846829
    847   if (!rc) 
     830  if (!rc)
    848831  {
    849832    *lpcbAvail   = availData.cbpipe;
     
    852835  }
    853836   else
    854   if ( rc==ERROR_ACCESS_DENIED      ) SetLastError(ERROR_ACCESS_DENIED_W);   
    855     else
    856   if ( rc==ERROR_PIPE_BUSY          ) SetLastError(ERROR_PIPE_BUSY_W);   
     837  if ( rc==ERROR_ACCESS_DENIED      ) SetLastError(ERROR_ACCESS_DENIED_W);
     838    else
     839  if ( rc==ERROR_PIPE_BUSY          ) SetLastError(ERROR_PIPE_BUSY_W);
    857840    else
    858841  if ( rc==ERROR_BAD_PIPE           ) SetLastError(ERROR_BAD_PIPE_W);
     
    877860  if (!rc) return TRUE;
    878861    else
    879   if ( rc==ERROR_BROKEN_PIPE        ) SetLastError(ERROR_BROKEN_PIPE_W);   
     862  if ( rc==ERROR_BROKEN_PIPE        ) SetLastError(ERROR_BROKEN_PIPE_W);
    880863    else
    881864  if ( rc==ERROR_BAD_PIPE           ) SetLastError(ERROR_BAD_PIPE_W);
     
    924907  return (FALSE);
    925908}
     909//******************************************************************************
     910//******************************************************************************
     911#define NOT_NORMAL (FILE_ATTRIBUTE_READONLY_W | \
     912                    FILE_ATTRIBUTE_HIDDEN_W |   \
     913                    FILE_ATTRIBUTE_SYSTEM_W |   \
     914                    FILE_ATTRIBUTE_ARCHIVE_W)
     915
     916VOID translateFileResults(FILESTATUS3 *pResult,LPWIN32_FIND_DATAA pFind,CHAR* achName)
     917{
     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;
     931
     932  pmDateTimeToFileTime(&pResult->fdateCreation,&pResult->ftimeCreation,&pFind->ftCreationTime);
     933  pmDateTimeToFileTime(&pResult->fdateLastAccess,&pResult->ftimeLastAccess,&pFind->ftLastAccessTime);
     934  pmDateTimeToFileTime(&pResult->fdateLastWrite,&pResult->ftimeLastWrite,&pFind->ftLastWriteTime);
     935
     936  pFind->nFileSizeHigh = 0; //CB: fixme
     937  pFind->nFileSizeLow = pResult->cbFile;
     938  strcpy(pFind->cFileName,achName);
     939  pFind->cAlternateFileName[0] = 0; //CB: fixme: store 8.3 file name
     940}
     941
     942VOID translateFindResults(FILEFINDBUF3 *pResult,LPWIN32_FIND_DATAA pFind)
     943{
     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;
     957
     958  pmDateTimeToFileTime(&pResult->fdateCreation,&pResult->ftimeCreation,&pFind->ftCreationTime);
     959  pmDateTimeToFileTime(&pResult->fdateLastAccess,&pResult->ftimeLastAccess,&pFind->ftLastAccessTime);
     960  pmDateTimeToFileTime(&pResult->fdateLastWrite,&pResult->ftimeLastWrite,&pFind->ftLastWriteTime);
     961
     962  pFind->nFileSizeHigh = 0; //CB: fixme
     963  pFind->nFileSizeLow = pResult->cbFile;
     964  strcpy(pFind->cFileName,pResult->achName);
     965  pFind->cAlternateFileName[0] = 0; //CB: fixme: store 8.3 file name
     966}
     967//******************************************************************************
     968//******************************************************************************
     969DWORD OSLibDosFindFirst(LPCSTR lpFileName,WIN32_FIND_DATAA* lpFindFileData)
     970{
     971  HDIR hDir = -1;
     972  ULONG attrs;
     973  FILEFINDBUF3 result;
     974  ULONG searchCount = 1;
     975
     976  attrs = FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY | FILE_ARCHIVED;
     977
     978  DosError(FERR_DISABLEHARDERR | FERR_DISABLEEXCEPTION);
     979  APIRET rc = DosFindFirst((PSZ)lpFileName,&hDir,attrs,&result,sizeof(result),&searchCount,FIL_STANDARD);
     980  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
     988  translateFindResults(&result,lpFindFileData);
     989
     990  return hDir;
     991}
     992//******************************************************************************
     993//******************************************************************************
     994DWORD OSLibDosFindFirstMulti(LPCSTR lpFileName,WIN32_FIND_DATAA *lpFindFileData,DWORD *count)
     995{
     996  HDIR hDir = -1;
     997  ULONG attrs;
     998  FILEFINDBUF3 *result,*data;
     999  ULONG searchCount = *count;
     1000
     1001  attrs = FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY | FILE_ARCHIVED;
     1002  result = (FILEFINDBUF3*)malloc(searchCount*sizeof(FILEFINDBUF3));
     1003
     1004  DosError(FERR_DISABLEHARDERR | FERR_DISABLEEXCEPTION);
     1005  APIRET rc = DosFindFirst((PSZ)lpFileName,&hDir,attrs,result,searchCount*sizeof(FILEFINDBUF3),&searchCount,FIL_STANDARD);
     1006  DosError(FERR_ENABLEHARDERR | FERR_ENABLEEXCEPTION);
     1007  if (rc)
     1008  {
     1009    free(result);
     1010    *count = 0;
     1011    SetLastError(ERROR_PATH_NOT_FOUND_W);  //CB: fixme: better error handling
     1012
     1013    return INVALID_HANDLE_VALUE_W;
     1014  }
     1015
     1016  data = result;
     1017  for (int x = 0;x < searchCount;x++)
     1018  {
     1019    translateFindResults(data,&lpFindFileData[x]);
     1020    data = (FILEFINDBUF3*)(((DWORD)data)+data->oNextEntryOffset);
     1021  }
     1022  free(result);
     1023  *count = searchCount;
     1024
     1025  return hDir;
     1026}
     1027//******************************************************************************
     1028//******************************************************************************
     1029BOOL  OSLibDosFindNext(DWORD hFindFile,WIN32_FIND_DATAA *lpFindFileData)
     1030{
     1031  FILEFINDBUF3 result;
     1032  ULONG searchCount = 1;
     1033
     1034  APIRET rc = DosFindNext((HDIR)hFindFile,&result,sizeof(result),&searchCount);
     1035  if (rc)
     1036  {
     1037    SetLastError(ERROR_INVALID_HANDLE_W); //CB: fixme: better error code
     1038
     1039    return FALSE;
     1040  }
     1041
     1042  translateFindResults(&result,lpFindFileData);
     1043
     1044  return TRUE;
     1045}
     1046//******************************************************************************
     1047//******************************************************************************
     1048BOOL  OSLibDosFindNextMulti(DWORD hFindFile,WIN32_FIND_DATAA *lpFindFileData,DWORD *count)
     1049{
     1050  FILEFINDBUF3 *result,*data;
     1051  ULONG searchCount = *count;
     1052
     1053  result = (FILEFINDBUF3*)malloc(searchCount*sizeof(FILEFINDBUF3));
     1054  APIRET rc = DosFindNext((HDIR)hFindFile,result,searchCount*sizeof(FILEFINDBUF3),&searchCount);
     1055  if (rc)
     1056  {
     1057    free(result);
     1058    *count = 0;
     1059    SetLastError(ERROR_INVALID_HANDLE_W); //CB: fixme: better error code
     1060
     1061    return FALSE;
     1062  }
     1063
     1064  data = result;
     1065  for (int x = 0;x < searchCount;x++)
     1066  {
     1067    translateFindResults(data,&lpFindFileData[x]);
     1068    data = (FILEFINDBUF3*)(((DWORD)data)+data->oNextEntryOffset);
     1069  }
     1070  free(result);
     1071  *count = searchCount;
     1072
     1073  return TRUE;
     1074}
     1075//******************************************************************************
     1076//******************************************************************************
     1077BOOL  OSLibDosFindClose(DWORD hFindFile)
     1078{
     1079  APIRET rc = DosFindClose((HDIR)hFindFile);
     1080  if (rc)
     1081  {
     1082    SetLastError(ERROR_INVALID_HANDLE_W);
     1083
     1084    return FALSE;
     1085  }
     1086
     1087  return TRUE;
     1088}
Note: See TracChangeset for help on using the changeset viewer.