tdbsam & smb_panic merge from 3.0 (initial tests are ok but I'll setup a HEAD PDC...
authorGerald Carter <jerry@samba.org>
Thu, 12 Feb 2004 05:59:03 +0000 (05:59 +0000)
committerGerald Carter <jerry@samba.org>
Thu, 12 Feb 2004 05:59:03 +0000 (05:59 +0000)
(This used to be commit c57b24ee49aee0f0687742da7f8d741c62f6effe)

source3/Makefile.in
source3/lib/dummysmbd.c [new file with mode: 0644]
source3/lib/util.c
source3/locking/brlock.c
source3/locking/locking.c
source3/passdb/pdb_tdb.c
source3/printing/printing_db.c
source3/smbd/connection.c
source3/smbd/server.c
source3/smbd/session.c
source3/smbd/tdbutil.c [new file with mode: 0644]

index 77ae8a0bddba9ebe72ffc0d1c6363208c3cb06ac..886d9f81a921725f1dc2dad0d0935a2d88e27ed2 100644 (file)
@@ -190,6 +190,8 @@ LIB_OBJ = lib/version.o lib/charcnv.o lib/debug.o lib/fault.o \
 
 LIB_SMBD_OBJ = lib/system_smbd.o lib/util_smbd.o 
 
+LIB_NONSMBD_OBJ = $(LIB_OBJ) lib/dummysmbd.o
+
 READLINE_OBJ = lib/readline.o
 
 # Also depends on  $(SECRETS_OBJ) $(LIBSAMBA_OBJ)
@@ -286,7 +288,7 @@ RPC_PARSE_OBJ = rpc_parse/parse_lsa.o rpc_parse/parse_net.o \
 
 RPC_CLIENT_OBJ = rpc_client/cli_pipe.o 
 
-LOCKING_OBJ = locking/locking.o locking/brlock.o locking/posix.o
+LOCKING_OBJ = locking/locking.o locking/brlock.o locking/posix.o smbd/tdbutil.o
 
 GUMS_OBJ = sam/gums.o sam/gums_api.o sam/gums_helper.o @GUMS_STATIC@
 
@@ -377,11 +379,11 @@ SMBD_OBJ_BASE = $(PARAM_OBJ) $(SMBD_OBJ_SRV) $(MSDFS_OBJ) $(LIBSMB_OBJ) \
                $(UBIQX_OBJ) $(BUILDOPT_OBJ) $(SMBLDAP_OBJ)
 
 PRINTING_OBJ = printing/pcap.o printing/print_svid.o \
-                               printing/print_cups.o printing/print_generic.o \
-                               printing/lpq_parse.o printing/load.o
+               printing/print_cups.o printing/print_generic.o \
+               printing/lpq_parse.o printing/load.o
 
 PRINTBACKEND_OBJ = printing/printing.o printing/nt_printing.o printing/notify.o \
-               printing/printing_db.o
+                   printing/printing_db.o
 
 MSDFS_OBJ = msdfs/msdfs.o 
 
@@ -400,13 +402,13 @@ NMBD_OBJ1 = nmbd/asyncdns.o nmbd/nmbd.o nmbd/nmbd_become_dmb.o \
             nmbd/nmbd_workgroupdb.o nmbd/nmbd_synclists.o
 
 NMBD_OBJ = $(NMBD_OBJ1) $(PARAM_OBJ) $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) $(UBIQX_OBJ) \
-           $(PROFILE_OBJ) $(LIB_OBJ) $(SECRETS_OBJ) $(POPT_LIB_OBJ)
+           $(PROFILE_OBJ) $(LIB_NONSMBD_OBJ) $(SECRETS_OBJ) $(POPT_LIB_OBJ)
 
 WREPL_OBJ1 = wrepld/server.o wrepld/process.o wrepld/parser.o wrepld/socket.o \
              wrepld/partners.o
 
 WREPL_OBJ = $(WREPL_OBJ1)  $(PARAM_OBJ) $(UBIQX_OBJ) \
-           $(PROFILE_OBJ) $(LIB_OBJ) $(POPT_LIB_OBJ) $(SECRETS_OBJ) \
+           $(PROFILE_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) $(SECRETS_OBJ) \
            $(LIBSAMBA_OBJ)
 
 SWAT_OBJ1 = web/cgi.o web/diagnose.o web/startstop.o web/statuspage.o \
@@ -414,39 +416,41 @@ SWAT_OBJ1 = web/cgi.o web/diagnose.o web/startstop.o web/statuspage.o \
 
 SWAT_OBJ = $(SWAT_OBJ1) $(PARAM_OBJ) $(PRINTING_OBJ) $(LIBSMB_OBJ) \
           $(LOCKING_OBJ) $(PASSDB_OBJ) $(SECRETS_OBJ) $(KRBCLIENT_OBJ) \
-          $(UBIQX_OBJ) $(LIB_OBJ) $(GROUPDB_OBJ) $(PLAINTEXT_AUTH_OBJ) \
-          $(POPT_LIB_OBJ) $(SMBLDAP_OBJ) $(RPC_PARSE_OBJ) $(LIBMSRPC_OBJ) libsmb/passchange.o lib/dummyroot.o
+          $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ) $(GROUPDB_OBJ) $(PLAINTEXT_AUTH_OBJ) \
+          $(POPT_LIB_OBJ) $(SMBLDAP_OBJ) $(RPC_PARSE_OBJ) $(LIBMSRPC_OBJ) \
+           libsmb/passchange.o lib/dummyroot.o 
 
 SMBSH_OBJ = smbwrapper/smbsh.o smbwrapper/shared.o \
-            $(PARAM_OBJ) $(UBIQX_OBJ) $(LIB_OBJ)
+            $(PARAM_OBJ) $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ)
 
 STATUS_OBJ = utils/status.o $(LOCKING_OBJ) $(PARAM_OBJ) \
-             $(UBIQX_OBJ) $(PROFILE_OBJ) $(LIB_OBJ) $(POPT_LIB_OBJ) \
+             $(UBIQX_OBJ) $(PROFILE_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \
             $(SECRETS_OBJ) $(LIBSAMBA_OBJ) lib/dummyroot.o libsmb/errormap.o 
+             
 
 SMBCONTROL_OBJ = utils/smbcontrol.o $(LOCKING_OBJ) $(PARAM_OBJ) \
-       $(UBIQX_OBJ) $(PROFILE_OBJ) $(LIB_OBJ) $(POPT_LIB_OBJ) \
+       $(UBIQX_OBJ) $(PROFILE_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \
        $(SECRETS_OBJ) $(LIBSAMBA_OBJ) \
        printing/notify.o printing/printing_db.o lib/dummyroot.o libsmb/errormap.o
 
-SMBTREE_OBJ = utils/smbtree.o $(LOCKING_OBJ) $(PARAM_OBJ) \
-             $(UBIQX_OBJ) $(PROFILE_OBJ) $(LIB_OBJ) $(LIBSMB_OBJ) \
+SMBTREE_OBJ = utils/smbtree.o $(PARAM_OBJ) \
+             $(UBIQX_OBJ) $(PROFILE_OBJ) $(LIB_NONSMBD_OBJ) $(LIBSMB_OBJ) \
             $(KRBCLIENT_OBJ) $(POPT_LIB_OBJ) $(SECRETS_OBJ) 
 
 TESTPARM_OBJ = utils/testparm.o \
-               $(PARAM_OBJ) $(UBIQX_OBJ) $(LIB_OBJ) $(POPT_LIB_OBJ) \
+               $(PARAM_OBJ) $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \
               $(SECRETS_OBJ) $(LIBSAMBA_OBJ)
 
 TESTPRNS_OBJ = utils/testprns.o $(PARAM_OBJ) $(PRINTING_OBJ) $(UBIQX_OBJ) \
-               $(LIB_OBJ)
+               $(LIB_NONSMBD_OBJ)
 
 SMBPASSWD_OBJ = utils/smbpasswd.o libsmb/passchange.o $(PARAM_OBJ) $(SECRETS_OBJ) \
                $(LIBSMB_OBJ) $(PASSDB_OBJ) $(GROUPDB_OBJ)\
-                $(UBIQX_OBJ) $(LIB_OBJ) $(KRBCLIENT_OBJ) \
+                $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ) $(KRBCLIENT_OBJ) \
                $(SMBLDAP_OBJ) $(RPC_PARSE_OBJ) $(LIBMSRPC_OBJ) lib/dummyroot.o
 
 PDBEDIT_OBJ = utils/pdbedit.o $(PARAM_OBJ) $(PASSDB_OBJ) $(LIBSAMBA_OBJ) \
-               $(UBIQX_OBJ) $(LIB_OBJ) $(GROUPDB_OBJ) $(SECRETS_OBJ) \
+               $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ) $(GROUPDB_OBJ) $(SECRETS_OBJ) \
                $(POPT_LIB_OBJ) $(SMBLDAP_OBJ) lib/dummyroot.o
 
 SMBGET_OBJ = utils/smbget.o $(POPT_LIB_OBJ) $(LIBSMBCLIENT_OBJ) $(SECRETS_OBJ)
@@ -460,7 +464,7 @@ RPCCLIENT_OBJ1 = rpcclient/rpcclient.o rpcclient/cmd_lsarpc.o \
                 rpcclient/cmd_epmapper.o
 
 RPCCLIENT_OBJ = $(RPCCLIENT_OBJ1) \
-             $(PARAM_OBJ) $(LIBSMB_OBJ) $(UBIQX_OBJ) $(LIB_OBJ) \
+             $(PARAM_OBJ) $(LIBSMB_OBJ) $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ) \
              $(RPC_PARSE_OBJ) $(PASSDB_OBJ) $(LIBMSRPC_OBJ) \
              $(READLINE_OBJ) $(GROUPDB_OBJ) $(KRBCLIENT_OBJ) \
             $(LIBADS_OBJ) $(SECRETS_OBJ) $(POPT_LIB_OBJ) \
@@ -476,7 +480,7 @@ SMBW_OBJ1 = smbwrapper/smbw.o \
                smbwrapper/smbw_cache.o
 
 SMBW_OBJ = $(SMBW_OBJ1) $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) $(PARAM_OBJ) \
-                $(UBIQX_OBJ) $(LIB_OBJ)
+                $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ)
 
 SMBWRAPPER_OBJ1 = smbwrapper/wrapped.o
 
@@ -484,7 +488,7 @@ SMBWRAPPER_OBJ = $(SMBW_OBJ) $(SMBWRAPPER_OBJ1)
 
 LIBSMBCLIENT_OBJ = libsmb/libsmbclient.o libsmb/libsmb_compat.o \
                   libsmb/libsmb_cache.o \
-                  $(PARAM_OBJ) $(LIB_OBJ) \
+                  $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \
                   $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) $(UBIQX_OBJ) \
                   $(LIBMSRPC_OBJ) $(RPC_PARSE_OBJ) $(PASSDB_GET_SET_OBJ)
 
@@ -494,7 +498,7 @@ LIBSMBCLIENT_OBJ = libsmb/libsmbclient.o libsmb/libsmb_compat.o \
 
 LIBBIGBALLOFMUD_MAJOR = 0
 
