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 = sys_read(fd, buf + nread, maxcnt - nread);
253 readret = sys_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 = sys_read(fd, buf + nread, maxcnt - nread);
310 readret = sys_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 = sys_read(fd, buf + nread, maxcnt - nread);
363 readret = sys_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 = sys_read(fd, buf + nread, maxcnt - nread);
393 readret = sys_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)
434 ret = SSL_read(ssl, buffer + total, N - total);
436 ret = sys_read(fd,buffer + total,N - total);
439 ret = sys_read(fd,buffer + total,N - total);
440 #endif /* WITH_SSL */
443 DEBUG(10,("read_data: read of %d returned 0. Error = %s\n", (int)(N - total), strerror(errno) ));
444 smb_read_error = READ_EOF;
449 DEBUG(0,("read_data: read failure for %d. Error = %s\n", (int)(N - total), strerror(errno) ));
450 smb_read_error = READ_ERROR;
455 return (ssize_t)total;
458 /****************************************************************************
459 Read data from a socket, reading exactly N bytes.
460 ****************************************************************************/
462 static ssize_t read_socket_data(int fd,char *buffer,size_t N)
472 ret = SSL_read(ssl, buffer + total, N - total);
474 ret = sys_read(fd,buffer + total,N - total);
477 ret = sys_read(fd,buffer + total,N - total);
478 #endif /* WITH_SSL */
481 DEBUG(10,("read_socket_data: recv of %d returned 0. Error = %s\n", (int)(N - total), strerror(errno) ));
482 smb_read_error = READ_EOF;
487 DEBUG(0,("read_socket_data: recv failure for %d. Error = %s\n", (int)(N - total), strerror(errno) ));
488 smb_read_error = READ_ERROR;
493 return (ssize_t)total;
496 /****************************************************************************
498 ****************************************************************************/
500 ssize_t write_data(int fd,char *buffer,size_t N)
508 ret = SSL_write(ssl,buffer + total,N - total);
510 ret = sys_write(fd,buffer + total,N - total);
513 ret = sys_write(fd,buffer + total,N - total);
514 #endif /* WITH_SSL */
517 DEBUG(0,("write_data: write failure. Error = %s\n", strerror(errno) ));
525 return (ssize_t)total;
528 /****************************************************************************
529 Write data to a socket - use send rather than write.
530 ****************************************************************************/
532 ssize_t write_socket_data(int fd,char *buffer,size_t N)
540 ret = SSL_write(ssl,buffer + total,N - total);
542 ret = sys_send(fd,buffer + total,N - total, 0);
545 ret = sys_send(fd,buffer + total,N - total,0);
546 #endif /* WITH_SSL */
549 DEBUG(0,("write_socket_data: write failure. Error = %s\n", strerror(errno) ));
557 return (ssize_t)total;
560 /****************************************************************************
562 ****************************************************************************/
564 ssize_t write_socket(int fd,char *buf,size_t len)
568 DEBUG(6,("write_socket(%d,%d)\n",fd,(int)len));
569 ret = write_socket_data(fd,buf,len);
571 DEBUG(6,("write_socket(%d,%d) wrote %d\n",fd,(int)len,(int)ret));
573 DEBUG(0,("write_socket: Error writing %d bytes to socket %d: ERRNO = %s\n",
574 (int)len, fd, strerror(errno) ));
579 /****************************************************************************
580 read 4 bytes of a smb packet and return the smb length of the packet
581 store the result in the buffer
582 This version of the function will return a length of zero on receiving
584 timeout is in milliseconds.
585 ****************************************************************************/
587 static ssize_t read_smb_length_return_keepalive(int fd,char *inbuf,unsigned int timeout)
595 ok = (read_socket_with_timeout(fd,inbuf,4,4,timeout) == 4);
597 ok = (read_socket_data(fd,inbuf,4) == 4);
602 len = smb_len(inbuf);
603 msg_type = CVAL(inbuf,0);
605 if (msg_type == SMBkeepalive)
606 DEBUG(5,("Got keepalive packet\n"));
609 DEBUG(10,("got smb length of %d\n",len));
614 /****************************************************************************
615 read 4 bytes of a smb packet and return the smb length of the packet
616 store the result in the buffer. This version of the function will
617 never return a session keepalive (length of zero).
618 timeout is in milliseconds.
619 ****************************************************************************/
621 ssize_t read_smb_length(int fd,char *inbuf,unsigned int timeout)
626 len = read_smb_length_return_keepalive(fd, inbuf, timeout);
631 /* Ignore session keepalives. */
632 if(CVAL(inbuf,0) != SMBkeepalive)
636 DEBUG(10,("read_smb_length: got smb length of %d\n",len));
641 /****************************************************************************
642 read an smb from a fd. Note that the buffer *MUST* be of size
643 BUFFER_SIZE+SAFETY_MARGIN.
644 The timeout is in milliseconds.
645 This function will return on a
646 receipt of a session keepalive packet.
647 ****************************************************************************/
649 BOOL receive_smb(int fd,char *buffer, unsigned int timeout)
655 memset(buffer,'\0',smb_size + 100);
657 len = read_smb_length_return_keepalive(fd,buffer,timeout);
659 DEBUG(10,("receive_smb: length < 0!\n"));
662 * Correct fix. smb_read_error may have already been
663 * set. Only set it here if not already set. Global
664 * variables still suck :-). JRA.
667 if (smb_read_error == 0)
668 smb_read_error = READ_ERROR;
673 * A WRITEX with CAP_LARGE_WRITEX can be 64k worth of data plus 65 bytes
674 * of header. Don't print the error if this fits.... JRA.
677 if (len > (BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE)) {
678 DEBUG(0,("Invalid packet length! (%d bytes).\n",len));
679 if (len > BUFFER_SIZE + (SAFETY_MARGIN/2)) {
682 * Correct fix. smb_read_error may have already been
683 * set. Only set it here if not already set. Global
684 * variables still suck :-). JRA.
687 if (smb_read_error == 0)
688 smb_read_error = READ_ERROR;
694 ret = read_socket_data(fd,buffer+4,len);
696 if (smb_read_error == 0)
697 smb_read_error = READ_ERROR;
705 /****************************************************************************
706 read an smb from a fd ignoring all keepalive packets. Note that the buffer
707 *MUST* be of size BUFFER_SIZE+SAFETY_MARGIN.
708 The timeout is in milliseconds
710 This is exactly the same as receive_smb except that it never returns
711 a session keepalive packet (just as receive_smb used to do).
712 receive_smb was changed to return keepalives as the oplock processing means this call
713 should never go into a blocking read.
714 ****************************************************************************/
716 BOOL client_receive_smb(int fd,char *buffer, unsigned int timeout)
722 ret = receive_smb(fd, buffer, timeout);
726 DEBUG(10,("client_receive_smb failed\n"));
731 /* Ignore session keepalive packets. */
732 if(CVAL(buffer,0) != SMBkeepalive)
739 /****************************************************************************
741 ****************************************************************************/
743 BOOL send_smb(int fd,char *buffer)
748 len = smb_len(buffer) + 4;
750 while (nwritten < len) {
751 ret = write_socket(fd,buffer+nwritten,len - nwritten);
753 DEBUG(0,("Error writing %d bytes to client. %d. (%s)\n",
754 (int)len,(int)ret, strerror(errno) ));
763 /****************************************************************************
764 send a single packet to a port on another machine
765 ****************************************************************************/
767 BOOL send_one_packet(char *buf,int len,struct in_addr ip,int port,int type)
771 struct sockaddr_in sock_out;
773 /* create a socket to write to */
774 out_fd = socket(AF_INET, type, 0);
777 DEBUG(0,("socket failed"));
781 /* set the address and port */
782 memset((char *)&sock_out,'\0',sizeof(sock_out));
783 putip((char *)&sock_out.sin_addr,(char *)&ip);
784 sock_out.sin_port = htons( port );
785 sock_out.sin_family = AF_INET;
788 DEBUG(3,("sending a packet of len %d to (%s) on port %d of type %s\n",
789 len,inet_ntoa(ip),port,type==SOCK_DGRAM?"DGRAM":"STREAM"));
792 ret = (sendto(out_fd,buf,len,0,(struct sockaddr *)&sock_out,sizeof(sock_out)) >= 0);
795 DEBUG(0,("Packet send to %s(%d) failed ERRNO=%s\n",
796 inet_ntoa(ip),port,strerror(errno)));
802 /****************************************************************************
803 Open a socket of the specified type, port, and address for incoming data.
804 ****************************************************************************/
806 int open_socket_in( int type, int port, int dlevel, uint32 socket_addr, BOOL rebind )
808 struct sockaddr_in sock;
811 memset( (char *)&sock, '\0', sizeof(sock) );
813 #ifdef HAVE_SOCK_SIN_LEN
814 sock.sin_len = sizeof(sock);
816 sock.sin_port = htons( port );
817 sock.sin_family = AF_INET;
818 sock.sin_addr.s_addr = socket_addr;
820 res = socket( AF_INET, type, 0 );
823 dbgtext( "open_socket_in(): socket() call failed: " );
824 dbgtext( "%s\n", strerror( errno ) );
829 /* This block sets/clears the SO_REUSEADDR and possibly SO_REUSEPORT. */
831 int val = rebind ? 1 : 0;
832 if( setsockopt(res,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val)) == -1 ) {
833 if( DEBUGLVL( dlevel ) ) {
834 dbgtext( "open_socket_in(): setsockopt: " );
835 dbgtext( "SO_REUSEADDR = %s ", val?"True":"False" );
836 dbgtext( "on port %d failed ", port );
837 dbgtext( "with error = %s\n", strerror(errno) );
841 if( setsockopt(res,SOL_SOCKET,SO_REUSEPORT,(char *)&val,sizeof(val)) == -1 ) {
842 if( DEBUGLVL( dlevel ) ) {
843 dbgtext( "open_socket_in(): setsockopt: ");
844 dbgtext( "SO_REUSEPORT = %s ", val?"True":"False" );
845 dbgtext( "on port %d failed ", port );
846 dbgtext( "with error = %s\n", strerror(errno) );
849 #endif /* SO_REUSEPORT */
852 /* now we've got a socket - we need to bind it */
853 if( bind( res, (struct sockaddr *)&sock, sizeof(sock) ) == -1 ) {
854 if( DEBUGLVL(dlevel) && (port == SMB_PORT || port == NMB_PORT) ) {
855 dbgtext( "bind failed on port %d ", port );
856 dbgtext( "socket_addr = %s.\n", inet_ntoa( sock.sin_addr ) );
857 dbgtext( "Error = %s\n", strerror(errno) );
863 DEBUG( 3, ( "bind succeeded on port %d\n", port ) );
868 /****************************************************************************
869 create an outgoing socket. timeout is in milliseconds.
870 **************************************************************************/
872 int open_socket_out(int type, struct in_addr *addr, int port ,int timeout)
874 struct sockaddr_in sock_out;
876 int connect_loop = 250; /* 250 milliseconds */
877 int loops = (timeout) / connect_loop;
879 /* create a socket to write to */
880 res = socket(PF_INET, type, 0);
882 { DEBUG(0,("socket error\n")); return -1; }
884 if (type != SOCK_STREAM) return(res);
886 memset((char *)&sock_out,'\0',sizeof(sock_out));
887 putip((char *)&sock_out.sin_addr,(char *)addr);
889 sock_out.sin_port = htons( port );
890 sock_out.sin_family = PF_INET;
892 /* set it non-blocking */
893 set_blocking(res,False);
895 DEBUG(3,("Connecting to %s at port %d\n",inet_ntoa(*addr),port));
897 /* and connect it to the destination */
899 ret = connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out));
901 /* Some systems return EAGAIN when they mean EINPROGRESS */
902 if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
903 errno == EAGAIN) && loops--) {
904 msleep(connect_loop);
908 if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
910 DEBUG(1,("timeout connecting to %s:%d\n",inet_ntoa(*addr),port));
916 if (ret < 0 && errno == EISCONN) {
923 DEBUG(2,("error connecting to %s:%d (%s)\n",
924 inet_ntoa(*addr),port,strerror(errno)));
929 /* set it blocking again */
930 set_blocking(res,True);
936 open a connected UDP socket to host on port
938 int open_udp_socket(const char *host, int port)
940 int type = SOCK_DGRAM;
941 struct sockaddr_in sock_out;
943 struct in_addr *addr;
945 addr = interpret_addr2(host);
947 res = socket(PF_INET, type, 0);
952 memset((char *)&sock_out,'\0',sizeof(sock_out));
953 putip((char *)&sock_out.sin_addr,(char *)addr);
954 sock_out.sin_port = htons(port);
955 sock_out.sin_family = PF_INET;
957 if (connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out))) {
966 /* the following 3 client_*() functions are nasty ways of allowing
967 some generic functions to get info that really should be hidden in
968 particular modules */
969 static int client_fd = -1;
971 void client_setfd(int fd)
976 char *client_name(void)
978 return get_socket_name(client_fd);
981 char *client_addr(void)
983 return get_socket_addr(client_fd);
986 /*******************************************************************
987 matchname - determine if host name matches IP address. Used to
988 confirm a hostname lookup to prevent spoof attacks
989 ******************************************************************/
990 static BOOL matchname(char *remotehost,struct in_addr addr)
995 if ((hp = sys_gethostbyname(remotehost)) == 0) {
996 DEBUG(0,("sys_gethostbyname(%s): lookup failure.\n", remotehost));
1001 * Make sure that gethostbyname() returns the "correct" host name.
1002 * Unfortunately, gethostbyname("localhost") sometimes yields
1003 * "localhost.domain". Since the latter host name comes from the
1004 * local DNS, we just have to trust it (all bets are off if the local
1005 * DNS is perverted). We always check the address list, though.
1008 if (strcasecmp(remotehost, hp->h_name)
1009 && strcasecmp(remotehost, "localhost")) {
1010 DEBUG(0,("host name/name mismatch: %s != %s\n",
1011 remotehost, hp->h_name));
1015 /* Look up the host address in the address list we just got. */
1016 for (i = 0; hp->h_addr_list[i]; i++) {
1017 if (memcmp(hp->h_addr_list[i], (caddr_t) & addr, sizeof(addr)) == 0)
1022 * The host name does not map to the original host address. Perhaps
1023 * someone has compromised a name server. More likely someone botched
1024 * it, but that could be dangerous, too.
1027 DEBUG(0,("host name/address mismatch: %s != %s\n",
1028 inet_ntoa(addr), hp->h_name));
1033 /*******************************************************************
1034 return the DNS name of the remote end of a socket
1035 ******************************************************************/
1036 char *get_socket_name(int fd)
1038 static pstring name_buf;
1039 static fstring addr_buf;
1041 struct in_addr addr;
1044 /* reverse lookups can be *very* expensive, and in many
1045 situations won't work because many networks don't link dhcp
1046 with dns. To avoid the delay we avoid the lookup if
1048 if (!lp_hostname_lookups()) {
1049 return get_socket_addr(fd);
1052 p = get_socket_addr(fd);
1054 /* it might be the same as the last one - save some DNS work */
1055 if (strcmp(p, addr_buf) == 0) return name_buf;
1057 pstrcpy(name_buf,"UNKNOWN");
1058 if (fd == -1) return name_buf;
1060 fstrcpy(addr_buf, p);
1062 addr = *interpret_addr2(p);
1064 /* Look up the remote host name. */
1065 if ((hp = gethostbyaddr((char *)&addr.s_addr, sizeof(addr.s_addr), AF_INET)) == 0) {
1066 DEBUG(1,("Gethostbyaddr failed for %s\n",p));
1067 pstrcpy(name_buf, p);
1069 pstrcpy(name_buf,(char *)hp->h_name);
1070 if (!matchname(name_buf, addr)) {
1071 DEBUG(0,("Matchname failed on %s %s\n",name_buf,p));
1072 pstrcpy(name_buf,"UNKNOWN");
1076 alpha_strcpy(name_buf, name_buf, "_-.", sizeof(name_buf));
1077 if (strstr(name_buf,"..")) {
1078 pstrcpy(name_buf, "UNKNOWN");
1084 /*******************************************************************
1085 return the IP addr of the remote end of a socket as a string
1086 ******************************************************************/
1087 char *get_socket_addr(int fd)
1090 struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
1091 int length = sizeof(sa);
1092 static fstring addr_buf;
1094 fstrcpy(addr_buf,"0.0.0.0");
1100 if (getpeername(fd, &sa, &length) < 0) {
1101 DEBUG(0,("getpeername failed. Error was %s\n", strerror(errno) ));
1105 fstrcpy(addr_buf,(char *)inet_ntoa(sockin->sin_addr));
1110 /*******************************************************************
1111 opens and connects to a unix pipe socket
1112 ******************************************************************/
1113 int open_pipe_sock(char *path)
1116 struct sockaddr_un sa;
1118 sock = socket(AF_UNIX, SOCK_STREAM, 0);
1122 DEBUG(0, ("unix socket open failed\n"));
1127 sa.sun_family = AF_UNIX;
1128 safe_strcpy(sa.sun_path, path, sizeof(sa.sun_path)-1);
1130 DEBUG(10, ("socket open succeeded. file name: %s\n", sa.sun_path));
1132 if (connect(sock, (struct sockaddr*) &sa, sizeof(sa)) < 0)
1134 DEBUG(0,("socket connect to %s failed\n", sa.sun_path));
1142 /*******************************************************************
1143 Create protected unix domain socket.
1145 some unixen cannot set permissions on a ux-dom-sock, so we
1146 have to make sure that the directory contains the protection
1147 permissions, instead.
1148 ******************************************************************/
1149 int create_pipe_sock(const char *socket_dir,
1150 const char *socket_name,
1153 struct sockaddr_un sunaddr;
1159 /* Create the socket directory or reuse the existing one */
1161 if (lstat(socket_dir, &st) == -1) {
1163 if (errno == ENOENT) {
1165 /* Create directory */
1167 if (mkdir(socket_dir, dir_perms) == -1) {
1168 DEBUG(0, ("error creating socket directory "
1169 "%s: %s\n", socket_dir,
1176 DEBUG(0, ("lstat failed on socket directory %s: %s\n",
1177 socket_dir, strerror(errno)));
1183 /* Check ownership and permission on existing directory */
1185 if (!S_ISDIR(st.st_mode)) {
1186 DEBUG(0, ("socket directory %s isn't a directory\n",
1191 if ((st.st_uid != sec_initial_uid()) ||
1192 ((st.st_mode & 0777) != dir_perms)) {
1193 DEBUG(0, ("invalid permissions on socket directory "
1194 "%s\n", socket_dir));
1199 /* Create the socket file */
1201 old_umask = umask(0);
1203 sock = socket(AF_UNIX, SOCK_STREAM, 0);
1211 snprintf(path, sizeof(path), "%s/%s", socket_dir, socket_name);
1214 memset(&sunaddr, 0, sizeof(sunaddr));
1215 sunaddr.sun_family = AF_UNIX;
1216 safe_strcpy(sunaddr.sun_path, path, sizeof(sunaddr.sun_path)-1);
1218 if (bind(sock, (struct sockaddr *)&sunaddr, sizeof(sunaddr)) == -1) {
1219 DEBUG(0, ("bind failed on pipe socket %s: %s\n",
1227 if (listen(sock, 5) == -1) {
1228 DEBUG(0, ("listen failed on pipe socket %s: %s\n",
1243 /*******************************************************************
1244 this is like socketpair but uses tcp. It is used by the Samba
1245 regression test code
1246 The function guarantees that nobody else can attach to the socket,
1247 or if they do that this function fails and the socket gets closed
1248 returns 0 on success, -1 on failure
1249 the resulting file descriptors are symmetrical
1250 ******************************************************************/
1251 static int socketpair_tcp(int fd[2])
1254 struct sockaddr_in sock;
1255 struct sockaddr_in sock2;
1256 socklen_t socklen = sizeof(sock);
1257 int connect_done = 0;
1259 fd[0] = fd[1] = listener = -1;
1261 memset(&sock, 0, sizeof(sock));
1263 if ((listener = socket(PF_INET, SOCK_STREAM, 0)) == -1) goto failed;
1265 memset(&sock2, 0, sizeof(sock2));
1266 #ifdef HAVE_SOCK_SIN_LEN
1267 sock2.sin_len = sizeof(sock2);
1269 sock2.sin_family = PF_INET;
1271 bind(listener, (struct sockaddr *)&sock2, sizeof(sock2));
1273 if (listen(listener, 1) != 0) goto failed;
1275 if (getsockname(listener, (struct sockaddr *)&sock, &socklen) != 0) goto failed;
1277 if ((fd[1] = socket(PF_INET, SOCK_STREAM, 0)) == -1) goto failed;
1279 set_blocking(fd[1], 0);
1281 sock.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
1283 if (connect(fd[1],(struct sockaddr *)&sock,sizeof(sock)) == -1) {
1284 if (errno != EINPROGRESS) goto failed;
1289 if ((fd[0] = accept(listener, (struct sockaddr *)&sock, &socklen)) == -1) goto failed;
1292 if (connect_done == 0) {
1293 if (connect(fd[1],(struct sockaddr *)&sock,sizeof(sock)) != 0
1294 && errno != EISCONN) goto failed;
1297 set_blocking(fd[1], 1);
1303 if (fd[0] != -1) close(fd[0]);
1304 if (fd[1] != -1) close(fd[1]);
1305 if (listener != -1) close(listener);
1310 /*******************************************************************
1311 run a program on a local tcp socket, this is used to launch smbd
1312 when regression testing
1313 the return value is a socket which is attached to a subprocess
1314 running "prog". stdin and stdout are attached. stderr is left
1315 attached to the original stderr
1316 ******************************************************************/
1317 int sock_exec(const char *prog)
1320 if (socketpair_tcp(fd) != 0) {
1321 DEBUG(0,("socketpair_tcp failed (%s)\n", strerror(errno)));