r8671: use much shorter names for the selftest directory and socket wrapper
[bbaumbach/samba-autobuild/.git] / source4 / 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 #include "system/network.h"
24 #include "pstring.h"
25
26
27 enum SOCK_OPT_TYPES {OPT_BOOL,OPT_INT,OPT_ON};
28
29 typedef struct smb_socket_option {
30         const char *name;
31         int level;
32         int option;
33         int value;
34         int opttype;
35 } smb_socket_option;
36
37 static const smb_socket_option socket_options[] = {
38   {"SO_KEEPALIVE",      SOL_SOCKET,    SO_KEEPALIVE,    0,                 OPT_BOOL},
39   {"SO_REUSEADDR",      SOL_SOCKET,    SO_REUSEADDR,    0,                 OPT_BOOL},
40   {"SO_BROADCAST",      SOL_SOCKET,    SO_BROADCAST,    0,                 OPT_BOOL},
41 #ifdef TCP_NODELAY
42   {"TCP_NODELAY",       IPPROTO_TCP,   TCP_NODELAY,     0,                 OPT_BOOL},
43 #endif
44 #ifdef IPTOS_LOWDELAY
45   {"IPTOS_LOWDELAY",    IPPROTO_IP,    IP_TOS,          IPTOS_LOWDELAY,    OPT_ON},
46 #endif
47 #ifdef IPTOS_THROUGHPUT
48   {"IPTOS_THROUGHPUT",  IPPROTO_IP,    IP_TOS,          IPTOS_THROUGHPUT,  OPT_ON},
49 #endif
50 #ifdef SO_REUSEPORT
51   {"SO_REUSEPORT",      SOL_SOCKET,    SO_REUSEPORT,    0,                 OPT_BOOL},
52 #endif
53 #ifdef SO_SNDBUF
54   {"SO_SNDBUF",         SOL_SOCKET,    SO_SNDBUF,       0,                 OPT_INT},
55 #endif
56 #ifdef SO_RCVBUF
57   {"SO_RCVBUF",         SOL_SOCKET,    SO_RCVBUF,       0,                 OPT_INT},
58 #endif
59 #ifdef SO_SNDLOWAT
60   {"SO_SNDLOWAT",       SOL_SOCKET,    SO_SNDLOWAT,     0,                 OPT_INT},
61 #endif
62 #ifdef SO_RCVLOWAT
63   {"SO_RCVLOWAT",       SOL_SOCKET,    SO_RCVLOWAT,     0,                 OPT_INT},
64 #endif
65 #ifdef SO_SNDTIMEO
66   {"SO_SNDTIMEO",       SOL_SOCKET,    SO_SNDTIMEO,     0,                 OPT_INT},
67 #endif
68 #ifdef SO_RCVTIMEO
69   {"SO_RCVTIMEO",       SOL_SOCKET,    SO_RCVTIMEO,     0,                 OPT_INT},
70 #endif
71   {NULL,0,0,0,0}};
72
73
74 /****************************************************************************
75  Set user socket options.
76 ****************************************************************************/
77 void set_socket_options(int fd, const char *options)
78 {
79         fstring tok;
80
81         while (next_token(&options,tok," \t,", sizeof(tok))) {
82                 int ret=0,i;
83                 int value = 1;
84                 char *p;
85                 BOOL got_value = False;
86
87                 if ((p = strchr_m(tok,'='))) {
88                         *p = 0;
89                         value = atoi(p+1);
90                         got_value = True;
91                 }
92
93                 for (i=0;socket_options[i].name;i++)
94                         if (strequal(socket_options[i].name,tok))
95                                 break;
96
97                 if (!socket_options[i].name) {
98                         DEBUG(0,("Unknown socket option %s\n",tok));
99                         continue;
100                 }
101
102                 switch (socket_options[i].opttype) {
103                 case OPT_BOOL:
104                 case OPT_INT:
105                         ret = setsockopt(fd,socket_options[i].level,
106                                                 socket_options[i].option,(char *)&value,sizeof(int));
107                         break;
108
109                 case OPT_ON:
110                         if (got_value)
111                                 DEBUG(0,("syntax error - %s does not take a value\n",tok));
112
113                         {
114                                 int on = socket_options[i].value;
115                                 ret = setsockopt(fd,socket_options[i].level,
116                                                         socket_options[i].option,(char *)&on,sizeof(int));
117                         }
118                         break;    
119                 }
120       
121                 if (ret != 0)
122                         DEBUG(0,("Failed to set socket option %s (Error %s)\n",tok, strerror(errno) ));
123         }
124 }
125