-LIBBIGBALLOFMUD_OBJ = $(PARAM_OBJ) $(LIB_OBJ) $(UBIQX_OBJ) $(SECRETS_OBJ) \
+LIBBIGBALLOFMUD_OBJ = $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(UBIQX_OBJ) $(SECRETS_OBJ) \
        $(LIBSMB_OBJ) $(LIBMSRPC_OBJ) $(RPC_PARSE_OBJ) $(PASSDB_OBJ) \
        $(GROUPDB_OBJ) $(KRBCLIENT_OBJ) $(SMBLDAP_OBJ) lib/dummyroot.o
 
@@ -503,7 +507,7 @@ LIBBIGBALLOFMUD_PICOBJS = $(LIBBIGBALLOFMUD_OBJ:.o=.@PICSUFFIX@)
 CLIENT_OBJ1 = client/client.o client/clitar.o 
 
 CLIENT_OBJ = $(CLIENT_OBJ1) $(PARAM_OBJ) $(LIBSMB_OBJ) $(UBIQX_OBJ) \
-            $(LIB_OBJ) $(KRBCLIENT_OBJ) \
+            $(LIB_NONSMBD_OBJ) $(KRBCLIENT_OBJ) \
              $(READLINE_OBJ) $(POPT_LIB_OBJ) $(SECRETS_OBJ)
 
 NET_OBJ1 = utils/net.o utils/net_ads.o utils/net_ads_cldap.o utils/net_help.o \
@@ -514,62 +518,62 @@ NET_OBJ1 = utils/net.o utils/net_ads.o utils/net_ads_cldap.o utils/net_help.o \
 
 NET_OBJ = $(NET_OBJ1) $(PARAM_OBJ) $(SECRETS_OBJ) $(LIBSMB_OBJ) \
          $(RPC_PARSE_OBJ) $(PASSDB_OBJ) $(GROUPDB_OBJ) \
-         $(KRBCLIENT_OBJ) $(UBIQX_OBJ) $(LIB_OBJ) \
+         $(KRBCLIENT_OBJ) $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ) \
          $(LIBMSRPC_OBJ) $(IDMAP_OBJ) \
          $(LIBADS_OBJ) $(LIBADS_SERVER_OBJ) $(POPT_LIB_OBJ) \
          $(SMBLDAP_OBJ) $(DCUTIL_OBJ) lib/dummyroot.o lib/server_mutex.o lib/afs.o
 
 CUPS_OBJ = client/smbspool.o $(PARAM_OBJ) $(LIBSMB_OBJ) $(UBIQX_OBJ) \
-         $(LIB_OBJ) $(KRBCLIENT_OBJ) $(SECRETS_OBJ)
+         $(LIB_NONSMBD_OBJ) $(KRBCLIENT_OBJ) $(SECRETS_OBJ)
 
 MOUNT_OBJ = client/smbmount.o \
-             $(PARAM_OBJ) $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) $(UBIQX_OBJ) $(LIB_OBJ) 
+             $(PARAM_OBJ) $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ) 
 
 MNT_OBJ = client/smbmnt.o lib/version.o lib/snprintf.o
 
 UMOUNT_OBJ = client/smbumount.o
 
 NMBLOOKUP_OBJ = utils/nmblookup.o $(PARAM_OBJ) $(UBIQX_OBJ) $(LIBNMB_OBJ) \
-               $(LIB_OBJ) $(POPT_LIB_OBJ) $(SECRETS_OBJ) $(LIBSAMBA_OBJ)
+               $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) $(SECRETS_OBJ) $(LIBSAMBA_OBJ)
 
 SMBTORTURE_OBJ1 = torture/torture.o torture/nbio.o torture/scanner.o torture/utable.o \
                torture/denytest.o torture/mangle_test.o 
 
 SMBTORTURE_OBJ = $(SMBTORTURE_OBJ1) $(PARAM_OBJ) \
-       $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) $(UBIQX_OBJ) $(LIB_OBJ)
+       $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ)
 
 MASKTEST_OBJ = torture/masktest.o $(PARAM_OBJ) $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \
-                 $(UBIQX_OBJ) $(LIB_OBJ)
+                 $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ)
 
 MSGTEST_OBJ = torture/msgtest.o $(PARAM_OBJ) $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \
-                 $(UBIQX_OBJ) $(LIB_OBJ)
+                 $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ)
 
 LOCKTEST_OBJ = torture/locktest.o $(PARAM_OBJ) $(LOCKING_OBJ) $(KRBCLIENT_OBJ) \
-                          $(LIBSMB_OBJ) $(UBIQX_OBJ) $(LIB_OBJ)
+               $(LIBSMB_OBJ) $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ) lib/dummyroot.o
 
 NSSTEST_OBJ = torture/nsstest.o $(PARAM_OBJ) $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \
-                 $(UBIQX_OBJ) $(LIB_OBJ)
+                 $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ)
 
 VFSTEST_OBJ = torture/cmd_vfs.o torture/vfstest.o $(SMBD_OBJ_BASE) $(READLINE_OBJ)
 
-SMBICONV_OBJ = $(PARAM_OBJ) torture/smbiconv.o $(LIB_OBJ) $(UBIQX_OBJ) $(POPT_LIB_OBJ) $(SECRETS_OBJ) $(LIBSAMBA_OBJ)
+SMBICONV_OBJ = $(PARAM_OBJ) torture/smbiconv.o $(LIB_NONSMBD_OBJ) $(UBIQX_OBJ) $(POPT_LIB_OBJ) $(SECRETS_OBJ) $(LIBSAMBA_OBJ)
 
 LOG2PCAP_OBJ = utils/log2pcaphex.o
 
 LOCKTEST2_OBJ = torture/locktest2.o $(PARAM_OBJ) $(LOCKING_OBJ) $(LIBSMB_OBJ) \
