2 Unix SMB/CIFS implementation.
3 Samba utility functions
4 Copyright (C) Andrew Tridgell 1992-1998
5 Copyright (C) Tim Potter 2000-2001
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 /* the last IP received from */
25 struct in_addr lastip;
27 /* the last port received from */
30 int smb_read_error = 0;
32 /****************************************************************************
33 Determine if a file descriptor is in fact a socket.
34 ****************************************************************************/
36 BOOL is_a_socket(int fd)
40 return(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&v, &l) == 0);
43 enum SOCK_OPT_TYPES {OPT_BOOL,OPT_INT,OPT_ON};
45 typedef struct smb_socket_option {
53 static const smb_socket_option socket_options[] = {
54 {"SO_KEEPALIVE", SOL_SOCKET, SO_KEEPALIVE, 0, OPT_BOOL},
55 {"SO_REUSEADDR", SOL_SOCKET, SO_REUSEADDR, 0, OPT_BOOL},
56 {"SO_BROADCAST", SOL_SOCKET, SO_BROADCAST, 0, OPT_BOOL},
58 {"TCP_NODELAY", IPPROTO_TCP, TCP_NODELAY, 0, OPT_BOOL},
61 {"IPTOS_LOWDELAY", IPPROTO_IP, IP_TOS, IPTOS_LOWDELAY, OPT_ON},
63 #ifdef IPTOS_THROUGHPUT
64 {"IPTOS_THROUGHPUT", IPPROTO_IP, IP_TOS, IPTOS_THROUGHPUT, OPT_ON},
67 {"SO_REUSEPORT", SOL_SOCKET, SO_REUSEPORT, 0, OPT_BOOL},
70 {"SO_SNDBUF", SOL_SOCKET, SO_SNDBUF, 0, OPT_INT},
73 {"SO_RCVBUF", SOL_SOCKET, SO_RCVBUF, 0, OPT_INT},
76 {"SO_SNDLOWAT", SOL_SOCKET, SO_SNDLOWAT, 0, OPT_INT},
79 {"SO_RCVLOWAT", SOL_SOCKET, SO_RCVLOWAT, 0, OPT_INT},
82 {"SO_SNDTIMEO", SOL_SOCKET, SO_SNDTIMEO, 0, OPT_INT},
85 {"SO_RCVTIMEO", SOL_SOCKET, SO_RCVTIMEO, 0, OPT_INT},
89 /****************************************************************************
91 ****************************************************************************/
93 static void print_socket_options(int s)
96 const smb_socket_option *p = &socket_options[0];
98 for (; p->name != NULL; p++) {
99 if (getsockopt(s, p->level, p->option, (void *)&value, &vlen) == -1) {
100 DEBUG(5,("Could not test socket option %s.\n", p->name));
102 DEBUG(5,("socket option %s = %d\n",p->name,value));
107 /****************************************************************************
108 Set user socket options.
109 ****************************************************************************/
111 void set_socket_options(int fd, const char *options)
115 while (next_token(&options,tok," \t,", sizeof(tok))) {
119 BOOL got_value = False;
121 if ((p = strchr_m(tok,'='))) {
127 for (i=0;socket_options[i].name;i++)
128 if (strequal(socket_options[i].name,tok))
131 if (!socket_options[i].name) {
132 DEBUG(0,("Unknown socket option %s\n",tok));
136 switch (socket_options[i].opttype) {
139 ret = setsockopt(fd,socket_options[i].level,
140 socket_options[i].option,(char *)&value,sizeof(int));
145 DEBUG(0,("syntax error - %s does not take a value\n",tok));
148 int on = socket_options[i].value;
149 ret = setsockopt(fd,socket_options[i].level,
150 socket_options[i].option,(char *)&on,sizeof(int));
156 DEBUG(0,("Failed to set socket option %s (Error %s)\n",tok, strerror(errno) ));
159 print_socket_options(fd);
162 /****************************************************************************
164 ****************************************************************************/
166 ssize_t read_udp_socket(int fd,char *buf,size_t len)
169 struct sockaddr_in sock;
170 socklen_t socklen = sizeof(sock);
172 memset((char *)&sock,'\0',socklen);
173 memset((char *)&lastip,'\0',sizeof(lastip));
174 ret = (ssize_t)sys_recvfrom(fd,buf,len,0,(struct sockaddr *)&sock,&socklen);
176 DEBUG(2,("read socket failed. ERRNO=%s\n",strerror(errno)));
180 lastip = sock.sin_addr;
181 lastport = ntohs(sock.sin_port);
183 DEBUG(10,("read_udp_socket: lastip %s lastport %d read: %d\n",
184 inet_ntoa(lastip), lastport, ret));
189 /****************************************************************************
190 Read data from a socket with a timout in msec.
191 mincount = if timeout, minimum to read before returning
192 maxcount = number to be read.
193 time_out = timeout in milliseconds
194 ****************************************************************************/
196 ssize_t read_socket_with_timeout(int fd,char *buf,size_t mincnt,size_t maxcnt,unsigned int time_out)
202 struct timeval timeout;
204 /* just checking .... */
212 if (mincnt == 0) mincnt = maxcnt;
214 while (nread < mincnt) {
215 readret = sys_read(fd, buf + nread, maxcnt - nread);
218 DEBUG(5,("read_socket_with_timeout: blocking read. EOF from client.\n"));
219 smb_read_error = READ_EOF;
224 DEBUG(0,("read_socket_with_timeout: read error = %s.\n", strerror(errno) ));
225 smb_read_error = READ_ERROR;
230 return((ssize_t)nread);
233 /* Most difficult - timeout read */
234 /* If this is ever called on a disk file and
235 mincnt is greater then the filesize then
236 system performance will suffer severely as
237 select always returns true on disk files */
239 /* Set initial timeout */
240 timeout.tv_sec = (time_t)(time_out / 1000);
241 timeout.tv_usec = (long)(1000 * (time_out % 1000));
243 for (nread=0; nread < mincnt; ) {
247 selrtn = sys_select_intr(fd+1,&fds,NULL,NULL,&timeout);
251 /* something is wrong. Maybe the socket is dead? */
252 DEBUG(0,("read_socket_with_timeout: timeout read. select error = %s.\n", strerror(errno) ));
253 smb_read_error = READ_ERROR;
257 /* Did we timeout ? */
259 DEBUG(10,("read_socket_with_timeout: timeout read. select timed out.\n"));
260 smb_read_error = READ_TIMEOUT;
264 readret = sys_read(fd, buf+nread, maxcnt-nread);
267 /* we got EOF on the file descriptor */
268 DEBUG(5,("read_socket_with_timeout: timeout read. EOF from client.\n"));
269 smb_read_error = READ_EOF;
274 /* the descriptor is probably dead */
275 DEBUG(0,("read_socket_with_timeout: timeout read. read error = %s.\n", strerror(errno) ));
276 smb_read_error = READ_ERROR;
283 /* Return the number we got */
284 return (ssize_t)nread;
287 /****************************************************************************
288 read data from the client, reading exactly N bytes.
289 ****************************************************************************/
291 ssize_t read_data(int fd,char *buffer,size_t N)
299 ret = sys_read(fd,buffer + total,N - total);
302 DEBUG(10,("read_data: read of %d returned 0. Error = %s\n", (int)(N - total), strerror(errno) ));
303 smb_read_error = READ_EOF;
308 DEBUG(0,("read_data: read failure for %d. Error = %s\n", (int)(N - total), strerror(errno) ));
309 smb_read_error = READ_ERROR;
314 return (ssize_t)total;
317 /****************************************************************************
318 Read data from a socket, reading exactly N bytes.
319 ****************************************************************************/
321 static ssize_t read_socket_data(int fd,char *buffer,size_t N)
329 ret = sys_read(fd,buffer + total,N - total);
332 DEBUG(10,("read_socket_data: recv of %d returned 0. Error = %s\n", (int)(N - total), strerror(errno) ));
333 smb_read_error = READ_EOF;
338 DEBUG(0,("read_socket_data: recv failure for %d. Error = %s\n", (int)(N - total), strerror(errno) ));
339 smb_read_error = READ_ERROR;
344 return (ssize_t)total;
347 /****************************************************************************
349 ****************************************************************************/
351 ssize_t write_data(int fd,char *buffer,size_t N)
357 ret = sys_write(fd,buffer + total,N - total);
360 DEBUG(0,("write_data: write failure. Error = %s\n", strerror(errno) ));
368 return (ssize_t)total;
371 /****************************************************************************
372 Write data to a socket - use send rather than write.
373 ****************************************************************************/
375 static ssize_t write_socket_data(int fd,char *buffer,size_t N)
381 ret = sys_send(fd,buffer + total,N - total,0);
384 DEBUG(0,("write_socket_data: write failure. Error = %s\n", strerror(errno) ));
392 return (ssize_t)total;
395 /****************************************************************************
397 ****************************************************************************/
399 ssize_t write_socket(int fd,char *buf,size_t len)
403 DEBUG(6,("write_socket(%d,%d)\n",fd,(int)len));
404 ret = write_socket_data(fd,buf,len);
406 DEBUG(6,("write_socket(%d,%d) wrote %d\n",fd,(int)len,(int)ret));
408 DEBUG(0,("write_socket: Error writing %d bytes to socket %d: ERRNO = %s\n",
409 (int)len, fd, strerror(errno) ));
414 /****************************************************************************
415 send a keepalive packet (rfc1002)
416 ****************************************************************************/
418 BOOL send_keepalive(int client)
420 unsigned char buf[4];
422 buf[0] = SMBkeepalive;
423 buf[1] = buf[2] = buf[3] = 0;
425 return(write_socket_data(client,(char *)buf,4) == 4);
429 /****************************************************************************
430 read 4 bytes of a smb packet and return the smb length of the packet
431 store the result in the buffer
432 This version of the function will return a length of zero on receiving
434 timeout is in milliseconds.
435 ****************************************************************************/
437 static ssize_t read_smb_length_return_keepalive(int fd,char *inbuf,unsigned int timeout)
445 ok = (read_socket_with_timeout(fd,inbuf,4,4,timeout) == 4);
447 ok = (read_socket_data(fd,inbuf,4) == 4);
452 len = smb_len(inbuf);
453 msg_type = CVAL(inbuf,0);
455 if (msg_type == SMBkeepalive)
456 DEBUG(5,("Got keepalive packet\n"));
459 DEBUG(10,("got smb length of %d\n",len));
464 /****************************************************************************
465 read 4 bytes of a smb packet and return the smb length of the packet
466 store the result in the buffer. This version of the function will
467 never return a session keepalive (length of zero).
468 timeout is in milliseconds.
469 ****************************************************************************/
471 ssize_t read_smb_length(int fd,char *inbuf,unsigned int timeout)
476 len = read_smb_length_return_keepalive(fd, inbuf, timeout);
481 /* Ignore session keepalives. */
482 if(CVAL(inbuf,0) != SMBkeepalive)
486 DEBUG(10,("read_smb_length: got smb length of %d\n",len));
491 /****************************************************************************
492 read an smb from a fd. Note that the buffer *MUST* be of size
493 BUFFER_SIZE+SAFETY_MARGIN.
494 The timeout is in milliseconds.
495 This function will return on a
496 receipt of a session keepalive packet.
497 ****************************************************************************/
499 BOOL receive_smb(int fd,char *buffer, unsigned int timeout)
505 memset(buffer,'\0',smb_size + 100);
507 len = read_smb_length_return_keepalive(fd,buffer,timeout);
509 DEBUG(10,("receive_smb: length < 0!\n"));
512 * Correct fix. smb_read_error may have already been
513 * set. Only set it here if not already set. Global
514 * variables still suck :-). JRA.
517 if (smb_read_error == 0)
518 smb_read_error = READ_ERROR;
523 * A WRITEX with CAP_LARGE_WRITEX can be 64k worth of data plus 65 bytes
524 * of header. Don't print the error if this fits.... JRA.
527 if (len > (BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE)) {
528 DEBUG(0,("Invalid packet length! (%d bytes).\n",len));
529 if (len > BUFFER_SIZE + (SAFETY_MARGIN/2)) {
532 * Correct fix. smb_read_error may have already been
533 * set. Only set it here if not already set. Global
534 * variables still suck :-). JRA.
537 if (smb_read_error == 0)
538 smb_read_error = READ_ERROR;
544 ret = read_socket_data(fd,buffer+4,len);
546 if (smb_read_error == 0)
547 smb_read_error = READ_ERROR;
555 /****************************************************************************
557 ****************************************************************************/
559 BOOL send_smb(int fd,char *buffer)
564 len = smb_len(buffer) + 4;
566 while (nwritten < len) {
567 ret = write_socket(fd,buffer+nwritten,len - nwritten);
569 DEBUG(0,("Error writing %d bytes to client. %d. (%s)\n",
570 (int)len,(int)ret, strerror(errno) ));
579 /****************************************************************************
580 Open a socket of the specified type, port, and address for incoming data.
581 ****************************************************************************/
583 int open_socket_in( int type, int port, int dlevel, uint32 socket_addr, BOOL rebind )
585 struct sockaddr_in sock;
588 memset( (char *)&sock, '\0', sizeof(sock) );
590 #ifdef HAVE_SOCK_SIN_LEN
591 sock.sin_len = sizeof(sock);
593 sock.sin_port = htons( port );
594 sock.sin_family = AF_INET;
595 sock.sin_addr.s_addr = socket_addr;
597 res = socket( AF_INET, type, 0 );
600 dbgtext( "open_socket_in(): socket() call failed: " );
601 dbgtext( "%s\n", strerror( errno ) );
606 /* This block sets/clears the SO_REUSEADDR and possibly SO_REUSEPORT. */
608 int val = rebind ? 1 : 0;
609 if( setsockopt(res,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val)) == -1 ) {
610 if( DEBUGLVL( dlevel ) ) {
611 dbgtext( "open_socket_in(): setsockopt: " );
612 dbgtext( "SO_REUSEADDR = %s ", val?"True":"False" );
613 dbgtext( "on port %d failed ", port );
614 dbgtext( "with error = %s\n", strerror(errno) );
618 if( setsockopt(res,SOL_SOCKET,SO_REUSEPORT,(char *)&val,sizeof(val)) == -1 ) {
619 if( DEBUGLVL( dlevel ) ) {
620 dbgtext( "open_socket_in(): setsockopt: ");
621 dbgtext( "SO_REUSEPORT = %s ", val?"True":"False" );
622 dbgtext( "on port %d failed ", port );
623 dbgtext( "with error = %s\n", strerror(errno) );
626 #endif /* SO_REUSEPORT */
629 /* now we've got a socket - we need to bind it */
630 if( bind( res, (struct sockaddr *)&sock, sizeof(sock) ) == -1 ) {
631 if( DEBUGLVL(dlevel) && (port == SMB_PORT1 || port == SMB_PORT2 || port == NMB_PORT) ) {
632 dbgtext( "bind failed on port %d ", port );
633 dbgtext( "socket_addr = %s.\n", inet_ntoa( sock.sin_addr ) );
634 dbgtext( "Error = %s\n", strerror(errno) );
640 DEBUG( 10, ( "bind succeeded on port %d\n", port ) );
645 /****************************************************************************
646 create an outgoing socket. timeout is in milliseconds.
647 **************************************************************************/
649 int open_socket_out(int type, struct in_addr *addr, int port ,int timeout)
651 struct sockaddr_in sock_out;
653 int connect_loop = 250; /* 250 milliseconds */
654 int loops = (timeout) / connect_loop;
656 /* create a socket to write to */
657 res = socket(PF_INET, type, 0);
659 { DEBUG(0,("socket error\n")); return -1; }
661 if (type != SOCK_STREAM) return(res);
663 memset((char *)&sock_out,'\0',sizeof(sock_out));
664 putip((char *)&sock_out.sin_addr,(char *)addr);
666 sock_out.sin_port = htons( port );
667 sock_out.sin_family = PF_INET;
669 /* set it non-blocking */
670 set_blocking(res,False);
672 DEBUG(3,("Connecting to %s at port %d\n",inet_ntoa(*addr),port));
674 /* and connect it to the destination */
676 ret = connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out));
678 /* Some systems return EAGAIN when they mean EINPROGRESS */
679 if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
680 errno == EAGAIN) && loops--) {
681 msleep(connect_loop);
685 if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
687 DEBUG(1,("timeout connecting to %s:%d\n",inet_ntoa(*addr),port));
693 if (ret < 0 && errno == EISCONN) {
700 DEBUG(2,("error connecting to %s:%d (%s)\n",
701 inet_ntoa(*addr),port,strerror(errno)));
706 /* set it blocking again */
707 set_blocking(res,True);
713 open a connected UDP socket to host on port
715 int open_udp_socket(const char *host, int port)
717 int type = SOCK_DGRAM;
718 struct sockaddr_in sock_out;
720 struct in_addr *addr;
722 addr = interpret_addr2(host);
724 res = socket(PF_INET, type, 0);
729 memset((char *)&sock_out,'\0',sizeof(sock_out));
730 putip((char *)&sock_out.sin_addr,(char *)addr);
731 sock_out.sin_port = htons(port);
732 sock_out.sin_family = PF_INET;
734 if (connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out))) {
743 /* the following 3 client_*() functions are nasty ways of allowing
744 some generic functions to get info that really should be hidden in
745 particular modules */
746 static int client_fd = -1;
748 void client_setfd(int fd)
753 char *client_name(void)
755 return get_socket_name(client_fd,False);
758 char *client_addr(void)
760 return get_socket_addr(client_fd);
763 /*******************************************************************
764 matchname - determine if host name matches IP address. Used to
765 confirm a hostname lookup to prevent spoof attacks
766 ******************************************************************/
767 static BOOL matchname(char *remotehost,struct in_addr addr)
772 if ((hp = sys_gethostbyname(remotehost)) == 0) {
773 DEBUG(0,("sys_gethostbyname(%s): lookup failure.\n", remotehost));
778 * Make sure that gethostbyname() returns the "correct" host name.
779 * Unfortunately, gethostbyname("localhost") sometimes yields
780 * "localhost.domain". Since the latter host name comes from the
781 * local DNS, we just have to trust it (all bets are off if the local
782 * DNS is perverted). We always check the address list, though.
785 if (strcasecmp(remotehost, hp->h_name)
786 && strcasecmp(remotehost, "localhost")) {
787 DEBUG(0,("host name/name mismatch: %s != %s\n",
788 remotehost, hp->h_name));
792 /* Look up the host address in the address list we just got. */
793 for (i = 0; hp->h_addr_list[i]; i++) {
794 if (memcmp(hp->h_addr_list[i], (char *) & addr, sizeof(addr)) == 0)
799 * The host name does not map to the original host address. Perhaps
800 * someone has compromised a name server. More likely someone botched
801 * it, but that could be dangerous, too.
804 DEBUG(0,("host name/address mismatch: %s != %s\n",
805 inet_ntoa(addr), hp->h_name));
810 /*******************************************************************
811 return the DNS name of the remote end of a socket
812 ******************************************************************/
813 char *get_socket_name(int fd, BOOL force_lookup)
815 static pstring name_buf;
816 static fstring addr_buf;
821 /* reverse lookups can be *very* expensive, and in many
822 situations won't work because many networks don't link dhcp
823 with dns. To avoid the delay we avoid the lookup if
825 if (!lp_hostname_lookups() && (force_lookup == False)) {
826 return get_socket_addr(fd);
829 p = get_socket_addr(fd);
831 /* it might be the same as the last one - save some DNS work */
832 if (strcmp(p, addr_buf) == 0) return name_buf;
834 pstrcpy(name_buf,"UNKNOWN");
835 if (fd == -1) return name_buf;
837 fstrcpy(addr_buf, p);
839 addr = *interpret_addr2(p);
841 /* Look up the remote host name. */
842 if ((hp = gethostbyaddr((char *)&addr.s_addr, sizeof(addr.s_addr), AF_INET)) == 0) {
843 DEBUG(1,("Gethostbyaddr failed for %s\n",p));
844 pstrcpy(name_buf, p);
846 pstrcpy(name_buf,(char *)hp->h_name);
847 if (!matchname(name_buf, addr)) {
848 DEBUG(0,("Matchname failed on %s %s\n",name_buf,p));
849 pstrcpy(name_buf,"UNKNOWN");
853 alpha_strcpy(name_buf, name_buf, "_-.", sizeof(name_buf));
854 if (strstr(name_buf,"..")) {
855 pstrcpy(name_buf, "UNKNOWN");
861 /*******************************************************************
862 return the IP addr of the remote end of a socket as a string
863 ******************************************************************/
864 char *get_socket_addr(int fd)
867 struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
868 int length = sizeof(sa);
869 static fstring addr_buf;
871 fstrcpy(addr_buf,"0.0.0.0");
877 if (getpeername(fd, &sa, &length) < 0) {
878 DEBUG(0,("getpeername failed. Error was %s\n", strerror(errno) ));
882 fstrcpy(addr_buf,(char *)inet_ntoa(sockin->sin_addr));
888 /*******************************************************************
889 Create protected unix domain socket.
891 Some unixes cannot set permissions on a ux-dom-sock, so we
892 have to make sure that the directory contains the protection
894 ******************************************************************/
896 int create_pipe_sock(const char *socket_dir,
897 const char *socket_name,
900 #ifdef HAVE_UNIXSOCKET
901 struct sockaddr_un sunaddr;
907 old_umask = umask(0);
909 /* Create the socket directory or reuse the existing one */
911 if (lstat(socket_dir, &st) == -1) {
912 if (errno == ENOENT) {
913 /* Create directory */
914 if (mkdir(socket_dir, dir_perms) == -1) {
915 DEBUG(0, ("error creating socket directory "
916 "%s: %s\n", socket_dir,
921 DEBUG(0, ("lstat failed on socket directory %s: %s\n",
922 socket_dir, strerror(errno)));
926 /* Check ownership and permission on existing directory */
927 if (!S_ISDIR(st.st_mode)) {
928 DEBUG(0, ("socket directory %s isn't a directory\n",
932 if ((st.st_uid != sec_initial_uid()) ||
933 ((st.st_mode & 0777) != dir_perms)) {
934 DEBUG(0, ("invalid permissions on socket directory "
935 "%s\n", socket_dir));
940 /* Create the socket file */
942 sock = socket(AF_UNIX, SOCK_STREAM, 0);
949 snprintf(path, sizeof(path), "%s/%s", socket_dir, socket_name);
952 memset(&sunaddr, 0, sizeof(sunaddr));
953 sunaddr.sun_family = AF_UNIX;
954 safe_strcpy(sunaddr.sun_path, path, sizeof(sunaddr.sun_path)-1);
956 if (bind(sock, (struct sockaddr *)&sunaddr, sizeof(sunaddr)) == -1) {
957 DEBUG(0, ("bind failed on pipe socket %s: %s\n", path,
962 if (listen(sock, 5) == -1) {
963 DEBUG(0, ("listen failed on pipe socket %s: %s\n", path,
979 DEBUG(0, ("create_pipe_sock: No Unix sockets on this system\n"));
981 #endif /* HAVE_UNIXSOCKET */
984 /*******************************************************************
985 this is like socketpair but uses tcp. It is used by the Samba
987 The function guarantees that nobody else can attach to the socket,
988 or if they do that this function fails and the socket gets closed
989 returns 0 on success, -1 on failure
990 the resulting file descriptors are symmetrical
991 ******************************************************************/
992 static int socketpair_tcp(int fd[2])
995 struct sockaddr_in sock;
996 struct sockaddr_in sock2;
997 socklen_t socklen = sizeof(sock);
998 int connect_done = 0;
1000 fd[0] = fd[1] = listener = -1;
1002 memset(&sock, 0, sizeof(sock));
1004 if ((listener = socket(PF_INET, SOCK_STREAM, 0)) == -1) goto failed;
1006 memset(&sock2, 0, sizeof(sock2));
1007 #ifdef HAVE_SOCK_SIN_LEN
1008 sock2.sin_len = sizeof(sock2);
1010 sock2.sin_family = PF_INET;
1012 bind(listener, (struct sockaddr *)&sock2, sizeof(sock2));
1014 if (listen(listener, 1) != 0) goto failed;
1016 if (getsockname(listener, (struct sockaddr *)&sock, &socklen) != 0) goto failed;
1018 if ((fd[1] = socket(PF_INET, SOCK_STREAM, 0)) == -1) goto failed;
1020 set_blocking(fd[1], 0);
1022 sock.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
1024 if (connect(fd[1],(struct sockaddr *)&sock,sizeof(sock)) == -1) {
1025 if (errno != EINPROGRESS) goto failed;
1030 if ((fd[0] = accept(listener, (struct sockaddr *)&sock, &socklen)) == -1) goto failed;
1033 if (connect_done == 0) {
1034 if (connect(fd[1],(struct sockaddr *)&sock,sizeof(sock)) != 0
1035 && errno != EISCONN) goto failed;
1038 set_blocking(fd[1], 1);
1044 if (fd[0] != -1) close(fd[0]);
1045 if (fd[1] != -1) close(fd[1]);
1046 if (listener != -1) close(listener);
1051 /*******************************************************************
1052 run a program on a local tcp socket, this is used to launch smbd
1053 when regression testing
1054 the return value is a socket which is attached to a subprocess
1055 running "prog". stdin and stdout are attached. stderr is left
1056 attached to the original stderr
1057 ******************************************************************/
1058 int sock_exec(const char *prog)
1061 if (socketpair_tcp(fd) != 0) {
1062 DEBUG(0,("socketpair_tcp failed (%s)\n", strerror(errno)));