_WCRTLINK unsigned _dos_findnext( struct find_t *buf ) { /*****************************************************/ #if defined(__OS2_286__) if( _RWD_osmode == OS2_MODE ) { /* protected mode */ #endif APIRET rc; FF_BUFFER dir_buff; OS_UINT searchcount = 1; rc = DosFindNext( FIND_HANDLE_OF( buf ), (PVOID)&dir_buff, sizeof( dir_buff ), &searchcount ); if( rc != 0 ) { return( __set_errno_dos_reterr( rc ) ); } copydir( buf, &dir_buff ); #if defined(__OS2_286__) } else { /* real mode */ tiny_ret_t rc; void __far * old_dta; old_dta = TinyFarChangeDTA( buf ); /* set our DTA */ rc = TinyFindNext(); TinyFarSetDTA( old_dta ); /* restore DTA */ if( TINY_ERROR( rc ) ) { return( __set_errno_dos_reterr( TINY_INFO( rc ) ) ); } } #endif return( 0 ); }
_WCRTLINK unsigned _dos_allocmem( unsigned size, mem_id *p_mem ) // Note: size is in paragraphs of 16 bytes { APIRET rc; #if defined(__386__) || defined(__PPC__) /* Note: _dos_allocmem() needs better documentation for 32-bit since mem is an offset instead a selector value. */ void *mem; rc = DosAllocMem( &mem, size << 4, PAG_COMMIT | PAG_READ | PAG_WRITE ); #elif defined( _M_I86 ) SEL mem; USHORT number_segments, remaining_bytes; number_segments = size >> 12; // Number of 64k segments remaining_bytes = (size << 4) & 0xFFFF; // remainder, < 64k rc = DosAllocHuge( number_segments, remaining_bytes, &mem, 0, 0 ); #else #error platform not supported #endif *p_mem = mem; if( rc ) { return( __set_errno_dos_reterr( rc ) ); } return( 0 ); }
static unsigned _dos_getfileattr_lfn( const char *path, unsigned *attrib ) /************************************************************************/ { #ifdef _M_I86 return( __dos_getfileattr_lfn( path, attrib ) ); #else call_struct dpmi_rm; strcpy( RM_TB_PARM1_LINEAR, path ); memset( &dpmi_rm, 0, sizeof( dpmi_rm ) ); dpmi_rm.ds = RM_TB_PARM1_SEGM; dpmi_rm.edx = RM_TB_PARM1_OFFS; dpmi_rm.ecx = 0; dpmi_rm.ebx = 0; dpmi_rm.eax = 0x7143; dpmi_rm.flags = 1; if( __dpmi_dos_call( &dpmi_rm ) ) { return( -1 ); } if( dpmi_rm.flags & 1 ) { return( __set_errno_dos_reterr( (unsigned short)dpmi_rm.eax ) ); } *attrib = dpmi_rm.ecx; return( 0 ); #endif }
_WCRTLINK unsigned _dos_findfirst( const char *path, unsigned attr, struct find_t *buf ) { HANDLE h; int error; WIN32_FIND_DATA ffb; h = FindFirstFile( (LPTSTR)path, &ffb ); if( h == (HANDLE)-1 ) { HANDLE_OF( buf ) = BAD_HANDLE; return( __set_errno_nt_reterr() ); } // if( attr == _A_NORMAL ) { // attr = ~(_A_SUBDIR|_A_VOLID); // } if( !__NTFindNextFileWithAttr( h, attr, &ffb ) ) { error = GetLastError(); HANDLE_OF( buf ) = BAD_HANDLE; FindClose( h ); return( __set_errno_dos_reterr( error ) ); } HANDLE_OF( buf ) = h; ATTR_OF( buf ) = attr; __GetNTDirInfo( (struct dirent *) buf, &ffb ); return( 0 ); }
_WCRTLINK unsigned _dos_open( const char *name, unsigned mode, int *handle ) { APIRET rc; OS_UINT rwmode, actiontaken, openmode; HFILE fhandle; int share; unsigned iomode_flags; while( *name == ' ' ) ++name; rwmode = mode & OPENMODE_ACCESS_MASK; if( rwmode == OPENMODE_ACCESS_WRONLY #if defined(__OS2_286__) && !_RWD_osmode /* Can't open WRONLY file in bound application under DOS */ #endif ) { rwmode = OPENMODE_ACCESS_RDWR; } share = mode & OPENMODE_SHARE_MASK; if( share == OPENMODE_DENY_COMPAT ) { share = OPENMODE_DENY_NONE; } openmode = share+rwmode; rc = DosOpen( (PSZ)name, &fhandle, &actiontaken, 0ul, _A_NORMAL, OPENFLAG_OPEN_IF_EXISTS, openmode, 0ul ); if( rc ) { return( __set_errno_dos_reterr( rc ) ); } *handle = fhandle; if( rwmode == O_RDWR ) iomode_flags = _READ | _WRITE; if( rwmode == O_RDONLY) iomode_flags = _READ; if( rwmode == O_WRONLY) iomode_flags = _WRITE; __SetIOMode( fhandle, iomode_flags ); return( 0 ); }
_WCRTLINK unsigned _dos_write( int handle, void const _WCI86FAR *buffer, unsigned count, unsigned *bytes ) { APIRET rc; rc = DosWrite( handle, (PVOID)buffer, count, (OS_PUINT)bytes ); if( rc ) { return( __set_errno_dos_reterr( rc ) ); } return( 0 ); }
unsigned _dos_commit( int handle ) { APIRET rc; rc = DosBufReset( handle ); if( rc ) { return( __set_errno_dos_reterr( rc ) ); } return( 0 ); }
unsigned _dos_close( int handle ) { APIRET rc; __SetIOMode_nogrow( handle, 0 ); rc = DosClose( handle ); if( rc ) { return( __set_errno_dos_reterr( rc ) ); } return( 0 ); }
_WCRTLINK unsigned _dos_getfileattr( const char *path, unsigned *attribute ) /**************************************************************************/ { FILESTATUS3 fs; APIRET rc; rc = DosQueryPathInfo( (PSZ)path, FIL_STANDARD, &fs, sizeof( fs ) ); if( rc != 0 ) { return( __set_errno_dos_reterr( rc ) ); } *attribute = fs.attrFile; return( 0 ); }
_WCRTLINK unsigned _dos_findfirst( const char *path, unsigned attr, struct find_t *buf ) { /******************************************************/ #if defined(__OS2_286__) if( _RWD_osmode == OS2_MODE ) { #endif APIRET rc; FF_BUFFER dir_buff; HDIR handle = BAD_HANDLE; OS_UINT searchcount; searchcount = 1; /* only one at a time */ rc = DosFindFirst( (PSZ)path, (PHFILE)&handle, attr, (PVOID)&dir_buff, sizeof( dir_buff ), &searchcount, FF_LEVEL ); if( rc != 0 && rc != ERROR_EAS_DIDNT_FIT ) { FIND_HANDLE_OF( buf ) = BAD_HANDLE; return( __set_errno_dos_reterr( rc ) ); } FIND_HANDLE_OF( buf ) = handle; copydir( buf, &dir_buff ); /* copy in other fields */ #if defined(__OS2_286__) } else { /* real mode */ tiny_ret_t rc; void __far * old_dta; old_dta = TinyFarChangeDTA( buf ); /* set our DTA */ rc = TinyFindFirst( path, attr ); TinyFarSetDTA( old_dta ); /* restore DTA */ if( TINY_ERROR( rc ) ) { return( __set_errno_dos_reterr( TINY_INFO( rc ) ) ); } } #endif return( 0 ); }
_WCRTLINK unsigned _dos_freemem( mem_id mem ) { #if defined(__386__) || defined(__PPC__) APIRET rc; rc = DosFreeMem( mem ); if( rc ) { return( __set_errno_dos_reterr( rc ) ); } return( 0 ); #elif defined( _M_I86 ) // defined inside heap return( __FreeSeg( mem ) ); #else #error platform not supported #endif }
_WCRTLINK unsigned _dos_open( const char *path, unsigned mode, int *handle ) /**************************************************************************/ { #ifdef __WATCOM_LFN__ tiny_ret_t rc = 0; if( _RWD_uselfn && TINY_OK( rc = __dos_open_lfn( path, mode ) ) ) { *handle = TINY_INFO( rc ); return( 0 ); } if( IS_LFN_ERROR( rc ) ) { return( __set_errno_dos_reterr( TINY_INFO( rc ) ) ); } #endif return( __dos_open_sfn_err( path, mode, handle ) ); }
_WCRTLINK unsigned _dos_findclose( struct find_t *fdta ) /******************************************************/ { #if defined( __WATCOM_LFN__ ) tiny_ret_t rc; if( IS_LFN( fdta ) ) { if( TINY_OK( rc = _dos_find_close_lfn( LFN_HANDLE_OF( fdta ) ) ) ) return( 0 ); return( __set_errno_dos_reterr( TINY_INFO( rc ) ) ); } #endif #ifdef __OSI__ return( __dos_find_close_dta( fdta ) ); #else return( 0 ); #endif }
_WCRTLINK unsigned _dos_findnext( struct find_t *fdta ) /*****************************************************/ { #ifdef __WATCOM_LFN__ lfnfind_t lfndta; tiny_ret_t rc; if( IS_LFN( fdta ) ) { rc = _dos_find_next_lfn( LFN_HANDLE_OF( fdta ), &lfndta ); if( TINY_OK( rc ) ) { convert_to_find_t( fdta, &lfndta ); return( 0 ); } return( __set_errno_dos_reterr( TINY_INFO( rc ) ) ); } #endif return( __dos_find_next_dta( fdta ) ); }
_WCRTLINK unsigned _dos_setfileattr( const char *path, unsigned attribute ) { APIRET rc; #if defined(__WARP__) FILESTATUS3 fs; rc = DosQueryPathInfo( (PSZ)path, FIL_STANDARD, &fs, sizeof( fs ) ); if( rc == 0 ) { fs.attrFile = attribute; rc = DosSetPathInfo( (PSZ)path, FIL_STANDARD, &fs, sizeof( fs ), 0 ); } #else rc = DosSetFileMode( (PSZ)path, attribute, 0ul ); #endif if( rc ) { return( __set_errno_dos_reterr( rc ) ); } return( 0 ); }
_WCRTLINK unsigned _dos_open( const char *name, unsigned mode, int *posix_handle ) { HANDLE handle; unsigned rwmode; DWORD share_mode; DWORD desired_access, os_attr; unsigned iomode_flags; int hid; // First try to get the required slot. // No point in creating a file only to not use it. JBS 99/11/01 hid = __allocPOSIXHandle( DUMMY_HANDLE ); if( hid == -1 ) { return( __set_errno_dos_reterr( ERROR_NOT_ENOUGH_MEMORY ) ); } rwmode = mode & OPENMODE_ACCESS_MASK; __GetNTAccessAttr( rwmode, &desired_access, &os_attr ); __GetNTShareAttr( mode & (OPENMODE_SHARE_MASK|OPENMODE_ACCESS_MASK), &share_mode ); handle = CreateFile( (LPTSTR) name, desired_access, share_mode, 0, OPEN_EXISTING, os_attr, NULL ); if( handle == (HANDLE)-1 ) { __freePOSIXHandle( hid ); return( __set_errno_nt_reterr() ); } // Now use the slot we got. __setOSHandle( hid, handle ); // JBS 99/11/01 *posix_handle = hid; iomode_flags = 0; if( rwmode == O_RDWR ) iomode_flags = _READ | _WRITE; if( rwmode == O_RDONLY ) iomode_flags = _READ; if( rwmode == O_WRONLY ) iomode_flags = _WRITE; __SetIOMode( hid, iomode_flags ); return( 0 ); }
_WCRTLINK unsigned _dos_findclose( struct find_t *buf ) { /******************************************************/ APIRET rc; #if defined(__OS2_286__) if( _RWD_osmode == OS2_MODE ) { /* protected mode */ #endif if( FIND_HANDLE_OF( buf ) != BAD_HANDLE ) { rc = DosFindClose( FIND_HANDLE_OF( buf ) ); if( rc != 0 ) { return( __set_errno_dos_reterr( rc ) ); } } #if defined(__OS2_286__) } else { buf = buf; } #endif return( 0 ); }
_WCRTLINK unsigned _dos_findfirst( const char *path, unsigned attrib, struct find_t *fdta ) /******************************************************************************/ { #ifdef __WATCOM_LFN__ lfnfind_t lfndta; tiny_ret_t rc = 0; LFN_SIGN_OF( fdta ) = 0; LFN_HANDLE_OF( fdta ) = 0; if( _RWD_uselfn && TINY_OK( rc = _dos_find_first_lfn( path, attrib, &lfndta ) ) ) { convert_to_find_t( fdta, &lfndta ); LFN_SIGN_OF( fdta ) = _LFN_SIGN; LFN_HANDLE_OF( fdta ) = TINY_INFO( rc ); return( 0 ); } if( IS_LFN_ERROR( rc ) ) { return( __set_errno_dos_reterr( TINY_INFO( rc ) ) ); } #endif return( __dos_find_first_dta( path, attrib, fdta ) ); }
_WCRTLINK unsigned _dos_creat( const char *name, unsigned attribute, int *handle ) { APIRET rc; OS_UINT actiontaken; HFILE fhandle; while( *name == ' ' ) ++name; rc = DosOpen( (PSZ)name, &fhandle, &actiontaken, 0ul, attribute, OPENFLAG_REPLACE_IF_EXISTS | OPENFLAG_CREATE_IF_NOT_EXISTS, OPENMODE_ACCESS_RDWR | OPENMODE_DENY_NONE, 0ul ); if( rc ) { return( __set_errno_dos_reterr( rc ) ); } *handle = fhandle; __SetIOMode( fhandle, _READ | _WRITE ); return( 0 ); }
static unsigned _mkdir_lfn( const char *path ) /********************************************/ { #ifdef _M_I86 return( __mkdir_lfn( path ) ); #else call_struct dpmi_rm; strcpy( RM_TB_PARM1_LINEAR, path ); memset( &dpmi_rm, 0, sizeof( dpmi_rm ) ); dpmi_rm.ds = RM_TB_PARM1_SEGM; dpmi_rm.edx = RM_TB_PARM1_OFFS; dpmi_rm.eax = 0x7139; dpmi_rm.flags = 1; if( __dpmi_dos_call( &dpmi_rm ) ) { return( -1 ); } if( dpmi_rm.flags & 1 ) { return( __set_errno_dos_reterr( (unsigned short)dpmi_rm.eax ) ); } return( 0 ); #endif }
static unsigned _unlink_lfn( const char *filename ) /*************************************************/ { #ifdef _M_I86 return( __unlink_lfn( filename ) ); #else call_struct dpmi_rm; strcpy( RM_TB_PARM1_LINEAR, filename ); memset( &dpmi_rm, 0, sizeof( dpmi_rm ) ); dpmi_rm.ds = RM_TB_PARM1_SEGM; dpmi_rm.edx = RM_TB_PARM1_OFFS; dpmi_rm.esi = 0; dpmi_rm.eax = 0x7141; dpmi_rm.flags = 1; if( __dpmi_dos_call( &dpmi_rm ) ) { return( -1 ); } if( dpmi_rm.flags & 1 ) { return( __set_errno_dos_reterr( (unsigned short)dpmi_rm.eax ) ); } return( 0 ); #endif }