Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nx-libs
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
dimbor
nx-libs
Commits
f6619070
Commit
f6619070
authored
Feb 09, 2015
by
Mike Gabriel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Support abstract local sockets for Linux systems (028_nx-X11_abstract-kernel-sockets.full.patch).
Relevant code taken from xtrans 1.2.7 on 2014-06-11.
parent
aaf4a59e
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
99 additions
and
352 deletions
+99
-352
028_nx-X11_abstract-kernel-sockets.full.patch
debian/patches/028_nx-X11_abstract-kernel-sockets.full.patch
+0
-321
series
debian/patches/series
+0
-1
Xtransint.h
nx-X11/lib/xtrans/Xtransint.h
+2
-1
Xtranssock.c
nx-X11/lib/xtrans/Xtranssock.c
+97
-29
No files found.
debian/patches/028_nx-X11_abstract-kernel-sockets.full.patch
deleted
100644 → 0
View file @
aaf4a59e
Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
Description: Support abstract local sockets for Linux systems
Abstract:
Relevant code taken from xtrans 1.2.7 on 2014-06-11.
--- a/nx-X11/lib/xtrans/Xtranssock.c
+++ b/nx-X11/lib/xtrans/Xtranssock.c
@@ -172,6 +172,8 @@
sock_init();\
IBMsockInit = 1;\
}
+
+
#undef EINTR
#define EINTR SOCEINTR
#undef EINVAL
@@ -192,6 +194,10 @@
#define SocketInitOnce() /**/
#endif
+#if defined(linux)
+#define HAVE_ABSTRACT_SOCKETS
+#endif
+
#define MIN_BACKLOG 128
#ifdef SOMAXCONN
#if SOMAXCONN > MIN_BACKLOG
@@ -532,7 +538,7 @@
void TRANS(SocketRejectConnection) (XtransConnInfo ciptr)
{
- size_t sa_l = sizeof(struct sockaddr);
+ socklen_t sa_l = sizeof(struct sockaddr);
struct sockaddr sa;
fd_set fs;
struct timeval t;
@@ -914,9 +920,11 @@
struct sockaddr_in socknamev4;
void *socknamePtr;
#if defined(SVR4) || defined(__SCO__)
+# define SOCKLEN_T_PTR void*
size_t namelen;
#else
- int namelen;
+# define SOCKLEN_T_PTR socklen_t*
+ socklen_t namelen;
#endif
PRMSG (3,"SocketINETGetAddr(%p)\n", ciptr, 0, 0);
@@ -935,7 +943,7 @@
}
if (getsockname (ciptr->fd,(struct sockaddr *) socknamePtr,
- (void *)&namelen) < 0)
+ (SOCKLEN_T_PTR)&namelen) < 0)
{
#ifdef WIN32
errno = WSAGetLastError();
@@ -1477,23 +1485,28 @@
#ifdef UNIXCONN
static int
-set_sun_path(const char *port, const char *upath, char *path)
+set_sun_path(const char *port, const char *upath, char *path, int abstract)
{
struct sockaddr_un s;
int maxlen = sizeof(s.sun_path) - 1;
+ const char *at = "";
if (!port || !*port || !path)
return -1;
- if (*port == '/') { /* a full pathname */
- if (strlen(port) > maxlen)
- return -1;
- sprintf(path, "%s", port);
- } else {
- if (strlen(port) + strlen(upath) > maxlen)
- return -1;
- sprintf(path, "%s%s", upath, port);
- }
+#ifdef HAVE_ABSTRACT_SOCKETS
+ if (port[0] == '@')
+ upath = "";
+ else if (abstract)
+ at = "@";
+#endif
+
+ if (*port == '/') /* a full pathname */
+ upath = "";
+
+ if (strlen(port) + strlen(upath) > maxlen)
+ return -1;
+ snprintf(path, sizeof(s.sun_path), "%s%s%s", at, upath, port);
return 0;
}
#endif
@@ -1726,6 +1739,12 @@
int oldUmask;
int status;
unsigned int mode;
+ char tmpport[108];
+
+ int abstract = 0;
+#ifdef HAVE_ABSTRACT_SOCKETS
+ abstract = ciptr->transptr->flags & TRANS_ABSTRACT;
+#endif
PRMSG (2, "SocketUNIXCreateListener(%s)\n",
port ? port : "NULL", 0, 0);
@@ -1741,11 +1760,11 @@
mode = 0777;
#endif
#ifdef NX_TRANS_SOCKET
- if (trans_mkdir(_NXGetUnixDir(UNIX_DIR), mode) == -1) {
+ if (!abstract && trans_mkdir(_NXGetUnixDir(UNIX_DIR), mode) == -1) {
PRMSG (1, "SocketUNIXCreateListener: mkdir(%s) failed, errno = %d\n",
_NXGetUnixDir(UNIX_DIR), errno, 0);
#else
- if (trans_mkdir(UNIX_DIR, mode) == -1) {
+ if (!abstract && trans_mkdir(UNIX_DIR, mode) == -1) {
PRMSG (1, "SocketUNIXCreateListener: mkdir(%s) failed, errno = %d\n",
UNIX_DIR, errno, 0);
#endif
@@ -1754,13 +1773,18 @@
}
#endif
+ memset(&sockname, 0, sizeof(sockname));
sockname.sun_family = AF_UNIX;
+ if (!(port && *port)) {
+ snprintf (tmpport, sizeof(tmpport), "%s%ld", UNIX_PATH, (long)getpid());
+ port = tmpport;
+ }
if (port && *port) {
#ifdef NX_TRANS_SOCKET
- if (set_sun_path(port, _NXGetUnixPath(UNIX_PATH), sockname.sun_path) != 0) {
+ if (set_sun_path(port, _NXGetUnixPath(UNIX_PATH), sockname.sun_path, abstract) != 0) {
#else
- if (set_sun_path(port, UNIX_PATH, sockname.sun_path) != 0) {
+ if (set_sun_path(port, UNIX_PATH, sockname.sun_path, abstract) != 0) {
#endif
PRMSG (1, "SocketUNIXCreateListener: path too long\n", 0, 0, 0);
return TRANS_CREATE_LISTENER_FAILED;
@@ -1784,7 +1808,12 @@
fprintf(stderr, "SocketUNIXCreateListener: Unlinking path [%s] for ciptr at [%p].\n",
sockname.sun_path, (void *) ciptr);
#endif
- unlink (sockname.sun_path);
+ if (abstract) {
+ sockname.sun_path[0] = '\0';
+ namelen = offsetof(struct sockaddr_un, sun_path) + 1 + strlen(&sockname.sun_path[1]);
+ }
+ else
+ unlink (sockname.sun_path);
if ((status = TRANS(SocketCreateListener) (ciptr,
(struct sockaddr *) &sockname, namelen, flags)) < 0)
@@ -1814,6 +1843,9 @@
return TRANS_CREATE_LISTENER_FAILED;
}
+ if (abstract)
+ sockname.sun_path[0] = '@';
+
ciptr->family = sockname.sun_family;
ciptr->addrlen = namelen;
memcpy (ciptr->addr, &sockname, ciptr->addrlen);
@@ -1823,7 +1855,6 @@
return 0;
}
-
static int
TRANS(SocketUNIXResetListener) (XtransConnInfo ciptr)
@@ -1836,15 +1867,20 @@
struct stat statb;
int status = TRANS_RESET_NOOP;
unsigned int mode;
+ int abstract = 0;
+#ifdef HAVE_ABSTRACT_SOCKETS
+ abstract = ciptr->transptr->flags & TRANS_ABSTRACT;
+#endif
PRMSG (3, "SocketUNIXResetListener(%p,%d)\n", ciptr, ciptr->fd, 0);
- if (stat (unsock->sun_path, &statb) == -1 ||
+ if (!abstract && (
+ stat (unsock->sun_path, &statb) == -1 ||
((statb.st_mode & S_IFMT) !=
#if (defined (sun) && defined(SVR4)) || defined(NCR) || defined(SCO325) || !defined(S_IFSOCK)
S_IFIFO))
#else
- S_IFSOCK))
+ S_IFSOCK)))
#endif
{
int oldUmask = umask (0);
@@ -2034,6 +2070,11 @@
}
+ /*
+ * if the socket is abstract, we already modified the address to have a
+ * @ instead of the initial NUL, so no need to do that again here.
+ */
+
newciptr->addrlen = ciptr->addrlen;
memcpy (newciptr->addr, ciptr->addr, newciptr->addrlen);
@@ -2626,6 +2667,12 @@
struct sockaddr_un sockname;
int namelen;
+
+ int abstract = 0;
+#ifdef HAVE_ABSTRACT_SOCKETS
+ abstract = ciptr->transptr->flags & TRANS_ABSTRACT;
+#endif
+
#if defined(hpux) && defined(X11_t)
struct sockaddr_un old_sockname;
int old_namelen;
@@ -2674,9 +2721,9 @@
sockname.sun_family = AF_UNIX;
#ifdef NX_TRANS_SOCKET
- if (set_sun_path(port, _NXGetUnixPath(UNIX_PATH), sockname.sun_path) != 0) {
+ if (set_sun_path(port, _NXGetUnixPath(UNIX_PATH), sockname.sun_path, abstract) != 0) {
#else
- if (set_sun_path(port, UNIX_PATH, sockname.sun_path) != 0) {
+ if (set_sun_path(port, UNIX_PATH, sockname.sun_path, abstract) != 0) {
#endif
PRMSG (1, "SocketUNIXConnect: path too long\n", 0, 0, 0);
return TRANS_CONNECT_FAILED;
@@ -2722,6 +2769,14 @@
#endif
/*
+ * Adjust the socket path if using abstract sockets.
+ * Done here because otherwise all the strlen() calls above would fail.
+ */
+
+ if (abstract)
+ sockname.sun_path[0] = '\0';
+
+ /*
* Do the connect()
*/
@@ -2757,12 +2812,18 @@
* should try again.
*/
- if (olderrno == ENOENT || olderrno == EINTR)
- return TRANS_TRY_CONNECT_AGAIN;
- else if (olderrno == EWOULDBLOCK || olderrno == EINPROGRESS)
+ if (olderrno == EWOULDBLOCK || olderrno == EINPROGRESS)
return TRANS_IN_PROGRESS;
- else
- {
+ else if (olderrno == EINTR)
+ return TRANS_TRY_CONNECT_AGAIN;
+ else if (olderrno == ENOENT || olderrno == ECONNREFUSED)
+ /* If opening as abstract failed, try again normally */
+ if (abstract) {
+ ciptr->transptr->flags &= ~(TRANS_ABSTRACT);
+ return TRANS_TRY_CONNECT_AGAIN;
+ } else {
+ return TRANS_CONNECT_FAILED;
+ } else {
PRMSG (2,"SocketUNIXConnect: Can't connect: errno = %d\n",
EGET(),0, 0);
@@ -2791,6 +2852,9 @@
return TRANS_CONNECT_FAILED;
}
+ if (abstract)
+ sockname.sun_path[0] = '@';
+
ciptr->family = AF_UNIX;
ciptr->addrlen = namelen;
ciptr->peeraddrlen = namelen;
@@ -3323,7 +3387,11 @@
Xtransport TRANS(SocketLocalFuncs) = {
/* Socket Interface */
"local",
+#ifdef HAVE_ABSTRACT_SOCKETS
+ TRANS_ABSTRACT,
+#else
0,
+#endif
#ifdef TRANS_CLIENT
TRANS(SocketOpenCOTSClient),
#endif /* TRANS_CLIENT */
@@ -3369,7 +3437,7 @@
Xtransport TRANS(SocketUNIXFuncs) = {
/* Socket Interface */
"unix",
-#if !defined(LOCALCONN)
+#if !defined(LOCALCONN) && !defined(HAVE_ABSTRACT_SOCKETS)
TRANS_ALIAS,
#else
0,
--- a/nx-X11/lib/xtrans/Xtransint.h
+++ b/nx-X11/lib/xtrans/Xtransint.h
@@ -374,9 +374,10 @@
#define TRANS_DISABLED (1<<2) /* Don't open this one */
#define TRANS_NOLISTEN (1<<3) /* Don't listen on this one */
#define TRANS_NOUNLINK (1<<4) /* Dont unlink transport endpoints */
+#define TRANS_ABSTRACT (1<<5) /* Use abstract sockets if available */
/* Flags to preserve when setting others */
-#define TRANS_KEEPFLAGS (TRANS_NOUNLINK)
+#define TRANS_KEEPFLAGS (TRANS_NOUNLINK|TRANS_ABSTRACT)
/*
* readv() and writev() don't exist or don't work correctly on some
debian/patches/series
View file @
f6619070
028_nx-X11_abstract-kernel-sockets.full.patch
029_nxcomp_ppc64.full+lite.patch
030_nx-X11_configure-args.full.patch
031_nx-X11_parallel-make.full.patch
...
...
nx-X11/lib/xtrans/Xtransint.h
View file @
f6619070
...
...
@@ -374,9 +374,10 @@ typedef struct _Xtransport_table {
#define TRANS_DISABLED (1<<2)
/* Don't open this one */
#define TRANS_NOLISTEN (1<<3)
/* Don't listen on this one */
#define TRANS_NOUNLINK (1<<4)
/* Dont unlink transport endpoints */
#define TRANS_ABSTRACT (1<<5)
/* Use abstract sockets if available */
/* Flags to preserve when setting others */
#define TRANS_KEEPFLAGS (TRANS_NOUNLINK)
#define TRANS_KEEPFLAGS (TRANS_NOUNLINK
|TRANS_ABSTRACT
)
/*
* readv() and writev() don't exist or don't work correctly on some
...
...
nx-X11/lib/xtrans/Xtranssock.c
View file @
f6619070
...
...
@@ -172,6 +172,8 @@ static int IBMsockInit = 0;
sock_init();\
IBMsockInit = 1;\
}
#undef EINTR
#define EINTR SOCEINTR
#undef EINVAL
...
...
@@ -192,6 +194,10 @@ static int IBMsockInit = 0;
#define SocketInitOnce()
/**/
#endif
#if defined(linux)
#define HAVE_ABSTRACT_SOCKETS
#endif
#define MIN_BACKLOG 128
#ifdef SOMAXCONN
#if SOMAXCONN > MIN_BACKLOG
...
...
@@ -532,7 +538,7 @@ static char *_NXGetOldUnixPath(char *path)
void
TRANS
(
SocketRejectConnection
)
(
XtransConnInfo
ciptr
)
{
s
ize
_t
sa_l
=
sizeof
(
struct
sockaddr
);
s
ocklen
_t
sa_l
=
sizeof
(
struct
sockaddr
);
struct
sockaddr
sa
;
fd_set
fs
;
struct
timeval
t
;
...
...
@@ -914,9 +920,11 @@ TRANS(SocketINETGetAddr) (XtransConnInfo ciptr)
struct
sockaddr_in
socknamev4
;
void
*
socknamePtr
;
#if defined(SVR4) || defined(__SCO__)
# define SOCKLEN_T_PTR void*
size_t
namelen
;
#else
int
namelen
;
# define SOCKLEN_T_PTR socklen_t*
socklen_t
namelen
;
#endif
PRMSG
(
3
,
"SocketINETGetAddr(%p)
\n
"
,
ciptr
,
0
,
0
);
...
...
@@ -935,7 +943,7 @@ TRANS(SocketINETGetAddr) (XtransConnInfo ciptr)
}
if
(
getsockname
(
ciptr
->
fd
,(
struct
sockaddr
*
)
socknamePtr
,
(
void
*
)
&
namelen
)
<
0
)
(
SOCKLEN_T_PTR
)
&
namelen
)
<
0
)
{
#ifdef WIN32
errno
=
WSAGetLastError
();
...
...
@@ -1477,23 +1485,28 @@ TRANS(SocketSetOption) (XtransConnInfo ciptr, int option, int arg)
#ifdef UNIXCONN
static
int
set_sun_path
(
const
char
*
port
,
const
char
*
upath
,
char
*
path
)
set_sun_path
(
const
char
*
port
,
const
char
*
upath
,
char
*
path
,
int
abstract
)
{
struct
sockaddr_un
s
;
int
maxlen
=
sizeof
(
s
.
sun_path
)
-
1
;
const
char
*
at
=
""
;
if
(
!
port
||
!*
port
||
!
path
)
return
-
1
;
if
(
*
port
==
'/'
)
{
/* a full pathname */
if
(
strlen
(
port
)
>
maxlen
)
return
-
1
;
sprintf
(
path
,
"%s"
,
port
);
}
else
{
if
(
strlen
(
port
)
+
strlen
(
upath
)
>
maxlen
)
return
-
1
;
sprintf
(
path
,
"%s%s"
,
upath
,
port
);
}
#ifdef HAVE_ABSTRACT_SOCKETS
if
(
port
[
0
]
==
'@'
)
upath
=
""
;
else
if
(
abstract
)
at
=
"@"
;
#endif
if
(
*
port
==
'/'
)
/* a full pathname */
upath
=
""
;
if
(
strlen
(
port
)
+
strlen
(
upath
)
>
maxlen
)
return
-
1
;
snprintf
(
path
,
sizeof
(
s
.
sun_path
),
"%s%s%s"
,
at
,
upath
,
port
);
return
0
;
}
#endif
...
...
@@ -1726,6 +1739,12 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port,
int
oldUmask
;
int
status
;
unsigned
int
mode
;
char
tmpport
[
108
];
int
abstract
=
0
;
#ifdef HAVE_ABSTRACT_SOCKETS
abstract
=
ciptr
->
transptr
->
flags
&
TRANS_ABSTRACT
;
#endif
PRMSG
(
2
,
"SocketUNIXCreateListener(%s)
\n
"
,
port
?
port
:
"NULL"
,
0
,
0
);
...
...
@@ -1741,11 +1760,11 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port,
mode
=
0777
;
#endif
#ifdef NX_TRANS_SOCKET
if
(
trans_mkdir
(
_NXGetUnixDir
(
UNIX_DIR
),
mode
)
==
-
1
)
{
if
(
!
abstract
&&
trans_mkdir
(
_NXGetUnixDir
(
UNIX_DIR
),
mode
)
==
-
1
)
{
PRMSG
(
1
,
"SocketUNIXCreateListener: mkdir(%s) failed, errno = %d
\n
"
,
_NXGetUnixDir
(
UNIX_DIR
),
errno
,
0
);
#else
if
(
trans_mkdir
(
UNIX_DIR
,
mode
)
==
-
1
)
{
if
(
!
abstract
&&
trans_mkdir
(
UNIX_DIR
,
mode
)
==
-
1
)
{
PRMSG
(
1
,
"SocketUNIXCreateListener: mkdir(%s) failed, errno = %d
\n
"
,
UNIX_DIR
,
errno
,
0
);
#endif
...
...
@@ -1754,13 +1773,18 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port,
}
#endif
memset
(
&
sockname
,
0
,
sizeof
(
sockname
));
sockname
.
sun_family
=
AF_UNIX
;
if
(
!
(
port
&&
*
port
))
{
snprintf
(
tmpport
,
sizeof
(
tmpport
),
"%s%ld"
,
UNIX_PATH
,
(
long
)
getpid
());
port
=
tmpport
;
}
if
(
port
&&
*
port
)
{
#ifdef NX_TRANS_SOCKET
if
(
set_sun_path
(
port
,
_NXGetUnixPath
(
UNIX_PATH
),
sockname
.
sun_path
)
!=
0
)
{
if
(
set_sun_path
(
port
,
_NXGetUnixPath
(
UNIX_PATH
),
sockname
.
sun_path
,
abstract
)
!=
0
)
{
#else
if
(
set_sun_path
(
port
,
UNIX_PATH
,
sockname
.
sun_path
)
!=
0
)
{
if
(
set_sun_path
(
port
,
UNIX_PATH
,
sockname
.
sun_path
,
abstract
)
!=
0
)
{
#endif
PRMSG
(
1
,
"SocketUNIXCreateListener: path too long
\n
"
,
0
,
0
,
0
);
return
TRANS_CREATE_LISTENER_FAILED
;
...
...
@@ -1784,7 +1808,12 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port,
fprintf
(
stderr
,
"SocketUNIXCreateListener: Unlinking path [%s] for ciptr at [%p].
\n
"
,
sockname
.
sun_path
,
(
void
*
)
ciptr
);
#endif
unlink
(
sockname
.
sun_path
);
if
(
abstract
)
{
sockname
.
sun_path
[
0
]
=
'\0'
;
namelen
=
offsetof
(
struct
sockaddr_un
,
sun_path
)
+
1
+
strlen
(
&
sockname
.
sun_path
[
1
]);
}
else
unlink
(
sockname
.
sun_path
);
if
((
status
=
TRANS
(
SocketCreateListener
)
(
ciptr
,
(
struct
sockaddr
*
)
&
sockname
,
namelen
,
flags
))
<
0
)
...
...
@@ -1814,6 +1843,9 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port,
return
TRANS_CREATE_LISTENER_FAILED
;
}
if
(
abstract
)
sockname
.
sun_path
[
0
]
=
'@'
;
ciptr
->
family
=
sockname
.
sun_family
;
ciptr
->
addrlen
=
namelen
;
memcpy
(
ciptr
->
addr
,
&
sockname
,
ciptr
->
addrlen
);
...
...
@@ -1823,7 +1855,6 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port,
return
0
;
}
static
int
TRANS
(
SocketUNIXResetListener
)
(
XtransConnInfo
ciptr
)
...
...
@@ -1836,15 +1867,20 @@ TRANS(SocketUNIXResetListener) (XtransConnInfo ciptr)
struct
stat
statb
;
int
status
=
TRANS_RESET_NOOP
;
unsigned
int
mode
;
int
abstract
=
0
;
#ifdef HAVE_ABSTRACT_SOCKETS
abstract
=
ciptr
->
transptr
->
flags
&
TRANS_ABSTRACT
;
#endif
PRMSG
(
3
,
"SocketUNIXResetListener(%p,%d)
\n
"
,
ciptr
,
ciptr
->
fd
,
0
);
if
(
stat
(
unsock
->
sun_path
,
&
statb
)
==
-
1
||
if
(
!
abstract
&&
(
stat
(
unsock
->
sun_path
,
&
statb
)
==
-
1
||
((
statb
.
st_mode
&
S_IFMT
)
!=
#if (defined (sun) && defined(SVR4)) || defined(NCR) || defined(SCO325) || !defined(S_IFSOCK)
S_IFIFO
))
#else
S_IFSOCK
))
S_IFSOCK
))
)
#endif
{
int
oldUmask
=
umask
(
0
);
...
...
@@ -2034,6 +2070,11 @@ TRANS(SocketUNIXAccept) (XtransConnInfo ciptr, int *status)
}
/*
* if the socket is abstract, we already modified the address to have a
* @ instead of the initial NUL, so no need to do that again here.
*/
newciptr
->
addrlen
=
ciptr
->
addrlen
;
memcpy
(
newciptr
->
addr
,
ciptr
->
addr
,
newciptr
->
addrlen
);
...
...
@@ -2626,6 +2667,12 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port)
struct
sockaddr_un
sockname
;
int
namelen
;
int
abstract
=
0
;
#ifdef HAVE_ABSTRACT_SOCKETS
abstract
=
ciptr
->
transptr
->
flags
&
TRANS_ABSTRACT
;
#endif
#if defined(hpux) && defined(X11_t)
struct
sockaddr_un
old_sockname
;
int
old_namelen
;
...
...
@@ -2674,9 +2721,9 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port)
sockname
.
sun_family
=
AF_UNIX
;
#ifdef NX_TRANS_SOCKET
if
(
set_sun_path
(
port
,
_NXGetUnixPath
(
UNIX_PATH
),
sockname
.
sun_path
)
!=
0
)
{
if
(
set_sun_path
(
port
,
_NXGetUnixPath
(
UNIX_PATH
),
sockname
.
sun_path
,
abstract
)
!=
0
)
{
#else
if
(
set_sun_path
(
port
,
UNIX_PATH
,
sockname
.
sun_path
)
!=
0
)
{
if
(
set_sun_path
(
port
,
UNIX_PATH
,
sockname
.
sun_path
,
abstract
)
!=
0
)
{
#endif
PRMSG
(
1
,
"SocketUNIXConnect: path too long
\n
"
,
0
,
0
,
0
);
return
TRANS_CONNECT_FAILED
;
...
...
@@ -2722,6 +2769,14 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port)
#endif
/*
* Adjust the socket path if using abstract sockets.
* Done here because otherwise all the strlen() calls above would fail.
*/
if
(
abstract
)
sockname
.
sun_path
[
0
]
=
'\0'
;
/*
* Do the connect()
*/
...
...
@@ -2757,12 +2812,18 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port)
* should try again.
*/
if
(
olderrno
==
ENOENT
||
olderrno
==
EINTR
)
return
TRANS_TRY_CONNECT_AGAIN
;
else
if
(
olderrno
==
EWOULDBLOCK
||
olderrno
==
EINPROGRESS
)
if
(
olderrno
==
EWOULDBLOCK
||
olderrno
==
EINPROGRESS
)
return
TRANS_IN_PROGRESS
;
else
{
else
if
(
olderrno
==
EINTR
)
return
TRANS_TRY_CONNECT_AGAIN
;
else
if
(
olderrno
==
ENOENT
||
olderrno
==
ECONNREFUSED
)
/* If opening as abstract failed, try again normally */
if
(
abstract
)
{
ciptr
->
transptr
->
flags
&=
~
(
TRANS_ABSTRACT
);
return
TRANS_TRY_CONNECT_AGAIN
;
}
else
{
return
TRANS_CONNECT_FAILED
;
}
else
{
PRMSG
(
2
,
"SocketUNIXConnect: Can't connect: errno = %d
\n
"
,
EGET
(),
0
,
0
);
...
...
@@ -2791,6 +2852,9 @@ SocketUNIXConnectPost:
return
TRANS_CONNECT_FAILED
;
}
if
(
abstract
)
sockname
.
sun_path
[
0
]
=
'@'
;
ciptr
->
family
=
AF_UNIX
;
ciptr
->
addrlen
=
namelen
;
ciptr
->
peeraddrlen
=
namelen
;
...
...
@@ -3323,7 +3387,11 @@ Xtransport TRANS(SocketINET6Funcs) = {
Xtransport
TRANS
(
SocketLocalFuncs
)
=
{
/* Socket Interface */
"local"
,
#ifdef HAVE_ABSTRACT_SOCKETS
TRANS_ABSTRACT
,
#else
0
,
#endif
#ifdef TRANS_CLIENT
TRANS
(
SocketOpenCOTSClient
),
#endif
/* TRANS_CLIENT */
...
...
@@ -3369,7 +3437,7 @@ static char* unix_nolisten[] = { "local" , NULL };
Xtransport
TRANS
(
SocketUNIXFuncs
)
=
{
/* Socket Interface */
"unix"
,
#if !defined(LOCALCONN)
#if !defined(LOCALCONN)
&& !defined(HAVE_ABSTRACT_SOCKETS)
TRANS_ALIAS
,
#else
0
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment