@@ -272,22 +272,70 @@ static int sendCurrentWindowSize(thread_args* args)
272272
273273#ifndef _MSC_VER
274274
275- #if (defined(__OSX__ ) || defined(__APPLE__ ))
276- #include <dispatch/dispatch.h>
277- dispatch_semaphore_t windowSem ;
278- #else
275+ #include <errno.h>
276+ #include <fcntl.h>
279277#include <semaphore.h>
280- static sem_t windowSem ;
281- #endif
278+ #include <stdio.h>
279+ #include <unistd.h>
280+
281+ typedef struct {
282+ sem_t * s ;
283+ char name [32 ];
284+ } WOLFSSH_SEMAPHORE ;
285+
286+ static inline
287+ int wolfSSH_SEMAPHORE_Init (WOLFSSH_SEMAPHORE * s , unsigned int n )
288+ {
289+ if (s != NULL ) {
290+ snprintf (s -> name , sizeof (s -> name ), "/wolfssh_winch_%d" , (int )getpid ());
291+ s -> s = sem_open (s -> name , O_CREAT | O_EXCL | O_RDWR , 0600 , n );
292+ if (s -> s == SEM_FAILED && errno == EEXIST ) {
293+ /* named semaphore already exists, unlink the name and
294+ * try to open it one more time. */
295+ if (sem_unlink (s -> name ) == 0 ) {
296+ s -> s = sem_open (s -> name , O_CREAT | O_RDWR , 0600 , n );
297+ }
298+ }
299+ }
300+ return (s != NULL && s -> s != SEM_FAILED );
301+ }
302+
303+ static inline
304+ void wolfSSH_SEMAPHORE_Release (WOLFSSH_SEMAPHORE * s )
305+ {
306+ if (s != NULL && s -> s != NULL && s -> s != SEM_FAILED ) {
307+ sem_close (s -> s );
308+ sem_unlink (s -> name );
309+ s -> s = NULL ;
310+ }
311+ }
312+
313+ static inline
314+ int wolfSSH_SEMAPHORE_Wait (WOLFSSH_SEMAPHORE * s )
315+ {
316+ int ret = -1 ;
317+ if (s != NULL && s -> s != NULL && s -> s != SEM_FAILED ) {
318+ do {
319+ ret = sem_wait (s -> s );
320+ } while (ret == -1 && errno == EINTR );
321+ }
322+ return (ret == 0 );
323+ }
324+
325+ static inline
326+ void wolfSSH_SEMAPHORE_Post (WOLFSSH_SEMAPHORE * s )
327+ {
328+ if (s != NULL && s -> s != NULL && s -> s != SEM_FAILED ) {
329+ sem_post (s -> s );
330+ }
331+ }
332+
333+ static WOLFSSH_SEMAPHORE windowSem ;
282334
283335/* capture window change signals */
284336static void WindowChangeSignal (int sig )
285337{
286- #if (defined(__OSX__ ) || defined(__APPLE__ ))
287- dispatch_semaphore_signal (windowSem );
288- #else
289- sem_post (& windowSem );
290- #endif
338+ wolfSSH_SEMAPHORE_Post (& windowSem );
291339 (void )sig ;
292340}
293341
@@ -299,11 +347,9 @@ static THREAD_RET windowMonitor(void* in)
299347
300348 args = (thread_args * )in ;
301349 do {
302- #if (defined(__OSX__ ) || defined(__APPLE__ ))
303- dispatch_semaphore_wait (windowSem , DISPATCH_TIME_FOREVER );
304- #else
305- sem_wait (& windowSem );
306- #endif
350+ if (!wolfSSH_SEMAPHORE_Wait (& windowSem )) {
351+ break ;
352+ }
307353 if (args -> quit ) {
308354 break ;
309355 }
@@ -1060,11 +1106,9 @@ static THREAD_RETURN WOLFSSH_THREAD wolfSSH_Client(void* args)
10601106 arg .readError = 0 ;
10611107#ifdef WOLFSSH_TERM
10621108 arg .quit = 0 ;
1063- #if (defined(__OSX__ ) || defined(__APPLE__ ))
1064- windowSem = dispatch_semaphore_create (0 );
1065- #else
1066- sem_init (& windowSem , 0 , 0 );
1067- #endif
1109+ if (!wolfSSH_SEMAPHORE_Init (& windowSem , 0 )) {
1110+ err_sys ("Couldn't initialize window semaphore." );
1111+ }
10681112
10691113 if (config .command ) {
10701114 int err ;
@@ -1087,21 +1131,14 @@ static THREAD_RETURN WOLFSSH_THREAD wolfSSH_Client(void* args)
10871131#ifdef WOLFSSH_TERM
10881132 /* Wake the windowMonitor thread so it can exit. */
10891133 arg .quit = 1 ;
1090- #if (defined(__OSX__ ) || defined(__APPLE__ ))
1091- dispatch_semaphore_signal (windowSem );
1092- #else
1093- sem_post (& windowSem );
1094- #endif
1134+ signal (SIGWINCH , SIG_DFL );
1135+ wolfSSH_SEMAPHORE_Post (& windowSem );
10951136 pthread_join (thread [0 ], NULL );
10961137#endif /* WOLFSSH_TERM */
10971138 pthread_cancel (thread [1 ]);
10981139 pthread_join (thread [1 ], NULL );
10991140#ifdef WOLFSSH_TERM
1100- #if (defined(__OSX__ ) || defined(__APPLE__ ))
1101- dispatch_release (windowSem );
1102- #else
1103- sem_destroy (& windowSem );
1104- #endif
1141+ wolfSSH_SEMAPHORE_Release (& windowSem );
11051142#endif /* WOLFSSH_TERM */
11061143 ioErr = arg .readError ;
11071144 #elif defined(_MSC_VER )
0 commit comments