r7318: Unify HEAD and 3.0 socket functions. Add HEAD functions here #ifdef'ed out.
[samba.git] / source / lib / util_sock.c
1 /* 
2    Unix SMB/CIFS implementation.
3    Samba utility functions
4    Copyright (C) Andrew Tridgell 1992-1998
5    Copyright (C) Tim Potter      2000-2001
6    
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.
11    
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.
16    
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.
20 */
21
22 #include "includes.h"
23
24 /* the last IP received from */
25 struct in_addr lastip;
26
27 /* the last port received from */
28 int lastport=0;
29
30 int smb_read_error = 0;
31
32 static char *get_socket_addr(int fd)
33 {
34         struct sockaddr sa;
35         struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
36         socklen_t length = sizeof(sa);
37         static fstring addr_buf;
38
39         fstrcpy(addr_buf,"0.0.0.0");
40
41         if (fd == -1) {
42                 return addr_buf;
43         }
44         
45         if (getsockname(fd, &sa, &length) < 0) {
46                 DEBUG(0,("getsockname failed. Error was %s\n", strerror(errno) ));
47                 return addr_buf;
48         }
49         
50         fstrcpy(addr_buf,(char *)inet_ntoa(sockin->sin_addr));
51         
52         return addr_buf;
53 }
54
55 static int get_socket_port(int fd)
56 {
57         struct sockaddr sa;
58         struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
59         socklen_t length = sizeof(sa);
60
61         if (fd == -1)
62                 return -1;
63         
64         if (getsockname(fd, &sa, &length) < 0) {
65                 DEBUG(0,("getpeername failed. Error was %s\n", strerror(errno) ));
66                 return -1;
67         }
68         
69         return ntohs(sockin->sin_port);
70 }
71
72 /****************************************************************************
73  Determine if a file descriptor is in fact a socket.
74 ****************************************************************************/
75
76 BOOL is_a_socket(int fd)
77 {
78         int v;
79         socklen_t l;
80         l = sizeof(int);
81         return(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&v, &l) == 0);
82 }
83
84 enum SOCK_OPT_TYPES {OPT_BOOL,OPT_INT,OPT_ON};
85
86 typedef struct smb_socket_option {
87         const char *name;
88         int level;
89         int option;
90         int value;
91         int opttype;
92 } smb_socket_option;
93
94 static const smb_socket_option socket_options[] = {
95   {"SO_KEEPALIVE",      SOL_SOCKET,    SO_KEEPALIVE,    0,                 OPT_BOOL},
96   {"SO_REUSEADDR",      SOL_SOCKET,    SO_REUSEADDR,    0,                 OPT_BOOL},
97   {"SO_BROADCAST",      SOL_SOCKET,    SO_BROADCAST,    0,                 OPT_BOOL},
98 #ifdef TCP_NODELAY
99   {"TCP_NODELAY",       IPPROTO_TCP,   TCP_NODELAY,     0,                 OPT_BOOL},
100 #endif
101 #ifdef TCP_KEEPCNT
102   {"TCP_KEEPCNT",       IPPROTO_TCP,   TCP_KEEPCNT,     0,                 OPT_INT},
103 #endif
104 #ifdef TCP_KEEPIDLE
105   {"TCP_KEEPIDLE",      IPPROTO_TCP,   TCP_KEEPIDLE,    0,                 OPT_INT},
106 #endif
107 #ifdef TCP_KEEPINTVL
108   {"TCP_KEEPINTVL",     IPPROTO_TCP,   TCP_KEEPINTVL,   0,                 OPT_INT},
109 #endif
110 #ifdef IPTOS_LOWDELAY
111   {"IPTOS_LOWDELAY",    IPPROTO_IP,    IP_TOS,          IPTOS_LOWDELAY,    OPT_ON},
112 #endif
113 #ifdef IPTOS_THROUGHPUT
114   {"IPTOS_THROUGHPUT",  IPPROTO_IP,    IP_TOS,          IPTOS_THROUGHPUT,  OPT_ON},
115 #endif
116 #ifdef SO_REUSEPORT
117   {"SO_REUSEPORT",      SOL_SOCKET,    SO_REUSEPORT,    0,                 OPT_BOOL},
118 #endif
119 #ifdef SO_SNDBUF
120   {"SO_SNDBUF",         SOL_SOCKET,    SO_SNDBUF,       0,                 OPT_INT},
121 #endif
122 #ifdef SO_RCVBUF
123   {"SO_RCVBUF",         SOL_SOCKET,    SO_RCVBUF,       0,                 OPT_INT},
124 #endif
125 #ifdef SO_SNDLOWAT
126   {"SO_SNDLOWAT",       SOL_SOCKET,    SO_SNDLOWAT,     0,                 OPT_INT},
127 #endif
128 #ifdef SO_RCVLOWAT
129   {"SO_RCVLOWAT",       SOL_SOCKET,    SO_RCVLOWAT,     0,                 OPT_INT},
130 #endif
131 #ifdef SO_SNDTIMEO
132   {"SO_SNDTIMEO",       SOL_SOCKET,    SO_SNDTIMEO,     0,                 OPT_INT},
133 #endif
134 #ifdef SO_RCVTIMEO
135   {"SO_RCVTIMEO",       SOL_SOCKET,    SO_RCVTIMEO,     0,                 OPT_INT},
136 #endif
137   {NULL,0,0,0,0}};
138
139 /****************************************************************************
140  Print socket options.
141 ****************************************************************************/
142
143 static void print_socket_options(int s)
144 {
145         int value;
146         socklen_t vlen = 4;
147         const smb_socket_option *p = &socket_options[0];
148
149         /* wrapped in if statement to prevent streams leak in SCO Openserver 5.0 */
150         /* reported on samba-technical  --jerry */
151         if ( DEBUGLEVEL >= 5 ) {
152         for (; p->name != NULL; p++) {
153                 if (getsockopt(s, p->level, p->option, (void *)&value, &vlen) == -1) {
154                         DEBUG(5,("Could not test socket option %s.\n", p->name));
155                 } else {
156                         DEBUG(5,("socket option %s = %d\n",p->name,value));
157                         }
158                 }
159         }
160  }
161
162 /****************************************************************************
163  Set user socket options.
164 ****************************************************************************/
165
166 void set_socket_options(int fd, const char *options)
167 {
168         fstring tok;
169
170         while (next_token(&options,tok," \t,", sizeof(tok))) {
171                 int ret=0,i;
172                 int value = 1;
173                 char *p;
174                 BOOL got_value = False;
175
176                 if ((p = strchr_m(tok,'='))) {
177                         *p = 0;
178                         value = atoi(p+1);
179                         got_value = True;
180                 }
181
182                 for (i=0;socket_options[i].name;i++)
183                         if (strequal(socket_options[i].name,tok))
184                                 break;
185
186                 if (!socket_options[i].name) {
187                         DEBUG(0,("Unknown socket option %s\n",tok));
188                         continue;
189                 }
190
191                 switch (socket_options[i].opttype) {
192                 case OPT_BOOL:
193                 case OPT_INT:
194                         ret = setsockopt(fd,socket_options[i].level,
195                                                 socket_options[i].option,(char *)&value,sizeof(int));
196                         break;
197
198                 case OPT_ON:
199                         if (got_value)
200                                 DEBUG(0,("syntax error - %s does not take a value\n",tok));
201
202                         {
203                                 int on = socket_options[i].value;
204                                 ret = setsockopt(fd,socket_options[i].level,
205                                                         socket_options[i].option,(char *)&on,sizeof(int));
206                         }
207                         break;    
208                 }
209       
210                 if (ret != 0)
211                         DEBUG(0,("Failed to set socket option %s (Error %s)\n",tok, strerror(errno) ));
212         }
213
214         print_socket_options(fd);
215 }
216
217 /****************************************************************************
218  Read from a socket.
219 ****************************************************************************/
220
221 ssize_t read_udp_socket(int fd,char *buf,size_t len)
222 {
223         ssize_t ret;
224         struct sockaddr_in sock;
225         socklen_t socklen = sizeof(sock);
226
227         memset((char *)&sock,'\0',socklen);
228         memset((char *)&lastip,'\0',sizeof(lastip));
229         ret = (ssize_t)sys_recvfrom(fd,buf,len,0,(struct sockaddr *)&sock,&socklen);
230         if (ret <= 0) {
231                 DEBUG(2,("read socket failed. ERRNO=%s\n",strerror(errno)));
232                 return(0);
233         }
234
235         lastip = sock.sin_addr;
236         lastport = ntohs(sock.sin_port);
237
238         DEBUG(10,("read_udp_socket: lastip %s lastport %d read: %lu\n",
239                         inet_ntoa(lastip), lastport, (unsigned long)ret));
240
241         return(ret);
242 }
243
244 #if 0
245
246 Socket routines from HEAD - maybe re-enable in future. JRA.
247
248 /****************************************************************************
249  Work out if we've timed out.
250 ****************************************************************************/
251
252 static BOOL timeout_until(struct timeval *timeout, const struct timeval *endtime)
253 {
254         struct timeval now;
255         SMB_BIG_INT t_dif;
256
257         GetTimeOfDay(&now);
258
259         t_dif = usec_time_diff(endtime, &now);
260         if (t_dif <= 0) {
261                 return False;
262         }
263
264         timeout->tv_sec = (t_dif / (SMB_BIG_INT)1000000);
265         timeout->tv_usec = (t_dif % (SMB_BIG_INT)1000000);
266         return True;
267 }
268
269 /****************************************************************************
270  Read data from the client, reading exactly N bytes, or until endtime timeout.
271  Use with a non-blocking socket if endtime != NULL.
272 ****************************************************************************/
273
274 ssize_t read_data_until(int fd,char *buffer,size_t N, const struct timeval *endtime)
275 {
276         ssize_t ret;
277         size_t total=0;
278
279         smb_read_error = 0;
280
281         while (total < N) {
282
283                 if (endtime != NULL) {
284                         fd_set r_fds;
285                         struct timeval timeout;
286                         int selrtn;
287
288                         if (!timeout_until(&timeout, endtime)) {
289                                 DEBUG(10,("read_data_until: read timed out\n"));
290                                 smb_read_error = READ_TIMEOUT;
291                                 return -1;
292                         }
293
294                         FD_ZERO(&r_fds);
295                         FD_SET(fd, &r_fds);
296
297                         /* Select but ignore EINTR. */
298                         selrtn = sys_select_intr(fd+1, &r_fds, NULL, NULL, &timeout);
299                         if (selrtn == -1) {
300                                 /* something is wrong. Maybe the socket is dead? */
301                                 DEBUG(0,("read_data_until: select error = %s.\n", strerror(errno) ));
302                                 smb_read_error = READ_ERROR;
303                                 return -1;
304                         }
305
306                         /* Did we timeout ? */
307                         if (selrtn == 0) {
308                                 DEBUG(10,("read_data_until: select timed out.\n"));
309                                 smb_read_error = READ_TIMEOUT;
310                                 return -1;
311                         }
312                 }
313
314                 ret = sys_read(fd,buffer + total,N - total);
315
316                 if (ret == 0) {
317                         DEBUG(10,("read_data_until: read of %d returned 0. Error = %s\n", (int)(N - total), strerror(errno) ));
318                         smb_read_error = READ_EOF;
319                         return 0;
320                 }
321
322                 if (ret == -1) {
323                         if (errno == EAGAIN) {
324                                 /* Non-blocking socket with no data available. Try select again. */
325                                 continue;
326                         }
327                         DEBUG(0,("read_data_until: read failure for %d. Error = %s\n", (int)(N - total), strerror(errno) ));
328                         smb_read_error = READ_ERROR;
329                         return -1;
330                 }
331                 total += ret;
332         }
333         return (ssize_t)total;
334 }
335 #endif
336
337 /****************************************************************************
338  Read data from a socket with a timout in msec.
339  mincount = if timeout, minimum to read before returning
340  maxcount = number to be read.
341  time_out = timeout in milliseconds
342 ****************************************************************************/
343
344 ssize_t read_socket_with_timeout(int fd,char *buf,size_t mincnt,size_t maxcnt,unsigned int time_out)
345 {
346         fd_set fds;
347         int selrtn;
348         ssize_t readret;
349         size_t nread = 0;
350         struct timeval timeout;
351         
352         /* just checking .... */
353         if (maxcnt <= 0)
354                 return(0);
355         
356         smb_read_error = 0;
357         
358         /* Blocking read */
359         if (time_out <= 0) {
360                 if (mincnt == 0) mincnt = maxcnt;
361                 
362                 while (nread < mincnt) {
363                         readret = sys_read(fd, buf + nread, maxcnt - nread);
364                         
365                         if (readret == 0) {
366                                 DEBUG(5,("read_socket_with_timeout: blocking read. EOF from client.\n"));
367                                 smb_read_error = READ_EOF;
368                                 return -1;
369                         }
370                         
371                         if (readret == -1) {
372                                 DEBUG(0,("read_socket_with_timeout: read error = %s.\n", strerror(errno) ));
373                                 smb_read_error = READ_ERROR;
374                                 return -1;
375                         }
376                         nread += readret;
377                 }
378                 return((ssize_t)nread);
379         }
380         
381         /* Most difficult - timeout read */
382         /* If this is ever called on a disk file and 
383            mincnt is greater then the filesize then
384            system performance will suffer severely as 
385            select always returns true on disk files */
386         
387         /* Set initial timeout */
388         timeout.tv_sec = (time_t)(time_out / 1000);
389         timeout.tv_usec = (long)(1000 * (time_out % 1000));
390         
391         for (nread=0; nread < mincnt; ) {      
392                 FD_ZERO(&fds);
393                 FD_SET(fd,&fds);
394                 
395                 selrtn = sys_select_intr(fd+1,&fds,NULL,NULL,&timeout);
396                 
397                 /* Check if error */
398                 if (selrtn == -1) {
399                         /* something is wrong. Maybe the socket is dead? */
400                         DEBUG(0,("read_socket_with_timeout: timeout read. select error = %s.\n", strerror(errno) ));
401                         smb_read_error = READ_ERROR;
402                         return -1;
403                 }
404                 
405                 /* Did we timeout ? */
406                 if (selrtn == 0) {
407                         DEBUG(10,("read_socket_with_timeout: timeout read. select timed out.\n"));
408                         smb_read_error = READ_TIMEOUT;
409                         return -1;
410                 }
411                 
412                 readret = sys_read(fd, buf+nread, maxcnt-nread);
413                 
414                 if (readret == 0) {
415                         /* we got EOF on the file descriptor */
416                         DEBUG(5,("read_socket_with_timeout: timeout read. EOF from client.\n"));
417                         smb_read_error = READ_EOF;
418                         return -1;
419                 }
420                 
421                 if (readret == -1) {
422                         /* the descriptor is probably dead */
423                         DEBUG(0,("read_socket_with_timeout: timeout read. read error = %s.\n", strerror(errno) ));
424                         smb_read_error = READ_ERROR;
425                         return -1;
426                 }
427                 
428                 nread += readret;
429         }
430         
431         /* Return the number we got */
432         return (ssize_t)nread;
433 }
434
435 /****************************************************************************
436  Read data from the client, reading exactly N bytes. 
437 ****************************************************************************/
438
439 ssize_t read_data(int fd,char *buffer,size_t N)
440 {
441         ssize_t ret;
442         size_t total=0;  
443  
444         smb_read_error = 0;
445
446         while (total < N) {
447                 ret = sys_read(fd,buffer + total,N - total);
448
449                 if (ret == 0) {
450                         DEBUG(10,("read_data: read of %d returned 0. Error = %s\n", (int)(N - total), strerror(errno) ));
451                         smb_read_error = READ_EOF;
452                         return 0;
453                 }
454
455                 if (ret == -1) {
456                         DEBUG(0,("read_data: read failure for %d. Error = %s\n", (int)(N - total), strerror(errno) ));
457                         smb_read_error = READ_ERROR;
458                         return -1;
459                 }
460                 total += ret;
461         }
462         return (ssize_t)total;
463 }
464
465 /****************************************************************************
466  Read data from a socket, reading exactly N bytes. 
467 ****************************************************************************/
468
469 static ssize_t read_socket_data(int fd,char *buffer,size_t N)
470 {
471         ssize_t ret;
472         size_t total=0;  
473  
474         smb_read_error = 0;
475
476         while (total < N) {
477                 ret = sys_read(fd,buffer + total,N - total);
478
479                 if (ret == 0) {
480                         DEBUG(10,("read_socket_data: recv of %d returned 0. Error = %s\n", (int)(N - total), strerror(errno) ));
481                         smb_read_error = READ_EOF;
482                         return 0;
483                 }
484
485                 if (ret == -1) {
486                         DEBUG(0,("read_socket_data: recv failure for %d. Error = %s\n", (int)(N - total), strerror(errno) ));
487                         smb_read_error = READ_ERROR;
488                         return -1;
489                 }
490                 total += ret;
491         }
492         return (ssize_t)total;
493 }
494
495 /****************************************************************************
496  Write data to a fd.
497 ****************************************************************************/
498
499 ssize_t write_data(int fd, const char *buffer, size_t N)
500 {
501         size_t total=0;
502         ssize_t ret;
503
504         while (total < N) {
505                 ret = sys_write(fd,buffer + total,N - total);
506
507                 if (ret == -1) {
508                         DEBUG(0,("write_data: write failure. Error = %s\n", strerror(errno) ));
509                         return -1;
510                 }
511                 if (ret == 0)
512                         return total;
513
514                 total += ret;
515         }
516         return (ssize_t)total;
517 }
518
519 /****************************************************************************
520  Write data to a socket - use send rather than write.
521 ****************************************************************************/
522
523 static ssize_t write_socket_data(int fd, const char *buffer, size_t N)
524 {
525         size_t total=0;
526         ssize_t ret;
527
528         while (total < N) {
529                 ret = sys_send(fd,buffer + total,N - total,0);
530
531                 if (ret == -1) {
532                         DEBUG(0,("write_socket_data: write failure. Error = %s\n", strerror(errno) ));
533                         return -1;
534                 }
535                 if (ret == 0)
536                         return total;
537
538                 total += ret;
539         }
540         return (ssize_t)total;
541 }
542
543 /****************************************************************************
544  Write to a socket.
545 ****************************************************************************/
546
547 ssize_t write_socket(int fd, const char *buf, size_t len)
548 {
549         ssize_t ret=0;
550
551         DEBUG(6,("write_socket(%d,%d)\n",fd,(int)len));
552         ret = write_socket_data(fd,buf,len);
553       
554         DEBUG(6,("write_socket(%d,%d) wrote %d\n",fd,(int)len,(int)ret));
555         if(ret <= 0)
556                 DEBUG(0,("write_socket: Error writing %d bytes to socket %d: ERRNO = %s\n", 
557                         (int)len, fd, strerror(errno) ));
558
559         return(ret);
560 }
561
562 /****************************************************************************
563  Send a keepalive packet (rfc1002).
564 ****************************************************************************/
565
566 BOOL send_keepalive(int client)
567 {
568         unsigned char buf[4];
569
570         buf[0] = SMBkeepalive;
571         buf[1] = buf[2] = buf[3] = 0;
572
573         return(write_socket_data(client,(char *)buf,4) == 4);
574 }
575
576
577 /****************************************************************************
578  Read 4 bytes of a smb packet and return the smb length of the packet.
579  Store the result in the buffer.
580  This version of the function will return a length of zero on receiving
581  a keepalive packet.
582  Timeout is in milliseconds.
583 ****************************************************************************/
584
585 static ssize_t read_smb_length_return_keepalive(int fd, char *inbuf, unsigned int timeout)
586 {
587         ssize_t len=0;
588         int msg_type;
589         BOOL ok = False;
590
591         while (!ok) {
592                 if (timeout > 0)
593                         ok = (read_socket_with_timeout(fd,inbuf,4,4,timeout) == 4);
594                 else 
595                         ok = (read_socket_data(fd,inbuf,4) == 4);
596
597                 if (!ok)
598                         return(-1);
599
600                 len = smb_len(inbuf);
601                 msg_type = CVAL(inbuf,0);
602
603                 if (msg_type == SMBkeepalive) 
604                         DEBUG(5,("Got keepalive packet\n"));
605         }
606
607         DEBUG(10,("got smb length of %lu\n",(unsigned long)len));
608
609         return(len);
610 }
611
612 /****************************************************************************
613  Read 4 bytes of a smb packet and return the smb length of the packet.
614  Store the result in the buffer. This version of the function will
615  never return a session keepalive (length of zero).
616  Timeout is in milliseconds.
617 ****************************************************************************/
618
619 ssize_t read_smb_length(int fd, char *inbuf, unsigned int timeout)
620 {
621         ssize_t len;
622
623         for(;;) {
624                 len = read_smb_length_return_keepalive(fd, inbuf, timeout);
625
626                 if(len < 0)
627                         return len;
628
629                 /* Ignore session keepalives. */
630                 if(CVAL(inbuf,0) != SMBkeepalive)
631                         break;
632         }
633
634         DEBUG(10,("read_smb_length: got smb length of %lu\n",
635                   (unsigned long)len));
636
637         return len;
638 }
639
640 /****************************************************************************
641  Read an smb from a fd. Note that the buffer *MUST* be of size
642  BUFFER_SIZE+SAFETY_MARGIN.
643  The timeout is in milliseconds. 
644  This function will return on receipt of a session keepalive packet.
645  Doesn't check the MAC on signed packets.
646 ****************************************************************************/
647
648 BOOL receive_smb_raw(int fd, char *buffer, unsigned int timeout)
649 {
650         ssize_t len,ret;
651
652         smb_read_error = 0;
653
654         memset(buffer,'\0',smb_size + 100);
655
656         len = read_smb_length_return_keepalive(fd,buffer,timeout);
657         if (len < 0) {
658                 DEBUG(10,("receive_smb_raw: length < 0!\n"));
659
660                 /*
661                  * Correct fix. smb_read_error may have already been
662                  * set. Only set it here if not already set. Global
663                  * variables still suck :-). JRA.
664                  */
665
666                 if (smb_read_error == 0)
667                         smb_read_error = READ_ERROR;
668                 return False;
669         }
670
671         /*
672          * A WRITEX with CAP_LARGE_WRITEX can be 64k worth of data plus 65 bytes
673          * of header. Don't print the error if this fits.... JRA.
674          */
675
676         if (len > (BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE)) {
677                 DEBUG(0,("Invalid packet length! (%lu bytes).\n",(unsigned long)len));
678                 if (len > BUFFER_SIZE + (SAFETY_MARGIN/2)) {
679
680                         /*
681                          * Correct fix. smb_read_error may have already been
682                          * set. Only set it here if not already set. Global
683                          * variables still suck :-). JRA.
684                          */
685
686                         if (smb_read_error == 0)
687                                 smb_read_error = READ_ERROR;
688                         return False;
689                 }
690         }
691
692         if(len > 0) {
693                 if (timeout > 0) {
694                         ret = read_socket_with_timeout(fd,buffer+4,len,len,timeout);
695                 } else {
696                         ret = read_socket_data(fd,buffer+4,len);
697                 }
698
699                 if (ret != len) {
700                         if (smb_read_error == 0)
701                                 smb_read_error = READ_ERROR;
702                         return False;
703                 }
704                 
705                 /* not all of samba3 properly checks for packet-termination of strings. This
706                    ensures that we don't run off into empty space. */
707                 SSVAL(buffer+4,len, 0);
708         }
709
710         return True;
711 }
712
713 /****************************************************************************
714  Wrapper for receive_smb_raw().
715  Checks the MAC on signed packets.
716 ****************************************************************************/
717
718 BOOL receive_smb(int fd, char *buffer, unsigned int timeout)
719 {
720         if (!receive_smb_raw(fd, buffer, timeout)) {
721                 return False;
722         }
723
724         /* Check the incoming SMB signature. */
725         if (!srv_check_sign_mac(buffer, True)) {
726                 DEBUG(0, ("receive_smb: SMB Signature verification failed on incoming packet!\n"));
727                 if (smb_read_error == 0)
728                         smb_read_error = READ_BAD_SIG;
729                 return False;
730         };
731
732         return(True);
733 }
734
735 /****************************************************************************
736  Send an smb to a fd.
737 ****************************************************************************/
738
739 BOOL send_smb(int fd, char *buffer)
740 {
741         size_t len;
742         size_t nwritten=0;
743         ssize_t ret;
744
745         /* Sign the outgoing packet if required. */
746         srv_calculate_sign_mac(buffer);
747
748         len = smb_len(buffer) + 4;
749
750         while (nwritten < len) {
751                 ret = write_socket(fd,buffer+nwritten,len - nwritten);
752                 if (ret <= 0) {
753                         DEBUG(0,("Error writing %d bytes to client. %d. (%s)\n",
754                                 (int)len,(int)ret, strerror(errno) ));
755                         return False;
756                 }
757                 nwritten += ret;
758         }
759
760         return True;
761 }
762
763 /****************************************************************************
764  Open a socket of the specified type, port, and address for incoming data.
765 ****************************************************************************/
766
767 int open_socket_in( int type, int port, int dlevel, uint32 socket_addr, BOOL rebind )
768 {
769         struct sockaddr_in sock;
770         int res;
771
772         memset( (char *)&sock, '\0', sizeof(sock) );
773
774 #ifdef HAVE_SOCK_SIN_LEN
775         sock.sin_len         = sizeof(sock);
776 #endif
777         sock.sin_port        = htons( port );
778         sock.sin_family      = AF_INET;
779         sock.sin_addr.s_addr = socket_addr;
780
781         res = socket( AF_INET, type, 0 );
782         if( res == -1 ) {
783                 if( DEBUGLVL(0) ) {
784                         dbgtext( "open_socket_in(): socket() call failed: " );
785                         dbgtext( "%s\n", strerror( errno ) );
786                 }
787                 return -1;
788         }
789
790         /* This block sets/clears the SO_REUSEADDR and possibly SO_REUSEPORT. */
791         {
792                 int val = rebind ? 1 : 0;
793                 if( setsockopt(res,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val)) == -1 ) {
794                         if( DEBUGLVL( dlevel ) ) {
795                                 dbgtext( "open_socket_in(): setsockopt: " );
796                                 dbgtext( "SO_REUSEADDR = %s ", val?"True":"False" );
797                                 dbgtext( "on port %d failed ", port );
798                                 dbgtext( "with error = %s\n", strerror(errno) );
799                         }
800                 }
801 #ifdef SO_REUSEPORT
802                 if( setsockopt(res,SOL_SOCKET,SO_REUSEPORT,(char *)&val,sizeof(val)) == -1 ) {
803                         if( DEBUGLVL( dlevel ) ) {
804                                 dbgtext( "open_socket_in(): setsockopt: ");
805                                 dbgtext( "SO_REUSEPORT = %s ", val?"True":"False" );
806                                 dbgtext( "on port %d failed ", port );
807                                 dbgtext( "with error = %s\n", strerror(errno) );
808                         }
809                 }
810 #endif /* SO_REUSEPORT */
811         }
812
813         /* now we've got a socket - we need to bind it */
814         if( bind( res, (struct sockaddr *)&sock, sizeof(sock) ) == -1 ) {
815                 if( DEBUGLVL(dlevel) && (port == SMB_PORT1 || port == SMB_PORT2 || port == NMB_PORT) ) {
816                         dbgtext( "bind failed on port %d ", port );
817                         dbgtext( "socket_addr = %s.\n", inet_ntoa( sock.sin_addr ) );
818                         dbgtext( "Error = %s\n", strerror(errno) );
819                 }
820                 close( res ); 
821                 return( -1 ); 
822         }
823
824         DEBUG( 10, ( "bind succeeded on port %d\n", port ) );
825
826         return( res );
827  }
828
829 /****************************************************************************
830  Create an outgoing socket. timeout is in milliseconds.
831 **************************************************************************/
832
833 int open_socket_out(int type, struct in_addr *addr, int port ,int timeout)
834 {
835         struct sockaddr_in sock_out;
836         int res,ret;
837         int connect_loop = 10;
838         int increment = 10;
839
840         /* create a socket to write to */
841         res = socket(PF_INET, type, 0);
842         if (res == -1) {
843                 DEBUG(0,("socket error (%s)\n", strerror(errno)));
844                 return -1;
845         }
846
847         if (type != SOCK_STREAM)
848                 return(res);
849   
850         memset((char *)&sock_out,'\0',sizeof(sock_out));
851         putip((char *)&sock_out.sin_addr,(char *)addr);
852   
853         sock_out.sin_port = htons( port );
854         sock_out.sin_family = PF_INET;
855
856         /* set it non-blocking */
857         set_blocking(res,False);
858
859         DEBUG(3,("Connecting to %s at port %d\n",inet_ntoa(*addr),port));
860   
861         /* and connect it to the destination */
862   connect_again:
863
864         ret = connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out));
865
866         /* Some systems return EAGAIN when they mean EINPROGRESS */
867         if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
868                         errno == EAGAIN) && (connect_loop < timeout) ) {
869                 smb_msleep(connect_loop);
870                 timeout -= connect_loop;
871                 connect_loop += increment;
872                 if (increment < 250) {
873                         /* After 8 rounds we end up at a max of 255 msec */
874                         increment *= 1.5;
875                 }
876                 goto connect_again;
877         }
878
879         if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
880                         errno == EAGAIN)) {
881                 DEBUG(1,("timeout connecting to %s:%d\n",inet_ntoa(*addr),port));
882                 close(res);
883                 return -1;
884         }
885
886 #ifdef EISCONN
887
888         if (ret < 0 && errno == EISCONN) {
889                 errno = 0;
890                 ret = 0;
891         }
892 #endif
893
894         if (ret < 0) {
895                 DEBUG(2,("error connecting to %s:%d (%s)\n",
896                                 inet_ntoa(*addr),port,strerror(errno)));
897                 close(res);
898                 return -1;
899         }
900
901         /* set it blocking again */
902         set_blocking(res,True);
903
904         return res;
905 }
906
907 /****************************************************************************
908  Create an outgoing TCP socket to any of the addrs. This is for
909  simultaneous connects to port 445 and 139 of a host or even a variety
910  of DC's all of which are equivalent for our purposes.
911 **************************************************************************/
912
913 BOOL open_any_socket_out(struct sockaddr_in *addrs, int num_addrs,
914                          int timeout, int *fd_index, int *fd)
915 {
916         int i, resulting_index, res;
917         int *sockets;
918         BOOL good_connect;
919
920         fd_set r_fds, wr_fds;
921         struct timeval tv;
922         int maxfd;
923
924         int connect_loop = 10000; /* 10 milliseconds */
925
926         timeout *= 1000;        /* convert to microseconds */
927
928         sockets = SMB_MALLOC_ARRAY(int, num_addrs);
929
930         if (sockets == NULL)
931                 return False;
932
933         resulting_index = -1;
934
935         for (i=0; i<num_addrs; i++)
936                 sockets[i] = -1;
937
938         for (i=0; i<num_addrs; i++) {
939                 sockets[i] = socket(PF_INET, SOCK_STREAM, 0);
940                 if (sockets[i] < 0)
941                         goto done;
942                 set_blocking(sockets[i], False);
943         }
944
945  connect_again:
946         good_connect = False;
947
948         for (i=0; i<num_addrs; i++) {
949
950                 if (sockets[i] == -1)
951                         continue;
952
953                 if (connect(sockets[i], (struct sockaddr *)&(addrs[i]),
954                             sizeof(*addrs)) == 0) {
955                         /* Rather unlikely as we are non-blocking, but it
956                          * might actually happen. */
957                         resulting_index = i;
958                         goto done;
959                 }
960
961                 if (errno == EINPROGRESS || errno == EALREADY ||
962                     errno == EAGAIN) {
963                         /* These are the error messages that something is
964                            progressing. */
965                         good_connect = True;
966                 } else if (errno != 0) {
967                         /* There was a direct error */
968                         close(sockets[i]);
969                         sockets[i] = -1;
970                 }
971         }
972
973         if (!good_connect) {
974                 /* All of the connect's resulted in real error conditions */
975                 goto done;
976         }
977
978         /* Lets see if any of the connect attempts succeeded */
979
980         maxfd = 0;
981         FD_ZERO(&wr_fds);
982         FD_ZERO(&r_fds);
983
984         for (i=0; i<num_addrs; i++) {
985                 if (sockets[i] == -1)
986                         continue;
987                 FD_SET(sockets[i], &wr_fds);
988                 FD_SET(sockets[i], &r_fds);
989                 if (sockets[i]>maxfd)
990                         maxfd = sockets[i];
991         }
992
993         tv.tv_sec = 0;
994         tv.tv_usec = connect_loop;
995
996         res = sys_select(maxfd+1, &r_fds, &wr_fds, NULL, &tv);
997
998         if (res < 0)
999                 goto done;
1000
1001         if (res == 0)
1002                 goto next_round;
1003
1004         for (i=0; i<num_addrs; i++) {
1005
1006                 if (sockets[i] == -1)
1007                         continue;
1008
1009                 /* Stevens, Network Programming says that if there's a
1010                  * successful connect, the socket is only writable. Upon an
1011                  * error, it's both readable and writable. */
1012
1013                 if (FD_ISSET(sockets[i], &r_fds) &&
1014                     FD_ISSET(sockets[i], &wr_fds)) {
1015                         /* readable and writable, so it's an error */
1016                         close(sockets[i]);
1017                         sockets[i] = -1;
1018                         continue;
1019                 }
1020
1021                 if (!FD_ISSET(sockets[i], &r_fds) &&
1022                     FD_ISSET(sockets[i], &wr_fds)) {
1023                         /* Only writable, so it's connected */
1024                         resulting_index = i;
1025                         goto done;
1026                 }
1027         }
1028
1029  next_round:
1030
1031         timeout -= connect_loop;
1032         if (timeout <= 0)
1033                 goto done;
1034         connect_loop *= 1.5;
1035         if (connect_loop > timeout)
1036                 connect_loop = timeout;
1037         goto connect_again;
1038
1039  done:
1040         for (i=0; i<num_addrs; i++) {
1041                 if (i == resulting_index)
1042                         continue;
1043                 if (sockets[i] >= 0)
1044                         close(sockets[i]);
1045         }
1046
1047         if (resulting_index >= 0) {
1048                 *fd_index = resulting_index;
1049                 *fd = sockets[*fd_index];
1050                 set_blocking(*fd, True);
1051         }
1052
1053         free(sockets);
1054
1055         return (resulting_index >= 0);
1056 }
1057 /****************************************************************************
1058  Open a connected UDP socket to host on port
1059 **************************************************************************/
1060
1061 int open_udp_socket(const char *host, int port)
1062 {
1063         int type = SOCK_DGRAM;
1064         struct sockaddr_in sock_out;
1065         int res;
1066         struct in_addr *addr;
1067
1068         addr = interpret_addr2(host);
1069
1070         res = socket(PF_INET, type, 0);
1071         if (res == -1) {
1072                 return -1;
1073         }
1074
1075         memset((char *)&sock_out,'\0',sizeof(sock_out));
1076         putip((char *)&sock_out.sin_addr,(char *)addr);
1077         sock_out.sin_port = htons(port);
1078         sock_out.sin_family = PF_INET;
1079
1080         if (connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out))) {
1081                 close(res);
1082                 return -1;
1083         }
1084
1085         return res;
1086 }
1087
1088
1089 /* the following 3 client_*() functions are nasty ways of allowing
1090    some generic functions to get info that really should be hidden in
1091    particular modules */
1092 static int client_fd = -1;
1093
1094 void client_setfd(int fd)
1095 {
1096         client_fd = fd;
1097 }
1098
1099 char *client_name(void)
1100 {
1101         return get_peer_name(client_fd,False);
1102 }
1103
1104 char *client_addr(void)
1105 {
1106         return get_peer_addr(client_fd);
1107 }
1108
1109 char *client_socket_addr(void)
1110 {
1111         return get_socket_addr(client_fd);
1112 }
1113
1114 int client_socket_port(void)
1115 {
1116         return get_socket_port(client_fd);
1117 }
1118
1119 struct in_addr *client_inaddr(struct sockaddr *sa)
1120 {
1121         struct sockaddr_in *sockin = (struct sockaddr_in *) (sa);
1122         socklen_t  length = sizeof(*sa);
1123         
1124         if (getpeername(client_fd, sa, &length) < 0) {
1125                 DEBUG(0,("getpeername failed. Error was %s\n", strerror(errno) ));
1126                 return NULL;
1127         }
1128         
1129         return &sockin->sin_addr;
1130 }
1131
1132 /*******************************************************************
1133  Matchname - determine if host name matches IP address. Used to
1134  confirm a hostname lookup to prevent spoof attacks.
1135 ******************************************************************/
1136
1137 static BOOL matchname(char *remotehost,struct in_addr  addr)
1138 {
1139         struct hostent *hp;
1140         int     i;
1141         
1142         if ((hp = sys_gethostbyname(remotehost)) == 0) {
1143                 DEBUG(0,("sys_gethostbyname(%s): lookup failure.\n", remotehost));
1144                 return False;
1145         } 
1146
1147         /*
1148          * Make sure that gethostbyname() returns the "correct" host name.
1149          * Unfortunately, gethostbyname("localhost") sometimes yields
1150          * "localhost.domain". Since the latter host name comes from the
1151          * local DNS, we just have to trust it (all bets are off if the local
1152          * DNS is perverted). We always check the address list, though.
1153          */
1154         
1155         if (!strequal(remotehost, hp->h_name)
1156             && !strequal(remotehost, "localhost")) {
1157                 DEBUG(0,("host name/name mismatch: %s != %s\n",
1158                          remotehost, hp->h_name));
1159                 return False;
1160         }
1161         
1162         /* Look up the host address in the address list we just got. */
1163         for (i = 0; hp->h_addr_list[i]; i++) {
1164                 if (memcmp(hp->h_addr_list[i], (char *) & addr, sizeof(addr)) == 0)
1165                         return True;
1166         }
1167         
1168         /*
1169          * The host name does not map to the original host address. Perhaps
1170          * someone has compromised a name server. More likely someone botched
1171          * it, but that could be dangerous, too.
1172          */
1173         
1174         DEBUG(0,("host name/address mismatch: %s != %s\n",
1175                  inet_ntoa(addr), hp->h_name));
1176         return False;
1177 }
1178
1179 /*******************************************************************
1180  Return the DNS name of the remote end of a socket.
1181 ******************************************************************/
1182
1183 char *get_peer_name(int fd, BOOL force_lookup)
1184 {
1185         static pstring name_buf;
1186         pstring tmp_name;
1187         static fstring addr_buf;
1188         struct hostent *hp;
1189         struct in_addr addr;
1190         char *p;
1191
1192         /* reverse lookups can be *very* expensive, and in many
1193            situations won't work because many networks don't link dhcp
1194            with dns. To avoid the delay we avoid the lookup if
1195            possible */
1196         if (!lp_hostname_lookups() && (force_lookup == False)) {
1197                 return get_peer_addr(fd);
1198         }
1199         
1200         p = get_peer_addr(fd);
1201
1202         /* it might be the same as the last one - save some DNS work */
1203         if (strcmp(p, addr_buf) == 0) 
1204                 return name_buf;
1205
1206         pstrcpy(name_buf,"UNKNOWN");
1207         if (fd == -1) 
1208                 return name_buf;
1209
1210         fstrcpy(addr_buf, p);
1211
1212         addr = *interpret_addr2(p);
1213         
1214         /* Look up the remote host name. */
1215         if ((hp = gethostbyaddr((char *)&addr.s_addr, sizeof(addr.s_addr), AF_INET)) == 0) {
1216                 DEBUG(1,("Gethostbyaddr failed for %s\n",p));
1217                 pstrcpy(name_buf, p);
1218         } else {
1219                 pstrcpy(name_buf,(char *)hp->h_name);
1220                 if (!matchname(name_buf, addr)) {
1221                         DEBUG(0,("Matchname failed on %s %s\n",name_buf,p));
1222                         pstrcpy(name_buf,"UNKNOWN");
1223                 }
1224         }
1225
1226         /* can't pass the same source and dest strings in when you 
1227            use --enable-developer or the clobber_region() call will 
1228            get you */
1229         
1230         pstrcpy( tmp_name, name_buf );
1231         alpha_strcpy(name_buf, tmp_name, "_-.", sizeof(name_buf));
1232         if (strstr(name_buf,"..")) {
1233                 pstrcpy(name_buf, "UNKNOWN");
1234         }
1235
1236         return name_buf;
1237 }
1238
1239 /*******************************************************************
1240  Return the IP addr of the remote end of a socket as a string.
1241  ******************************************************************/
1242
1243 char *get_peer_addr(int fd)
1244 {
1245         struct sockaddr sa;
1246         struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
1247         socklen_t length = sizeof(sa);
1248         static fstring addr_buf;
1249
1250         fstrcpy(addr_buf,"0.0.0.0");
1251
1252         if (fd == -1) {
1253                 return addr_buf;
1254         }
1255         
1256         if (getpeername(fd, &sa, &length) < 0) {
1257                 DEBUG(0,("getpeername failed. Error was %s\n", strerror(errno) ));
1258                 return addr_buf;
1259         }
1260         
1261         fstrcpy(addr_buf,(char *)inet_ntoa(sockin->sin_addr));
1262         
1263         return addr_buf;
1264 }
1265
1266 /*******************************************************************
1267  Create protected unix domain socket.
1268
1269  Some unixes cannot set permissions on a ux-dom-sock, so we
1270  have to make sure that the directory contains the protection
1271  permissions instead.
1272  ******************************************************************/
1273
1274 int create_pipe_sock(const char *socket_dir,
1275                      const char *socket_name,
1276                      mode_t dir_perms)
1277 {
1278 #ifdef HAVE_UNIXSOCKET
1279         struct sockaddr_un sunaddr;
1280         struct stat st;
1281         int sock;
1282         mode_t old_umask;
1283         pstring path;
1284         
1285         old_umask = umask(0);
1286         
1287         /* Create the socket directory or reuse the existing one */
1288         
1289         if (lstat(socket_dir, &st) == -1) {
1290                 if (errno == ENOENT) {
1291                         /* Create directory */
1292                         if (mkdir(socket_dir, dir_perms) == -1) {
1293                                 DEBUG(0, ("error creating socket directory "
1294                                         "%s: %s\n", socket_dir, 
1295                                         strerror(errno)));
1296                                 goto out_umask;
1297                         }
1298                 } else {
1299                         DEBUG(0, ("lstat failed on socket directory %s: %s\n",
1300                                 socket_dir, strerror(errno)));
1301                         goto out_umask;
1302                 }
1303         } else {
1304                 /* Check ownership and permission on existing directory */
1305                 if (!S_ISDIR(st.st_mode)) {
1306                         DEBUG(0, ("socket directory %s isn't a directory\n",
1307                                 socket_dir));
1308                         goto out_umask;
1309                 }
1310                 if ((st.st_uid != sec_initial_uid()) || 
1311                                 ((st.st_mode & 0777) != dir_perms)) {
1312                         DEBUG(0, ("invalid permissions on socket directory "
1313                                 "%s\n", socket_dir));
1314                         goto out_umask;
1315                 }
1316         }
1317         
1318         /* Create the socket file */
1319         
1320         sock = socket(AF_UNIX, SOCK_STREAM, 0);
1321         
1322         if (sock == -1) {
1323                 perror("socket");
1324                 goto out_umask;
1325         }
1326         
1327         pstr_sprintf(path, "%s/%s", socket_dir, socket_name);
1328         
1329         unlink(path);
1330         memset(&sunaddr, 0, sizeof(sunaddr));
1331         sunaddr.sun_family = AF_UNIX;
1332         safe_strcpy(sunaddr.sun_path, path, sizeof(sunaddr.sun_path)-1);
1333         
1334         if (bind(sock, (struct sockaddr *)&sunaddr, sizeof(sunaddr)) == -1) {
1335                 DEBUG(0, ("bind failed on pipe socket %s: %s\n", path,
1336                         strerror(errno)));
1337                 goto out_close;
1338         }
1339         
1340         if (listen(sock, 5) == -1) {
1341                 DEBUG(0, ("listen failed on pipe socket %s: %s\n", path,
1342                         strerror(errno)));
1343                 goto out_close;
1344         }
1345         
1346         umask(old_umask);
1347         return sock;
1348
1349 out_close:
1350         close(sock);
1351
1352 out_umask:
1353         umask(old_umask);
1354         return -1;
1355
1356 #else
1357         DEBUG(0, ("create_pipe_sock: No Unix sockets on this system\n"));
1358         return -1;
1359 #endif /* HAVE_UNIXSOCKET */
1360 }