54
54
#ifndef MSG_NOSIGNAL
55
55
#define MSG_NOSIGNAL 0
56
56
#endif
57
+
58
+ static int translate_wsa_error_to_posix (int wsa_err )
59
+ {
60
+ switch (wsa_err ) {
61
+ case WSAEACCES : return - EACCES ;
62
+ case WSAEADDRINUSE : return - EADDRINUSE ;
63
+ case WSAEADDRNOTAVAIL : return - EADDRNOTAVAIL ;
64
+ case WSAEAFNOSUPPORT : return - EAFNOSUPPORT ;
65
+ case WSAEALREADY : return - EALREADY ;
66
+ case WSAECONNREFUSED : return - ECONNREFUSED ;
67
+ case WSAECONNRESET : return - ECONNRESET ;
68
+ case WSAECONNABORTED : return - ECONNABORTED ;
69
+ case WSAEFAULT : return - EFAULT ;
70
+ case WSAEINPROGRESS : return - EINPROGRESS ;
71
+ case WSAEISCONN : return - EISCONN ;
72
+ case WSAEMFILE : return - EMFILE ;
73
+ case WSAENETDOWN : return - ENETDOWN ;
74
+ case WSAENETUNREACH : return - ENETUNREACH ;
75
+ case WSAENOBUFS : return - ENOBUFS ;
76
+ case WSAENOTSOCK : return - ENOTSOCK ;
77
+ case WSAEPROTONOSUPPORT : return - EPROTONOSUPPORT ;
78
+ case WSAETIMEDOUT : return - ETIMEDOUT ;
79
+ case WSAEHOSTUNREACH : return - EHOSTUNREACH ;
80
+ case WSAEINVAL : return - EINVAL ;
81
+ case WSAEWOULDBLOCK : return - EAGAIN ;
82
+ #ifdef ESHUTDOWN
83
+ case WSAESHUTDOWN : return - ESHUTDOWN ;
84
+ #else
85
+ case WSAESHUTDOWN : return - ECONNABORTED ;
86
+ #endif
87
+ case WSAENOTCONN : return - ENOTCONN ;
88
+ case WSAEOPNOTSUPP : return - EOPNOTSUPP ;
89
+ default : {
90
+ if (wsa_err > -4096 && wsa_err < 0 ) // pass through for POSIX errors
91
+ return wsa_err ;
92
+ else
93
+ return - EIO ; // generic fallback
94
+ }
95
+ }
96
+ }
57
97
#endif
58
98
99
+ /* Helper function to translate WSA errors to POSIX at API boundary.
100
+ ret is expected to be negative. */
101
+ static int translate_error_for_api (int ret )
102
+ {
103
+ #ifdef _WIN32
104
+ if (ret < 0 )
105
+ return translate_wsa_error_to_posix (- ret );
106
+ #endif
107
+ return ret ;
108
+ }
109
+
59
110
#define NETWORK_TIMEOUT_MS 5000
60
111
61
112
struct iio_context_pdata {
@@ -326,6 +377,7 @@ network_setup_iiod_client(const struct iio_device *dev,
326
377
* See commit 9eff490 for more info.
327
378
*/
328
379
ret = create_socket (pdata -> addrinfo , NETWORK_TIMEOUT_MS );
380
+ ret = translate_error_for_api (ret );
329
381
if (ret < 0 ) {
330
382
dev_perror (dev , ret , "Unable to create socket" );
331
383
return iio_ptr (ret );
@@ -348,6 +400,7 @@ network_setup_iiod_client(const struct iio_device *dev,
348
400
}
349
401
350
402
ret = set_blocking_mode (io_ctx -> fd , false);
403
+ ret = translate_error_for_api (ret );
351
404
if (ret < 0 ) {
352
405
dev_perror (dev , ret , "Unable to set blocking mode" );
353
406
goto err_free_iiod_client ;
@@ -380,7 +433,8 @@ static ssize_t network_read_attr(const struct iio_attr *attr,
380
433
const struct iio_context * ctx = iio_device_get_context (dev );
381
434
struct iio_context_pdata * pdata = iio_context_get_pdata (ctx );
382
435
383
- return iiod_client_attr_read (pdata -> iiod_client , attr , dst , len );
436
+ return (ssize_t )translate_error_for_api (
437
+ (int )iiod_client_attr_read (pdata -> iiod_client , attr , dst , len ));
384
438
}
385
439
386
440
static ssize_t network_write_attr (const struct iio_attr * attr ,
@@ -390,7 +444,8 @@ static ssize_t network_write_attr(const struct iio_attr *attr,
390
444
const struct iio_context * ctx = iio_device_get_context (dev );
391
445
struct iio_context_pdata * pdata = iio_context_get_pdata (ctx );
392
446
393
- return iiod_client_attr_write (pdata -> iiod_client , attr , src , len );
447
+ return (ssize_t )translate_error_for_api (
448
+ (int )iiod_client_attr_write (pdata -> iiod_client , attr , src , len ));
394
449
}
395
450
396
451
static const struct iio_device *
@@ -408,7 +463,8 @@ static int network_set_trigger(const struct iio_device *dev,
408
463
const struct iio_context * ctx = iio_device_get_context (dev );
409
464
struct iio_context_pdata * pdata = iio_context_get_pdata (ctx );
410
465
411
- return iiod_client_set_trigger (pdata -> iiod_client , dev , trigger );
466
+ return translate_error_for_api (
467
+ iiod_client_set_trigger (pdata -> iiod_client , dev , trigger ));
412
468
}
413
469
414
470
static void network_shutdown (struct iio_context * ctx )
@@ -553,13 +609,15 @@ static ssize_t network_write_data(struct iiod_client_pdata *io_ctx,
553
609
const char * src , size_t len ,
554
610
unsigned int timeout_ms )
555
611
{
556
- return network_send (io_ctx , src , len , MSG_NOSIGNAL , timeout_ms );
612
+ return (ssize_t )translate_error_for_api (
613
+ (int )network_send (io_ctx , src , len , MSG_NOSIGNAL , timeout_ms ));
557
614
}
558
615
559
616
static ssize_t network_read_data (struct iiod_client_pdata * io_ctx ,
560
617
char * dst , size_t len , unsigned int timeout_ms )
561
618
{
562
- return network_recv (io_ctx , dst , len , 0 , timeout_ms );
619
+ return (ssize_t )translate_error_for_api (
620
+ (int )network_recv (io_ctx , dst , len , 0 , timeout_ms ));
563
621
}
564
622
565
623
static struct iio_context * network_create_context (const struct iio_context_params * params ,
@@ -586,7 +644,8 @@ static struct iio_context * network_create_context(const struct iio_context_para
586
644
WSADATA wsaData ;
587
645
588
646
ret = WSAStartup (MAKEWORD (2 , 0 ), & wsaData );
589
- if (ret < 0 ) {
647
+ if (ret != 0 ) {
648
+ ret = translate_wsa_error_to_posix (ret );
590
649
prm_perror (params , ret , "WSAStartup failed" );
591
650
return iio_ptr (ret );
592
651
}
@@ -655,6 +714,7 @@ static struct iio_context * network_create_context(const struct iio_context_para
655
714
656
715
ret = dnssd_discover_host (params , addr_str ,
657
716
sizeof (addr_str ), & port_num );
717
+ ret = translate_error_for_api (ret );
658
718
if (ret < 0 ) {
659
719
char buf [1024 ];
660
720
iio_strerror (- ret , buf , sizeof (buf ));
@@ -711,6 +771,7 @@ static struct iio_context * network_create_context(const struct iio_context_para
711
771
}
712
772
713
773
fd = create_socket (res , params -> timeout_ms );
774
+ fd = translate_error_for_api (fd );
714
775
if (fd < 0 ) {
715
776
ret = fd ;
716
777
goto err_free_addrinfo ;
0 commit comments