-               $(KRBCLIENT_OBJ) $(UBIQX_OBJ) $(LIB_OBJ)
+               $(KRBCLIENT_OBJ) $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ) lib/dummyroot.o
 
-SMBCACLS_OBJ = utils/smbcacls.o $(PARAM_OBJ) $(LOCKING_OBJ) $(LIBSMB_OBJ) \
-                          $(KRBCLIENT_OBJ) $(UBIQX_OBJ) $(LIB_OBJ) $(RPC_PARSE_OBJ) \
+SMBCACLS_OBJ = utils/smbcacls.o $(PARAM_OBJ) $(LIBSMB_OBJ) \
+                          $(KRBCLIENT_OBJ) $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ) $(RPC_PARSE_OBJ) \
                           $(PASSDB_GET_SET_OBJ) $(LIBMSRPC_OBJ) $(SECRETS_OBJ) \
                           $(POPT_LIB_OBJ) $(DCUTIL_OBJ) $(LIBADS_OBJ)
 
-SMBCQUOTAS_OBJ = utils/smbcquotas.o $(LOCKING_OBJ) $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \
+SMBCQUOTAS_OBJ = utils/smbcquotas.o $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \
                $(PARAM_OBJ) \
-               $(UBIQX_OBJ) $(LIB_OBJ) $(RPC_PARSE_OBJ) $(PASSDB_GET_SET_OBJ) \
+               $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ) $(RPC_PARSE_OBJ) $(PASSDB_GET_SET_OBJ) \
                $(LIBMSRPC_OBJ) $(SECRETS_OBJ) $(POPT_LIB_OBJ)
 
-TALLOCTORT_OBJ = lib/talloctort.o $(PARAM_OBJ) $(LIB_OBJ) $(UBIQX_OBJ)
+TALLOCTORT_OBJ = lib/talloctort.o $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(UBIQX_OBJ)
 
 RPCTORTURE_OBJ = torture/rpctorture.o \
              rpcclient/display.o \
@@ -578,13 +582,13 @@ RPCTORTURE_OBJ = torture/rpctorture.o \
              rpcclient/cmd_samr.o \
              rpcclient/cmd_srvsvc.o \
              rpcclient/cmd_netlogon.o \
-             $(PARAM_OBJ) $(LIBSMB_OBJ) $(UBIQX_OBJ) $(LIB_OBJ) $(KRBCLIENT_OBJ) \
+             $(PARAM_OBJ) $(LIBSMB_OBJ) $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ) $(KRBCLIENT_OBJ) \
              $(RPC_CLIENT_OBJ) $(RPC_PARSE_OBJ) $(PASSDB_GET_SET_OBJ)
 
 DEBUG2HTML_OBJ = utils/debug2html.o ubiqx/debugparse.o
 
 SMBFILTER_OBJ = utils/smbfilter.o $(PARAM_OBJ) $(LIBSMB_OBJ) \
-                 $(UBIQX_OBJ) $(LIB_OBJ) $(KRBCLIENT_OBJ) 
+                 $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ) $(KRBCLIENT_OBJ) 
 
 PROTO_OBJ = $(SMBD_OBJ_MAIN) \
            $(SMBD_OBJ_SRV) $(NMBD_OBJ1) $(SWAT_OBJ1) $(LIB_OBJ) $(LIBSMB_OBJ) \
@@ -602,7 +606,7 @@ PROTO_OBJ = $(SMBD_OBJ_MAIN) \
            $(SMBLDAP_OBJ) $(IDMAP_OBJ) libsmb/spnego.o libsmb/passchange.o
 
 WINBIND_WINS_NSS_OBJ = nsswitch/wins.o $(PARAM_OBJ) $(UBIQX_OBJ) \
-       $(LIBSMB_OBJ) $(LIB_OBJ) $(NSSWINS_OBJ) $(KRBCLIENT_OBJ)
+       $(LIBSMB_OBJ) $(LIB_NONSMBD_OBJ) $(NSSWINS_OBJ) $(KRBCLIENT_OBJ)
 
 WINBIND_WINS_NSS_PICOBJS = $(WINBIND_WINS_NSS_OBJ:.o=.@PICSUFFIX@)
 
@@ -611,7 +615,7 @@ LIBSMBCLIENT_PICOBJS = $(LIBSMBCLIENT_OBJ:.o=.@PICSUFFIX@)
 
 PAM_SMBPASS_OBJ_0 = pam_smbpass/pam_smb_auth.o pam_smbpass/pam_smb_passwd.o \
                pam_smbpass/pam_smb_acct.o pam_smbpass/support.o \
-               lib/dummyroot.o $(PARAM_OBJ) $(LIB_OBJ) $(PASSDB_OBJ) $(GROUPDB_OBJ) \
+               lib/dummyroot.o $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(PASSDB_OBJ) $(GROUPDB_OBJ) \
                $(SECRETS_OBJ) $(UBIQX_OBJ) $(SMBLDAP_OBJ) $(LIBSAMBA_OBJ)
 
 PAM_SMBPASS_PICOOBJ = $(PAM_SMBPASS_OBJ_0:.o=.@PICSUFFIX@)
@@ -636,13 +640,13 @@ WINBINDD_OBJ1 = \
 
 WINBINDD_OBJ = \
                $(WINBINDD_OBJ1) $(PASSDB_OBJ) $(GROUPDB_OBJ) \
