summaryrefslogtreecommitdiffstats
path: root/source/smbd/conn.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>1998-08-17 06:13:32 +0000
committerAndrew Tridgell <tridge@samba.org>1998-08-17 06:13:32 +0000
commitb7aaab1b6b2d2f72b2bb7c11f5c7bf081a6093d9 (patch)
treedfce95029fac84ce23c04419bc5a5204bf9cb7b5 /source/smbd/conn.c
parent27da84b90df1f32e0d07acad04c72065b2005470 (diff)
downloadsamba-b7aaab1b6b2d2f72b2bb7c11f5c7bf081a6093d9.tar.gz
samba-b7aaab1b6b2d2f72b2bb7c11f5c7bf081a6093d9.tar.xz
samba-b7aaab1b6b2d2f72b2bb7c11f5c7bf081a6093d9.zip
moved connection_struct handling code into smbd/conn.c and changed it
to a linked list with bitmap format.
Diffstat (limited to 'source/smbd/conn.c')
-rw-r--r--source/smbd/conn.c196
1 files changed, 196 insertions, 0 deletions
diff --git a/source/smbd/conn.c b/source/smbd/conn.c
new file mode 100644
index 00000000000..b110e8d0828
--- /dev/null
+++ b/source/smbd/conn.c
@@ -0,0 +1,196 @@
+/*
+ Unix SMB/Netbios implementation.
+ Version 1.9.
+ Manage connections_struct structures
+ Copyright (C) Andrew Tridgell 1998
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+
+extern int DEBUGLEVEL;
+
+/* set these to define the limits of the server. NOTE These are on a
+ per-client basis. Thus any one machine can't connect to more than
+ MAX_CONNECTIONS services, but any number of machines may connect at
+ one time. */
+#define MAX_CONNECTIONS 128
+
+static connection_struct *Connections;
+
+/* number of open connections */
+static struct bitmap *bmap;
+static int num_open;
+
+/****************************************************************************
+init the conn structures
+****************************************************************************/
+void conn_init(void)
+{
+ bmap = bitmap_allocate(MAX_CONNECTIONS);
+}
+
+/****************************************************************************
+return the number of open connections
+****************************************************************************/
+int conn_num_open(void)
+{
+ return num_open;
+}
+
+
+/****************************************************************************
+check if a snum is in use
+****************************************************************************/
+BOOL conn_snum_used(int snum)
+{
+ connection_struct *conn;
+ for (conn=Connections;conn;conn=conn->next) {
+ if (conn->service == snum) {
+ return(True);
+ }
+ }
+ return(False);
+}
+
+
+/****************************************************************************
+find a conn given a cnum
+****************************************************************************/
+connection_struct *conn_find(int cnum)
+{
+ connection_struct *conn;
+
+ for (conn=Connections;conn;conn=conn->next) {
+ if (conn->cnum == cnum) return conn;
+ }
+
+ return NULL;
+}
+
+
+/****************************************************************************
+ find first available connection slot, starting from a random position.
+The randomisation stops problems with the server dieing and clients
+thinking the server is still available.
+****************************************************************************/
+connection_struct *conn_new(void)
+{
+ connection_struct *conn;
+ int i;
+
+ i = bitmap_find(bmap, 1);
+
+ if (i == -1) {
+ DEBUG(1,("ERROR! Out of connection structures\n"));
+ return NULL;
+ }
+
+ conn = (connection_struct *)malloc(sizeof(*conn));
+ if (!conn) return NULL;
+
+ memset(conn, 0, sizeof(*conn));
+ conn->cnum = i;
+
+ bitmap_set(bmap, i);
+
+ num_open++;
+
+ string_init(&conn->user,"");
+ string_init(&conn->dirpath,"");
+ string_init(&conn->connectpath,"");
+ string_init(&conn->origpath,"");
+
+ /* hook into the front of the list */
+ if (!Connections) {
+ Connections = conn;
+ } else {
+ Connections->prev = conn;
+ conn->next = Connections;
+ Connections = conn;
+ }
+
+ return conn;
+}
+
+/****************************************************************************
+close all conn structures
+****************************************************************************/
+void conn_close_all(void)
+{
+ connection_struct *conn, *next;
+ for (conn=Connections;conn;conn=next) {
+ next=conn->next;
+ close_cnum(conn, (uint16)-1);
+ }
+}
+
+/****************************************************************************
+idle inactive connections
+****************************************************************************/
+BOOL conn_idle_all(time_t t, int deadtime)
+{
+ BOOL allidle = True;
+ connection_struct *conn, *next;
+
+ for (conn=Connections;conn;conn=next) {
+ next=conn->next;
+ /* close dirptrs on connections that are idle */
+ if ((t-conn->lastused) > DPTR_IDLE_TIMEOUT)
+ dptr_idlecnum(conn);
+
+ if (conn->num_files_open > 0 ||
+ (t-conn->lastused)<deadtime)
+ allidle = False;
+ }
+
+ return allidle;
+}
+
+/****************************************************************************
+free a conn structure
+****************************************************************************/
+void conn_free(connection_struct *conn)
+{
+ if (conn == Connections) {
+ Connections = conn->next;
+ if (Connections) Connections->prev = NULL;
+ } else {
+ conn->prev->next = conn->next;
+ if (conn->next) conn->next->prev = conn->prev;
+ }
+
+ if (conn->ngroups && conn->groups) {
+ free(conn->groups);
+ conn->groups = NULL;
+ conn->ngroups = 0;
+ }
+
+ free_namearray(conn->veto_list);
+ free_namearray(conn->hide_list);
+ free_namearray(conn->veto_oplock_list);
+
+ string_free(&conn->user);
+ string_free(&conn->dirpath);
+ string_free(&conn->connectpath);
+ string_free(&conn->origpath);
+
+ bitmap_clear(bmap, conn->cnum);
+ num_open--;
+
+ memset(conn, 0, sizeof(*conn));
+ free(conn);
+}