@@ -106,11 +106,24 @@ extern HWND Event_Handle;
106
106
#endif
107
107
108
108
host = OS_Make (MAXGETHOSTSTRUCT ); // be sure to free it
109
+ sock -> net .host_info = host ; // stores allocated buffer, deallocated on close or on error
109
110
110
111
#ifdef HAS_ASYNC_DNS
111
- if (!GET_FLAG (sock -> modes , RST_REVERSE )) // hostname lookup
112
- handle = WSAAsyncGetHostByName (Event_Handle , WM_DNS , sock -> data , host , MAXGETHOSTSTRUCT );
113
- else
112
+ // WINDOWS version
113
+ if (!GET_FLAG (sock -> modes , RST_REVERSE )) {// hostname lookup
114
+ if (sock -> data == NULL ) {
115
+ DWORD dwSize = MAXGETHOSTSTRUCT ;
116
+ if (GetComputerNameExA (ComputerNameDnsFullyQualified , host , & dwSize )) {
117
+ ((REBYTE * )host )[dwSize ] = 0 ;
118
+ sock -> data = host ;
119
+ SET_FLAG (sock -> modes , RST_REVERSE );
120
+ SET_FLAG (sock -> flags , RRF_DONE );
121
+ return DR_DONE ;
122
+ }
123
+ goto error ;
124
+ }
125
+ handle = WSAAsyncGetHostByName (Event_Handle , WM_DNS , cs_cast (sock -> data ), host , MAXGETHOSTSTRUCT );
126
+ } else
114
127
handle = WSAAsyncGetHostByAddr (Event_Handle , WM_DNS , (char * )& (sock -> net .remote_ip ), 4 , AF_INET , host , MAXGETHOSTSTRUCT );
115
128
116
129
if (handle != 0 ) {
@@ -119,27 +132,34 @@ extern HWND Event_Handle;
119
132
return DR_PEND ; // keep it on pending list
120
133
}
121
134
#else
135
+ // POSIX version
122
136
// Use old-style blocking DNS (mainly for testing purposes):
123
137
if (GET_FLAG (sock -> modes , RST_REVERSE )) {
124
138
he = gethostbyaddr ((char * )& sock -> net .remote_ip , 4 , AF_INET );
125
139
if (he ) {
126
- sock -> net .host_info = host ; //???
127
140
sock -> data = he -> h_name ;
128
141
SET_FLAG (sock -> flags , RRF_DONE );
129
142
return DR_DONE ;
130
143
}
131
144
}
145
+ else if (sock -> data == NULL ) {
146
+ if (0 == gethostname (host , MAXGETHOSTSTRUCT )) {
147
+ sock -> data = host ;
148
+ SET_FLAG (sock -> modes , RST_REVERSE );
149
+ SET_FLAG (sock -> flags , RRF_DONE );
150
+ return DR_DONE ;
151
+ }
152
+ }
132
153
else {
133
154
he = gethostbyname (sock -> data );
134
155
if (he ) {
135
- sock -> net .host_info = host ; // ?? who deallocs?
136
156
COPY_MEM ((char * )& (sock -> net .remote_ip ), (char * )(* he -> h_addr_list ), 4 ); //he->h_length);
137
157
SET_FLAG (sock -> flags , RRF_DONE );
138
158
return DR_DONE ;
139
159
}
140
160
}
141
161
#endif
142
-
162
+ error :
143
163
OS_Free (host );
144
164
sock -> net .host_info = 0 ;
145
165
@@ -178,7 +198,7 @@ extern HWND Event_Handle;
178
198
if (!req -> error ) { // success!
179
199
host = (HOSTENT * )req -> net .host_info ;
180
200
if (GET_FLAG (req -> modes , RST_REVERSE ))
181
- req -> data = host -> h_name ;
201
+ req -> data = ( REBYTE * ) host -> h_name ;
182
202
else
183
203
COPY_MEM ((char * )& (req -> net .remote_ip ), (char * )(* host -> h_addr_list ), 4 ); //he->h_length);
184
204
Signal_Device (req , EVT_READ );
0 commit comments