54
54
# if defined(PRIu32 )
55
55
# define SIM_PRIsocket PRIu32
56
56
# else
57
- # define SIM_PRIsocket "lu "
57
+ # define SIM_PRIsocket "u "
58
58
# endif
59
59
#else
60
60
# define SIM_PRIsocket "u"
@@ -75,21 +75,21 @@ static inline uint32_t slirp_dbg_mask(const SimSlirpNetwork *slirp, size_t flag)
75
75
return (slirp != NULL && slirp -> dptr != NULL ) ? slirp -> dptr -> debflags [slirp -> flag_offset + flag ].mask : 0 ;
76
76
}
77
77
78
- #if SIM_USE_SELECT
79
- /* Socket identifier pretty-printer: */
80
- static const char * print_socket (slirp_os_socket s )
78
+ /* Socket error check */
79
+ static inline int have_valid_socket (slirp_os_socket s )
81
80
{
82
- static char retbuf [64 ];
83
-
84
- #if defined(_WIN64 )
85
- sprintf (retbuf , "%llu" , s );
86
- #elif defined(_WIN32 )
87
- sprintf (retbuf , "%u" , s );
81
+ #if !defined(_WIN32 ) && !defined(_WIN64 )
82
+ return (s >= 0 );
88
83
#else
89
- sprintf ( retbuf , "%d" , s );
84
+ return ( s != SLIRP_INVALID_SOCKET );
90
85
#endif
86
+ }
91
87
92
- return retbuf ;
88
+ #if (defined(_WIN32 ) || defined(_WIN64 )) && SIM_USE_POLL
89
+ /* poll() wrapper for Windows: */
90
+ static inline int poll (WSAPOLLFD * fds , size_t n_fds , int timeout )
91
+ {
92
+ return WSAPoll (fds , (ULONG ) n_fds , timeout );
93
93
}
94
94
#endif
95
95
@@ -145,13 +145,6 @@ int sim_slirp_select(SimSlirpNetwork *slirp, int ms_timeout)
145
145
* "Protocol" functions. These functions abide by the one function definition rule.
146
146
*~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=*/
147
147
148
- #if (defined(_WIN32 ) || defined(_WIN64 )) && SIM_USE_POLL
149
- static inline int poll (WSAPOLLFD * fds , size_t n_fds , int timeout )
150
- {
151
- return WSAPoll (fds , (ULONG ) n_fds , timeout );
152
- }
153
- #endif
154
-
155
148
static void initialize_poll (SimSlirpNetwork * slirp , uint32 tmo , struct timeval * tv )
156
149
{
157
150
#if SIM_USE_SELECT
@@ -164,9 +157,7 @@ static void initialize_poll(SimSlirpNetwork *slirp, uint32 tmo, struct timeval *
164
157
165
158
slirp -> max_fd = SIM_INVALID_MAX_FD ;
166
159
#elif SIM_USE_POLL
167
- /* Reinitialize and reset */
168
- memset (slirp -> fds , 0 , slirp -> fd_idx * sizeof (sim_pollfd_t ));
169
- slirp -> fd_idx = 0 ;
160
+ /* Nothing to do. */
170
161
#endif
171
162
}
172
163
@@ -238,10 +229,10 @@ static void report_error(SimSlirpNetwork *slirp)
238
229
/* Add new socket file descriptors to the Slirp I/O event tracking state. */
239
230
void register_poll_socket (slirp_os_socket fd , void * opaque )
240
231
{
241
- #if SIM_USE_SELECT
242
232
SimSlirpNetwork * slirp = (SimSlirpNetwork * ) opaque ;
243
233
size_t i ;
244
234
235
+ #if SIM_USE_SELECT
245
236
for (i = 0 ; i < slirp -> lut_alloc ; ++ i ) {
246
237
if (slirp -> lut [i ] == INVALID_SOCKET ) {
247
238
slirp -> lut [i ] = fd ;
@@ -264,34 +255,55 @@ void register_poll_socket(slirp_os_socket fd, void *opaque)
264
255
slirp -> lut [i ] = fd ;
265
256
}
266
257
267
- sim_debug (slirp_dbg_mask (slirp , DBG_SOCKET ), slirp -> dptr , "register_poll_socket(%s) index %" SIZE_T_FMT "d\n" ,
268
- print_socket ( fd ) , i );
258
+ sim_debug (slirp_dbg_mask (slirp , DBG_SOCKET ), slirp -> dptr , "register_poll_socket(%" SIM_PRIsocket " index %" SIZE_T_FMT "d\n" ,
259
+ fd , i );
269
260
#elif SIM_USE_POLL
270
- /* Not necessary for poll(). */
271
- (void ) opaque ;
261
+ for (i = 0 ; i < slirp -> fd_idx && have_valid_socket (slirp -> fds [i ].fd ); ++ i )
262
+ /* NOP */ ;
263
+
264
+ if (i >= slirp -> n_fds ) {
265
+ /* Resize the array... */
266
+ size_t j = slirp -> n_fds ;
267
+ sim_pollfd_t * new_fds ;
268
+
269
+ slirp -> n_fds += FDS_ALLOC_INCR ;
270
+ new_fds = (sim_pollfd_t * ) realloc (slirp -> fds , slirp -> n_fds * sizeof (sim_pollfd_t ));
271
+ ASSURE (new_fds != NULL );
272
+ memset (new_fds + j , 0 , (slirp -> n_fds - j ) * sizeof (sim_pollfd_t ));
273
+ slirp -> fds = new_fds ;
274
+ }
275
+
276
+ slirp -> fds [i ].fd = fd ;
277
+ slirp -> fds [i ].events = slirp -> fds [i ].revents = 0 ;
278
+
279
+ if (i == slirp -> fd_idx )
280
+ ++ slirp -> fd_idx ;
272
281
#endif
273
282
}
274
283
275
284
/* Reap a disused socket. */
276
285
void unregister_poll_socket (slirp_os_socket fd , void * opaque )
277
286
{
278
- GLIB_UNUSED_PARAM (opaque );
279
-
280
- #if SIM_USE_SELECT
281
287
SimSlirpNetwork * slirp = (SimSlirpNetwork * ) opaque ;
282
288
size_t i ;
283
289
290
+ #if SIM_USE_SELECT
284
291
for (i = 0 ; i < slirp -> lut_alloc ; ++ i ) {
285
292
if (slirp -> lut [i ] == fd ) {
286
293
slirp -> lut [i ] = INVALID_SOCKET ;
287
294
sim_debug (slirp_dbg_mask (slirp , DBG_SOCKET ), slirp -> dptr ,
288
- "unregister_poll_socket(%s ) index %" SIZE_T_FMT "d\n" , print_socket ( fd ) , i );
295
+ "unregister_poll_socket(%" SIM_PRIsocket " ) index %" SIZE_T_FMT "d\n" , fd , i );
289
296
break ;
290
297
}
291
298
}
292
299
#elif SIM_USE_POLL
293
- /* Not necessary for poll(). */
294
- (void ) opaque ;
300
+ for (i = 0 ; i < slirp -> fd_idx && slirp -> fds [i ].fd != fd ; ++ i )
301
+ /* NOP */ ;
302
+
303
+ if (i < slirp -> fd_idx ) {
304
+ slirp -> fds [i ].fd = INVALID_SOCKET ;
305
+ slirp -> fds [i ].events = slirp -> fds [i ].revents = 0 ;
306
+ }
295
307
#endif
296
308
}
297
309
@@ -339,9 +351,9 @@ static int add_poll_callback(slirp_os_socket fd, int events, void *opaque)
339
351
SimSlirpNetwork * slirp = (SimSlirpNetwork * ) opaque ;
340
352
int retval = -1 ;
341
353
char prefix [128 ];
354
+ size_t i ;
342
355
343
356
#if SIM_USE_SELECT
344
- size_t i ;
345
357
const int event_mask = (SLIRP_POLL_IN | SLIRP_POLL_OUT | SLIRP_POLL_PRI );
346
358
347
359
for (i = 0 ; i < slirp -> lut_alloc ; ++ i ) {
@@ -364,21 +376,10 @@ static int add_poll_callback(slirp_os_socket fd, int events, void *opaque)
364
376
break ;
365
377
}
366
378
367
- sprintf (prefix , "add_poll_callback(%s )/select (0x%04x)" , print_socket ( fd ) , events & event_mask );
379
+ sprintf (prefix , "add_poll_callback(%" SIM_PRIsocket " )/select (0x%04x)" , fd , events & event_mask );
368
380
poll_debugging (slirp_dbg_mask (slirp , DBG_POLL ), slirp -> dptr , prefix , events & event_mask );
369
381
}
370
382
#elif SIM_USE_POLL
371
- if (slirp -> fd_idx == slirp -> n_fds ) {
372
- size_t j = slirp -> n_fds ;
373
- sim_pollfd_t * new_fds ;
374
-
375
- slirp -> n_fds += FDS_ALLOC_INCR ;
376
- new_fds = (sim_pollfd_t * ) realloc (slirp -> fds , slirp -> n_fds * sizeof (sim_pollfd_t ));
377
- ASSURE (new_fds != NULL );
378
- memset (new_fds + j , 0 , (slirp -> n_fds - j ) * sizeof (sim_pollfd_t ));
379
- slirp -> fds = new_fds ;
380
- }
381
-
382
383
short poll_events = 0 ;
383
384
384
385
if (events & SLIRP_POLL_IN ) {
@@ -387,7 +388,7 @@ static int add_poll_callback(slirp_os_socket fd, int events, void *opaque)
387
388
if (events & SLIRP_POLL_OUT ) {
388
389
poll_events |= POLLOUT ;
389
390
}
390
- #if !defined(_WIN32 ) && !defined(_WIN64 )
391
+ # if !defined(_WIN32 ) && !defined(_WIN64 )
391
392
/* Not supported on Windows. Unless you like EINVAL. :-) */
392
393
if (events & SLIRP_POLL_PRI ) {
393
394
poll_events |= POLLPRI ;
@@ -398,16 +399,23 @@ static int add_poll_callback(slirp_os_socket fd, int events, void *opaque)
398
399
if (events & SLIRP_POLL_HUP ) {
399
400
poll_events |= POLLHUP ;
400
401
}
401
- #endif
402
+ # endif
403
+ for (i = 0 ; i < slirp -> fd_idx && slirp -> fds [i ].fd != fd ; ++ i )
404
+ /* NOP */ ;
405
+
406
+ if (i >= slirp -> fd_idx ) {
407
+ sim_messagef (SCPE_IOERR , "add_poll_callback: Unregistered/unknown fd %" SIM_PRIsocket "\n" , fd );
408
+ return -1 ;
409
+ }
402
410
403
411
sprintf (prefix , "add_poll_callback(%" SIM_PRIsocket ")/poll (0x%04x)" , fd , events );
404
412
poll_debugging (slirp_dbg_mask (slirp , DBG_POLL ), slirp -> dptr , prefix , events );
405
413
406
- slirp -> fds [slirp -> fd_idx ].fd = fd ;
407
- slirp -> fds [slirp -> fd_idx ].events = poll_events ;
408
- slirp -> fds [slirp -> fd_idx ].revents = 0 ;
414
+ slirp -> fds [i ].fd = fd ;
415
+ slirp -> fds [i ].events = poll_events ;
416
+ slirp -> fds [i ].revents = 0 ;
409
417
410
- retval = (int ) slirp -> fd_idx ++ ;
418
+ retval = (int ) i ;
411
419
#endif
412
420
413
421
return retval ;
@@ -435,7 +443,7 @@ static int get_events_callback(int idx, void *opaque)
435
443
event |= SLIRP_POLL_PRI ;
436
444
}
437
445
438
- sprintf (prefix , "get_events_callback(%s )/select (0x%04x)" , print_socket ( fd ) , event & event_mask );
446
+ sprintf (prefix , "get_events_callback(%" SIM_PRIsocket " )/select (0x%04x)" , fd , event & event_mask );
439
447
poll_debugging (slirp_dbg_mask (slirp , DBG_POLL ), slirp -> dptr , prefix , event & event_mask );
440
448
}
441
449
#elif SIM_USE_POLL
0 commit comments