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.
25 #include <openssl/ssl.h>
26 #undef Realloc /* SSLeay defines this and samba has a function of this name */
31 /* the last IP received from */
32 struct in_addr lastip;
34 /* the last port received from */
37 int smb_read_error = 0;
39 /****************************************************************************
40 Determine if a file descriptor is in fact a socket.
41 ****************************************************************************/
43 BOOL is_a_socket(int fd)
47 return(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&v, &l) == 0);
50 enum SOCK_OPT_TYPES {OPT_BOOL,OPT_INT,OPT_ON};
52 typedef struct smb_socket_option
61 smb_socket_option socket_options[] = {
62 {"SO_KEEPALIVE", SOL_SOCKET, SO_KEEPALIVE, 0, OPT_BOOL},
63 {"SO_REUSEADDR", SOL_SOCKET, SO_REUSEADDR, 0, OPT_BOOL},
64 {"SO_BROADCAST", SOL_SOCKET, SO_BROADCAST, 0, OPT_BOOL},
66 {"TCP_NODELAY", IPPROTO_TCP, TCP_NODELAY, 0, OPT_BOOL},
69 {"IPTOS_LOWDELAY", IPPROTO_IP, IP_TOS, IPTOS_LOWDELAY, OPT_ON},
71 #ifdef IPTOS_THROUGHPUT
72 {"IPTOS_THROUGHPUT", IPPROTO_IP, IP_TOS, IPTOS_THROUGHPUT, OPT_ON},
75 {"SO_REUSEPORT", SOL_SOCKET, SO_REUSEPORT, 0, OPT_BOOL},
78 {"SO_SNDBUF", SOL_SOCKET, SO_SNDBUF, 0, OPT_INT},
81 {"SO_RCVBUF", SOL_SOCKET, SO_RCVBUF, 0, OPT_INT},
84 {"SO_SNDLOWAT", SOL_SOCKET, SO_SNDLOWAT, 0, OPT_INT},
87 {"SO_RCVLOWAT", SOL_SOCKET, SO_RCVLOWAT, 0, OPT_INT},
90 {"SO_SNDTIMEO", SOL_SOCKET, SO_SNDTIMEO, 0, OPT_INT},
93 {"SO_RCVTIMEO", SOL_SOCKET, SO_RCVTIMEO, 0, OPT_INT},
97 /****************************************************************************
99 ****************************************************************************/
100 static void print_socket_options(int s)
103 smb_socket_option *p = &socket_options[0];
105 for (; p->name != NULL; p++) {
106 if (getsockopt(s, p->level, p->option, (void *)&value, &vlen) == -1) {
107 DEBUG(5,("Could not test socket option %s.\n", p->name));
109 DEBUG(5,("socket option %s = %d\n",p->name,value));
114 /****************************************************************************
115 Set user socket options.
116 ****************************************************************************/
118 void set_socket_options(int fd, char *options)
122 while (next_token(&options,tok," \t,", sizeof(tok))) {
126 BOOL got_value = False;
128 if ((p = strchr_m(tok,'='))) {
134 for (i=0;socket_options[i].name;i++)
135 if (strequal(socket_options[i].name,tok))
138 if (!socket_options[i].name) {
139 DEBUG(0,("Unknown socket option %s\n",tok));
143 switch (socket_options[i].opttype) {
146 ret = setsockopt(fd,socket_options[i].level,
147 socket_options[i].option,(char *)&value,sizeof(int));
152 DEBUG(0,("syntax error - %s does not take a value\n",tok));
155 int on = socket_options[i].value;
156 ret = setsockopt(fd,socket_options[i].level,
157 socket_options[i].option,(char *)&on,sizeof(int));
163 DEBUG(0,("Failed to set socket option %s (Error %s)\n",tok, strerror(errno) ));
166 print_socket_options(fd);
169 /****************************************************************************
171 ****************************************************************************/
173 ssize_t read_udp_socket(int fd,char *buf,size_t len)
176 struct sockaddr_in sock;
177 socklen_t socklen = sizeof(sock);
179 memset((char *)&sock,'\0',socklen);
180 memset((char *)&lastip,'\0',sizeof(lastip));
181 ret = (ssize_t)recvfrom(fd,buf,len,0,(struct sockaddr *)&sock,&socklen);
183 DEBUG(2,("read socket failed. ERRNO=%s\n",strerror(errno)));
187 lastip = sock.sin_addr;
188 lastport = ntohs(sock.sin_port);
190 DEBUG(10,("read_udp_socket: lastip %s lastport %d read: %d\n",
191 inet_ntoa(lastip), lastport, ret));
196 /*******************************************************************
197 checks if read data is outstanding.
198 ********************************************************************/
199 int read_data_outstanding(int fd, unsigned int time_out)
203 struct timeval timeout;
208 timeout.tv_sec = (time_t) (time_out / 1000);
209 timeout.tv_usec = (long)(1000 * (time_out % 1000));
211 selrtn = sys_select_intr(fd + 1, &fds, NULL, NULL, &timeout);
217 return FD_ISSET(fd, &fds) ? 1 : 0;
220 /****************************************************************************
221 Read data from a socket with a timout in msec.
222 mincount = if timeout, minimum to read before returning
223 maxcount = number to be read.
224 time_out = timeout in milliseconds
225 ****************************************************************************/
227 static ssize_t read_socket_with_timeout(int fd,char *buf,size_t mincnt,size_t maxcnt,unsigned int time_out)
233 struct timeval timeout;
235 /* just checking .... */
243 if (mincnt == 0) mincnt = maxcnt;
245 while (nread < mincnt) {
248 readret = SSL_read(ssl, buf + nread, maxcnt - nread);
250 readret = read(fd, buf + nread, maxcnt - nread);
253 readret = read(fd, buf + nread, maxcnt - nread);
254 #endif /* WITH_SSL */
257 DEBUG(5,("read_socket_with_timeout: blocking read. EOF from client.\n"));
258 smb_read_error = READ_EOF;
263 DEBUG(0,("read_socket_with_timeout: read error = %s.\n", strerror(errno) ));
264 smb_read_error = READ_ERROR;
269 return((ssize_t)nread);
272 /* Most difficult - timeout read */
273 /* If this is ever called on a disk file and
274 mincnt is greater then the filesize then
275 system performance will suffer severely as
276 select always returns true on disk files */
278 /* Set initial timeout */
279 timeout.tv_sec = (time_t)(time_out / 1000);
280 timeout.tv_usec = (long)(1000 * (time_out % 1000));
282 for (nread=0; nread < mincnt; ) {
286 selrtn = sys_select_intr(fd+1,&fds,NULL,NULL,&timeout);
290 /* something is wrong. Maybe the socket is dead? */
291 DEBUG(0,("read_socket_with_timeout: timeout read. select error = %s.\n", strerror(errno) ));
292 smb_read_error = READ_ERROR;
296 /* Did we timeout ? */
298 DEBUG(10,("read_socket_with_timeout: timeout read. select timed out.\n"));
299 smb_read_error = READ_TIMEOUT;
305 readret = SSL_read(ssl, buf + nread, maxcnt - nread);
307 readret = read(fd, buf + nread, maxcnt - nread);
310 readret = read(fd, buf+nread, maxcnt-nread);
311 #endif /* WITH_SSL */
314 /* we got EOF on the file descriptor */
315 DEBUG(5,("read_socket_with_timeout: timeout read. EOF from client.\n"));
316 smb_read_error = READ_EOF;
321 /* the descriptor is probably dead */
322 DEBUG(0,("read_socket_with_timeout: timeout read. read error = %s.\n", strerror(errno) ));
323 smb_read_error = READ_ERROR;
330 /* Return the number we got */
331 return (ssize_t)nread;
334 /****************************************************************************
335 Read data from a fd with a timout in msec.
336 mincount = if timeout, minimum to read before returning
337 maxcount = number to be read.
338 time_out = timeout in milliseconds
339 ****************************************************************************/
341 ssize_t read_with_timeout(int fd, char *buf, size_t mincnt, size_t maxcnt,
342 unsigned int time_out)
347 /* just checking .... */
353 if (mincnt == 0) mincnt = maxcnt;
355 while (nread < mincnt) {
358 readret = SSL_read(ssl, buf + nread, maxcnt - nread);
360 readret = read(fd, buf + nread, maxcnt - nread);
363 readret = read(fd, buf + nread, maxcnt - nread);
364 #endif /* WITH_SSL */
371 return((ssize_t)nread);
374 /* Most difficult - timeout read */
375 /* If this is ever called on a disk file and
376 mincnt is greater then the filesize then
377 system performance will suffer severely as
378 select always returns true on disk files */
380 for (nread=0; nread < mincnt; ) {
381 int selrtn = read_data_outstanding(fd, time_out);
388 readret = SSL_read(ssl, buf + nread, maxcnt - nread);
390 readret = read(fd, buf + nread, maxcnt - nread);
393 readret = read(fd, buf+nread, maxcnt-nread);
394 #endif /* WITH_SSL */
402 /* Return the number we got */
403 return((ssize_t)nread);
406 /****************************************************************************
407 send a keepalive packet (rfc1002)
408 ****************************************************************************/
410 BOOL send_keepalive(int client)
412 unsigned char buf[4];
414 buf[0] = SMBkeepalive;
415 buf[1] = buf[2] = buf[3] = 0;
417 return(write_socket_data(client,(char *)buf,4) == 4);
420 /****************************************************************************
421 read data from the client, reading exactly N bytes.
422 ****************************************************************************/
424 ssize_t read_data(int fd,char *buffer,size_t N)
435 ret = SSL_read(ssl, buffer + total, N - total);
437 ret = read(fd,buffer + total,N - total);
440 ret = read(fd,buffer + total,N - total);
441 #endif /* WITH_SSL */
445 DEBUG(10,("read_data: read of %d returned 0. Error = %s\n", (int)(N - total), strerror(errno) ));
446 smb_read_error = READ_EOF;
451 DEBUG(0,("read_data: read failure for %d. Error = %s\n", (int)(N - total), strerror(errno) ));
452 smb_read_error = READ_ERROR;
457 return (ssize_t)total;
460 /****************************************************************************
461 Read data from a socket, reading exactly N bytes.
462 ****************************************************************************/
464 static ssize_t read_socket_data(int fd,char *buffer,size_t N)
475 ret = SSL_read(ssl, buffer + total, N - total);
477 ret = read(fd,buffer + total,N - total);
480 ret = read(fd,buffer + total,N - total);
481 #endif /* WITH_SSL */
485 DEBUG(10,("read_socket_data: recv of %d returned 0. Error = %s\n", (int)(N - total), strerror(errno) ));
486 smb_read_error = READ_EOF;
491 DEBUG(0,("read_socket_data: recv failure for %d. Error = %s\n", (int)(N - total), strerror(errno) ));
492 smb_read_error = READ_ERROR;
497 return (ssize_t)total;
500 /****************************************************************************
502 ****************************************************************************/
504 ssize_t write_data(int fd,char *buffer,size_t N)
513 ret = SSL_write(ssl,buffer + total,N - total);
515 ret = write(fd,buffer + total,N - total);
518 ret = write(fd,buffer + total,N - total);
519 #endif /* WITH_SSL */
522 DEBUG(0,("write_data: write failure. Error = %s\n", strerror(errno) ));
525 if (ret == 0) return total;
529 return (ssize_t)total;
532 /****************************************************************************
533 Write data to a socket - use send rather than write.
534 ****************************************************************************/
536 ssize_t write_socket_data(int fd,char *buffer,size_t N)
545 ret = SSL_write(ssl,buffer + total,N - total);
547 ret = send(fd,buffer + total,N - total, 0);
550 ret = send(fd,buffer + total,N - total,0);
551 #endif /* WITH_SSL */
554 DEBUG(0,("write_socket_data: write failure. Error = %s\n", strerror(errno) ));
557 if (ret == 0) return total;
561 return (ssize_t)total;
564 /****************************************************************************
566 ****************************************************************************/
568 ssize_t write_socket(int fd,char *buf,size_t len)
572 DEBUG(6,("write_socket(%d,%d)\n",fd,(int)len));
573 ret = write_socket_data(fd,buf,len);
575 DEBUG(6,("write_socket(%d,%d) wrote %d\n",fd,(int)len,(int)ret));
577 DEBUG(0,("write_socket: Error writing %d bytes to socket %d: ERRNO = %s\n",
578 (int)len, fd, strerror(errno) ));
583 /****************************************************************************
584 read 4 bytes of a smb packet and return the smb length of the packet
585 store the result in the buffer
586 This version of the function will return a length of zero on receiving
588 timeout is in milliseconds.
589 ****************************************************************************/
591 static ssize_t read_smb_length_return_keepalive(int fd,char *inbuf,unsigned int timeout)
600 ok = (read_socket_with_timeout(fd,inbuf,4,4,timeout) == 4);
602 ok = (read_socket_data(fd,inbuf,4) == 4);
607 len = smb_len(inbuf);
608 msg_type = CVAL(inbuf,0);
610 if (msg_type == SMBkeepalive)
611 DEBUG(5,("Got keepalive packet\n"));
614 DEBUG(10,("got smb length of %d\n",len));
619 /****************************************************************************
620 read 4 bytes of a smb packet and return the smb length of the packet
621 store the result in the buffer. This version of the function will
622 never return a session keepalive (length of zero).
623 timeout is in milliseconds.
624 ****************************************************************************/
626 ssize_t read_smb_length(int fd,char *inbuf,unsigned int timeout)
632 len = read_smb_length_return_keepalive(fd, inbuf, timeout);
637 /* Ignore session keepalives. */
638 if(CVAL(inbuf,0) != SMBkeepalive)
642 DEBUG(10,("read_smb_length: got smb length of %d\n",len));
647 /****************************************************************************
648 read an smb from a fd. Note that the buffer *MUST* be of size
649 BUFFER_SIZE+SAFETY_MARGIN.
650 The timeout is in milliseconds.
651 This function will return on a
652 receipt of a session keepalive packet.
653 ****************************************************************************/
655 BOOL receive_smb(int fd,char *buffer, unsigned int timeout)
661 memset(buffer,'\0',smb_size + 100);
663 len = read_smb_length_return_keepalive(fd,buffer,timeout);
665 DEBUG(10,("receive_smb: length < 0!\n"));
668 * Correct fix. smb_read_error may have already been
669 * set. Only set it here if not already set. Global
670 * variables still suck :-). JRA.
673 if (smb_read_error == 0)
674 smb_read_error = READ_ERROR;
679 * A WRITEX with CAP_LARGE_WRITEX can be 64k worth of data plus 65 bytes
680 * of header. Don't print the error if this fits.... JRA.
683 if (len > (BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE)) {
684 DEBUG(0,("Invalid packet length! (%d bytes).\n",len));
685 if (len > BUFFER_SIZE + (SAFETY_MARGIN/2)) {
688 * Correct fix. smb_read_error may have already been
689 * set. Only set it here if not already set. Global
690 * variables still suck :-). JRA.
693 if (smb_read_error == 0)
694 smb_read_error = READ_ERROR;
700 ret = read_socket_data(fd,buffer+4,len);
702 if (smb_read_error == 0)
703 smb_read_error = READ_ERROR;
711 /****************************************************************************
712 read an smb from a fd ignoring all keepalive packets. Note that the buffer
713 *MUST* be of size BUFFER_SIZE+SAFETY_MARGIN.
714 The timeout is in milliseconds
716 This is exactly the same as receive_smb except that it never returns
717 a session keepalive packet (just as receive_smb used to do).
718 receive_smb was changed to return keepalives as the oplock processing means this call
719 should never go into a blocking read.
720 ****************************************************************************/
722 BOOL client_receive_smb(int fd,char *buffer, unsigned int timeout)
728 ret = receive_smb(fd, buffer, timeout);
732 DEBUG(10,("client_receive_smb failed\n"));
737 /* Ignore session keepalive packets. */
738 if(CVAL(buffer,0) != SMBkeepalive)
745 /****************************************************************************
747 ****************************************************************************/
749 BOOL send_smb(int fd,char *buffer)
754 len = smb_len(buffer) + 4;
756 while (nwritten < len) {
757 ret = write_socket(fd,buffer+nwritten,len - nwritten);
759 DEBUG(0,("Error writing %d bytes to client. %d. (%s)\n",
760 (int)len,(int)ret, strerror(errno) ));
769 /****************************************************************************
770 send a single packet to a port on another machine
771 ****************************************************************************/
773 BOOL send_one_packet(char *buf,int len,struct in_addr ip,int port,int type)
777 struct sockaddr_in sock_out;
779 /* create a socket to write to */
780 out_fd = socket(AF_INET, type, 0);
783 DEBUG(0,("socket failed"));
787 /* set the address and port */
788 memset((char *)&sock_out,'\0',sizeof(sock_out));
789 putip((char *)&sock_out.sin_addr,(char *)&ip);
790 sock_out.sin_port = htons( port );
791 sock_out.sin_family = AF_INET;
794 DEBUG(3,("sending a packet of len %d to (%s) on port %d of type %s\n",
795 len,inet_ntoa(ip),port,type==SOCK_DGRAM?"DGRAM":"STREAM"));
798 ret = (sendto(out_fd,buf,len,0,(struct sockaddr *)&sock_out,sizeof(sock_out)) >= 0);
801 DEBUG(0,("Packet send to %s(%d) failed ERRNO=%s\n",
802 inet_ntoa(ip),port,strerror(errno)));
808 /****************************************************************************
809 Open a socket of the specified type, port, and address for incoming data.
810 ****************************************************************************/
812 int open_socket_in( int type, int port, int dlevel, uint32 socket_addr, BOOL rebind )
814 struct sockaddr_in sock;
817 memset( (char *)&sock, '\0', sizeof(sock) );
819 #ifdef HAVE_SOCK_SIN_LEN
820 sock.sin_len = sizeof(sock);
822 sock.sin_port = htons( port );
823 sock.sin_family = AF_INET;
824 sock.sin_addr.s_addr = socket_addr;
826 res = socket( AF_INET, type, 0 );
829 dbgtext( "open_socket_in(): socket() call failed: " );
830 dbgtext( "%s\n", strerror( errno ) );
835 /* This block sets/clears the SO_REUSEADDR and possibly SO_REUSEPORT. */
837 int val = rebind ? 1 : 0;
838 if( setsockopt(res,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val)) == -1 ) {
839 if( DEBUGLVL( dlevel ) ) {
840 dbgtext( "open_socket_in(): setsockopt: " );
841 dbgtext( "SO_REUSEADDR = %s ", val?"True":"False" );
842 dbgtext( "on port %d failed ", port );
843 dbgtext( "with error = %s\n", strerror(errno) );
847 if( setsockopt(res,SOL_SOCKET,SO_REUSEPORT,(char *)&val,sizeof(val)) == -1 ) {
848 if( DEBUGLVL( dlevel ) ) {
849 dbgtext( "open_socket_in(): setsockopt: ");
850 dbgtext( "SO_REUSEPORT = %s ", val?"True":"False" );
851 dbgtext( "on port %d failed ", port );
852 dbgtext( "with error = %s\n", strerror(errno) );
855 #endif /* SO_REUSEPORT */
858 /* now we've got a socket - we need to bind it */
859 if( bind( res, (struct sockaddr *)&sock, sizeof(sock) ) == -1 ) {
860 if( DEBUGLVL(dlevel) && (port == SMB_PORT || port == NMB_PORT) ) {
861 dbgtext( "bind failed on port %d ", port );
862 dbgtext( "socket_addr = %s.\n", inet_ntoa( sock.sin_addr ) );
863 dbgtext( "Error = %s\n", strerror(errno) );
869 DEBUG( 3, ( "bind succeeded on port %d\n", port ) );
874 /****************************************************************************
875 create an outgoing socket. timeout is in milliseconds.
876 **************************************************************************/
878 int open_socket_out(int type, struct in_addr *addr, int port ,int timeout)
880 struct sockaddr_in sock_out;
882 int connect_loop = 250; /* 250 milliseconds */
883 int loops = (timeout) / connect_loop;
885 /* create a socket to write to */
886 res = socket(PF_INET, type, 0);
888 { DEBUG(0,("socket error\n")); return -1; }
890 if (type != SOCK_STREAM) return(res);
892 memset((char *)&sock_out,'\0',sizeof(sock_out));
893 putip((char *)&sock_out.sin_addr,(char *)addr);
895 sock_out.sin_port = htons( port );
896 sock_out.sin_family = PF_INET;
898 /* set it non-blocking */
899 set_blocking(res,False);
901 DEBUG(3,("Connecting to %s at port %d\n",inet_ntoa(*addr),port));
903 /* and connect it to the destination */
905 ret = connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out));
907 /* Some systems return EAGAIN when they mean EINPROGRESS */
908 if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
909 errno == EAGAIN) && loops--) {
910 msleep(connect_loop);
914 if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
916 DEBUG(1,("timeout connecting to %s:%d\n",inet_ntoa(*addr),port));
922 if (ret < 0 && errno == EISCONN) {
929 DEBUG(2,("error connecting to %s:%d (%s)\n",
930 inet_ntoa(*addr),port,strerror(errno)));
935 /* set it blocking again */
936 set_blocking(res,True);
942 open a connected UDP socket to host on port
944 int open_udp_socket(const char *host, int port)
946 int type = SOCK_DGRAM;
947 struct sockaddr_in sock_out;
949 struct in_addr *addr;
951 addr = interpret_addr2(host);
953 res = socket(PF_INET, type, 0);
958 memset((char *)&sock_out,'\0',sizeof(sock_out));
959 putip((char *)&sock_out.sin_addr,(char *)addr);
960 sock_out.sin_port = htons(port);
961 sock_out.sin_family = PF_INET;
963 if (connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out))) {
972 /* the following 3 client_*() functions are nasty ways of allowing
973 some generic functions to get info that really should be hidden in
974 particular modules */
975 static int client_fd = -1;
977 void client_setfd(int fd)
982 char *client_name(void)
984 return get_socket_name(client_fd);
987 char *client_addr(void)
989 return get_socket_addr(client_fd);
992 /*******************************************************************
993 matchname - determine if host name matches IP address. Used to
994 confirm a hostname lookup to prevent spoof attacks
995 ******************************************************************/
996 static BOOL matchname(char *remotehost,struct in_addr addr)
1001 if ((hp = sys_gethostbyname(remotehost)) == 0) {
1002 DEBUG(0,("sys_gethostbyname(%s): lookup failure.\n", remotehost));
1007 * Make sure that gethostbyname() returns the "correct" host name.
1008 * Unfortunately, gethostbyname("localhost") sometimes yields
1009 * "localhost.domain". Since the latter host name comes from the
1010 * local DNS, we just have to trust it (all bets are off if the local
1011 * DNS is perverted). We always check the address list, though.
1014 if (strcasecmp(remotehost, hp->h_name)
1015 && strcasecmp(remotehost, "localhost")) {
1016 DEBUG(0,("host name/name mismatch: %s != %s\n",
1017 remotehost, hp->h_name));
1021 /* Look up the host address in the address list we just got. */
1022 for (i = 0; hp->h_addr_list[i]; i++) {
1023 if (memcmp(hp->h_addr_list[i], (caddr_t) & addr, sizeof(addr)) == 0)
1028 * The host name does not map to the original host address. Perhaps
1029 * someone has compromised a name server. More likely someone botched
1030 * it, but that could be dangerous, too.
1033 DEBUG(0,("host name/address mismatch: %s != %s\n",
1034 inet_ntoa(addr), hp->h_name));
1039 /*******************************************************************
1040 return the DNS name of the remote end of a socket
1041 ******************************************************************/
1042 char *get_socket_name(int fd)
1044 static pstring name_buf;
1045 static fstring addr_buf;
1047 struct in_addr addr;
1050 /* reverse lookups can be *very* expensive, and in many
1051 situations won't work because many networks don't link dhcp
1052 with dns. To avoid the delay we avoid the lookup if
1054 if (!lp_hostname_lookups()) {
1055 return get_socket_addr(fd);
1058 p = get_socket_addr(fd);
1060 /* it might be the same as the last one - save some DNS work */
1061 if (strcmp(p, addr_buf) == 0) return name_buf;
1063 pstrcpy(name_buf,"UNKNOWN");
1064 if (fd == -1) return name_buf;
1066 fstrcpy(addr_buf, p);
1068 addr = *interpret_addr2(p);
1070 /* Look up the remote host name. */
1071 if ((hp = gethostbyaddr((char *)&addr.s_addr, sizeof(addr.s_addr), AF_INET)) == 0) {
1072 DEBUG(1,("Gethostbyaddr failed for %s\n",p));
1073 pstrcpy(name_buf, p);
1075 pstrcpy(name_buf,(char *)hp->h_name);
1076 if (!matchname(name_buf, addr)) {
1077 DEBUG(0,("Matchname failed on %s %s\n",name_buf,p));
1078 pstrcpy(name_buf,"UNKNOWN");
1082 alpha_strcpy(name_buf, name_buf, "_-.", sizeof(name_buf));
1083 if (strstr(name_buf,"..")) {
1084 pstrcpy(name_buf, "UNKNOWN");
1090 /*******************************************************************
1091 return the IP addr of the remote end of a socket as a string
1092 ******************************************************************/
1093 char *get_socket_addr(int fd)
1096 struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
1097 int length = sizeof(sa);
1098 static fstring addr_buf;
1100 fstrcpy(addr_buf,"0.0.0.0");
1106 if (getpeername(fd, &sa, &length) < 0) {
1107 DEBUG(0,("getpeername failed. Error was %s\n", strerror(errno) ));
1111 fstrcpy(addr_buf,(char *)inet_ntoa(sockin->sin_addr));
1116 /*******************************************************************
1117 opens and connects to a unix pipe socket
1118 ******************************************************************/
1119 int open_pipe_sock(char *path)
1122 struct sockaddr_un sa;
1124 sock = socket(AF_UNIX, SOCK_STREAM, 0);
1128 DEBUG(0, ("unix socket open failed\n"));
1133 sa.sun_family = AF_UNIX;
1134 safe_strcpy(sa.sun_path, path, sizeof(sa.sun_path)-1);
1136 DEBUG(10, ("socket open succeeded. file name: %s\n", sa.sun_path));
1138 if (connect(sock, (struct sockaddr*) &sa, sizeof(sa)) < 0)
1140 DEBUG(0,("socket connect to %s failed\n", sa.sun_path));
1148 /*******************************************************************
1149 Create protected unix domain socket.
1151 some unixen cannot set permissions on a ux-dom-sock, so we
1152 have to make sure that the directory contains the protection
1153 permissions, instead.
1154 ******************************************************************/
1155 int create_pipe_sock(const char *socket_dir,
1156 const char *socket_name,
1159 struct sockaddr_un sunaddr;
1165 /* Create the socket directory or reuse the existing one */
1167 if (lstat(socket_dir, &st) == -1) {
1169 if (errno == ENOENT) {
1171 /* Create directory */
1173 if (mkdir(socket_dir, dir_perms) == -1) {
1174 DEBUG(0, ("error creating socket directory "
1175 "%s: %s\n", socket_dir,
1182 DEBUG(0, ("lstat failed on socket directory %s: %s\n",
1183 socket_dir, strerror(errno)));
1189 /* Check ownership and permission on existing directory */
1191 if (!S_ISDIR(st.st_mode)) {
1192 DEBUG(0, ("socket directory %s isn't a directory\n",
1197 if ((st.st_uid != sec_initial_uid()) ||
1198 ((st.st_mode & 0777) != dir_perms)) {
1199 DEBUG(0, ("invalid permissions on socket directory "
1200 "%s\n", socket_dir));
1205 /* Create the socket file */
1207 old_umask = umask(0);
1209 sock = socket(AF_UNIX, SOCK_STREAM, 0);
1217 snprintf(path, sizeof(path), "%s/%s", socket_dir, socket_name);
1220 memset(&sunaddr, 0, sizeof(sunaddr));
1221 sunaddr.sun_family = AF_UNIX;
1222 safe_strcpy(sunaddr.sun_path, path, sizeof(sunaddr.sun_path)-1);
1224 if (bind(sock, (struct sockaddr *)&sunaddr, sizeof(sunaddr)) == -1) {
1225 DEBUG(0, ("bind failed on pipe socket %s: %s\n",
1233 if (listen(sock, 5) == -1) {
1234 DEBUG(0, ("listen failed on pipe socket %s: %s\n",
1249 /*******************************************************************
1250 this is like socketpair but uses tcp. It is used by the Samba
1251 regression test code
1252 The function guarantees that nobody else can attach to the socket,
1253 or if they do that this function fails and the socket gets closed
1254 returns 0 on success, -1 on failure
1255 the resulting file descriptors are symmetrical
1256 ******************************************************************/
1257 static int socketpair_tcp(int fd[2])
1260 struct sockaddr_in sock;
1261 struct sockaddr_in sock2;
1262 socklen_t socklen = sizeof(sock);
1263 int connect_done = 0;
1265 fd[0] = fd[1] = listener = -1;
1267 memset(&sock, 0, sizeof(sock));
1269 if ((listener = socket(PF_INET, SOCK_STREAM, 0)) == -1) goto failed;
1271 memset(&sock2, 0, sizeof(sock2));
1272 #ifdef HAVE_SOCK_SIN_LEN
1273 sock2.sin_len = sizeof(sock2);
1275 sock2.sin_family = PF_INET;
1277 bind(listener, (struct sockaddr *)&sock2, sizeof(sock2));
1279 if (listen(listener, 1) != 0) goto failed;
1281 if (getsockname(listener, (struct sockaddr *)&sock, &socklen) != 0) goto failed;
1283 if ((fd[1] = socket(PF_INET, SOCK_STREAM, 0)) == -1) goto failed;
1285 set_blocking(fd[1], 0);
1287 sock.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
1289 if (connect(fd[1],(struct sockaddr *)&sock,sizeof(sock)) == -1) {
1290 if (errno != EINPROGRESS) goto failed;
1295 if ((fd[0] = accept(listener, (struct sockaddr *)&sock, &socklen)) == -1) goto failed;
1298 if (connect_done == 0) {
1299 if (connect(fd[1],(struct sockaddr *)&sock,sizeof(sock)) != 0
1300 && errno != EISCONN) goto failed;
1303 set_blocking(fd[1], 1);
1309 if (fd[0] != -1) close(fd[0]);
1310 if (fd[1] != -1) close(fd[1]);
1311 if (listener != -1) close(listener);
1316 /*******************************************************************
1317 run a program on a local tcp socket, this is used to launch smbd
1318 when regression testing
1319 the return value is a socket which is attached to a subprocess
1320 running "prog". stdin and stdout are attached. stderr is left
1321 attached to the original stderr
1322 ******************************************************************/
1323 int sock_exec(const char *prog)
1326 if (socketpair_tcp(fd) != 0) {
1327 DEBUG(0,("socketpair_tcp failed (%s)\n", strerror(errno)));