Subversion Repositories Kolibri OS

Rev

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. #ifdef DLHEAP
  52.  
  53. void* _cdecl dlmalloc(size_t);
  54. void  _cdecl dlfree(void*);
  55. void _cdecl mf_init();
  56.  
  57. #define malloc  dlmalloc
  58. #define free    dlfree
  59. #define realloc dlrealloc
  60.  
  61. #define lib_malloc   dlmalloc
  62. #define lib_free     dlfree
  63. #define lib_realloc  dlrealloc
  64.  
  65. #endif
  66.  
  67.  
  68. #undef __getOSHandle
  69.  
  70. extern  unsigned    __NFiles;       // the size of the iomode array
  71. extern  void        __grow_iomode( int num );
  72.         unsigned    __NHandles = 0;
  73.  
  74. #if defined(__NT__)
  75.  
  76. HANDLE *__OSHandles = NULL;
  77.  
  78. unsigned __growPOSIXHandles( unsigned num )
  79. {
  80.     HANDLE *new2;
  81.     unsigned i;
  82.  
  83.     if( num > __NHandles )
  84.     {
  85.         _AccessFList();
  86.         if( __OSHandles == NULL )
  87.         {
  88.             new2 = lib_malloc( num * sizeof( int ) );
  89.         }
  90.         else
  91.         {
  92.             new2 = lib_realloc( __OSHandles, num * sizeof( int ) );
  93.         }
  94.         if( new2 == NULL )
  95.         {
  96.             __set_errno( ENOMEM );
  97.             num = __NHandles;
  98.         }
  99.         else
  100.         {
  101.             for( i = __NHandles; i < num; i++ )
  102.             {
  103.                 new2[ i ] = NULL_HANDLE;
  104.             }
  105.             __OSHandles = new2;
  106.             __NHandles = num;
  107.         }
  108.         _ReleaseFList();
  109.     }
  110.     return( __NHandles );
  111. }
  112.  
  113. int __allocPOSIXHandle( HANDLE hdl )
  114. {
  115.     int i;
  116.  
  117.     _AccessFList();
  118.     for( i = 0; i < __NHandles; i++ )
  119.     {
  120.         if( __OSHandles[i] == NULL_HANDLE ) break;
  121.     }
  122.     if( i >= __NHandles )
  123.     {
  124.                                 // 20 -> (20+10+1) -> 31
  125.                                 // 31 -> (31+15+1) -> 47
  126.                                 // 47 -> (47+23+1) -> 71
  127.         __growPOSIXHandles( i + (i >> 1) + 1 );
  128.         // keep iomode array in sync
  129.         if( __NHandles > __NFiles ) __grow_iomode( __NHandles );
  130.         for( ; i < __NHandles; i++ )
  131.         {
  132.             if( __OSHandles[i] == NULL_HANDLE ) break;
  133.         }
  134.     }
  135.     if( i >= __NHandles )
  136.     {
  137.         i = -1;
  138.     } else {
  139.         __OSHandles[i] = hdl;
  140.     }
  141.     _ReleaseFList();
  142.     return( i );
  143. }
  144.  
  145. void __freePOSIXHandle( int hid )
  146. {
  147.     __OSHandles[ hid ] = NULL_HANDLE;
  148. }
  149.  
  150.  
  151. HANDLE __getOSHandle( int hid )
  152. {
  153.     return( __OSHandles[ hid ] );
  154. }
  155.  
  156. int __setOSHandle( unsigned hid, HANDLE hdl )
  157. {
  158.     // call the Win32 API for a standard file handle
  159.     switch( hid ) {
  160.     case STDIN_FILENO:
  161. //        SetStdHandle( STD_INPUT_HANDLE, hdl );
  162.         break;
  163.     case STDOUT_FILENO:
  164. //        SetStdHandle( STD_OUTPUT_HANDLE, hdl );
  165.         break;
  166.     case STDERR_FILENO:
  167. //        SetStdHandle( STD_ERROR_HANDLE, hdl );
  168.         break;
  169.     }
  170.     if( hid < __NHandles )
  171.     {
  172.         __OSHandles[ hid ] = hdl;
  173.     }
  174.     else
  175.     {
  176.         hid = (unsigned)-1;     // this should never happen
  177.     }
  178.     return( hid );
  179. }
  180.  
  181. HANDLE *__FakeHandles = 0;
  182. static int __topFakeHandle = 0;
  183.  
  184. HANDLE __NTGetFakeHandle( void )
  185. {
  186.     HANDLE os_handle;
  187.  
  188.     _AccessFList();
  189.    
  190. //    os_handle = CreateEvent( 0, 0, 0, 0 );
  191.     os_handle = 0;
  192.     if( os_handle == NULL )
  193.     {
  194.         // win32s does not support event handles
  195.         static DWORD fakeHandle = 0x80000000L;
  196.         fakeHandle++;
  197.         os_handle = (HANDLE)fakeHandle;
  198.     }
  199.     else
  200.     {
  201.         __FakeHandles = lib_realloc( __FakeHandles, (__topFakeHandle+1) * sizeof( HANDLE ) );
  202.         __FakeHandles[ __topFakeHandle ] = os_handle;
  203.         __topFakeHandle++;
  204.     }
  205.     _ReleaseFList();
  206.     return( os_handle );
  207. }
  208.  
  209. // called from library startup code
  210.  
  211. void __initPOSIXHandles( void )
  212. {
  213.     HANDLE h;
  214.  
  215.     // __OSHandles = NULL;
  216.     // __NHandles = 0;
  217.  
  218.     __growPOSIXHandles( __NFiles );
  219.     h = 0; //GetStdHandle( STD_INPUT_HANDLE );
  220.     if( h == 0 || h == INVALID_HANDLE_VALUE ) {
  221.         h = (HANDLE)__NTGetFakeHandle();
  222.     }
  223.     __allocPOSIXHandle( h );        // should return 0==STDIN_FILENO
  224.     h = 0; //GetStdHandle( STD_OUTPUT_HANDLE );
  225.     if( h == 0 || h == INVALID_HANDLE_VALUE ) {
  226.         h = (HANDLE)__NTGetFakeHandle();
  227.     }
  228.     __allocPOSIXHandle( h );        // should return 1==STDOUT_FILENO
  229.     h = 0; //GetStdHandle( STD_ERROR_HANDLE );
  230.     if( h == 0 || h == INVALID_HANDLE_VALUE ) {
  231.         h = (HANDLE)__NTGetFakeHandle();
  232.     }
  233.     __allocPOSIXHandle( h );        // should return 3==STDERR_FILENO
  234. }
  235.  
  236. static void __finiPOSIXHandles( void )
  237. {
  238.     if( __OSHandles != NULL ) {
  239.         lib_free( __OSHandles );
  240.         __OSHandles = NULL;
  241.     }
  242.     if( __FakeHandles != NULL )
  243.     {
  244.         int i;
  245.         for( i = 0 ; i < __topFakeHandle ; i++ )
  246.         {
  247.           //  CloseHandle( __FakeHandles[i] );
  248.         }
  249.         lib_free( __FakeHandles );
  250.         __FakeHandles = 0;
  251.     }
  252. }
  253.  
  254. AYI( __finiPOSIXHandles, INIT_PRIORITY_LIBRARY-1 )
  255.  
  256. #endif
  257.  
  258.  
  259. void __set_handles( int num )
  260. {
  261.     __NHandles = num;
  262. }
  263.  
  264. _WCRTLINK int _grow_handles( int num )
  265. {
  266.     if( num > __NHandles )
  267.     {
  268.         #if defined(MSDOS)
  269.         #elif defined( __OS2_286__ )
  270.         #elif defined( __WARP__ )
  271.         #elif defined(__WINDOWS__)
  272.         #elif defined(__NT__)
  273.         {
  274.             num = __growPOSIXHandles( num );
  275.         }
  276.         #elif defined(__NETWARE__)
  277.         #elif defined(__UNIX__)
  278.         #endif
  279.  
  280.         if( num > __NFiles ) {
  281.             __grow_iomode( num );   // sets new __NFiles if successful
  282.         }
  283.         __NHandles = num;
  284.     }
  285.     return( __NHandles );
  286. }
  287.