1 /* $NetBSD: stream_connect.c,v 1.1.1.1 2009/06/23 10:09:00 tron Exp $ */ 2 3 /*++ 4 /* NAME 5 /* stream_connect 3 6 /* SUMMARY 7 /* connect to stream listener 8 /* SYNOPSIS 9 /* #include <connect.h> 10 /* 11 /* int stream_connect(path, block_mode, timeout) 12 /* const char *path; 13 /* int block_mode; 14 /* int timeout; 15 /* DESCRIPTION 16 /* stream_connect() connects to a stream listener for the specified 17 /* pathname, and returns the resulting file descriptor. 18 /* 19 /* Arguments: 20 /* .IP path 21 /* Null-terminated string with listener endpoint name. 22 /* .IP block_mode 23 /* Either NON_BLOCKING for a non-blocking stream, or BLOCKING for 24 /* blocking mode. However, a stream connection succeeds or fails 25 /* immediately. 26 /* .IP timeout 27 /* This argument is ignored; it is present for compatibility with 28 /* other interfaces. Stream connections succeed or fail immediately. 29 /* DIAGNOSTICS 30 /* The result is -1 in case the connection could not be made. 31 /* Fatal errors: other system call failures. 32 /* LICENSE 33 /* .ad 34 /* .fi 35 /* The Secure Mailer license must be distributed with this software. 36 /* AUTHOR(S) 37 /* Wietse Venema 38 /* IBM T.J. Watson Research 39 /* P.O. Box 704 40 /* Yorktown Heights, NY 10598, USA 41 /*--*/ 42 43 /* System library. */ 44 45 #include <sys_defs.h> 46 47 #ifdef STREAM_CONNECTIONS 48 49 #include <sys/stat.h> 50 #include <unistd.h> 51 #include <fcntl.h> 52 #include <errno.h> 53 #include <stropts.h> 54 55 #endif 56 57 /* Utility library. */ 58 59 #include <msg.h> 60 #include <connect.h> 61 62 /* stream_connect - connect to stream listener */ 63 64 int stream_connect(const char *path, int block_mode, int unused_timeout) 65 { 66 #ifdef STREAM_CONNECTIONS 67 const char *myname = "stream_connect"; 68 int pair[2]; 69 int fifo; 70 71 /* 72 * The requested file system object must exist, otherwise we can't reach 73 * the server. 74 */ 75 if ((fifo = open(path, O_WRONLY | O_NONBLOCK, 0)) < 0) 76 return (-1); 77 78 /* 79 * This is for {unix,inet}_connect() compatibility. 80 */ 81 if (block_mode == BLOCKING) 82 non_blocking(fifo, BLOCKING); 83 84 /* 85 * Create a pipe, and send one pipe end to the server. 86 */ 87 if (pipe(pair) < 0) 88 msg_fatal("%s: pipe: %m", myname); 89 if (ioctl(fifo, I_SENDFD, pair[1]) < 0) 90 msg_fatal("%s: send file descriptor: %m", myname); 91 close(pair[1]); 92 93 /* 94 * This is for {unix,inet}_connect() compatibility. 95 */ 96 if (block_mode == NON_BLOCKING) 97 non_blocking(pair[0], NON_BLOCKING); 98 99 /* 100 * Cleanup. 101 */ 102 close(fifo); 103 104 /* 105 * Keep the other end of the pipe. 106 */ 107 return (pair[0]); 108 #else 109 msg_fatal("stream connections are not implemented"); 110 #endif 111 } 112