From 3b45ae681311e22809b359b48c36dce4bf947a10 Mon Sep 17 00:00:00 2001 From: Jeffrey Townsend Date: Tue, 3 Apr 2018 21:11:29 +0000 Subject: [PATCH] UDS Error Handling - Don't allow UDS connects() to block. - Add a 1 second timeout for all UDS read/write operations. --- .../base/any/onlp/src/onlplib/module/src/file.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/base/any/onlp/src/onlplib/module/src/file.c b/packages/base/any/onlp/src/onlplib/module/src/file.c index ef31b840..df73165c 100644 --- a/packages/base/any/onlp/src/onlplib/module/src/file.c +++ b/packages/base/any/onlp/src/onlplib/module/src/file.c @@ -50,11 +50,26 @@ ds_connect__(const char* path) return -1; } + /* + * UDS connects must be non-blocking. + */ + fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK); + memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strncpy(addr.sun_path, path, sizeof(addr.sun_path)-1); if(connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == 0) { + + /* + * Set blocking with a 1 second timeout on all domain socket read/write operations. + */ + struct timeval tv; + + fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK); + tv.tv_sec = 1; + tv.tv_usec = 0; + setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv); return fd; } else {