00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "lspdef.h"
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 SOCKET_CONTEXT *
00032 FindSocketContext(
00033 SOCKET s,
00034 BOOL Remove
00035 )
00036 {
00037 SOCKET_CONTEXT *SocketContext = NULL,
00038 *info = NULL;
00039 LIST_ENTRY *lptr = NULL;
00040 int i;
00041
00042 EnterCriticalSection( &gCriticalSection );
00043
00044 for(i=0; i < gLayerCount ;i++)
00045 {
00046 EnterCriticalSection( &gLayerInfo[ i ].ProviderCritSec );
00047
00048 for(lptr = gLayerInfo[ i ].SocketList.Flink ;
00049 lptr != &gLayerInfo[ i ].SocketList ;
00050 lptr = lptr->Flink )
00051 {
00052 info = CONTAINING_RECORD( lptr, SOCKET_CONTEXT, Link );
00053
00054 if ( s == info->Socket )
00055 {
00056 SocketContext = info;
00057
00058 if ( TRUE == Remove )
00059 {
00060 RemoveEntryList( &info->Link );
00061 }
00062 break;
00063 }
00064 }
00065
00066 LeaveCriticalSection( &gLayerInfo[ i ].ProviderCritSec );
00067
00068 if ( NULL != SocketContext )
00069 break;
00070 }
00071
00072 LeaveCriticalSection( &gCriticalSection );
00073
00074 return SocketContext;
00075 }
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 SOCKET_CONTEXT *
00094 CreateSocketContext(
00095 PROVIDER *Provider,
00096 SOCKET Socket,
00097 int *lpErrno
00098 )
00099 {
00100 SOCKET_CONTEXT *newContext = NULL;
00101
00102 newContext = (SOCKET_CONTEXT *) LspAlloc(
00103 sizeof( SOCKET_CONTEXT ),
00104 lpErrno
00105 );
00106 if ( NULL == newContext )
00107 {
00108 dbgprint("CreateSocketContext: LspAlloc failed: %d", *lpErrno );
00109 goto cleanup;
00110 }
00111
00112 newContext->Socket = Socket;
00113 newContext->Provider = Provider;
00114 newContext->Proxied = FALSE;
00115
00116 EnterCriticalSection( &Provider->ProviderCritSec );
00117
00118 InsertHeadList( &Provider->SocketList, &newContext->Link );
00119
00120 LeaveCriticalSection( &Provider->ProviderCritSec );
00121
00122 return newContext;
00123
00124 cleanup:
00125
00126 return NULL;
00127 }
00128
00129
00130
00131
00132
00133
00134
00135 void
00136 FreeSocketContext(
00137 PROVIDER *Provider,
00138 SOCKET_CONTEXT *Context
00139 )
00140 {
00141 EnterCriticalSection( &Provider->ProviderCritSec );
00142
00143 RemoveEntryList( &Context->Link );
00144 LspFree( Context );
00145
00146 LeaveCriticalSection( &Provider->ProviderCritSec );
00147
00148 return;
00149 }
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159 void
00160 FreeSocketContextList(
00161 PROVIDER *provider
00162 )
00163 {
00164 LIST_ENTRY *lptr = NULL;
00165 SOCKET_CONTEXT *context = NULL;
00166
00167 ASSERT( provider );
00168
00169
00170 while ( !IsListEmpty( &provider->SocketList ) )
00171 {
00172 lptr = RemoveHeadList( &provider->SocketList );
00173
00174 ASSERT( lptr );
00175
00176 context = CONTAINING_RECORD( lptr, SOCKET_CONTEXT, Link );
00177
00178
00179 LspFree( context );
00180 }
00181
00182 return;
00183 }