-               $(PARAM_OBJ) $(UBIQX_OBJ) $(LIB_OBJ) \
+               $(PARAM_OBJ) $(UBIQX_OBJ) $(LIB_NONSMBD_OBJ) \
                $(LIBSMB_OBJ) $(LIBMSRPC_OBJ) $(RPC_PARSE_OBJ) \
                $(PROFILE_OBJ) $(SLCACHE_OBJ) $(SMBLDAP_OBJ) \
                $(SECRETS_OBJ) $(LIBADS_OBJ) $(KRBCLIENT_OBJ) $(POPT_LIB_OBJ) \
                $(DCUTIL_OBJ) $(IDMAP_OBJ) lib/dummyroot.o
 
-WBINFO_OBJ = nsswitch/wbinfo.o $(LIBSAMBA_OBJ) $(PARAM_OBJ) $(LIB_OBJ) \
+WBINFO_OBJ = nsswitch/wbinfo.o $(LIBSAMBA_OBJ) $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \
                $(UBIQX_OBJ) $(SECRETS_OBJ) $(POPT_LIB_OBJ)
 
 WINBIND_NSS_OBJ = nsswitch/wb_common.o lib/replace1.o @WINBIND_NSS_EXTRA_OBJS@
@@ -1190,10 +1194,10 @@ bin/wbinfo@EXEEXT@: $(WBINFO_OBJ) @BUILD_POPT@ bin/.dummy
        @echo Linking $@
        @$(LINK) -o $@ $(WBINFO_OBJ) $(LIBS) @POPTLIBS@
 
-bin/ntlm_auth@EXEEXT@: $(NTLM_AUTH_OBJ) $(PARAM_OBJ) $(LIB_OBJ) \
+bin/ntlm_auth@EXEEXT@: $(NTLM_AUTH_OBJ) $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \
                $(UBIQX_OBJ) @BUILD_POPT@ bin/.dummy
        @echo Linking $@
-       @$(LINK) -o $@ $(NTLM_AUTH_OBJ) $(PARAM_OBJ) $(LIB_OBJ) \
+       @$(LINK) -o $@ $(NTLM_AUTH_OBJ) $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \
                $(UBIQX_OBJ) $(LIBS) @POPTLIBS@ $(KRB5LIBS) $(LDAP_LIBS)
 
 bin/pam_smbpass.@SHLIBEXT@: $(PAM_SMBPASS_PICOOBJ)
@@ -1284,7 +1288,7 @@ installclientlib: installdirs libsmbclient
 
 # Python extensions
 
-PYTHON_OBJS = $(PARAM_OBJ) $(LIB_OBJ) $(LIBSMB_OBJ) $(RPC_PARSE_OBJ) \
+PYTHON_OBJS = $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(LIBSMB_OBJ) $(RPC_PARSE_OBJ) \
        $(UBIQX_OBJ) $(LIBMSRPC_OBJ) $(PASSDB_OBJ) $(GROUPDB_OBJ) \
        $(SECRETS_OBJ) $(KRBCLIENT_OBJ) $(SMBLDAP_OBJ) lib/dummyroot.o
 
diff --git a/source3/lib/dummysmbd.c b/source3/lib/dummysmbd.c
new file mode 100644 (file)
index 0000000..17bc321
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+   Unix SMB/CIFS implementation.
+   RPC pipe client
+
+   Copyright (C) Gerald (Jerry) Carter          2004.
+
+   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.
+*/
+
+/* Stupid dummy functions required due to the horrible dependency mess
+   in Samba. */
+
+void decrement_smbd_process_count( void )
+{
+       return;
+}
+
index e9ab72b2bfe589bd8d9c69774d5444b45d41f638..61dbc2cb2afe4239346e47954a181b1c9f39bd4a 100644 (file)
@@ -1340,6 +1340,14 @@ gid_t nametogid(const char *name)
        return (gid_t)-1;
 }
 
+/*******************************************************************
+ legacy wrapper for smb_panic2()
+********************************************************************/
+void smb_panic( const char *why )
+{
+       smb_panic2( why, True );
+}
+
 /*******************************************************************
  Something really nasty happened - panic !
 ********************************************************************/
@@ -1348,7 +1356,7 @@ gid_t nametogid(const char *name)
 #include <libexc.h>
 #endif
 
-void smb_panic(const char *why)
+void smb_panic2(const char *why, BOOL decrement_pid_count )
 {
        char *cmd;
        int result;
@@ -1371,6 +1379,10 @@ void smb_panic(const char *why)
        }
 #endif
 
