kolibrios-fun/programs/develop/open watcom/trunk/clib/handleio/stiomode.c
Sergey Semyonov (Serge) 52facee6d5 handleio
git-svn-id: svn://kolibrios.org@613 a494cfbc-eb01-0410-851d-a64ba20cac60
2007-08-26 09:08:14 +00:00

176 lines
4.7 KiB
C

/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
* DESCRIBE IT HERE!
*
****************************************************************************/
#include "variety.h"
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include "rtdata.h"
#include "liballoc.h"
#include "fileacc.h"
#include "rtinit.h"
#include "seterrno.h"
#include "iomode.h"
#include "handleio.h"
#ifdef DLHEAP
void* _cdecl dlmalloc(size_t);
void _cdecl dlfree(void*);
void _cdecl mf_init();
#define malloc dlmalloc
#define free dlfree
#define realloc dlrealloc
#define lib_malloc dlmalloc
#define lib_free dlfree
#define lib_realloc dlrealloc
#endif
#if defined(__NETWARE__)
#error NO IO MODE MANAGER UNDER NETWARE
#endif
extern unsigned _HUGEDATA __init_mode[_NFILES];
extern unsigned __NFiles; /* maximum # of files we can open */
static unsigned _init_NFiles; // original __NFiles value;
void __grow_iomode( int num )
{
unsigned *new;
_AccessIOB();
if( __io_mode == __init_mode )
{
_init_NFiles = __NFiles;
new = (unsigned *) lib_malloc( num * sizeof( unsigned ) );
if( new != NULL ) {
memcpy( new, __init_mode, __NFiles * sizeof(unsigned) );
}
}
else
{
#if defined(__NETWARE__)
#else
new = (unsigned *) lib_realloc( __io_mode, num * sizeof( unsigned ) );
#endif
}
if( new == NULL )
{
__set_errno( ENOMEM );
}
else
{
memset( &new[__NFiles], 0, (num-__NFiles)*sizeof(unsigned) );
__io_mode = new;
__NFiles = num;
}
_ReleaseIOB();
}
void __shrink_iomode( void )
{
_AccessIOB();
// free any malloc'd iomode array
if( __io_mode != __init_mode )
{
lib_free( __io_mode );
__io_mode = __init_mode;
__NFiles = _init_NFiles;
}
_ReleaseIOB();
}
AYI(__shrink_iomode,INIT_PRIORITY_IOSTREAM);
#if defined(__WARP__)
extern unsigned __NHandles;
static void __preinit_iomode_os2(void)
{
LONG req_count;
ULONG curr_max_fh;
APIRET rc;
// Ensure that the clib and OS file handle limits match
req_count = 0;
rc = DosSetRelMaxFH( &req_count, &curr_max_fh );
if( rc == 0 ) {
__grow_iomode( curr_max_fh );
__NHandles = curr_max_fh; // same as __set_handles
}
}
AXI( __preinit_iomode_os2, INIT_PRIORITY_RUNTIME );
#endif
#define _INITIALIZED _DYNAMIC
signed __SetIOMode( int handle, unsigned value )
{
int i;
if( handle >= __NFiles )
{
i = __NFiles; // 20 -> (20+10+1) -> 31
// 31 -> (31+15+1) -> 47
// 47 -> (47+23+1) -> 71
__grow_iomode( i + (i > 1) + 1 );
}
if( handle >= __NFiles )
{
// return an error indication (errno should be set to ENOMEM)
return( -1 );
}
else
{
if( value != 0 )
{
__ChkTTYIOMode( handle );
__io_mode[handle] = value | _INITIALIZED;
}
else
{
__io_mode[handle] = value; /* we're closing it; smite _INITIALIZED */
}
return( handle );
}
}