This is socketpair.c in view mode; [Download] [Up]
/*
socketpair() emulator for System V Release 3
socketpair driver included here ignores all the standard
socketpair() parameters except the file descriptors.
s_pipe() is by W. Richard Stevens from the book titled
"Unix Network Programming" ISBN 0-13-949876-1 1990
*/
#include "includes.h"
#include <sys/stream.h> /* defines queue_t */
#include <stropts.h> /* defines strfdinsert */
#define SPX_DEVICE "/dev/spx"
int socketpair(int a_family, int s_type, int s_protocol, int s_fd)
{
return s_pipe(s_fd);
}
int s_pipe(int fd[2])
{
struct strfdinsert ins;
queue_t *pointer;
/*
* Open the stream clone device "/dev/spx" twice,
* obtaining 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.maxlen = 0;
ins.databuf.len = -1; /* magic! must be -1 not 0 for stream pipe */
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); /* tutto posto */
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.