Subversion Repositories Kolibri OS

Rev

Rev 359 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /****************************************************************************
  2. *
  3. *                            Open Watcom Project
  4. *
  5. *    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
  6. *
  7. *  ========================================================================
  8. *
  9. *    This file contains Original Code and/or Modifications of Original
  10. *    Code as defined in and that are subject to the Sybase Open Watcom
  11. *    Public License version 1.0 (the 'License'). You may not use this file
  12. *    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
  13. *    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
  14. *    provided with the Original Code and Modifications, and is also
  15. *    available at www.sybase.com/developer/opensource.
  16. *
  17. *    The Original Code and all software distributed under the License are
  18. *    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  19. *    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
  20. *    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
  21. *    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
  22. *    NON-INFRINGEMENT. Please see the License for the specific language
  23. *    governing rights and limitations under the License.
  24. *
  25. *  ========================================================================
  26. *
  27. * Description:  Handle manager routines.
  28. *
  29. ****************************************************************************/
  30.  
  31.  
  32. #include "variety.h"
  33. #include <stdio.h>
  34. #include <stdlib.h>
  35. #include "liballoc.h"
  36. #include <string.h>
  37. #ifdef _M_IX86
  38.  #include <i86.h>
  39. #endif
  40. #include <unistd.h>
  41. #include <errno.h>
  42. #if defined(__OS2__)
  43. #elif defined(__WINDOWS__) || defined(__NT__)
  44. #endif
  45. #include "iomode.h"
  46. #include "fileacc.h"
  47. #include "rtinit.h"
  48. #include "seterrno.h"
  49. #include "handleio.h"
  50.  
  51. #undef __getOSHandle
  52.  
  53. extern  unsigned    __NFiles;       // the size of the iomode array
  54. extern  void        __grow_iomode( int num );
  55.         unsigned    __NHandles = 0;
  56.  
  57. #if defined(__NT__)
  58.  
  59. HANDLE *__OSHandles = NULL;
  60.  
  61. unsigned __growPOSIXHandles( unsigned num )
  62. {
  63.     HANDLE *new2;
  64.     unsigned i;
  65.  
  66.     if( num > __NHandles )
  67.     {
  68.         _AccessFList();
  69.         if( __OSHandles == NULL )
  70.         {
  71.             new2 = lib_malloc( num * sizeof( int ) );
  72.         }
  73.         else
  74.         {
  75.             new2 = lib_realloc( __OSHandles, num * sizeof( int ) );
  76.         }
  77.         if( new2 == NULL )
  78.         {
  79.             __set_errno( ENOMEM );
  80.             num = __NHandles;
  81.         }
  82.         else
  83.         {
  84.             for( i = __NHandles; i < num; i++ )
  85.             {
  86.                 new2[ i ] = NULL_HANDLE;
  87.             }
  88.             __OSHandles = new2;
  89.             __NHandles = num;
  90.         }
  91.         _ReleaseFList();
  92.     }
  93.     return( __NHandles );
  94. }
  95.  
  96. int __allocPOSIXHandle( HANDLE hdl )
  97. {
  98.     int i;
  99.  
  100.     _AccessFList();
  101.     for( i = 0; i < __NHandles; i++ )
  102.     {
  103.         if( __OSHandles[i] == NULL_HANDLE ) break;
  104.     }
  105.     if( i >= __NHandles )
  106.     {
  107.                                 // 20 -> (20+10+1) -> 31
  108.                                 // 31 -> (31+15+1) -> 47
  109.                                 // 47 -> (47+23+1) -> 71
  110.         __growPOSIXHandles( i + (i >> 1) + 1 );
  111.         // keep iomode array in sync
  112.         if( __NHandles > __NFiles ) __grow_iomode( __NHandles );
  113.         for( ; i < __NHandles; i++ )
  114.         {
  115.             if( __OSHandles[i] == NULL_HANDLE ) break;
  116.         }
  117.     }
  118.     if( i >= __NHandles )
  119.     {
  120.         i = -1;
  121.     } else {
  122.         __OSHandles[i] = hdl;
  123.     }
  124.     _ReleaseFList();
  125.     return( i );
  126. }
  127.  
  128. void __freePOSIXHandle( int hid )
  129. {
  130.     __OSHandles[ hid ] = NULL_HANDLE;
  131. }
  132.  
  133.  
  134. HANDLE __getOSHandle( int hid )
  135. {
  136.     return( __OSHandles[ hid ] );
  137. }
  138.  
  139.  
  140. int __setOSHandle( unsigned hid, HANDLE hdl )
  141. {
  142.     // call the Win32 API for a standard file handle
  143.     switch( hid ) {
  144.     case STDIN_FILENO:
  145. //        SetStdHandle( STD_INPUT_HANDLE, hdl );
  146.         break;
  147.     case STDOUT_FILENO:
  148. //        SetStdHandle( STD_OUTPUT_HANDLE, hdl );
  149.         break;
  150.     case STDERR_FILENO:
  151. //        SetStdHandle( STD_ERROR_HANDLE, hdl );
  152.         break;
  153.     }
  154.     if( hid < __NHandles )
  155.     {
  156.         __OSHandles[ hid ] = hdl;
  157.     }
  158.     else
  159.     {
  160.         hid = (unsigned)-1;     // this should never happen
  161.     }
  162.     return( hid );
  163. }
  164.  
  165. HANDLE *__FakeHandles = 0;
  166. static int __topFakeHandle = 0;
  167.  
  168. HANDLE __NTGetFakeHandle( void )
  169. {
  170.     HANDLE os_handle;
  171.     static DWORD fakeHandle = 0x80000000L;
  172.     _AccessFList();
  173.  
  174.     fakeHandle++;
  175.     os_handle = (HANDLE)fakeHandle;
  176.     _ReleaseFList();
  177.     return( os_handle );
  178. }
  179.  
  180. // called from library startup code
  181.  
  182. void __initPOSIXHandles( void )
  183. {
  184.     HANDLE h;
  185.  
  186.     // __OSHandles = NULL;
  187.     // __NHandles = 0;
  188.  
  189.     __growPOSIXHandles( __NFiles );
  190.     h = 0; //GetStdHandle( STD_INPUT_HANDLE );
  191.     if( h == 0 || h == INVALID_HANDLE_VALUE ) {
  192.         h = (HANDLE)__NTGetFakeHandle();
  193.     }
  194.     __allocPOSIXHandle( h );        // should return 0==STDIN_FILENO
  195.     h = 0; //GetStdHandle( STD_OUTPUT_HANDLE );
  196.     if( h == 0 || h == INVALID_HANDLE_VALUE ) {
  197.         h = (HANDLE)__NTGetFakeHandle();
  198.     }
  199.     __allocPOSIXHandle( h );        // should return 1==STDOUT_FILENO
  200.     h = 0; //GetStdHandle( STD_ERROR_HANDLE );
  201.     if( h == 0 || h == INVALID_HANDLE_VALUE ) {
  202.         h = (HANDLE)__NTGetFakeHandle();
  203.     }
  204.     __allocPOSIXHandle( h );        // should return 3==STDERR_FILENO
  205. }
  206.  
  207. static void __finiPOSIXHandles( void )
  208. {
  209.     if( __OSHandles != NULL ) {
  210.         lib_free( __OSHandles );
  211.         __OSHandles = NULL;
  212.     }
  213.     if( __FakeHandles != NULL )
  214.     {
  215.         int i;
  216.         for( i = 0 ; i < __topFakeHandle ; i++ )
  217.         {
  218.           //  CloseHandle( __FakeHandles[i] );
  219.         }
  220.         lib_free( __FakeHandles );
  221.         __FakeHandles = 0;
  222.     }
  223. }
  224.  
  225. AYI( __finiPOSIXHandles, INIT_PRIORITY_LIBRARY-1 )
  226.  
  227. #endif
  228.  
  229.  
  230. void __set_handles( int num )
  231. {
  232.     __NHandles = num;
  233. }
  234.  
  235. _WCRTLINK int _grow_handles( int num )
  236. {
  237.     if( num > __NHandles )
  238.     {
  239.         #if defined(MSDOS)
  240.         #elif defined( __OS2_286__ )
  241.         #elif defined( __WARP__ )
  242.         #elif defined(__WINDOWS__)
  243.         #elif defined(__NT__)
  244.         {
  245.             num = __growPOSIXHandles( num );
  246.         }
  247.         #elif defined(__NETWARE__)
  248.         #elif defined(__UNIX__)
  249.         #endif
  250.  
  251.         if( num > __NFiles ) {
  252.             __grow_iomode( num );   // sets new __NFiles if successful
  253.         }
  254.         __NHandles = num;
  255.     }
  256.     return( __NHandles );
  257. }
  258.