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 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 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, 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 checks if read data is outstanding.
191 ********************************************************************/
192 int read_data_outstanding(int fd, unsigned int time_out)
196 struct timeval timeout;
201 timeout.tv_sec = (time_t) (time_out / 1000);
202 timeout.tv_usec = (long)(1000 * (time_out % 1000));
204 selrtn = sys_select_intr(fd + 1, &fds, NULL, NULL, &timeout);
210 return FD_ISSET(fd, &fds) ? 1 : 0;
213 /****************************************************************************
214 Read data from a socket with a timout in msec.
215 mincount = if timeout, minimum to read before returning
216 maxcount = number to be read.
217 time_out = timeout in milliseconds
218 ****************************************************************************/
220 static ssize_t read_socket_with_timeout(int fd,char *buf,size_t mincnt,size_t maxcnt,unsigned int time_out)
226 struct timeval timeout;
228 /* just checking .... */
236 if (mincnt == 0) mincnt = maxcnt;
238 while (nread < mincnt) {
239 readret = sys_read(fd, buf + nread, maxcnt - nread);
242 DEBUG(5,("read_socket_with_timeout: blocking read. EOF from client.\n"));
243 smb_read_error = READ_EOF;
248 DEBUG(0,("read_socket_with_timeout: read error = %s.\n", strerror(errno) ));
249 smb_read_error = READ_ERROR;
254 return((ssize_t)nread);
257 /* Most difficult - timeout read */
258 /* If this is ever called on a disk file and
259 mincnt is greater then the filesize then
260 system performance will suffer severely as
261 select always returns true on disk files */
263 /* Set initial timeout */
264 timeout.tv_sec = (time_t)(time_out / 1000);
265 timeout.tv_usec = (long)(1000 * (time_out % 1000));
267 for (nread=0; nread < mincnt; ) {
271 selrtn = sys_select_intr(fd+1,&fds,NULL,NULL,&timeout);
275 /* something is wrong. Maybe the socket is dead? */
276 DEBUG(0,("read_socket_with_timeout: timeout read. select error = %s.\n", strerror(errno) ));
277 smb_read_error = READ_ERROR;
281 /* Did we timeout ? */
283 DEBUG(10,("read_socket_with_timeout: timeout read. select timed out.\n"));
284 smb_read_error = READ_TIMEOUT;
288 readret = sys_read(fd, buf+nread, maxcnt-nread);
291 /* we got EOF on the file descriptor */
292 DEBUG(5,("read_socket_with_timeout: timeout read. EOF from client.\n"));
293 smb_read_error = READ_EOF;
298 /* the descriptor is probably dead */
299 DEBUG(0,("read_socket_with_timeout: timeout read. read error = %s.\n", strerror(errno) ));
300 smb_read_error = READ_ERROR;
307 /* Return the number we got */
308 return (ssize_t)nread;
311 /****************************************************************************
312 Read data from a fd with a timout in msec.
313 mincount = if timeout, minimum to read before returning
314 maxcount = number to be read.
315 time_out = timeout in milliseconds
316 ****************************************************************************/
318 ssize_t read_with_timeout(int fd, char *buf, size_t mincnt, size_t maxcnt,
319 unsigned int time_out)
324 /* just checking .... */
330 if (mincnt == 0) mincnt = maxcnt;
332 while (nread < mincnt) {
333 readret = sys_read(fd, buf + nread, maxcnt - nread);
340 return((ssize_t)nread);
343 /* Most difficult - timeout read */
344 /* If this is ever called on a disk file and
345 mincnt is greater then the filesize then
346 system performance will suffer severely as
347 select always returns true on disk files */
349 for (nread=0; nread < mincnt; ) {
350 int selrtn = read_data_outstanding(fd, time_out);
355 readret = sys_read(fd, buf+nread, maxcnt-nread);
363 /* Return the number we got */
364 return((ssize_t)nread);
367 /****************************************************************************
368 send a keepalive packet (rfc1002)
369 ****************************************************************************/
371 BOOL send_keepalive(int client)
373 unsigned char buf[4];
375 buf[0] = SMBkeepalive;
376 buf[1] = buf[2] = buf[3] = 0;
378 return(write_socket_data(client,(char *)buf,4) == 4);
381 /****************************************************************************
382 read data from the client, reading exactly N bytes.
383 ****************************************************************************/
385 ssize_t read_data(int fd,char *buffer,size_t N)
393 ret = sys_read(fd,buffer + total,N - total);
396 DEBUG(10,("read_data: read of %d returned 0. Error = %s\n", (int)(N - total), strerror(errno) ));
397 smb_read_error = READ_EOF;
402 DEBUG(0,("read_data: read failure for %d. Error = %s\n", (int)(N - total), strerror(errno) ));
403 smb_read_error = READ_ERROR;
408 return (ssize_t)total;
411 /****************************************************************************
412 Read data from a socket, reading exactly N bytes.
413 ****************************************************************************/
415 static ssize_t read_socket_data(int fd,char *buffer,size_t N)
423 ret = sys_read(fd,buffer + total,N - total);
426 DEBUG(10,("read_socket_data: recv of %d returned 0. Error = %s\n", (int)(N - total), strerror(errno) ));
427 smb_read_error = READ_EOF;
432 DEBUG(0,("read_socket_data: recv failure for %d. Error = %s\n", (int)(N - total), strerror(errno) ));
433 smb_read_error = READ_ERROR;
438 return (ssize_t)total;
441 /****************************************************************************
443 ****************************************************************************/
445 ssize_t write_data(int fd,char *buffer,size_t N)
451 ret = sys_write(fd,buffer + total,N - total);
454 DEBUG(0,("write_data: write failure. Error = %s\n", strerror(errno) ));
462 return (ssize_t)total;
465 /****************************************************************************
466 Write data to a socket - use send rather than write.
467 ****************************************************************************/
469 ssize_t write_socket_data(int fd,char *buffer,size_t N)
475 ret = sys_send(fd,buffer + total,N - total,0);
478 DEBUG(0,("write_socket_data: write failure. Error = %s\n", strerror(errno) ));
486 return (ssize_t)total;
489 /****************************************************************************
491 ****************************************************************************/
493 ssize_t write_socket(int fd,char *buf,size_t len)
497 DEBUG(6,("write_socket(%d,%d)\n",fd,(int)len));
498 ret = write_socket_data(fd,buf,len);
500 DEBUG(6,("write_socket(%d,%d) wrote %d\n",fd,(int)len,(int)ret));
502 DEBUG(0,("write_socket: Error writing %d bytes to socket %d: ERRNO = %s\n",
503 (int)len, fd, strerror(errno) ));
508 /****************************************************************************
509 read 4 bytes of a smb packet and return the smb length of the packet
510 store the result in the buffer
511 This version of the function will return a length of zero on receiving
513 timeout is in milliseconds.
514 ****************************************************************************/
516 static ssize_t read_smb_length_return_keepalive(int fd,char *inbuf,unsigned int timeout)
524 ok = (read_socket_with_timeout(fd,inbuf,4,4,timeout) == 4);
526 ok = (read_socket_data(fd,inbuf,4) == 4);
531 len = smb_len(inbuf);
532 msg_type = CVAL(inbuf,0);
534 if (msg_type == SMBkeepalive)
535 DEBUG(5,("Got keepalive packet\n"));
538 DEBUG(10,("got smb length of %d\n",len));
543 /****************************************************************************
544 read 4 bytes of a smb packet and return the smb length of the packet
545 store the result in the buffer. This version of the function will
546 never return a session keepalive (length of zero).
547 timeout is in milliseconds.
548 ****************************************************************************/
550 ssize_t read_smb_length(int fd,char *inbuf,unsigned int timeout)
555 len = read_smb_length_return_keepalive(fd, inbuf, timeout);
560 /* Ignore session keepalives. */
561 if(CVAL(inbuf,0) != SMBkeepalive)
565 DEBUG(10,("read_smb_length: got smb length of %d\n",len));
570 /****************************************************************************
571 read an smb from a fd. Note that the buffer *MUST* be of size
572 BUFFER_SIZE+SAFETY_MARGIN.
573 The timeout is in milliseconds.
574 This function will return on a
575 receipt of a session keepalive packet.
576 ****************************************************************************/
578 BOOL receive_smb(int fd,char *buffer, unsigned int timeout)
584 memset(buffer,'\0',smb_size + 100);
586 len = read_smb_length_return_keepalive(fd,buffer,timeout);
588 DEBUG(10,("receive_smb: length < 0!\n"));
591 * Correct fix. smb_read_error may have already been
592 * set. Only set it here if not already set. Global
593 * variables still suck :-). JRA.
596 if (smb_read_error == 0)
597 smb_read_error = READ_ERROR;
602 * A WRITEX with CAP_LARGE_WRITEX can be 64k worth of data plus 65 bytes
603 * of header. Don't print the error if this fits.... JRA.
606 if (len > (BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE)) {
607 DEBUG(0,("Invalid packet length! (%d bytes).\n",len));
608 if (len > BUFFER_SIZE + (SAFETY_MARGIN/2)) {
611 * Correct fix. smb_read_error may have already been
612 * set. Only set it here if not already set. Global
613 * variables still suck :-). JRA.
616 if (smb_read_error == 0)
617 smb_read_error = READ_ERROR;
623 ret = read_socket_data(fd,buffer+4,len);
625 if (smb_read_error == 0)
626 smb_read_error = READ_ERROR;
634 /****************************************************************************
636 ****************************************************************************/
638 BOOL send_smb(int fd,char *buffer)
643 len = smb_len(buffer) + 4;
645 while (nwritten < len) {
646 ret = write_socket(fd,buffer+nwritten,len - nwritten);
648 DEBUG(0,("Error writing %d bytes to client. %d. (%s)\n",
649 (int)len,(int)ret, strerror(errno) ));
658 /****************************************************************************
659 send a single packet to a port on another machine
660 ****************************************************************************/
662 BOOL send_one_packet(char *buf,int len,struct in_addr ip,int port,int type)
666 struct sockaddr_in sock_out;
668 /* create a socket to write to */
669 out_fd = socket(AF_INET, type, 0);
672 DEBUG(0,("socket failed"));
676 /* set the address and port */
677 memset((char *)&sock_out,'\0',sizeof(sock_out));
678 putip((char *)&sock_out.sin_addr,(char *)&ip);
679 sock_out.sin_port = htons( port );
680 sock_out.sin_family = AF_INET;
683 DEBUG(3,("sending a packet of len %d to (%s) on port %d of type %s\n",
684 len,inet_ntoa(ip),port,type==SOCK_DGRAM?"DGRAM":"STREAM"));
687 ret = (sys_sendto(out_fd,buf,len,0,(struct sockaddr *)&sock_out,sizeof(sock_out)) >= 0);
690 DEBUG(0,("Packet send to %s(%d) failed ERRNO=%s\n",
691 inet_ntoa(ip),port,strerror(errno)));
697 /****************************************************************************
698 Open a socket of the specified type, port, and address for incoming data.
699 ****************************************************************************/
701 int open_socket_in( int type, int port, int dlevel, uint32 socket_addr, BOOL rebind )
703 struct sockaddr_in sock;
706 memset( (char *)&sock, '\0', sizeof(sock) );
708 #ifdef HAVE_SOCK_SIN_LEN
709 sock.sin_len = sizeof(sock);
711 sock.sin_port = htons( port );
712 sock.sin_family = AF_INET;
713 sock.sin_addr.s_addr = socket_addr;
715 res = socket( AF_INET, type, 0 );
718 dbgtext( "open_socket_in(): socket() call failed: " );
719 dbgtext( "%s\n", strerror( errno ) );
724 /* This block sets/clears the SO_REUSEADDR and possibly SO_REUSEPORT. */
726 int val = rebind ? 1 : 0;
727 if( setsockopt(res,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val)) == -1 ) {
728 if( DEBUGLVL( dlevel ) ) {
729 dbgtext( "open_socket_in(): setsockopt: " );
730 dbgtext( "SO_REUSEADDR = %s ", val?"True":"False" );
731 dbgtext( "on port %d failed ", port );
732 dbgtext( "with error = %s\n", strerror(errno) );
736 if( setsockopt(res,SOL_SOCKET,SO_REUSEPORT,(char *)&val,sizeof(val)) == -1 ) {
737 if( DEBUGLVL( dlevel ) ) {
738 dbgtext( "open_socket_in(): setsockopt: ");
739 dbgtext( "SO_REUSEPORT = %s ", val?"True":"False" );
740 dbgtext( "on port %d failed ", port );
741 dbgtext( "with error = %s\n", strerror(errno) );
744 #endif /* SO_REUSEPORT */
747 /* now we've got a socket - we need to bind it */
748 if( bind( res, (struct sockaddr *)&sock, sizeof(sock) ) == -1 ) {
749 if( DEBUGLVL(dlevel) && (port == SMB_PORT || port == NMB_PORT) ) {
750 dbgtext( "bind failed on port %d ", port );
751 dbgtext( "socket_addr = %s.\n", inet_ntoa( sock.sin_addr ) );
752 dbgtext( "Error = %s\n", strerror(errno) );
758 DEBUG( 3, ( "bind succeeded on port %d\n", port ) );
763 /****************************************************************************
764 create an outgoing socket. timeout is in milliseconds.
765 **************************************************************************/
767 int open_socket_out(int type, struct in_addr *addr, int port ,int timeout)
769 struct sockaddr_in sock_out;
771 int connect_loop = 250; /* 250 milliseconds */
772 int loops = (timeout) / connect_loop;
774 /* create a socket to write to */
775 res = socket(PF_INET, type, 0);
777 { DEBUG(0,("socket error\n")); return -1; }
779 if (type != SOCK_STREAM) return(res);
781 memset((char *)&sock_out,'\0',sizeof(sock_out));
782 putip((char *)&sock_out.sin_addr,(char *)addr);
784 sock_out.sin_port = htons( port );
785 sock_out.sin_family = PF_INET;
787 /* set it non-blocking */
788 set_blocking(res,False);
790 DEBUG(3,("Connecting to %s at port %d\n",inet_ntoa(*addr),port));
792 /* and connect it to the destination */
794 ret = connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out));
796 /* Some systems return EAGAIN when they mean EINPROGRESS */
797 if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
798 errno == EAGAIN) && loops--) {
799 msleep(connect_loop);
803 if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
805 DEBUG(1,("timeout connecting to %s:%d\n",inet_ntoa(*addr),port));
811 if (ret < 0 && errno == EISCONN) {
818 DEBUG(2,("error connecting to %s:%d (%s)\n",
819 inet_ntoa(*addr),port,strerror(errno)));
824 /* set it blocking again */
825 set_blocking(res,True);
831 open a connected UDP socket to host on port
833 int open_udp_socket(const char *host, int port)
835 int type = SOCK_DGRAM;
836 struct sockaddr_in sock_out;
838 struct in_addr *addr;
840 addr = interpret_addr2(host);
842 res = socket(PF_INET, type, 0);
847 memset((char *)&sock_out,'\0',sizeof(sock_out));
848 putip((char *)&sock_out.sin_addr,(char *)addr);
849 sock_out.sin_port = htons(port);
850 sock_out.sin_family = PF_INET;
852 if (connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out))) {
861 /* the following 3 client_*() functions are nasty ways of allowing
862 some generic functions to get info that really should be hidden in
863 particular modules */
864 static int client_fd = -1;
866 void client_setfd(int fd)
871 char *client_name(void)
873 return get_socket_name(client_fd);
876 char *client_addr(void)
878 return get_socket_addr(client_fd);
881 /*******************************************************************
882 matchname - determine if host name matches IP address. Used to
883 confirm a hostname lookup to prevent spoof attacks
884 ******************************************************************/
885 static BOOL matchname(char *remotehost,struct in_addr addr)
890 if ((hp = sys_gethostbyname(remotehost)) == 0) {
891 DEBUG(0,("sys_gethostbyname(%s): lookup failure.\n", remotehost));
896 * Make sure that gethostbyname() returns the "correct" host name.
897 * Unfortunately, gethostbyname("localhost") sometimes yields
898 * "localhost.domain". Since the latter host name comes from the
899 * local DNS, we just have to trust it (all bets are off if the local
900 * DNS is perverted). We always check the address list, though.
903 if (strcasecmp(remotehost, hp->h_name)
904 && strcasecmp(remotehost, "localhost")) {
905 DEBUG(0,("host name/name mismatch: %s != %s\n",
906 remotehost, hp->h_name));
910 /* Look up the host address in the address list we just got. */
911 for (i = 0; hp->h_addr_list[i]; i++) {
912 if (memcmp(hp->h_addr_list[i], (caddr_t) & addr, sizeof(addr)) == 0)
917 * The host name does not map to the original host address. Perhaps
918 * someone has compromised a name server. More likely someone botched
919 * it, but that could be dangerous, too.
922 DEBUG(0,("host name/address mismatch: %s != %s\n",
923 inet_ntoa(addr), hp->h_name));
928 /*******************************************************************
929 return the DNS name of the remote end of a socket
930 ******************************************************************/
931 char *get_socket_name(int fd)
933 static pstring name_buf;
934 static fstring addr_buf;
939 /* reverse lookups can be *very* expensive, and in many
940 situations won't work because many networks don't link dhcp
941 with dns. To avoid the delay we avoid the lookup if
943 if (!lp_hostname_lookups()) {
944 return get_socket_addr(fd);
947 p = get_socket_addr(fd);
949 /* it might be the same as the last one - save some DNS work */
950 if (strcmp(p, addr_buf) == 0) return name_buf;
952 pstrcpy(name_buf,"UNKNOWN");
953 if (fd == -1) return name_buf;
955 fstrcpy(addr_buf, p);
957 addr = *interpret_addr2(p);
959 /* Look up the remote host name. */
960 if ((hp = gethostbyaddr((char *)&addr.s_addr, sizeof(addr.s_addr), AF_INET)) == 0) {
961 DEBUG(1,("Gethostbyaddr failed for %s\n",p));
962 pstrcpy(name_buf, p);
964 pstrcpy(name_buf,(char *)hp->h_name);
965 if (!matchname(name_buf, addr)) {
966 DEBUG(0,("Matchname failed on %s %s\n",name_buf,p));
967 pstrcpy(name_buf,"UNKNOWN");
971 alpha_strcpy(name_buf, name_buf, "_-.", sizeof(name_buf));
972 if (strstr(name_buf,"..")) {
973 pstrcpy(name_buf, "UNKNOWN");
979 /*******************************************************************
980 return the IP addr of the remote end of a socket as a string
981 ******************************************************************/
982 char *get_socket_addr(int fd)
985 struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
986 int length = sizeof(sa);
987 static fstring addr_buf;
989 fstrcpy(addr_buf,"0.0.0.0");
995 if (getpeername(fd, &sa, &length) < 0) {
996 DEBUG(0,("getpeername failed. Error was %s\n", strerror(errno) ));
1000 fstrcpy(addr_buf,(char *)inet_ntoa(sockin->sin_addr));
1005 /*******************************************************************
1006 opens and connects to a unix pipe socket
1007 ******************************************************************/
1008 int open_pipe_sock(char *path)
1011 struct sockaddr_un sa;
1013 sock = socket(AF_UNIX, SOCK_STREAM, 0);
1017 DEBUG(0, ("unix socket open failed\n"));
1022 sa.sun_family = AF_UNIX;
1023 safe_strcpy(sa.sun_path, path, sizeof(sa.sun_path)-1);
1025 DEBUG(10, ("socket open succeeded. file name: %s\n", sa.sun_path));
1027 if (connect(sock, (struct sockaddr*) &sa, sizeof(sa)) < 0)
1029 DEBUG(0,("socket connect to %s failed\n", sa.sun_path));
1037 /*******************************************************************
1038 Create protected unix domain socket.
1040 some unixen cannot set permissions on a ux-dom-sock, so we
1041 have to make sure that the directory contains the protection
1042 permissions, instead.
1043 ******************************************************************/
1044 int create_pipe_sock(const char *socket_dir,
1045 const char *socket_name,
1048 struct sockaddr_un sunaddr;
1054 /* Create the socket directory or reuse the existing one */
1056 if (lstat(socket_dir, &st) == -1) {
1058 if (errno == ENOENT) {
1060 /* Create directory */
1062 if (mkdir(socket_dir, dir_perms) == -1) {
1063 DEBUG(0, ("error creating socket directory "
1064 "%s: %s\n", socket_dir,
1071 DEBUG(0, ("lstat failed on socket directory %s: %s\n",
1072 socket_dir, strerror(errno)));
1078 /* Check ownership and permission on existing directory */
1080 if (!S_ISDIR(st.st_mode)) {
1081 DEBUG(0, ("socket directory %s isn't a directory\n",
1086 if ((st.st_uid != sec_initial_uid()) ||
1087 ((st.st_mode & 0777) != dir_perms)) {
1088 DEBUG(0, ("invalid permissions on socket directory "
1089 "%s\n", socket_dir));
1094 /* Create the socket file */
1096 old_umask = umask(0);
1098 sock = socket(AF_UNIX, SOCK_STREAM, 0);
1106 snprintf(path, sizeof(path), "%s/%s", socket_dir, socket_name);
1109 memset(&sunaddr, 0, sizeof(sunaddr));
1110 sunaddr.sun_family = AF_UNIX;
1111 safe_strcpy(sunaddr.sun_path, path, sizeof(sunaddr.sun_path)-1);
1113 if (bind(sock, (struct sockaddr *)&sunaddr, sizeof(sunaddr)) == -1) {
1114 DEBUG(0, ("bind failed on pipe socket %s: %s\n",
1122 if (listen(sock, 5) == -1) {
1123 DEBUG(0, ("listen failed on pipe socket %s: %s\n",
1138 /*******************************************************************
1139 this is like socketpair but uses tcp. It is used by the Samba
1140 regression test code
1141 The function guarantees that nobody else can attach to the socket,
1142 or if they do that this function fails and the socket gets closed
1143 returns 0 on success, -1 on failure
1144 the resulting file descriptors are symmetrical
1145 ******************************************************************/
1146 static int socketpair_tcp(int fd[2])
1149 struct sockaddr_in sock;
1150 struct sockaddr_in sock2;
1151 socklen_t socklen = sizeof(sock);
1152 int connect_done = 0;
1154 fd[0] = fd[1] = listener = -1;
1156 memset(&sock, 0, sizeof(sock));
1158 if ((listener = socket(PF_INET, SOCK_STREAM, 0)) == -1) goto failed;
1160 memset(&sock2, 0, sizeof(sock2));
1161 #ifdef HAVE_SOCK_SIN_LEN
1162 sock2.sin_len = sizeof(sock2);
1164 sock2.sin_family = PF_INET;
1166 bind(listener, (struct sockaddr *)&sock2, sizeof(sock2));
1168 if (listen(listener, 1) != 0) goto failed;
1170 if (getsockname(listener, (struct sockaddr *)&sock, &socklen) != 0) goto failed;
1172 if ((fd[1] = socket(PF_INET, SOCK_STREAM, 0)) == -1) goto failed;
1174 set_blocking(fd[1], 0);
1176 sock.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
1178 if (connect(fd[1],(struct sockaddr *)&sock,sizeof(sock)) == -1) {
1179 if (errno != EINPROGRESS) goto failed;
1184 if ((fd[0] = accept(listener, (struct sockaddr *)&sock, &socklen)) == -1) goto failed;
1187 if (connect_done == 0) {
1188 if (connect(fd[1],(struct sockaddr *)&sock,sizeof(sock)) != 0
1189 && errno != EISCONN) goto failed;
1192 set_blocking(fd[1], 1);
1198 if (fd[0] != -1) close(fd[0]);
1199 if (fd[1] != -1) close(fd[1]);
1200 if (listener != -1) close(listener);
1205 /*******************************************************************
1206 run a program on a local tcp socket, this is used to launch smbd
1207 when regression testing
1208 the return value is a socket which is attached to a subprocess
1209 running "prog". stdin and stdout are attached. stderr is left
1210 attached to the original stderr
1211 ******************************************************************/
1212 int sock_exec(const char *prog)
1215 if (socketpair_tcp(fd) != 0) {
1216 DEBUG(0,("socketpair_tcp failed (%s)\n", strerror(errno)));