cli_setup_creds new arguments added.
[samba.git] / source3 / smbd / conn.c
1 /* 
2    Unix SMB/Netbios implementation.
3    Version 1.9.
4    Manage connections_struct structures
5    Copyright (C) Andrew Tridgell 1998
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 extern int DEBUGLEVEL;
25
26 /* set these to define the limits of the server. NOTE These are on a
27    per-client basis. Thus any one machine can't connect to more than
28    MAX_CONNECTIONS services, but any number of machines may connect at
29    one time. */
30 #define MAX_CONNECTIONS 128
31
32 static connection_struct *Connections;
33
34 /* number of open connections */
35 static struct bitmap *bmap;
36 static int num_open;
37
38 /****************************************************************************
39 init the conn structures
40 ****************************************************************************/
41 void conn_init(void)
42 {
43         bmap = bitmap_allocate(MAX_CONNECTIONS);
44 }
45
46 /****************************************************************************
47 return the number of open connections
48 ****************************************************************************/
49 int conn_num_open(void)
50 {
51         return num_open;
52 }
53
54
55 /****************************************************************************
56 check if a snum is in use
57 ****************************************************************************/
58 BOOL conn_snum_used(int snum)
59 {
60         connection_struct *conn;
61         for (conn=Connections;conn;conn=conn->next) {
62                 if (conn->service == snum) {
63                         return(True);
64                 }
65         }
66         return(False);
67 }
68
69
70 /****************************************************************************
71 find a conn given a cnum
72 ****************************************************************************/
73 connection_struct *conn_find(int cnum)
74 {
75         int count=0;
76         connection_struct *conn;
77
78         for (conn=Connections;conn;conn=conn->next,count++) {
79                 if (conn->cnum == cnum) {
80                         if (count > 10) {
81                                 DLIST_PROMOTE(Connections, conn);
82                         }
83                         return conn;
84                 }
85         }
86
87         return NULL;
88 }
89
90
91 /****************************************************************************
92   find first available connection slot, starting from a random position.
93 The randomisation stops problems with the server dieing and clients
94 thinking the server is still available.
95 ****************************************************************************/
96 connection_struct *conn_new(void)
97 {
98         connection_struct *conn;
99         int i;
100
101         i = bitmap_find(bmap, 1);
102         
103         if (i == -1) {
104                 DEBUG(1,("ERROR! Out of connection structures\n"));            
105                 return NULL;
106         }
107
108         conn = (connection_struct *)malloc(sizeof(*conn));
109         if (!conn) return NULL;
110
111         ZERO_STRUCTP(conn);
112         conn->cnum = i;
113
114         bitmap_set(bmap, i);
115
116         num_open++;
117
118         string_init(&conn->user,"");
119         string_init(&conn->dirpath,"");
120         string_init(&conn->connectpath,"");
121         string_init(&conn->origpath,"");
122         
123         DLIST_ADD(Connections, conn);
124
125         return conn;
126 }
127
128 /****************************************************************************
129 close all conn structures
130 ****************************************************************************/
131 void conn_close_all(void)
132 {
133         connection_struct *conn, *next;
134         for (conn=Connections;conn;conn=next) {
135                 next=conn->next;
136                 close_cnum(conn, (uint16)-1);
137         }
138 }
139
140 /****************************************************************************
141 idle inactive connections
142 ****************************************************************************/
143 BOOL conn_idle_all(time_t t, int deadtime)
144 {
145         BOOL allidle = True;
146         connection_struct *conn, *next;
147
148         for (conn=Connections;conn;conn=next) {
149                 next=conn->next;
150                 /* close dirptrs on connections that are idle */
151                 if ((t-conn->lastused) > DPTR_IDLE_TIMEOUT)
152                         dptr_idlecnum(conn);
153
154                 if (conn->num_files_open > 0 || 
155                     (t-conn->lastused)<deadtime)
156                         allidle = False;
157         }
158
159         return allidle;
160 }
161
162 /****************************************************************************
163 free a conn structure
164 ****************************************************************************/
165 void conn_free(connection_struct *conn)
166 {
167         DLIST_REMOVE(Connections, conn);
168
169         if (conn->ngroups && conn->groups) {
170                 free(conn->groups);
171                 conn->groups = NULL;
172                 conn->ngroups = 0;
173         }
174
175         free_namearray(conn->veto_list);
176         free_namearray(conn->hide_list);
177         free_namearray(conn->veto_oplock_list);
178         
179         string_free(&conn->user);
180         string_free(&conn->dirpath);
181         string_free(&conn->connectpath);
182         string_free(&conn->origpath);
183
184         bitmap_clear(bmap, conn->cnum);
185         num_open--;
186
187         ZERO_STRUCTP(conn);
188         free(conn);
189 }