1
1

* samba/tests/summary.c: Remove. The test is now included ...

* samba/configure.in: ... here.
* samba/tests/README: Remove, it's irrelevant.
* samba/architecture.doc: Likewise.
* samba/include/dlinklist.h: Remove, it's unused.  Adjust
dependencies.
* samba/libsmb/namequery.c (): Remove, it's unused.
* Makefile.am: Remove unused Samba files.
Этот коммит содержится в:
Pavel Roskin 2003-08-30 07:14:54 +00:00
родитель c037f013a3
Коммит a64b930445
8 изменённых файлов: 18 добавлений и 227 удалений

Просмотреть файл

@ -61,7 +61,6 @@ dist-hook:
$(mkinstalldirs) $(distdir)/samba/lib
$(mkinstalldirs) $(distdir)/samba/libsmb
$(mkinstalldirs) $(distdir)/samba/param
$(mkinstalldirs) $(distdir)/samba/tests
for I in $(SAMBA_DIST); do \
cp -p $(srcdir)/samba/$$I $(distdir)/samba/$$I || exit 1; \
done
@ -104,7 +103,6 @@ mcserv_LDADD = $(MCSERVLIBS)
SAMBA_DIST = \
Makefile.in \
aclocal.m4 \
architecture.doc \
configure.in \
configure \
internals.doc \
@ -151,7 +149,5 @@ SAMBA_DIST = \
libsmb/smbencrypt.c \
libsmb/smberr.c \
param/loadparm.c \
param/params.c \
tests/README \
tests/summary.c
param/params.c

Просмотреть файл

@ -1,134 +0,0 @@
Samba Architecture
------------------
First preliminary version Dan Shearer Nov 97
Quickly scrabbled together from odd bits of mail and memory. Please update.
This document gives a general overview of how Samba works
internally. The Samba Team has tried to come up with a model which is
the best possible compromise between elegance, portability, security
and the constraints imposed by the very messy SMB and CIFS
protocol.
It also tries to answer some of the frequently asked questions such as:
* Is Samba secure when running on Unix? The xyz platform?
What about the root priveliges issue?
* Pros and cons of multithreading in various parts of Samba
* Why not have a separate process for name resolution, WINS,
and browsing?
Multithreading and Samba
------------------------
People sometimes tout threads as a uniformly good thing. They are very
nice in their place but are quite inappropriate for smbd. nmbd is
another matter, and multi-threading it would be very nice.
The short version is that smbd is not multithreaded, and alternative
servers that take this approach under Unix (such as Syntax, at the
time of writing) suffer tremendous performance penalties and are less
robust. nmbd is not threaded either, but this is because it is not
possible to do it while keeping code consistent and portable across 35
or more platforms. (This drawback also applies to threading smbd.)
The longer versions is that there are very good reasons for not making
smbd multi-threaded. Multi-threading would actually make Samba much
slower, less scalable, less portable and much less robust. The fact
that we use a separate process for each connection is one of Samba's
biggest advantages.
Threading smbd
--------------
A few problems that would arise from a threaded smbd are:
0) It's not only to create threads instead of processes, but you
must care about all variables if they have to be thread specific
(currently they would be global).
1) if one thread dies (eg. a seg fault) then all threads die. We can
immediately throw robustness out the window.
2) many of the system calls we make are blocking. Non-blocking
equivalents of many calls are either not available or are awkward (and
slow) to use. So while we block in one thread all clients are
waiting. Imagine if one share is a slow NFS filesystem and the others
are fast, we will end up slowing all clients to the speed of NFS.
3) you can't run as a different uid in different threads. This means
we would have to switch uid/gid on _every_ SMB packet. It would be
horrendously slow.
4) the per process file descriptor limit would mean that we could only
support a limited number of clients.
5) we couldn't use the system locking calls as the locking context of
fcntl() is a process, not a thread.
Threading nmbd
--------------
This would be ideal, but gets sunk by portability requirements.
Andrew tried to write a test threads library for nmbd that used only
ansi-C constructs (using setjmp and longjmp). Unfortunately some OSes
defeat this by restricting longjmp to calling addresses that are
shallower than the current address on the stack (apparently AIX does
this). This makes a truly portable threads library impossible. So to
support all our current platforms we would have to code nmbd both with
and without threads, and as the real aim of threads is to make the
code clearer we would not have gained anything. (it is a myth that
threads make things faster. threading is like recursion, it can make
things clear but the same thing can always be done faster by some
other method)
Chris tried to spec out a general design that would abstract threading
vs separate processes (vs other methods?) and make them accessible
through some general API. This doesn't work because of the data
sharing requirements of the protocol (packets in the future depending
on packets now, etc.) At least, the code would work but would be very
clumsy, and besides the fork() type model would never work on Unix. (Is there an OS that it would work on, for nmbd?)
A fork() is cheap, but not nearly cheap enough to do on every UDP
packet that arrives. Having a pool of processes is possible but is
nasty to program cleanly due to the enormous amount of shared data (in
complex structures) between the processes. We can't rely on each
platform having a shared memory system.
nbmd Design
-----------
Originally Andrew used recursion to simulate a multi-threaded
environment, which use the stack enormously and made for really
confusing debugging sessions. Luke Leighton rewrote it to use a
queuing system that keeps state information on each packet. The
first version used a single structure which was used by all the
pending states. As the initialisation of this structure was
done by adding arguments, as the functionality developed, it got
pretty messy. So, it was replaced with a higher-order function
and a pointer to a user-defined memory block. This suddenly
made things much simpler: large numbers of functions could be
made static, and modularised. This is the same principle as used
in NT's kernel, and achieves the same effect as threads, but in
a single process.
Then Jeremy rewrote nmbd. The packet data in nmbd isn't what's on the
wire. It's a nice format that is very amenable to processing but still
keeps the idea of a distinct packet. See "struct packet_struct" in
nameserv.h. It has all the detail but none of the on-the-wire
mess. This makes it ideal for using in disk or memory-based databases
for browsing and WINS support.
nmbd now consists of a series of modules. It...
Samba Design and Security
-------------------------
Why Isn't nmbd Multiple Daemons?
--------------------------------

