From c057653881c65cbbd9b853d119c9f873a9f9f641 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Tue, 31 Aug 1999 03:25:23 +0000 Subject: [PATCH] Added lutil_pair() --- libraries/liblutil/Makefile.in | 4 +-- libraries/liblutil/sockpair.c | 45 ++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 libraries/liblutil/sockpair.c diff --git a/libraries/liblutil/Makefile.in b/libraries/liblutil/Makefile.in index 189f2f6623..eba6a65ad9 100644 --- a/libraries/liblutil/Makefile.in +++ b/libraries/liblutil/Makefile.in @@ -4,9 +4,9 @@ LIBRARY = liblutil.a SRCS = base64.c debug.c detach.c \ - md5.c passwd.c sha1.c getpass.c lockf.c utils.c + md5.c passwd.c sha1.c getpass.c lockf.c utils.c sockpair.c OBJS = base64.o debug.o detach.o \ - md5.o passwd.o sha1.o getpass.o lockf.o utils.o \ + md5.o passwd.o sha1.o getpass.o lockf.o utils.o sockpair.o \ @LIBOBJS@ LDAP_INCDIR= ../../include diff --git a/libraries/liblutil/sockpair.c b/libraries/liblutil/sockpair.c new file mode 100644 index 0000000000..8fb279cf40 --- /dev/null +++ b/libraries/liblutil/sockpair.c @@ -0,0 +1,45 @@ +/* + * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. + * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + */ + +#include "portable.h" + +#include + +/* Return a pair of descriptors that are connected to each other. The + * returned descriptors are suitable for use with select(). The two + * descriptors may or may not be identical; the function may return + * the same descriptor number in both slots. It is guaranteed that + * data written on fds[1] will be readable on fds[0]. The returned + * descriptors may be datagram oriented, so data should be written + * in reasonably small pieces and read all at once. On Unix systems + * this function is best implemented using a single pipe() call. + */ +int lutil_pair( int fds[2] ) +{ + struct sockaddr_in si; + int rc, len = sizeof(si); + int fd; + + fd = socket( AF_INET, SOCK_DGRAM, 0 ); + if (fd < 0) + return fd; + + (void) memset( (void*) &si, 0, len ); + si.sin_family = AF_INET; + si.sin_port = 0; + si.sin_addr.s_addr = htonl( INADDR_LOOPBACK ); + + if ( rc = bind( fd, (struct sockaddr *)&si, len ) ) + { +fail: tcp_close(fd); + return rc; + } + if ( rc = getsockname( fd, (struct sockaddr *)&si, &len ) ) + goto fail; + if ( rc = connect( fd, (struct sockaddr *)&si, len ) ) + goto fail; + fds[0] = fds[1] = fd; + return 0; +} -- 2.39.5