+       /* only smbd needs to decrement the smbd counter in connections.tdb */
+       if ( decrement_pid_count )
+               decrement_smbd_process_count();
+
        cmd = lp_panic_action();
        if (cmd && *cmd) {
                DEBUG(0, ("smb_panic(): calling panic action [%s]\n", cmd));
index c51a5a2aac9285b43999fe5c3d6b05476ca7e04f..47001c8b89cdfacd0f3d66102052c7efbb814f8f 100644 (file)
@@ -246,8 +246,8 @@ void brl_init(int read_only)
 {
        if (tdb)
                return;
-       tdb = tdb_open_log(lock_path("brlock.tdb"), 0,  TDB_DEFAULT|(read_only?0x0:TDB_CLEAR_IF_FIRST),
-                      read_only?O_RDONLY:(O_RDWR|O_CREAT), 0644);
+       tdb = tdb_open_ex(lock_path("brlock.tdb"), 0,  TDB_DEFAULT|(read_only?0x0:TDB_CLEAR_IF_FIRST),
+                      read_only?O_RDONLY:(O_RDWR|O_CREAT), 0644, smbd_tdb_log);
        if (!tdb) {
                DEBUG(0,("Failed to open byte range locking database\n"));
                return;
index c3abd6381825b84e3213b87d5fe085a8eb18455d..42036cc70cf54aeb6714be8e38d13deef571b0bb 100644 (file)
@@ -283,10 +283,10 @@ BOOL locking_init(int read_only)
        if (tdb)
                return True;
 
-       tdb = tdb_open_log(lock_path("locking.tdb"), 
+       tdb = tdb_open_ex(lock_path("locking.tdb"), 
                       0, TDB_DEFAULT|(read_only?0x0:TDB_CLEAR_IF_FIRST), 
                       read_only?O_RDONLY:O_RDWR|O_CREAT,
-                      0644);
+                      0644, smbd_tdb_log);
 
        if (!tdb) {
                DEBUG(0,("ERROR: Failed to initialise locking database\n"));
index 1d8fb9b7ec26b365a6df9150c573436f69c27d6e..d9d946ffc84840924420c2ab66a18e140b5b4315 100644 (file)
@@ -46,12 +46,18 @@ static int tdbsam_debug_level = DBGC_ALL;
 
 struct tdbsam_privates {
        TDB_CONTEXT     *passwd_tdb;
-       TDB_DATA        key;
 
        /* retrive-once info */
        const char *tdbsam_location;
 };
 
+struct pwent_list {
+       struct pwent_list *prev, *next;
+       TDB_DATA key;
+};
+static struct pwent_list *tdbsam_pwent_list;
+
+
 /**
  * Convert old TDBSAM to the latest version.
  * @param pdb_tdb A pointer to the opened TDBSAM file which must be converted. 
@@ -222,33 +228,75 @@ static TDB_CONTEXT * tdbsam_tdbopen (const char *name, int open_flags)
        return pdb_tdb;
 }
 
+/*****************************************************************************
+ Utility functions to open the tdb sam database
+ ****************************************************************************/
+
+static void tdbsam_tdbclose ( struct tdbsam_privates *state )
+{
+       if ( !state )
+               return;
+               
+       if ( state->passwd_tdb ) {
+               tdb_close( state->passwd_tdb );
+               state->passwd_tdb = NULL;
+       }
+       
+       return;
+               
+}
+
+/****************************************************************************
+ creates a list of user keys
+****************************************************************************/
+
+static int tdbsam_traverse_setpwent(TDB_CONTEXT *t, TDB_DATA key, TDB_DATA data, void *state)
+{
+       const char *prefix = USERPREFIX;
+       int  prefixlen = strlen (prefix);
+       struct pwent_list *ptr;
+       
+       if ( strncmp(key.dptr, prefix, prefixlen) == 0 ) {
+               if ( !(ptr=(struct pwent_list*)malloc(sizeof(struct pwent_list))) ) {
+                       DEBUG(0,("tdbsam_traverse_setpwent: Failed to malloc new entry for list\n"));
+                       
+                       /* just return 0 and let the traversal continue */
+                       return 0;
+               }
+               ZERO_STRUCTP(ptr);
+               
+               /* save a copy of the key */
+               
+               ptr->key.dptr = memdup( key.dptr, key.dsize );
+               ptr->key.dsize = key.dsize;
+               
+               DLIST_ADD( tdbsam_pwent_list, ptr );
+       
+       }
+       
+       
+       return 0;
+}
+
 /***************************************************************
  Open the TDB passwd database for SAM account enumeration.
+ Save a list of user keys for iteration.
 ****************************************************************/
 
 static NTSTATUS tdbsam_setsampwent(struct pdb_methods *my_methods, BOOL update)
 {
+       uint32 flags = update ? (O_RDWR|O_CREAT) : O_RDONLY;
+       
        struct tdbsam_privates *tdb_state = (struct tdbsam_privates *)my_methods->private_data;
        
-       /* Open tdb passwd */
-       if (!(tdb_state->passwd_tdb = tdbsam_tdbopen(tdb_state->tdbsam_location, update?(O_RDWR|O_CREAT):O_RDONLY)))
-       {
-               DEBUG(0, ("Unable to open/create TDB passwd\n"));
+       if ( !(tdb_state->passwd_tdb = tdbsam_tdbopen(tdb_state->tdbsam_location, flags )) ) 
                return NT_STATUS_UNSUCCESSFUL;
-       }
-       
-       tdb_state->key = tdb_firstkey(tdb_state->passwd_tdb);
 
+       tdb_traverse( tdb_state->passwd_tdb, tdbsam_traverse_setpwent, NULL );
+       
        return NT_STATUS_OK;
 }
 
-static void close_tdb(struct tdbsam_privates *tdb_state) 
-{
-       if (tdb_state->passwd_tdb) {
-               tdb_close(tdb_state->passwd_tdb);
-               tdb_state->passwd_tdb = NULL;
-       }
-}
 
 /***************************************************************
  End enumeration of the TDB passwd list.
@@ -257,8 +305,18 @@ static void close_tdb(struct tdbsam_privates *tdb_state)
 static void tdbsam_endsampwent(struct pdb_methods *my_methods)
 {
        struct tdbsam_privates *tdb_state = (struct tdbsam_privates *)my_methods->private_data;
-       SAFE_FREE(tdb_state->key.dptr);
-       close_tdb(tdb_state);
+       struct pwent_list *ptr, *ptr_next;
+       
+       tdbsam_tdbclose( tdb_state );
+       
+       /* clear out any remaining entries in the list */
+       
+       for ( ptr=tdbsam_pwent_list; ptr; ptr = ptr_next ) {
+               ptr_next = ptr->next;
+               DLIST_REMOVE( tdbsam_pwent_list, ptr );
+               SAFE_FREE( ptr->key.dptr);
+               SAFE_FREE( ptr );
+       }
        
        DEBUG(7, ("endtdbpwent: closed sam database.\n"));
 }
@@ -269,55 +327,48 @@ static void tdbsam_endsampwent(struct pdb_methods *my_methods)
 
 static NTSTATUS tdbsam_getsampwent(struct pdb_methods *my_methods, SAM_ACCOUNT *user)
 {
-       NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
+       NTSTATUS                nt_status = NT_STATUS_UNSUCCESSFUL;
        struct tdbsam_privates *tdb_state = (struct tdbsam_privates *)my_methods->private_data;
-       TDB_DATA        data, old_key;
-       const char *prefix = USERPREFIX;
-       int  prefixlen = strlen (prefix);
-
+       TDB_DATA                data;
+       struct pwent_list       *pkey;
 
-       if (user==NULL) {
-               DEBUG(0,("pdb_get_sampwent: SAM_ACCOUNT is NULL.\n"));
+       if ( !user ) {
+               DEBUG(0,("tdbsam_getsampwent: SAM_ACCOUNT is NULL.\n"));
                return nt_status;
        }
 
-       /* skip all non-USER entries (eg. RIDs) */
-       while ((tdb_state->key.dsize != 0) && (strncmp(tdb_state->key.dptr, prefix, prefixlen))) {
-
-               old_key = tdb_state->key;
-
-               /* increment to next in line */
-               tdb_state->key = tdb_nextkey(tdb_state->passwd_tdb, tdb_state->key);
-
-               SAFE_FREE(old_key.dptr);
-       }
-
-       /* do we have an valid iteration pointer? */
-       if(tdb_state->passwd_tdb == NULL) {
-               DEBUG(0,("pdb_get_sampwent: Bad TDB Context pointer.\n"));
+       if ( !tdbsam_pwent_list ) {
+               DEBUG(4,("tdbsam_getsampwent: end of list\n"));
+               tdbsam_tdbclose( tdb_state );
                return nt_status;
        }
+       
+       if ( !tdb_state->passwd_tdb ) {
+               if ( !(tdb_state->passwd_tdb = tdbsam_tdbopen(tdb_state->tdbsam_location, O_RDONLY)) )
+                       return nt_status;
+       }
+
+       /* pull the next entry */
+               
+       pkey = tdbsam_pwent_list;
+       DLIST_REMOVE( tdbsam_pwent_list, pkey );
+       
+       data = tdb_fetch(tdb_state->passwd_tdb, pkey->key);
 
-       data = tdb_fetch(tdb_state->passwd_tdb, tdb_state->key);
+       SAFE_FREE( pkey->key.dptr);
+       SAFE_FREE( pkey);
+       
        if (!data.dptr) {
-               DEBUG(5,("pdb_getsampwent: database entry not found.\n"));
+               DEBUG(5,("pdb_getsampwent: database entry not found.  Was the user deleted?\n"));
                return nt_status;
        }
   
-       /* unpack the buffer */
        if (!init_sam_from_buffer(user, (unsigned char *)data.dptr, data.dsize)) {
                DEBUG(0,("pdb_getsampwent: Bad SAM_ACCOUNT entry returned from TDB!\n"));
-               SAFE_FREE(data.dptr);
-               return nt_status;
        }
-       SAFE_FREE(data.dptr);
        
-       old_key = tdb_state->key;
+       SAFE_FREE( data.dptr );
        
-       /* increment to next in line */
-       tdb_state->key = tdb_nextkey(tdb_state->passwd_tdb, tdb_state->key);
-
-       SAFE_FREE(old_key.dptr);
 
        return NT_STATUS_OK;
 }
@@ -335,12 +386,11 @@ static NTSTATUS tdbsam_getsampwnam (struct pdb_methods *my_methods, SAM_ACCOUNT
        fstring         keystr;
        fstring         name;
 
-       if (user==NULL) {
+       if ( !user ) {
                DEBUG(0,("pdb_getsampwnam: SAM_ACCOUNT is NULL.\n"));
                return nt_status;
        }
 
-       
        /* Data is stored in all lower-case */
        fstrcpy(name, sname);
        strlower_m(name);
@@ -358,7 +408,7 @@ static NTSTATUS tdbsam_getsampwnam (struct pdb_methods *my_methods, SAM_ACCOUNT
                         * TDB file doesn't exist, so try to create new one. This is useful to avoid
                         * confusing error msg when adding user account first time
                         */
-                       if (!(pwd_tdb = tdb_open_log(tdb_state->tdbsam_location, 0, TDB_DEFAULT, O_CREAT, 0600))) {
+                       if (!(pwd_tdb = tdbsam_tdbopen(tdb_state->tdbsam_location, O_CREAT ))) {
                                DEBUG(0, ("pdb_getsampwnam: TDB passwd (%s) did not exist. File successfully created.\n",
                                          tdb_state->tdbsam_location));
                        } else {
@@ -637,7 +687,7 @@ static NTSTATUS tdbsam_add_sam_account (struct pdb_methods *my_methods, SAM_ACCO
 static void free_private_data(void **vp) 
 {
        struct tdbsam_privates **tdb_state = (struct tdbsam_privates **)vp;
-       close_tdb(*tdb_state);
+       tdbsam_tdbclose(*tdb_state);
        *tdb_state = NULL;
 
        /* No need to free any further, as it is talloc()ed */
index 0e0fb1b51d694689606c7b643af0f1a25cc1086f..d402aa366f4e3f7a0dacc0887b7b730a2f9eb3d4 100644 (file)
@@ -96,7 +96,8 @@ struct tdb_print_db *get_print_db_byname(const char *printername)
                done_become_root = True;
        }
 
-       p->tdb = tdb_open_log(printdb_path, 5000, TDB_DEFAULT, O_RDWR|O_CREAT, 0600);
+       p->tdb = tdb_open_ex(printdb_path, 5000, TDB_DEFAULT, O_RDWR|O_CREAT, 
+               0600, smbd_tdb_log);
 
        if (done_become_root)
                unbecome_root();
index 5bb76eb3bd83a6cf43093dcb2b015e26f3acc1d5..a9ab14246150f95d2df848dbe947e58cc685cf5a 100644 (file)
@@ -29,8 +29,8 @@ static TDB_CONTEXT *tdb;
 TDB_CONTEXT *conn_tdb_ctx(void)
 {
        if (!tdb)
-               tdb = tdb_open_log(lock_path("connections.tdb"), 0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT, 
-                              O_RDWR | O_CREAT, 0644);
+               tdb = tdb_open_ex(lock_path("connections.tdb"), 0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT, 
+                              O_RDWR | O_CREAT, 0644, smbd_tdb_log);
 
        return tdb;
 }
@@ -131,8 +131,8 @@ BOOL claim_connection(connection_struct *conn, const char *name,int max_connecti
        TDB_DATA kbuf, dbuf;
 
        if (!tdb)
-               tdb = tdb_open_log(lock_path("connections.tdb"), 0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT, 
-                              O_RDWR | O_CREAT, 0644);
+               tdb = tdb_open_ex(lock_path("connections.tdb"), 0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT, 
+                              O_RDWR | O_CREAT, 0644, smbd_tdb_log);
 
        if (!tdb)
                return False;
index e2ffe8cc9f75bae2d14a22a39ef50b9dd8c59ade..be59e92cd7bbcf2b9877021c3330fc5766625fcd 100644 (file)
@@ -501,6 +501,7 @@ BOOL reload_services(BOOL test)
        return(ret);
 }
 
+
 #if DUMP_CORE
 /*******************************************************************
 prepare to dump a core file - carefully!
@@ -890,3 +891,4 @@ void build_options(BOOL screen);
        exit_server("normal exit");
        return(0);
 }
+
index 4d8826d3323d3f4eca301f308dfb07903c4efe00..a811a6e305a8aeb8eceba35e4dba16e95b47000e 100644 (file)
@@ -53,8 +53,8 @@ BOOL session_claim(user_struct *vuser)
        }
 
        if (!tdb) {
-               tdb = tdb_open_log(lock_path("sessionid.tdb"), 0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT, 
-                              O_RDWR | O_CREAT, 0644);
+               tdb = tdb_open_ex(lock_path("sessionid.tdb"), 0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT, 
+                              O_RDWR | O_CREAT, 0644, smbd_tdb_log);
                if (!tdb) {
                        DEBUG(1,("session_claim: failed to open sessionid tdb\n"));
                        return False;
diff --git a/source3/smbd/tdbutil.c b/source3/smbd/tdbutil.c
new file mode 100644 (file)
index 0000000..cafcde2
--- /dev/null
@@ -0,0 +1,85 @@
+/* 
+   Unix SMB/CIFS implementation.
+   Main SMB server routines
+   Copyright (C) Jeremy Allison                 2003
+   Copyright (C) Gerald (Jerry) Carter          2004
+   
+   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"
+
+
+/**********************************************************************
+ logging function used by smbd to detect and remove corrupted tdb's
+**********************************************************************/
+
+void smbd_tdb_log(TDB_CONTEXT *tdb, int level, const char *format, ...)
+{
+       va_list ap;
+       char *ptr = NULL;
+       BOOL decrement_smbd_count;
+
+       va_start(ap, format);
+       vasprintf(&ptr, format, ap);
+       va_end(ap);
+       
+       if (!ptr || !*ptr)
+               return;
+
+       DEBUG(level, ("tdb(%s): %s", tdb->name ? tdb->name : "unnamed", ptr));
+       
+       if (tdb->ecode == TDB_ERR_CORRUPT) {
+               int ret;
+
+               DEBUG(0,("tdb_log: TDB %s is corrupt. Removing file and stopping this process.\n",
+                       tdb->name ));
+
+               become_root();
+               ret = unlink(tdb->name);
+               if ( ret ) {
+                       DEBUG(0,("ERROR: %s\n", strerror(errno)));
+               }
+               unbecome_root();
+
+               
+               /* if its not connections.tdb, then make sure we decrement the 
+                  smbd count.  If connections.tdb is bad, there's nothing we 
+                  can do and everything will eventually shut down or clean 
+                  up anyways */
+               
+               if ( strcmp(tdb->name, lock_path("connections.tdb")) == 0 )
+                       decrement_smbd_count = False;
+               else
+                       decrement_smbd_count = True;
+               
+               /* now die */
+               
+               smb_panic2("corrupt tdb\n", decrement_smbd_count );
+       }
+
+       if (tdb->ecode == TDB_ERR_IO) 
+       {
+               if ( strcmp(tdb->name, lock_path("connections.tdb")) == 0 )
+                       decrement_smbd_count = False;
+               else
+                       decrement_smbd_count = True;
+                       
+               smb_panic2( "i/o error on tdb.\n", decrement_smbd_count );
+       }
+       
+       SAFE_FREE(ptr);
+}
+