Просмотреть файл

@ -566,7 +566,23 @@ AC_ARG_WITH(codepagedir,
esac])
AC_MSG_CHECKING([configure summary])
AC_TRY_RUN([#include "${srcdir-.}/tests/summary.c"],
AC_TRY_RUN([
#include <stdio.h>
main()
{
#if !(defined(HAVE_NETMASK_IFCONF) || defined(HAVE_NETMASK_IFREQ) || defined(HAVE_NETMASK_AIX))
printf("WARNING: No automated netmask determination - use an interfaces line\n");
#endif
#if !((defined(HAVE_RANDOM) || defined(HAVE_RAND)) && (defined(HAVE_SRANDOM) || defined(HAVE_SRAND)))
printf("ERROR: No random or srandom routine!\n");
exit(1);
#endif
exit(0);
}
],
AC_MSG_RESULT(OK);,
AC_MSG_RESULT(failure)
AC_MSG_ERROR([Aborting config]),:)

Просмотреть файл

@ -1,56 +0,0 @@
/*
Unix SMB/Netbios implementation.
Version 1.9.
some simple double linked list macros
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.
*/
/* To use these macros you must have a structure containing a next and
prev pointer */
/* hook into the front of the list */
#define DLIST_ADD(list, p) \
{ \
if (!(list)) { \
(list) = (p); \
(p)->next = (p)->prev = NULL; \
} else { \
(list)->prev = (p); \
(p)->next = (list); \
(p)->prev = NULL; \
(list) = (p); \
}\
}
/* remove an element from a list */
#define DLIST_REMOVE(list, p) \
{ \
if ((p) == (list)) { \
(list) = (p)->next; \
if (list) (list)->prev = NULL; \
} else { \
(p)->prev->next = (p)->next; \
if ((p)->next) (p)->next->prev = (p)->prev; \
} \
}
/* promote an element to the top of the list */
#define DLIST_PROMOTE(list, p) \
DLIST_REMOVE(list, p) \
DLIST_ADD(list, p)

Просмотреть файл

@ -519,9 +519,6 @@ extern int errno;
#endif
/* Lists, trees, caching, datbase... */
#include "dlinklist.h"
#include "version.h"
#include "smb.h"
#include "nameserv.h"

Просмотреть файл

@ -366,9 +366,6 @@ BOOL cli_dskattr(struct cli_state *cli, int *bsize, int *total, int *avail);
/* The following definitions come from libsmb/namequery.c */
BOOL name_status(int fd,char *name,int name_type,BOOL recurse,
struct in_addr to_ip,char *master,char *rname,
void (*fn)(struct packet_struct *));
struct in_addr *name_query(int fd,const char *name,int name_type, BOOL bcast,BOOL recurse,
struct in_addr to_ip, int *count, void (*fn)(struct packet_struct *));
FILE *startlmhosts(char *fname);

Просмотреть файл

@ -1,10 +0,0 @@
This directory contains autoconf test programs that are too large to
comfortably fit in configure.in.
These programs should test one feature of the OS and exit(0) if it
works or exit(1) if it doesn't work (do _not_ use return)
The programs should be kept simple and to the point. Beautiful/fast
code is not necessary

Просмотреть файл

@ -1,15 +0,0 @@
#include <stdio.h>
main()
{
#if !(defined(HAVE_NETMASK_IFCONF) || defined(HAVE_NETMASK_IFREQ) || defined(HAVE_NETMASK_AIX))
printf("WARNING: No automated netmask determination - use an interfaces line\n");
#endif
#if !((defined(HAVE_RANDOM) || defined(HAVE_RAND)) && (defined(HAVE_SRANDOM) || defined(HAVE_SRAND)))
printf("ERROR: No random or srandom routine!\n");
exit(1);
#endif
exit(0);
}