diff options
| author | Sam Varshavchik | 2013-08-19 16:39:41 -0400 | 
|---|---|---|
| committer | Sam Varshavchik | 2013-08-25 14:43:51 -0400 | 
| commit | 9c45d9ad13fdf439d44d7443ae75da15ea0223ed (patch) | |
| tree | 7a81a04cb51efb078ee350859a64be2ebc6b8813 /tcpd/spipe.c | |
| parent | a9520698b770168d1f33d6301463bb70a19655ec (diff) | |
| download | courier-libs-9c45d9ad13fdf439d44d7443ae75da15ea0223ed.tar.bz2 | |
Initial checkin
Imported from subversion report, converted to git. Updated all paths in
scripts and makefiles, reflecting the new directory hierarchy.
Diffstat (limited to 'tcpd/spipe.c')
| -rw-r--r-- | tcpd/spipe.c | 92 | 
1 files changed, 92 insertions, 0 deletions
| diff --git a/tcpd/spipe.c b/tcpd/spipe.c new file mode 100644 index 0000000..d60a508 --- /dev/null +++ b/tcpd/spipe.c @@ -0,0 +1,92 @@ +/* +** Copyright 2000 Double Precision, Inc. +** See COPYING for distribution information. +*/ + + +#include	"config.h" +#include	"spipe.h" + +#if HAVE_SPIPE_SOCKETPAIR + +#include <sys/types.h> +#include <sys/socket.h> + +int libmail_streampipe(int fd[2]) +{ +	return (socketpair(PF_UNIX, SOCK_STREAM, 0, fd)); +} +#endif + +#if HAVE_SPIPE_SVR3 + +/* This is, basically, Stevens */ + +#include	<sys/types.h> +#include	<sys/stream.h>		/* defines queue_t */ +#include	<stropts.h>		/* defines struct strfdinsert */ +#include	<fcntl.h> + +#define	SPX_DEVICE	"/dev/spx" + +int					/* return 0 if OK, -1 on error */ +libmail_streampipe(int fd[2]) +		/* two file descriptors returned through here */ +{ +	struct strfdinsert	ins; +	queue_t			*pointer; + +	/* +	 * First open the stream clone device "/dev/spx" twice, +	 * obtaining the two file descriptors. +	 */ + +	if ( (fd[0] = open(SPX_DEVICE, O_RDWR)) < 0) +		return(-1); + +	if ( (fd[1] = open(SPX_DEVICE, O_RDWR)) < 0) { +		close(fd[0]); +		return(-1); +	} + +	/* +	 * Now link these two streams together with an I_FDINSERT ioctl. +	 */ + +	ins.ctlbuf.buf     = (char *) &pointer;	/* no ctl info, just the ptr */ +	ins.ctlbuf.maxlen  = sizeof(queue_t *); +	ins.ctlbuf.len     = sizeof(queue_t *); + +	ins.databuf.buf    = (char *) 0;	/* no data to send */ +	ins.databuf.len    = -1; /* magic: must be -1, not 0, for stream pipe */ +	ins.databuf.maxlen = 0; + +	ins.fildes = fd[1];	/* the fd to connect with fd[0] */ +	ins.flags  = 0;		/* nonpriority message */ +	ins.offset = 0;		/* offset of pointer in control buffer */ + +	if (ioctl(fd[0], I_FDINSERT, (char * ) &ins) < 0) { +		close(fd[0]); +		close(fd[1]); +		return(-1); +	} + +	return(0);		/* all OK */ +} + +#endif + +#if HAVE_SPIPE_SVR4 + +#include	<stdio.h> +#if	HAVE_UNISTD_H +#include	<unistd.h> +#endif +#include	<stdlib.h> + +int	libmail_streampipe(int fd[2]) +{ +	return (pipe(fd)); +} + +#endif | 
