diff options
author | Jeremy Allison <jra@samba.org> | 2003-12-11 19:59:05 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2003-12-11 19:59:05 +0000 |
commit | 0b88121c7898e85837f32c98b445c9c4863b3fa8 (patch) | |
tree | dbf8159a1fa83b94c173eefab0a1cc7d5eb7d8bf /source3/smbd/conn.c | |
parent | da3a5ad98a03565525b496642a82c570af64f0b2 (diff) | |
download | samba-0b88121c7898e85837f32c98b445c9c4863b3fa8.tar.gz samba-0b88121c7898e85837f32c98b445c9c4863b3fa8.tar.bz2 samba-0b88121c7898e85837f32c98b445c9c4863b3fa8.zip |
Patch from James Peach <jpeach@sgi.com>. Remove the MAX_CONNECTIONS limit
by increasing bitmap size. Limited by "max connections" parameter.
Bug #716.
Jeremy.
(This used to be commit 0be57a2eb015f832c6bb6d84525719a3d632f741)
Diffstat (limited to 'source3/smbd/conn.c')
-rw-r--r-- | source3/smbd/conn.c | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/source3/smbd/conn.c b/source3/smbd/conn.c index eb2d2bbcbf..289b7d611d 100644 --- a/source3/smbd/conn.c +++ b/source3/smbd/conn.c @@ -21,11 +21,11 @@ #include "includes.h" -/* 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 +/* The connections bitmap is expanded in increments of BITMAP_BLOCK_SZ. The + * maximum size of the bitmap is the largest positive integer, but you will hit + * the "max connections" limit, looong before that. + */ +#define BITMAP_BLOCK_SZ 128 static connection_struct *Connections; @@ -38,7 +38,7 @@ init the conn structures ****************************************************************************/ void conn_init(void) { - bmap = bitmap_allocate(MAX_CONNECTIONS); + bmap = bitmap_allocate(BITMAP_BLOCK_SZ); } /**************************************************************************** @@ -96,12 +96,35 @@ connection_struct *conn_new(void) TALLOC_CTX *mem_ctx; connection_struct *conn; int i; + int find_offset = 1; - i = bitmap_find(bmap, 1); +find_again: + i = bitmap_find(bmap, find_offset); if (i == -1) { - DEBUG(1,("ERROR! Out of connection structures\n")); - return NULL; + /* Expand the connections bitmap. */ + int oldsz = bmap->n; + int newsz = bmap->n + BITMAP_BLOCK_SZ; + struct bitmap * nbmap; + + if (newsz <= 0) { + /* Integer wrap. */ + DEBUG(0,("ERROR! Out of connection structures\n")); + return NULL; + } + + DEBUG(4,("resizing connections bitmap from %d to %d\n", + oldsz, newsz)); + + nbmap = bitmap_allocate(newsz); + + bitmap_copy(nbmap, bmap); + bitmap_free(bmap); + + bmap = nbmap; + find_offset = oldsz; /* Start next search in the new portion. */ + + goto find_again; } if ((mem_ctx=talloc_init("connection_struct"))==NULL) { |