port latest changes from SAMBA_3_0 tree
authorSimo Sorce <idra@samba.org>
Sat, 2 Aug 2003 20:06:57 +0000 (20:06 +0000)
committerSimo Sorce <idra@samba.org>
Sat, 2 Aug 2003 20:06:57 +0000 (20:06 +0000)
(This used to be commit 3101c236b8241dc0183995ffceed551876427de4)

172 files changed:
source3/Makefile.in
source3/aclocal.m4
source3/auth/auth.c
source3/auth/auth_domain.c
source3/auth/auth_ntlmssp.c
source3/auth/auth_sam.c
source3/auth/auth_util.c
source3/client/client.c
source3/client/clitar.c
source3/client/smbspool.c
source3/client/tree.c
source3/configure.in
source3/dynconfig.c
source3/groupdb/mapping.c
source3/include/authdata.h
source3/include/byteorder.h
source3/include/charset.h
source3/include/client.h
source3/include/dynconfig.h
source3/include/idmap.h
source3/include/includes.h
source3/include/popt_common.h
source3/include/rpc_ds.h
source3/include/rpc_samr.h
source3/include/rpc_secdes.h
source3/include/smb.h
source3/include/smbldap.h
source3/include/sysquotas.h
source3/include/version.h
source3/include/vfs.h
source3/lib/account_pol.c
source3/lib/charcnv.c
source3/lib/popt_common.c
source3/lib/replace.c
source3/lib/smbldap.c
source3/lib/snprintf.c
source3/lib/substitute.c
source3/lib/sysquotas.c
source3/lib/username.c
source3/lib/util.c
source3/lib/util_file.c
source3/lib/util_sock.c
source3/lib/util_str.c
source3/lib/util_unistr.c
source3/lib/util_uuid.c
source3/libads/authdata.c
source3/libads/kerberos_verify.c
source3/libads/ldap.c
source3/libads/ldap_printer.c
source3/libads/ldap_user.c
source3/libads/sasl.c
source3/libsmb/asn1.c
source3/libsmb/cliconnect.c
source3/libsmb/clientgen.c
source3/libsmb/clierror.c
source3/libsmb/clikrb5.c
source3/libsmb/clilist.c
source3/libsmb/cliprint.c
source3/libsmb/clispnego.c
source3/libsmb/clitrans.c
source3/libsmb/errormap.c
source3/libsmb/nmblib.c
source3/libsmb/ntlmssp.c
source3/libsmb/ntlmssp_parse.c
source3/libsmb/ntlmssp_sign.c
source3/libsmb/smb_signing.c
source3/libsmb/trustdom_cache.c
source3/libsmb/trusts_util.c
source3/locking/locking.c
source3/nmbd/nmbd_processlogon.c
source3/nsswitch/wb_common.c
source3/nsswitch/wbinfo.c
source3/nsswitch/winbindd.c
source3/nsswitch/winbindd.h
source3/nsswitch/winbindd_acct.c
source3/nsswitch/winbindd_ads.c
source3/nsswitch/winbindd_cache.c
source3/nsswitch/winbindd_cm.c
source3/nsswitch/winbindd_group.c
source3/nsswitch/winbindd_misc.c
source3/nsswitch/winbindd_pam.c
source3/nsswitch/winbindd_sid.c
source3/nsswitch/winbindd_user.c
source3/nsswitch/winbindd_util.c
source3/nsswitch/winbindd_wins.c
source3/nsswitch/wins.c
source3/param/loadparm.c
source3/passdb/passdb.c
source3/passdb/pdb_get_set.c
source3/passdb/pdb_ldap.c
source3/passdb/pdb_smbpasswd.c
source3/passdb/pdb_tdb.c
source3/passdb/secrets.c
source3/printing/notify.c
source3/printing/pcap.c
source3/python/py_common.c
source3/python/py_lsa.c
source3/python/py_ntsec.c
source3/python/py_smb.c
source3/python/py_winbind.c
source3/rpc_client/cli_ds.c
source3/rpc_client/cli_lsarpc.c
source3/rpc_client/cli_netlogon.c
source3/rpc_client/cli_pipe.c
source3/rpc_client/cli_srvsvc.c
source3/rpc_parse/parse_ds.c
source3/rpc_parse/parse_lsa.c
source3/rpc_parse/parse_prs.c
source3/rpc_parse/parse_samr.c
source3/rpc_server/srv_dfs.c
source3/rpc_server/srv_lsa.c
source3/rpc_server/srv_lsa_nt.c
source3/rpc_server/srv_netlog.c
source3/rpc_server/srv_netlog_nt.c
source3/rpc_server/srv_pipe.c
source3/rpc_server/srv_reg.c
source3/rpc_server/srv_reg_nt.c
source3/rpc_server/srv_samr.c
source3/rpc_server/srv_samr_nt.c
source3/rpc_server/srv_spoolss.c
source3/rpc_server/srv_spoolss_nt.c
source3/rpc_server/srv_srvsvc.c
source3/rpc_server/srv_wkssvc.c
source3/rpcclient/cmd_ds.c
source3/rpcclient/cmd_samr.c
source3/rpcclient/rpcclient.c
source3/sam/idmap.c
source3/sam/idmap_tdb.c
source3/sam/idmap_util.c
source3/smbd/blocking.c
source3/smbd/change_trust_pw.c
source3/smbd/chgpasswd.c
source3/smbd/close.c
source3/smbd/ipc.c
source3/smbd/lanman.c
source3/smbd/mangle_hash.c
source3/smbd/negprot.c
source3/smbd/notify.c
source3/smbd/ntquotas.c
source3/smbd/nttrans.c
source3/smbd/open.c
source3/smbd/oplock.c
source3/smbd/password.c
source3/smbd/process.c
source3/smbd/reply.c
source3/smbd/service.c
source3/smbd/sesssetup.c
source3/smbd/statcache.c
source3/smbd/trans2.c
source3/smbd/utmp.c
source3/tdb/tdbtool.c
source3/torture/cmd_vfs.c
source3/torture/locktest.c
source3/torture/locktest2.c
source3/torture/mangle_test.c
source3/torture/nsstest.c
source3/torture/torture.c
source3/utils/net.c
source3/utils/net_ads.c
source3/utils/net_cache.c
source3/utils/net_idmap.c
source3/utils/net_rpc_samsync.c
source3/utils/net_time.c
source3/utils/ntlm_auth.c
source3/utils/pdbedit.c
source3/utils/smbcacls.c
source3/utils/smbcontrol.c
source3/utils/smbcquotas.c
source3/utils/smbpasswd.c
source3/utils/status.c
source3/web/statuspage.c
source3/web/swat.c

index 73ff436c6f50bcb642789ab23c680a698058022e..4674fd07ae5702770a5d16372564039cb4f7f0ac 100644 (file)
@@ -3,7 +3,7 @@
 # Copyright Andrew Tridgell 1992-1998
 # Copyright (C) 2001 by Martin Pool <mbp@samba.org>
 # Copyright Andrew Bartlett 2002
-# Copyright (C) 2003 Anthony Liguori <aliguor@us.ibm.com>
+# Copyright (C) 2003 Jim McDonough <aliguor@us.ibm.com>
 # Copyright (C) 2002-2003 Jelmer Vernooij <jelmer@samba.org>
 ###########################################################################
 
@@ -32,7 +32,6 @@ AUTHLIBS=@AUTHLIBS@
 ACLLIBS=@ACLLIBS@
 PASSDBLIBS=@PASSDBLIBS@
 IDMAP_LIBS=@IDMAP_LIBS@
-ADSLIBS=@ADSLIBS@
 KRB5LIBS=@KRB5_LIBS@
 LDAPLIBS=@LDAP_LIBS@
 
@@ -165,7 +164,7 @@ SMBLDAP_OBJ = @SMBLDAP@
 
 LIB_OBJ = lib/charcnv.o lib/debug.o lib/fault.o \
           lib/getsmbpass.o lib/interface.o lib/md4.o \
-          lib/interfaces.o lib/pidfile.o lib/replace.o \
+          lib/interfaces.o lib/pidfile.o lib/replace.o lib/replace1.o \
           lib/signal.o lib/system.o lib/sendfile.o lib/time.o \
          lib/ufc.o lib/genrand.o lib/username.o \
          lib/util_getent.o lib/util_pw.o lib/access.o lib/smbrun.o \
@@ -176,7 +175,7 @@ LIB_OBJ = lib/charcnv.o lib/debug.o lib/fault.o \
          lib/util.o lib/util_sock.o lib/sock_exec.o lib/util_sec.o \
          lib/talloc.o lib/hash.o lib/substitute.o lib/fsusage.o \
          lib/ms_fnmatch.o lib/select.o lib/messages.o \
-         lib/tallocmsg.o lib/dmallocmsg.o \
+         lib/tallocmsg.o lib/dmallocmsg.o libsmb/smb_signing.o \
          lib/md5.o lib/hmacmd5.o lib/iconv.o lib/smbpasswd.o \
          nsswitch/wb_client.o nsswitch/wb_common.o \
          lib/pam_errors.o intl/lang_tdb.o lib/account_pol.o \
@@ -216,7 +215,7 @@ LIBSMB_OBJ = libsmb/clientgen.o libsmb/cliconnect.o libsmb/clifile.o \
             libsmb/clirap.o libsmb/clierror.o libsmb/climessage.o \
             libsmb/clireadwrite.o libsmb/clilist.o libsmb/cliprint.o \
             libsmb/clitrans.o libsmb/clisecdesc.o libsmb/clidgram.o \
-            libsmb/clistr.o libsmb/smb_signing.o \
+            libsmb/clistr.o \
             libsmb/cliquota.o libsmb/clifsinfo.o \
              libsmb/smberr.o libsmb/credentials.o libsmb/pwd_cache.o \
             libsmb/clioplock.o libsmb/errormap.o libsmb/clirap2.o \
@@ -300,6 +299,7 @@ VFS_EXTD_AUDIT_OBJ = modules/vfs_extd_audit.o
 VFS_FAKE_PERMS_OBJ = modules/vfs_fake_perms.o
 VFS_RECYCLE_OBJ = modules/vfs_recycle.o
 VFS_NETATALK_OBJ = modules/vfs_netatalk.o
+VFS_DEFAULT_QUOTA_OBJ = modules/vfs_default_quota.o
 
 PLAINTEXT_AUTH_OBJ = auth/pampass.o auth/pass_check.o
 
@@ -389,17 +389,18 @@ 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)
+          $(POPT_LIB_OBJ) $(SMBLDAP_OBJ) lib/dummyroot.o
 
 SMBSH_OBJ = smbwrapper/smbsh.o smbwrapper/shared.o \
             $(PARAM_OBJ) $(UBIQX_OBJ) $(LIB_OBJ)
 
 STATUS_OBJ = utils/status.o $(LOCKING_OBJ) $(PARAM_OBJ) \
-             $(UBIQX_OBJ) $(PROFILE_OBJ) $(LIB_OBJ) $(POPT_LIB_OBJ)
+             $(UBIQX_OBJ) $(PROFILE_OBJ) $(LIB_OBJ) $(POPT_LIB_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) \
-       printing/notify.o printing/printing_db.o
+       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) \
@@ -414,11 +415,11 @@ TESTPRNS_OBJ = utils/testprns.o $(PARAM_OBJ) $(PRINTING_OBJ) $(UBIQX_OBJ) \
 SMBPASSWD_OBJ = utils/smbpasswd.o $(PARAM_OBJ) $(SECRETS_OBJ) \
                $(LIBSMB_OBJ) $(PASSDB_OBJ) $(GROUPDB_OBJ)\
                 $(UBIQX_OBJ) $(LIB_OBJ) $(KRBCLIENT_OBJ) \
-               $(SMBLDAP_OBJ)
+               $(SMBLDAP_OBJ) lib/dummyroot.o
 
 PDBEDIT_OBJ = utils/pdbedit.o $(PARAM_OBJ) $(PASSDB_OBJ) $(LIBSAMBA_OBJ) \
                $(UBIQX_OBJ) $(LIB_OBJ) $(GROUPDB_OBJ) $(SECRETS_OBJ) \
-               $(POPT_LIB_OBJ) $(SMBLDAP_OBJ)
+               $(POPT_LIB_OBJ) $(SMBLDAP_OBJ) lib/dummyroot.o
 
 RPCCLIENT_OBJ1 = rpcclient/rpcclient.o rpcclient/cmd_lsarpc.o \
                 rpcclient/cmd_samr.o rpcclient/cmd_spoolss.o \
@@ -432,9 +433,9 @@ RPCCLIENT_OBJ = $(RPCCLIENT_OBJ1) \
              $(RPC_PARSE_OBJ) $(PASSDB_OBJ) $(LIBMSRPC_OBJ) \
              $(READLINE_OBJ) $(GROUPDB_OBJ) $(KRBCLIENT_OBJ) \
             $(LIBADS_OBJ) $(SECRETS_OBJ) $(POPT_LIB_OBJ) \
-            $(SMBLDAP_OBJ) $(DCUTIL_OBJ)
+            $(SMBLDAP_OBJ) $(DCUTIL_OBJ) lib/dummyroot.o
 
-PAM_WINBIND_OBJ = nsswitch/pam_winbind.po nsswitch/wb_common.po lib/snprintf.po
+PAM_WINBIND_OBJ = nsswitch/pam_winbind.po nsswitch/wb_common.po lib/replace1.po lib/snprintf.po
 
 SMBW_OBJ1 = smbwrapper/smbw.o \
                smbwrapper/smbw_dir.o smbwrapper/smbw_stat.o \
@@ -460,7 +461,7 @@ LIBBIGBALLOFMUD_MAJOR = 0
 
 LIBBIGBALLOFMUD_OBJ = $(PARAM_OBJ) $(LIB_OBJ) $(UBIQX_OBJ) $(SECRETS_OBJ) \
        $(LIBSMB_OBJ) $(LIBMSRPC_OBJ) $(RPC_PARSE_OBJ) $(PASSDB_OBJ) \
-       $(GROUPDB_OBJ) $(KRBCLIENT_OBJ) $(SMBLDAP_OBJ)
+       $(GROUPDB_OBJ) $(KRBCLIENT_OBJ) $(SMBLDAP_OBJ) lib/dummyroot.o
 
 LIBBIGBALLOFMUD_PICOBJS = $(LIBBIGBALLOFMUD_OBJ:.o=.po)
 
@@ -480,7 +481,7 @@ NET_OBJ = $(NET_OBJ1) $(PARAM_OBJ) $(SECRETS_OBJ) $(LIBSMB_OBJ) \
          $(KRBCLIENT_OBJ) $(UBIQX_OBJ) $(LIB_OBJ) \
          $(LIBMSRPC_OBJ) $(IDMAP_OBJ) \
          $(LIBADS_OBJ) $(LIBADS_SERVER_OBJ) $(POPT_LIB_OBJ) \
-         $(SMBLDAP_OBJ) $(DCUTIL_OBJ)
+         $(SMBLDAP_OBJ) $(DCUTIL_OBJ) lib/dummyroot.o lib/server_mutex.o
 
 CUPS_OBJ = client/smbspool.o $(PARAM_OBJ) $(LIBSMB_OBJ) $(UBIQX_OBJ) \
          $(LIB_OBJ) $(KRBCLIENT_OBJ)
@@ -559,7 +560,7 @@ PROTO_OBJ = $(SMBD_OBJ_MAIN) \
            $(LIB_SMBD_OBJ) $(SAM_OBJ) $(REGISTRY_OBJ) $(POPT_LIB_OBJ) \
            $(RPC_LSA_OBJ) $(RPC_NETLOG_OBJ) $(RPC_SAMR_OBJ) $(RPC_REG_OBJ) \
            $(RPC_SVC_OBJ) $(RPC_WKS_OBJ) $(RPC_DFS_OBJ) $(RPC_SPOOLSS_OBJ) \
-           $(RPC_ECHO_OBJ) $(SMBLDAP_OBJ) $(IDMAP_OBJ)
+           $(RPC_ECHO_OBJ) $(SMBLDAP_OBJ) $(IDMAP_OBJ) libsmb/spnego.o
 
 WINBIND_WINS_NSS_OBJ = nsswitch/wins.o $(PARAM_OBJ) $(UBIQX_OBJ) \
        $(LIBSMB_OBJ) $(LIB_OBJ) $(NSSWINS_OBJ)
@@ -601,21 +602,22 @@ WINBINDD_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)
+               $(DCUTIL_OBJ) $(IDMAP_OBJ) lib/dummyroot.o
 
 WBINFO_OBJ = nsswitch/wbinfo.o $(LIBSAMBA_OBJ) $(PARAM_OBJ) $(LIB_OBJ) \
                $(UBIQX_OBJ) $(SECRETS_OBJ) $(POPT_LIB_OBJ)
 
-WINBIND_NSS_OBJ = nsswitch/wb_common.o @WINBIND_NSS_EXTRA_OBJS@
+WINBIND_NSS_OBJ = nsswitch/wb_common.o lib/replace1.o @WINBIND_NSS_EXTRA_OBJS@
 
-WINBIND_NSS_PICOBJS = $(WINBIND_NSS_OBJ:.o=.po)
+WINBIND_NSS_PICOBJS = $(WINBIND_NSS_OBJ:.o=.po) lib/snprintf.po
 
 POPT_OBJS=popt/findme.o popt/popt.o popt/poptconfig.o \
           popt/popthelp.o popt/poptparse.o
 
 TDBBACKUP_OBJ = tdb/tdbbackup.o tdb/tdbback.o $(TDBBASE_OBJ)
 
-NTLM_AUTH_OBJ = utils/ntlm_auth.o $(LIBSAMBA_OBJ) $(POPT_LIB_OBJ)
+NTLM_AUTH_OBJ = utils/ntlm_auth.o $(LIBSAMBA_OBJ) $(POPT_LIB_OBJ) \
+               libsmb/asn1.o libsmb/spnego.o
 
 ######################################################################
 # now the rules...
@@ -727,12 +729,12 @@ bin/.dummy:
 
 bin/smbd@EXEEXT@: $(SMBD_OBJ) @BUILD_POPT@ bin/.dummy
        @echo Linking $@
-       @$(CC) $(FLAGS) -o $@ $(SMBD_OBJ) $(ADSLIBS) $(LDFLAGS) $(DYNEXP) $(PRINTLIBS) \
+       @$(CC) $(FLAGS) -o $@ $(SMBD_OBJ) $(KRB5LIBS) $(LDAPLIBS) $(LDFLAGS) $(DYNEXP) $(PRINTLIBS) \
          $(AUTHLIBS) $(ACLLIBS) $(PASSDBLIBS) $(LIBS) @POPTLIBS@
 
 bin/nmbd@EXEEXT@: $(NMBD_OBJ) @BUILD_POPT@ bin/.dummy
        @echo Linking $@
-       @$(CC) $(FLAGS) -o $@ $(NMBD_OBJ) $(LDFLAGS) $(DYNEXP) $(LIBS) @POPTLIBS@ $(ADSLIBS)
+       @$(CC) $(FLAGS) -o $@ $(NMBD_OBJ) $(LDFLAGS) $(DYNEXP) $(LIBS) @POPTLIBS@ $(KRB5LIBS) $(LDAPLIBS)
 
 bin/wrepld@EXEEXT@: $(WREPL_OBJ) @BUILD_POPT@ bin/.dummy
        @echo Linking $@
@@ -741,19 +743,19 @@ bin/wrepld@EXEEXT@: $(WREPL_OBJ) @BUILD_POPT@ bin/.dummy
 bin/swat@EXEEXT@: $(SWAT_OBJ) @BUILD_POPT@ bin/.dummy
        @echo Linking $@
        @$(CC) $(FLAGS) -o $@ $(SWAT_OBJ) $(LDFLAGS) $(DYNEXP) $(PRINTLIBS) \
-         $(AUTHLIBS) $(LIBS) $(PASSDBLIBS) @POPTLIBS@ $(KRB5LIBS)
+         $(AUTHLIBS) $(LIBS) $(PASSDBLIBS) @POPTLIBS@ $(KRB5LIBS) $(LDAPLIBS)
 
 bin/rpcclient@EXEEXT@: $(RPCCLIENT_OBJ) @BUILD_POPT@ bin/.dummy
        @echo Linking $@
-       @$(CC) $(FLAGS) -o $@ $(PASSDBLIBS) $(RPCCLIENT_OBJ) $(LDFLAGS) $(DYNEXP) $(TERMLDFLAGS) $(TERMLIBS) $(LIBS) @POPTLIBS@ $(ADSLIBS)
+       @$(CC) $(FLAGS) -o $@ $(PASSDBLIBS) $(RPCCLIENT_OBJ) $(LDFLAGS) $(DYNEXP) $(TERMLDFLAGS) $(TERMLIBS) $(LIBS) @POPTLIBS@ $(KRB5LIBS) $(LDAPLIBS)
 
 bin/smbclient@EXEEXT@: $(CLIENT_OBJ) @BUILD_POPT@ bin/.dummy
        @echo Linking $@
-       @$(CC) $(FLAGS) -o $@ $(CLIENT_OBJ) $(LDFLAGS) $(DYNEXP) $(TERMLDFLAGS) $(TERMLIBS) $(LIBS) @POPTLIBS@ $(ADSLIBS)
+       @$(CC) $(FLAGS) -o $@ $(CLIENT_OBJ) $(LDFLAGS) $(DYNEXP) $(TERMLDFLAGS) $(TERMLIBS) $(LIBS) @POPTLIBS@ $(KRB5LIBS) $(LDAPLIBS)
 
 bin/net@EXEEXT@: $(NET_OBJ) @BUILD_POPT@ bin/.dummy
        @echo Linking $@
-       @$(CC) $(FLAGS) -o $@ $(NET_OBJ) $(DYNEXP) $(LDFLAGS) $(LIBS) @POPTLIBS@ $(ADSLIBS) $(PASSDBLIBS)
+       @$(CC) $(FLAGS) -o $@ $(NET_OBJ) $(DYNEXP) $(LDFLAGS) $(LIBS) @POPTLIBS@ $(KRB5LIBS) $(LDAPLIBS) $(PASSDBLIBS)
 
 bin/profiles@EXEEXT@: $(PROFILES_OBJ) @BUILD_POPT@ bin/.dummy
        @echo Linking $@
@@ -801,7 +803,7 @@ bin/smbtree@EXEEXT@: $(SMBTREE_OBJ) @BUILD_POPT@ bin/.dummy
 
 bin/smbpasswd@EXEEXT@: $(SMBPASSWD_OBJ) bin/.dummy
        @echo Linking $@
-       @$(CC) $(FLAGS) -o $@ $(SMBPASSWD_OBJ) $(PASSDBLIBS) $(LDFLAGS) $(DYNEXP) $(LIBS) $(KRB5LIBS)
+       @$(CC) $(FLAGS) -o $@ $(SMBPASSWD_OBJ) $(PASSDBLIBS) $(LDFLAGS) $(DYNEXP) $(LIBS) $(KRB5LIBS) $(LDAPLIBS)
 
 bin/pdbedit@EXEEXT@: $(PDBEDIT_OBJ) @BUILD_POPT@ bin/.dummy
        @echo Linking $@
@@ -873,7 +875,7 @@ bin/smbfilter@EXEEXT@: $(SMBFILTER_OBJ) bin/.dummy
 
 bin/smbw_sample@EXEEXT@: $(SMBW_OBJ) utils/smbw_sample.o bin/.dummy
        @echo Linking $@
-       @$(CC) $(FLAGS) -o $@ $(SMBW_OBJ) utils/smbw_sample.o $(LDFLAGS) $(LIBS) $(KRB5LIBS)
+       @$(CC) $(FLAGS) -o $@ $(SMBW_OBJ) utils/smbw_sample.o $(LDFLAGS) $(LIBS) $(KRB5LIBS) $(LDAPLIBS)
 
 bin/smbsh@EXEEXT@: $(SMBSH_OBJ) bin/.dummy
        @echo Linking $@
@@ -882,12 +884,14 @@ bin/smbsh@EXEEXT@: $(SMBSH_OBJ) bin/.dummy
 bin/smbwrapper.@SHLIBEXT@: $(PICOBJS) bin/.dummy
        @echo Linking shared library $@
        @$(SHLD) $(LDSHFLAGS) -o $@ $(PICOBJS) $(LIBS) \
-               @SONAMEFLAG@`basename $@` $(KRB5LIBS)
+               $(KRB5LIBS) $(LDAPLIBS) \
+               @SONAMEFLAG@`basename $@`
 
 bin/libsmbclient.@SHLIBEXT@: $(LIBSMBCLIENT_PICOBJS)
        @echo Linking libsmbclient shared library $@
        @$(SHLD) $(LDSHFLAGS) -o $@ $(LIBSMBCLIENT_PICOBJS) $(LDFLAGS) $(LIBS) \
-       $(KRB5LIBS) @SONAMEFLAG@`basename $@`.$(LIBSMBCLIENT_MAJOR)
+               $(KRB5LIBS) $(LDAPLIBS) \
+               @SONAMEFLAG@`basename $@`.$(LIBSMBCLIENT_MAJOR)
 
 bin/libsmbclient.a: $(LIBSMBCLIENT_PICOBJS)
        @echo Linking libsmbclient non-shared library $@
@@ -897,7 +901,8 @@ bin/libsmbclient.a: $(LIBSMBCLIENT_PICOBJS)
 bin/libbigballofmud.@SHLIBEXT@: $(LIBBIGBALLOFMUD_PICOBJS)
        @echo Linking bigballofmud shared library $@
        @$(SHLD) $(LDSHFLAGS) -o $@ $(LIBBIGBALLOFMUD_PICOBJS) $(LIBS) \
-               @SONAMEFLAG@`basename $@`.$(LIBBIGBALLOFMUD_MAJOR) $(PASSDBLIBS) $(IDMAP_LIBS) $(ADSLIBS)
+               $(PASSDBLIBS) $(IDMAP_LIBS) $(KRB5LIBS) $(LDAPLIBS) \
+               @SONAMEFLAG@`basename $@`.$(LIBBIGBALLOFMUD_MAJOR)
        ln -snf libbigballofmud.so bin/libbigballofmud.so.0
 
 # It would be nice to build a static bigballofmud too, but when I try
@@ -963,7 +968,8 @@ bin/winbindd@EXEEXT@: $(WINBINDD_OBJ) @BUILD_POPT@ bin/.dummy
 
 @WINBIND_WINS_NSS@: $(WINBIND_WINS_NSS_PICOBJS)
        @echo "Linking $@"
-       @$(SHLD) $(LDSHFLAGS) -o $@ $(WINBIND_WINS_NSS_PICOBJS) -lc \
+       @$(SHLD) $(LDSHFLAGS) -o $@ $(WINBIND_WINS_NSS_PICOBJS) \
+               $(KRBCLIENT_OBJ) $(LDAPLIBS) $(KRB5LIBS) -lc \
                @SONAMEFLAG@`basename $@`
 
 nsswitch/pam_winbind.@SHLIBEXT@: $(PAM_WINBIND_OBJ) bin/.dummy
@@ -1054,6 +1060,11 @@ bin/fake_perms.@SHLIBEXT@: $(VFS_FAKE_PERMS_OBJ:.o=.po)
        @$(SHLD) $(LDSHFLAGS) -o $@ $(VFS_FAKE_PERMS_OBJ:.o=.po) \
                @SONAMEFLAG@`basename $@`
 
+bin/default_quota.@SHLIBEXT@: $(VFS_DEFAULT_QUOTA_OBJ:.o=.po)
+       @echo "Building plugin $@"
+       @$(SHLD) $(LDSHFLAGS) -o $@ $(VFS_DEFAULT_QUOTA_OBJ:.o=.po) \
+               @SONAMEFLAG@`basename $@`
+
 bin/wbinfo@EXEEXT@: $(WBINFO_OBJ) @BUILD_POPT@ bin/.dummy
        @echo Linking $@
        @$(LINK) -o $@ $(WBINFO_OBJ) $(LIBS) @POPTLIBS@
@@ -1138,7 +1149,7 @@ installclientlib: installdirs libsmbclient
 
 PYTHON_OBJS = $(PARAM_OBJ) $(LIB_OBJ) $(LIBSMB_OBJ) $(RPC_PARSE_OBJ) \
        $(UBIQX_OBJ) $(LIBMSRPC_OBJ) $(PASSDB_OBJ) $(GROUPDB_OBJ) \
-       $(SECRETS_OBJ) $(KRBCLIENT_OBJ)
+       $(SECRETS_OBJ) $(KRBCLIENT_OBJ) $(SMBLDAP_OBJ) lib/dummyroot.o
 
 PYTHON_PICOBJS = $(PYTHON_OBJS:.o=.po)
 
@@ -1149,7 +1160,7 @@ python_ext: $(PYTHON_PICOBJS)
        fi
        PYTHON_OBJS="$(PYTHON_PICOBJS)" \
        PYTHON_CFLAGS="$(CFLAGS) $(CPPFLAGS) $(FLAGS)" \
-       LIBS="$(LIBS) $(PASSDBLIBS) $(IDMAP_LIBS) $(KRB5LIBS)" \
+       LIBS="$(LIBS) $(PASSDBLIBS) $(IDMAP_LIBS) $(KRB5LIBS) $(LDAPLIBS)" \
                $(PYTHON) python/setup.py build
 
 python_install: $(PYTHON_PICOBJS)
@@ -1185,7 +1196,7 @@ showlayout:
        @echo "  mandir:  $(MANDIR)"
 
 
-uninstall: uninstallman uninstallbin uninstallscripts
+uninstall: uninstallman uninstallbin uninstallscripts uninstallmodules
 
 uninstallman:
        @$(SHELL) $(srcdir)/script/uninstallman.sh $(DESTDIR)$(MANDIR) $(srcdir) $(man_langs)
index 21358e2a71171e675a7bcbec15725f683fde8bad..3a49f7e24975fb5c13444c77700b95eb0db2e892 100644 (file)
@@ -111,6 +111,113 @@ AC_DEFUN(AC_LIBTESTFUNC,
   esac
 ])
 
+# AC_CHECK_LIB_EXT(LIBRARY, [EXT_LIBS], [FUNCTION],
+#              [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND],
+#              [ADD-ACTION-IF-FOUND],[OTHER-LIBRARIES])
+# ------------------------------------------------------
+#
+# Use a cache variable name containing both the library and function name,
+# because the test really is for library $1 defining function $3, not
+# just for library $1.  Separate tests with the same $1 and different $3s
+# may have different results.
+#
+# Note that using directly AS_VAR_PUSHDEF([ac_Lib], [ac_cv_lib_$1_$3])
+# is asking for troubles, since AC_CHECK_LIB($lib, fun) would give
+# ac_cv_lib_$lib_fun, which is definitely not what was meant.  Hence
+# the AS_LITERAL_IF indirection.
+#
+# FIXME: This macro is extremely suspicious.  It DEFINEs unconditionnally,
+# whatever the FUNCTION, in addition to not being a *S macro.  Note
+# that the cache does depend upon the function we are looking for.
+#
+# It is on purpose we used `ac_check_lib_ext_save_LIBS' and not just
+# `ac_save_LIBS': there are many macros which don't want to see `LIBS'
+# changed but still want to use AC_CHECK_LIB_EXT, so they save `LIBS'.
+# And ``ac_save_LIBS' is too tempting a name, so let's leave them some
+# freedom.
+AC_DEFUN([AC_CHECK_LIB_EXT],
+[
+AH_CHECK_LIB_EXT([$1])
+ac_check_lib_ext_save_LIBS=$LIBS
+LIBS="-l$1 $$2 $7 $LIBS"
+AS_LITERAL_IF([$1],
+      [AS_VAR_PUSHDEF([ac_Lib_ext], [ac_cv_lib_ext_$1])],
+      [AS_VAR_PUSHDEF([ac_Lib_ext], [ac_cv_lib_ext_$1''])])dnl
+
+m4_ifval([$3],
+ [
+    AH_CHECK_FUNC_EXT([$3])
+    AS_LITERAL_IF([$1],
+              [AS_VAR_PUSHDEF([ac_Lib_func], [ac_cv_lib_ext_$1_$3])],
+              [AS_VAR_PUSHDEF([ac_Lib_func], [ac_cv_lib_ext_$1''_$3])])dnl
+    AC_CACHE_CHECK([for $3 in -l$1], ac_Lib_func,
+       [AC_TRY_LINK_FUNC($3,
+                 [AS_VAR_SET(ac_Lib_func, yes);
+                 AS_VAR_SET(ac_Lib_ext, yes)],
+                 [AS_VAR_SET(ac_Lib_func, no);
+                 AS_VAR_SET(ac_Lib_ext, no)])
+       ])
+    AS_IF([test AS_VAR_GET(ac_Lib_func) = yes],
+        [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_$3))])dnl
+    AS_VAR_POPDEF([ac_Lib_func])dnl
+ ],[
+    AC_CACHE_CHECK([for -l$1], ac_Lib_ext,
+       [AC_TRY_LINK_FUNC([main],
+                 [AS_VAR_SET(ac_Lib_ext, yes)],
+                 [AS_VAR_SET(ac_Lib_ext, no)])
+       ])
+ ])
+LIBS=$ac_check_lib_ext_save_LIBS
+
+AS_IF([test AS_VAR_GET(ac_Lib_ext) = yes],
+    [m4_default([$4], 
+        [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_LIB$1))
+               case "$$2" in
+                   *-l$1*)
+                       ;;
+                   *)
+                       $2="$$2 -l$1"
+                       ;;
+               esac])
+               [$6]
+           ],
+           [$5])dnl
+AS_VAR_POPDEF([ac_Lib_ext])dnl
+])# AC_CHECK_LIB_EXT
+
+# AH_CHECK_LIB_EXT(LIBNAME)
+# ---------------------
+m4_define([AH_CHECK_LIB_EXT],
+[AH_TEMPLATE(AS_TR_CPP(HAVE_LIB$1),
+             [Define to 1 if you have the `]$1[' library (-l]$1[).])])
+
+# AC_CHECK_FUNCS_EXT(FUNCTION, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -----------------------------------------------------------------
+dnl check for a function in a $LIBS and $OTHER_LIBS libraries variable.
+dnl AC_CHECK_FUNC_EXT(func,OTHER_LIBS,IF-TRUE,IF-FALSE)
+AC_DEFUN([AC_CHECK_FUNC_EXT],
+[
+    AH_CHECK_FUNC_EXT($1)      
+    ac_check_func_ext_save_LIBS=$LIBS
+    LIBS="$2 $LIBS"
+    AS_VAR_PUSHDEF([ac_var], [ac_cv_func_ext_$1])dnl
+    AC_CACHE_CHECK([for $1], ac_var,
+       [AC_LINK_IFELSE([AC_LANG_FUNC_LINK_TRY([$1])],
+                [AS_VAR_SET(ac_var, yes)],
+                [AS_VAR_SET(ac_var, no)])])
+    LIBS=$ac_check_func_ext_save_LIBS
+    AS_IF([test AS_VAR_GET(ac_var) = yes], 
+           [AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_$1])) $3], 
+           [$4])dnl
+AS_VAR_POPDEF([ac_var])dnl
+])# AC_CHECK_FUNC
+
+# AH_CHECK_FUNC_EXT(FUNCNAME)
+# ---------------------
+m4_define([AH_CHECK_FUNC_EXT],
+[AH_TEMPLATE(AS_TR_CPP(HAVE_$1),
+             [Define to 1 if you have the `]$1[' function.])])
+
 dnl Define an AC_DEFINE with ifndef guard.
 dnl AC_N_DEFINE(VARIABLE [, VALUE])
 define(AC_N_DEFINE,
index a2486acbd1122625e993e687c6c79c5b9f37399a..8316c4b61798607e9aaf1a6f33f1d6abaa5d64e3 100644 (file)
@@ -512,7 +512,7 @@ NTSTATUS make_auth_context_fixed(struct auth_context **auth_context, uchar chal[
                return nt_status;
        }
        
-       (*auth_context)->challenge = data_blob(chal, 8);
+       (*auth_context)->challenge = data_blob_talloc((*auth_context)->mem_ctx, chal, 8);
        (*auth_context)->challenge_set_by = "fixed";
        return nt_status;
 }
index 56bd6b9acab36c67ddd5b64b5503fb4b4efec118..aacea261febddf86eaa41e47c2bae2feb68a62a3 100644 (file)
@@ -69,7 +69,7 @@ static NTSTATUS connect_to_domain_password_server(struct cli_state **cli,
        /* Attempt connection */
        *retry = True;
        result = cli_full_connection(cli, global_myname(), dc_name, &dc_ip, 0, 
-               "IPC$", "IPC", "", "", "", 0, retry);
+               "IPC$", "IPC", "", "", "", 0, Undefined, retry);
 
        if (!NT_STATUS_IS_OK(result)) {
                /* map to something more useful */
@@ -104,7 +104,7 @@ machine %s. Error was : %s.\n", dc_name, cli_errstr(*cli)));
                return NT_STATUS_NO_LOGON_SERVERS;
        }
 
-       snprintf((*cli)->mach_acct, sizeof((*cli)->mach_acct) - 1, "%s$", setup_creds_as);
+       fstr_sprintf((*cli)->mach_acct, "%s$", setup_creds_as);
 
        if (!(*cli)->mach_acct) {
                release_server_mutex();
index a381219d74e24655011dea49e7c03d71234cd114..3af0cbaada4fe76dd920847453bc5cad70905315 100644 (file)
@@ -135,4 +135,3 @@ NTSTATUS auth_ntlmssp_update(AUTH_NTLMSSP_STATE *auth_ntlmssp_state,
 {
        return ntlmssp_server_update(auth_ntlmssp_state->ntlmssp_state, request, reply);
 }
-
index 012696f46a93c12268e669b720650a565c0f3c96..fb66d53cd4fee0bd8d4df8a00444a5c70c82ed50 100644 (file)
@@ -44,12 +44,12 @@ static BOOL smb_pwd_check_ntlmv1(const DATA_BLOB *nt_response,
        }
        
        if (sec_blob->length != 8) {
-               DEBUG(0, ("smb_pwd_check_ntlmv1: incorrect challenge size (%d)\n", sec_blob->length));
+               DEBUG(0, ("smb_pwd_check_ntlmv1: incorrect challenge size (%lu)\n", (unsigned long)sec_blob->length));
                return False;
        }
        
        if (nt_response->length != 24) {
-               DEBUG(0, ("smb_pwd_check_ntlmv1: incorrect password length (%d)\n", nt_response->length));
+               DEBUG(0, ("smb_pwd_check_ntlmv1: incorrect password length (%lu)\n", (unsigned long)nt_response->length));
                return False;
        }
 
@@ -103,8 +103,8 @@ static BOOL smb_pwd_check_ntlmv2(const DATA_BLOB *ntv2_response,
                /* We MUST have more than 16 bytes, or the stuff below will go
                   crazy.  No known implementation sends less than the 24 bytes
                   for LMv2, let alone NTLMv2. */
-               DEBUG(0, ("smb_pwd_check_ntlmv2: incorrect password length (%d)\n", 
-                         ntv2_response->length));
+               DEBUG(0, ("smb_pwd_check_ntlmv2: incorrect password length (%lu)\n", 
+                         (unsigned long)ntv2_response->length));
                return False;
        }
 
@@ -233,8 +233,8 @@ static NTSTATUS sam_password_ok(const struct auth_context *auth_context,
        
        if (auth_flags & AUTH_FLAG_LM_RESP) {
                if (user_info->lm_resp.length != 24) {
-                       DEBUG(2,("sam_password_ok: invalid LanMan password length (%d) for user %s\n", 
-                                user_info->nt_resp.length, pdb_get_username(sampass)));                
+                       DEBUG(2,("sam_password_ok: invalid LanMan password length (%lu) for user %s\n", 
+                                (unsigned long)user_info->nt_resp.length, pdb_get_username(sampass)));         
                }
                
                if (!lp_lanman_auth()) {
index 8e1b420b47382c536327954ff5da2fb2b8c00382..5403ee8c39a5999b0eb5d1084d441513bf59cb43 100644 (file)
@@ -68,7 +68,7 @@ void auth_add_user_script(const char *domain, const char *username)
         * user on the fly, do so.
         */
        
-       if ( lp_adduser_script() ) 
+       if ( *lp_adduser_script() )
                smb_create_user(domain, username, NULL);
        else {
                DEBUG(10,("auth_add_user_script: no 'add user script'.  Asking winbindd\n"));
@@ -133,7 +133,7 @@ static NTSTATUS make_user_info(auth_usersupplied_info **user_info,
 
        *user_info = malloc(sizeof(**user_info));
        if (!user_info) {
-               DEBUG(0,("malloc failed for user_info (size %d)\n", sizeof(*user_info)));
+               DEBUG(0,("malloc failed for user_info (size %lu)\n", (unsigned long)sizeof(*user_info)));
                return NT_STATUS_NO_MEMORY;
        }
 
@@ -489,9 +489,9 @@ void debug_nt_user_token(int dbg_class, int dbg_lev, NT_USER_TOKEN *token)
        
        DEBUGC(dbg_class, dbg_lev, ("NT user token of user %s\n",
                                    sid_to_string(sid_str, &token->user_sids[0]) ));
-       DEBUGADDC(dbg_class, dbg_lev, ("contains %i SIDs\n", token->num_sids));
+       DEBUGADDC(dbg_class, dbg_lev, ("contains %lu SIDs\n", (unsigned long)token->num_sids));
        for (i = 0; i < token->num_sids; i++)
-               DEBUGADDC(dbg_class, dbg_lev, ("SID[%3i]: %s\n", i, 
+               DEBUGADDC(dbg_class, dbg_lev, ("SID[%3lu]: %s\n", (unsigned long)i, 
                                               sid_to_string(sid_str, &token->user_sids[i])));
 }
 
index d9c3a7aa1b197b6c05628d247150cb27ccae434a..ec29f44e6e0d261f3112c8d12410edd22574c15e 100644 (file)
@@ -438,7 +438,8 @@ static void add_to_do_list_queue(const char* entry)
        }
        if (do_list_queue)
        {
-               pstrcpy(do_list_queue + do_list_queue_end, entry);
+               safe_strcpy_base(do_list_queue + do_list_queue_end, 
+                                entry, do_list_queue, do_list_queue_size);
                do_list_queue_end = new_end;
                DEBUG(4,("added %s to do_list_queue (start=%d, end=%d)\n",
                         entry, (int)do_list_queue_start, (int)do_list_queue_end));
@@ -481,6 +482,11 @@ static void do_list_helper(file_info *f, const char *mask, void *state)
                        pstring mask2;
                        char *p;
 
+                       if (!f->name[0]) {
+                               d_printf("Empty dir name returned. Possible server misconfiguration.\n");
+                               return;
+                       }
+
                        pstrcpy(mask2, mask);
                        p = strrchr_m(mask2,'\\');
                        if (!p) return;
@@ -2285,9 +2291,9 @@ static char **remote_completion(const char *text, int len)
        if (i > 0) {
                strncpy(info.dirmask, text, i+1);
                info.dirmask[i+1] = 0;
-               snprintf(dirmask, sizeof(dirmask), "%s%*s*", cur_dir, i-1, text);
+               pstr_sprintf(dirmask, "%s%*s*", cur_dir, i-1, text);
        } else
-               snprintf(dirmask, sizeof(dirmask), "%s*", cur_dir);
+               pstr_sprintf(dirmask, "%s*", cur_dir);
 
        if (cli_list(cli, dirmask, aDIR | aSYSTEM | aHIDDEN, completion_remote_filter, &info) < 0)
                goto cleanup;
@@ -2523,6 +2529,8 @@ static struct cli_state *do_connect(const char *server, const char *share)
 
        c->protocol = max_protocol;
        c->use_kerberos = use_kerberos;
+       cli_setup_signing_state(c, cmdline_auth_info.signing_state);
+               
 
        if (!cli_session_request(c, &calling, &called)) {
                char *p;
@@ -2816,9 +2824,25 @@ static void remember_query_host(const char *arg,
                        max_protocol = interpret_protocol(poptGetOptArg(pc), max_protocol);
                        break;
                case 'T':
-                       if (!tar_parseargs(argc, argv, poptGetOptArg(pc), optind)) {
-                               poptPrintUsage(pc, stderr, 0);
-                               exit(1);
+                       /* We must use old option processing for this. Find the
+                        * position of the -T option in the raw argv[]. */
+                       {
+                               int i, optnum;
+                               for (i = 1; i < argc; i++) {
+                                       if (strncmp("-T", argv[i],2)==0)
+                                               break;
+                               }
+                               i++;
+                               if (!(optnum = tar_parseargs(argc, argv, poptGetOptArg(pc), i))) {
+                                       poptPrintUsage(pc, stderr, 0);
+                                       exit(1);
+                               }
+                               /* Now we must eat (optnum - i) options - they have
+                                * been processed by tar_parseargs().
+                                */
+                               optnum -= i;
+                               for (i = 0; i < optnum; i++)
+                                       poptGetOptArg(pc);
                        }
                        break;
                case 'D':
@@ -2843,7 +2867,7 @@ static void remember_query_host(const char *arg,
                }
        }
 
-       if (poptPeekArg(pc)) { 
+       if (poptPeekArg(pc) && !cmdline_auth_info.got_pass) { 
                cmdline_auth_info.got_pass = True;
                pstrcpy(cmdline_auth_info.password,poptGetArg(pc));  
        }
index 765bc2a6594778241f6a1577542d8186846563ad..5295de8010ba75fa51c063a54bd640b5e6373c56 100644 (file)
@@ -43,27 +43,23 @@ static int clipfind(char **aret, int ret, char *tok);
 
 typedef struct file_info_struct file_info2;
 
-struct file_info_struct
-{
-  SMB_BIG_UINT size;
-  uint16 mode;
-  uid_t uid;
-  gid_t gid;
-  /* These times are normally kept in GMT */
-  time_t mtime;
-  time_t atime;
-  time_t ctime;
-  char *name;     /* This is dynamically allocate */
-
-  file_info2 *next, *prev;  /* Used in the stack ... */
-
+struct file_info_struct {
+       SMB_BIG_UINT size;
+       uint16 mode;
+       uid_t uid;
+       gid_t gid;
+       /* These times are normally kept in GMT */
+       time_t mtime;
+       time_t atime;
+       time_t ctime;
+       char *name;     /* This is dynamically allocate */
+
+       file_info2 *next, *prev;  /* Used in the stack ... */
 };
 
-typedef struct
-{
-  file_info2 *top;
-  int items;
-
+typedef struct {
+       file_info2 *top;
+       int items;
 } stack;
 
 #define SEPARATORS " \t\n\r"
@@ -145,285 +141,284 @@ static void unfixtarname(char *tptr, char *fp, int l, BOOL first);
 /*******************************************************************
 Create  a string of size size+1 (for the null)
 *******************************************************************/
+
 static char *string_create_s(int size)
 {
-  char *tmp;
+       char *tmp;
 
-  tmp = (char *)malloc(size+1);
+       tmp = (char *)malloc(size+1);
 
-  if (tmp == NULL) {
-
-    DEBUG(0, ("Out of memory in string_create_s\n"));
-
-  }
-
-  return(tmp);
+       if (tmp == NULL) {
+               DEBUG(0, ("Out of memory in string_create_s\n"));
+       }
 
+       return(tmp);
 }
 
 /****************************************************************************
 Write a tar header to buffer
 ****************************************************************************/
+
 static void writetarheader(int f, const char *aname, SMB_BIG_UINT size, time_t mtime,
                           const char *amode, unsigned char ftype)
 {
-  union hblock hb;
-  int i, chk, l;
-  char *jp;
+       union hblock hb;
+       int i, chk, l;
+       char *jp;
 
-  DEBUG(5, ("WriteTarHdr, Type = %c, Size= %.0f, Name = %s\n", ftype, (double)size, aname));
+       DEBUG(5, ("WriteTarHdr, Type = %c, Size= %.0f, Name = %s\n", ftype, (double)size, aname));
 
-  memset(hb.dummy, 0, sizeof(hb.dummy));
+       memset(hb.dummy, 0, sizeof(hb.dummy));
   
-  l=strlen(aname);
-  if (l >= NAMSIZ - 1) {
-         /* write a GNU tar style long header */
-         char *b;
-         b = (char *)malloc(l+TBLOCK+100);
-         if (!b) {
-                 DEBUG(0,("out of memory\n"));
-                 exit(1);
-         }
-         writetarheader(f, "/./@LongLink", l+2, 0, "     0 \0", 'L');
-         memset(b, 0, l+TBLOCK+100);
-         fixtarname(b, aname, l);
-         i = strlen(b)+1;
-         DEBUG(5, ("File name in tar file: %s, size=%d, \n", b, (int)strlen(b)));
-         dotarbuf(f, b, TBLOCK*(((i-1)/TBLOCK)+1));
-         SAFE_FREE(b);
-  }
-
-  /* use l + 1 to do the null too */
-  fixtarname(hb.dbuf.name, aname, (l >= NAMSIZ) ? NAMSIZ : l + 1);
-
-  if (lowercase)
-    strlower_m(hb.dbuf.name);
-
-  /* write out a "standard" tar format header */
-
-  hb.dbuf.name[NAMSIZ-1]='\0';
-  safe_strcpy(hb.dbuf.mode, amode, sizeof(hb.dbuf.mode)-1);
-  oct_it((SMB_BIG_UINT)0, 8, hb.dbuf.uid);
-  oct_it((SMB_BIG_UINT)0, 8, hb.dbuf.gid);
-  oct_it((SMB_BIG_UINT) size, 13, hb.dbuf.size);
-  if (size > (SMB_BIG_UINT)077777777777LL) {    
-
-         /* This is a non-POSIX compatible extention to store files
-            greater than 8GB. */
-
-         memset(hb.dbuf.size, 0, 4);
-         hb.dbuf.size[0]=128;
-         for (i = 8, jp=(char*)&size; i; i--)
-                 hb.dbuf.size[i+3] = *(jp++);
-  }
-  oct_it((SMB_BIG_UINT) mtime, 13, hb.dbuf.mtime);
-  memcpy(hb.dbuf.chksum, "        ", sizeof(hb.dbuf.chksum));
-  memset(hb.dbuf.linkname, 0, NAMSIZ);
-  hb.dbuf.linkflag=ftype;
+       l=strlen(aname);
+       if (l >= NAMSIZ - 1) {
+               /* write a GNU tar style long header */
+               char *b;
+               b = (char *)malloc(l+TBLOCK+100);
+               if (!b) {
+                       DEBUG(0,("out of memory\n"));
+                       exit(1);
+               }
+               writetarheader(f, "/./@LongLink", l+2, 0, "     0 \0", 'L');
+               memset(b, 0, l+TBLOCK+100);
+               fixtarname(b, aname, l);
+               i = strlen(b)+1;
+               DEBUG(5, ("File name in tar file: %s, size=%d, \n", b, (int)strlen(b)));
+               dotarbuf(f, b, TBLOCK*(((i-1)/TBLOCK)+1));
+               SAFE_FREE(b);
+       }
+
+       /* use l + 1 to do the null too */
+       fixtarname(hb.dbuf.name, aname, (l >= NAMSIZ) ? NAMSIZ : l + 1);
+
+       if (lowercase)
+               strlower_m(hb.dbuf.name);
+
+       /* write out a "standard" tar format header */
+
+       hb.dbuf.name[NAMSIZ-1]='\0';
+       safe_strcpy(hb.dbuf.mode, amode, sizeof(hb.dbuf.mode)-1);
+       oct_it((SMB_BIG_UINT)0, 8, hb.dbuf.uid);
+       oct_it((SMB_BIG_UINT)0, 8, hb.dbuf.gid);
+       oct_it((SMB_BIG_UINT) size, 13, hb.dbuf.size);
+       if (size > (SMB_BIG_UINT)077777777777LL) {    
+
+               /* This is a non-POSIX compatible extention to store files
+                       greater than 8GB. */
+
+               memset(hb.dbuf.size, 0, 4);
+               hb.dbuf.size[0]=128;
+               for (i = 8, jp=(char*)&size; i; i--)
+                       hb.dbuf.size[i+3] = *(jp++);
+       }
+       oct_it((SMB_BIG_UINT) mtime, 13, hb.dbuf.mtime);
+       memcpy(hb.dbuf.chksum, "        ", sizeof(hb.dbuf.chksum));
+       memset(hb.dbuf.linkname, 0, NAMSIZ);
+       hb.dbuf.linkflag=ftype;
   
-  for (chk=0, i=sizeof(hb.dummy), jp=hb.dummy; --i>=0;) chk+=(0xFF & *jp++);
+       for (chk=0, i=sizeof(hb.dummy), jp=hb.dummy; --i>=0;)
+               chk+=(0xFF & *jp++);
 
-  oct_it((SMB_BIG_UINT) chk, 8, hb.dbuf.chksum);
-  hb.dbuf.chksum[6] = '\0';
+       oct_it((SMB_BIG_UINT) chk, 8, hb.dbuf.chksum);
+       hb.dbuf.chksum[6] = '\0';
 
-  (void) dotarbuf(f, hb.dummy, sizeof(hb.dummy));
+       (void) dotarbuf(f, hb.dummy, sizeof(hb.dummy));
 }
 
 /****************************************************************************
 Read a tar header into a hblock structure, and validate
 ***************************************************************************/
+
 static long readtarheader(union hblock *hb, file_info2 *finfo, char *prefix)
 {
-  long chk, fchk;
-  int i;
-  char *jp;
-
-  /*
-   * read in a "standard" tar format header - we're not that interested
-   * in that many fields, though
-   */
-
-  /* check the checksum */
-  for (chk=0, i=sizeof(hb->dummy), jp=hb->dummy; --i>=0;) chk+=(0xFF & *jp++);
+       long chk, fchk;
+       int i;
+       char *jp;
 
-  if (chk == 0)
-    return chk;
-
-  /* compensate for blanks in chksum header */
-  for (i=sizeof(hb->dbuf.chksum), jp=hb->dbuf.chksum; --i>=0;)
-    chk-=(0xFF & *jp++);
+       /*
+        * read in a "standard" tar format header - we're not that interested
+        * in that many fields, though
+        */
 
-  chk += ' ' * sizeof(hb->dbuf.chksum);
+       /* check the checksum */
+       for (chk=0, i=sizeof(hb->dummy), jp=hb->dummy; --i>=0;)
+               chk+=(0xFF & *jp++);
 
-  fchk=unoct(hb->dbuf.chksum, sizeof(hb->dbuf.chksum));
+       if (chk == 0)
+               return chk;
 
-  DEBUG(5, ("checksum totals chk=%ld fchk=%ld chksum=%s\n",
-           chk, fchk, hb->dbuf.chksum));
+       /* compensate for blanks in chksum header */
+       for (i=sizeof(hb->dbuf.chksum), jp=hb->dbuf.chksum; --i>=0;)
+               chk-=(0xFF & *jp++);
 
-  if (fchk != chk)
-    {
-      DEBUG(0, ("checksums don't match %ld %ld\n", fchk, chk));
-      dump_data(5, (char *)hb - TBLOCK, TBLOCK *3);
-      return -1;
-    }
+       chk += ' ' * sizeof(hb->dbuf.chksum);
 
-  if ((finfo->name = string_create_s(strlen(prefix) + strlen(hb -> dbuf.name) + 3)) == NULL) {
+       fchk=unoct(hb->dbuf.chksum, sizeof(hb->dbuf.chksum));
 
-    DEBUG(0, ("Out of space creating file_info2 for %s\n", hb -> dbuf.name));
-    return(-1);
+       DEBUG(5, ("checksum totals chk=%ld fchk=%ld chksum=%s\n",
+                       chk, fchk, hb->dbuf.chksum));
 
-  }
+       if (fchk != chk) {
+               DEBUG(0, ("checksums don't match %ld %ld\n", fchk, chk));
+               dump_data(5, (char *)hb - TBLOCK, TBLOCK *3);
+               return -1;
+       }
 
-  safe_strcpy(finfo->name, prefix, strlen(prefix) + strlen(hb -> dbuf.name) + 3);
+       if ((finfo->name = string_create_s(strlen(prefix) + strlen(hb -> dbuf.name) + 3)) == NULL) {
+               DEBUG(0, ("Out of space creating file_info2 for %s\n", hb -> dbuf.name));
+               return(-1);
+       }
 
-  /* use l + 1 to do the null too; do prefix - prefcnt to zap leading slash */
-  unfixtarname(finfo->name + strlen(prefix), hb->dbuf.name,
-              strlen(hb->dbuf.name) + 1, True);
+       safe_strcpy(finfo->name, prefix, strlen(prefix) + strlen(hb -> dbuf.name) + 3);
+
+       /* use l + 1 to do the null too; do prefix - prefcnt to zap leading slash */
+       unfixtarname(finfo->name + strlen(prefix), hb->dbuf.name,
+               strlen(hb->dbuf.name) + 1, True);
+
+       /* can't handle some links at present */
+       if ((hb->dbuf.linkflag != '0') && (hb -> dbuf.linkflag != '5')) {
+               if (hb->dbuf.linkflag == 0) {
+                       DEBUG(6, ("Warning: NULL link flag (gnu tar archive ?) %s\n",
+                               finfo->name));
+               } else { 
+                       if (hb -> dbuf.linkflag == 'L') { /* We have a longlink */
+                               /* Do nothing here at the moment. do_tarput will handle this
+                                       as long as the longlink gets back to it, as it has to advance 
+                                       the buffer pointer, etc */
+                       } else {
+                               DEBUG(0, ("this tar file appears to contain some kind \
+of link other than a GNUtar Longlink - ignoring\n"));
+                               return -2;
+                       }
+               }
+       }
+    
+       if ((unoct(hb->dbuf.mode, sizeof(hb->dbuf.mode)) & S_IFDIR) ||
+                               (*(finfo->name+strlen(finfo->name)-1) == '\\')) {
+               finfo->mode=aDIR;
+       } else {
+               finfo->mode=0; /* we don't care about mode at the moment, we'll
+                               * just make it a regular file */
+       }
 
-  /* can't handle some links at present */
-  if ((hb->dbuf.linkflag != '0') && (hb -> dbuf.linkflag != '5')) {
-    if (hb->dbuf.linkflag == 0) {
-      DEBUG(6, ("Warning: NULL link flag (gnu tar archive ?) %s\n",
-               finfo->name));
-    } else { 
-      if (hb -> dbuf.linkflag == 'L') { /* We have a longlink */
-         /* Do nothing here at the moment. do_tarput will handle this
-            as long as the longlink gets back to it, as it has to advance 
-            the buffer pointer, etc */
+       /*
+        * Bug fix by richard@sj.co.uk
+        *
+        * REC: restore times correctly (as does tar)
+        * We only get the modification time of the file; set the creation time
+        * from the mod. time, and the access time to current time
+        */
+       finfo->mtime = finfo->ctime = strtol(hb->dbuf.mtime, NULL, 8);
+       finfo->atime = time(NULL);
+       finfo->size = unoct(hb->dbuf.size, sizeof(hb->dbuf.size));
 
-      } else {
-        DEBUG(0, ("this tar file appears to contain some kind of link other than a GNUtar Longlink - ignoring\n"));
-        return -2;
-      }
-    }
-  }
-    
-  if ((unoct(hb->dbuf.mode, sizeof(hb->dbuf.mode)) & S_IFDIR)
-    || (*(finfo->name+strlen(finfo->name)-1) == '\\'))
-    {
-      finfo->mode=aDIR;
-    }
-  else
-    finfo->mode=0; /* we don't care about mode at the moment, we'll
-                   * just make it a regular file */
-  /*
-   * Bug fix by richard@sj.co.uk
-   *
-   * REC: restore times correctly (as does tar)
-   * We only get the modification time of the file; set the creation time
-   * from the mod. time, and the access time to current time
-   */
-  finfo->mtime = finfo->ctime = strtol(hb->dbuf.mtime, NULL, 8);
-  finfo->atime = time(NULL);
-  finfo->size = unoct(hb->dbuf.size, sizeof(hb->dbuf.size));
-
-  return True;
+       return True;
 }
 
 /****************************************************************************
 Write out the tar buffer to tape or wherever
 ****************************************************************************/
+
 static int dotarbuf(int f, char *b, int n)
 {
-  int fail=1, writ=n;
-
-  if (dry_run) {
-    return writ;
-  }
-  /* This routine and the next one should be the only ones that do write()s */
-  if (tp + n >= tbufsiz)
-    {
-      int diff;
-
-      diff=tbufsiz-tp;
-      memcpy(tarbuf + tp, b, diff);
-      fail=fail && (1+write(f, tarbuf, tbufsiz));
-      n-=diff;
-      b+=diff;
-      tp=0;
-
-      while (n >= tbufsiz)
-       {
-         fail=fail && (1 + write(f, b, tbufsiz));
-         n-=tbufsiz;
-         b+=tbufsiz;
+       int fail=1, writ=n;
+
+       if (dry_run) {
+               return writ;
+       }
+       /* This routine and the next one should be the only ones that do write()s */
+       if (tp + n >= tbufsiz) {
+               int diff;
+
+               diff=tbufsiz-tp;
+               memcpy(tarbuf + tp, b, diff);
+               fail=fail && (1+write(f, tarbuf, tbufsiz));
+               n-=diff;
+               b+=diff;
+               tp=0;
+
+               while (n >= tbufsiz) {
+                       fail=fail && (1 + write(f, b, tbufsiz));
+                       n-=tbufsiz;
+                       b+=tbufsiz;
+               }
        }
-    }
-  if (n>0) {
-    memcpy(tarbuf+tp, b, n);
-    tp+=n;
-  }
 
-  return(fail ? writ : 0);
+       if (n>0) {
+               memcpy(tarbuf+tp, b, n);
+               tp+=n;
+       }
+
+       return(fail ? writ : 0);
 }
 
 /****************************************************************************
 Write zeros to buffer / tape
 ****************************************************************************/
+
 static void dozerobuf(int f, int n)
 {
-  /* short routine just to write out n zeros to buffer -
-   * used to round files to nearest block
-   * and to do tar EOFs */
+       /* short routine just to write out n zeros to buffer -
+        * used to round files to nearest block
+        * and to do tar EOFs */
 
-  if (dry_run)
-    return;
+       if (dry_run)
+               return;
   
-  if (n+tp >= tbufsiz)
-    {
-      memset(tarbuf+tp, 0, tbufsiz-tp);
-
-      write(f, tarbuf, tbufsiz);
-      memset(tarbuf, 0, (tp+=n-tbufsiz));
-    }
-  else
-    {
-      memset(tarbuf+tp, 0, n);
-      tp+=n;
-    }
+       if (n+tp >= tbufsiz) {
+               memset(tarbuf+tp, 0, tbufsiz-tp);
+               write(f, tarbuf, tbufsiz);
+               memset(tarbuf, 0, (tp+=n-tbufsiz));
+       } else {
+               memset(tarbuf+tp, 0, n);
+               tp+=n;
+       }
 }
 
 /****************************************************************************
 Malloc tape buffer
 ****************************************************************************/
+
 static void initarbuf(void)
 {
-  /* initialize tar buffer */
-  tbufsiz=blocksize*TBLOCK;
-  tarbuf=malloc(tbufsiz);      /* FIXME: We might not get the buffer */
+       /* initialize tar buffer */
+       tbufsiz=blocksize*TBLOCK;
+       tarbuf=malloc(tbufsiz);      /* FIXME: We might not get the buffer */
 
-  /* reset tar buffer pointer and tar file counter and total dumped */
-  tp=0; ntarf=0; ttarf=0;
+       /* reset tar buffer pointer and tar file counter and total dumped */
+       tp=0; ntarf=0; ttarf=0;
 }
 
 /****************************************************************************
 Write two zero blocks at end of file
 ****************************************************************************/
+
 static void dotareof(int f)
 {
-  SMB_STRUCT_STAT stbuf;
-  /* Two zero blocks at end of file, write out full buffer */
+       SMB_STRUCT_STAT stbuf;
+       /* Two zero blocks at end of file, write out full buffer */
 
-  if (dry_run)
-    return;
+       if (dry_run)
+               return;
 
-  (void) dozerobuf(f, TBLOCK);
-  (void) dozerobuf(f, TBLOCK);
+       (void) dozerobuf(f, TBLOCK);
+       (void) dozerobuf(f, TBLOCK);
 
-  if (sys_fstat(f, &stbuf) == -1)
-    {
-      DEBUG(0, ("Couldn't stat file handle\n"));
-      return;
-    }
+       if (sys_fstat(f, &stbuf) == -1) {
+               DEBUG(0, ("Couldn't stat file handle\n"));
+               return;
+       }
 
-  /* Could be a pipe, in which case S_ISREG should fail,
-   * and we should write out at full size */
-  if (tp > 0) write(f, tarbuf, S_ISREG(stbuf.st_mode) ? tp : tbufsiz);
+       /* Could be a pipe, in which case S_ISREG should fail,
+               * and we should write out at full size */
+       if (tp > 0)
+               write(f, tarbuf, S_ISREG(stbuf.st_mode) ? tp : tbufsiz);
 }
 
 /****************************************************************************
 (Un)mangle DOS pathname, make nonabsolute
 ****************************************************************************/
+
 static void fixtarname(char *tptr, const char *fp, int l)
 {
        /* add a '.' to start of file name, convert from ugly dos \'s in path
@@ -437,43 +432,43 @@ static void fixtarname(char *tptr, const char *fp, int l)
 /****************************************************************************
 Convert from decimal to octal string
 ****************************************************************************/
+
 static void oct_it (SMB_BIG_UINT value, int ndgs, char *p)
 {
-  /* Converts long to octal string, pads with leading zeros */
+       /* Converts long to octal string, pads with leading zeros */
 
-  /* skip final null, but do final space */
-  --ndgs;
-  p[--ndgs] = ' ';
+       /* skip final null, but do final space */
+       --ndgs;
+       p[--ndgs] = ' ';
  
-  /* Loop does at least one digit */
-  do {
-      p[--ndgs] = '0' + (char) (value & 7);
-      value >>= 3;
-    }
-  while (ndgs > 0 && value != 0);
+       /* Loop does at least one digit */
+       do {
+               p[--ndgs] = '0' + (char) (value & 7);
+               value >>= 3;
+       } while (ndgs > 0 && value != 0);
  
-  /* Do leading zeros */
-  while (ndgs > 0)
-    p[--ndgs] = '0';
+       /* Do leading zeros */
+       while (ndgs > 0)
+               p[--ndgs] = '0';
 }
 
 /****************************************************************************
 Convert from octal string to long
 ***************************************************************************/
+
 static long unoct(char *p, int ndgs)
 {
-  long value=0;
-  /* Converts octal string to long, ignoring any non-digit */
+       long value=0;
+       /* Converts octal string to long, ignoring any non-digit */
 
-  while (--ndgs)
-    {
-      if (isdigit((int)*p))
-        value = (value << 3) | (long) (*p - '0');
+       while (--ndgs) {
+               if (isdigit((int)*p))
+                       value = (value << 3) | (long) (*p - '0');
 
-      p++;
-    }
+               p++;
+       }
 
-  return value;
+       return value;
 }
 
 /****************************************************************************
@@ -481,90 +476,86 @@ Compare two strings in a slash insensitive way, allowing s1 to match s2
 if s1 is an "initial" string (up to directory marker).  Thus, if s2 is 
 a file in any subdirectory of s1, declare a match.
 ***************************************************************************/
+
 static int strslashcmp(char *s1, char *s2)
 {
-  char *s1_0=s1;
+       char *s1_0=s1;
 
-  while(*s1 && *s2 &&
-       (*s1 == *s2
-        || tolower(*s1) == tolower(*s2)
-        || (*s1 == '\\' && *s2=='/')
-        || (*s1 == '/' && *s2=='\\'))) {
-         s1++; s2++;
-  }
+       while(*s1 && *s2 && (*s1 == *s2 || tolower(*s1) == tolower(*s2) ||
+                               (*s1 == '\\' && *s2=='/') || (*s1 == '/' && *s2=='\\'))) {
+               s1++; s2++;
+       }
 
-  /* if s1 has a trailing slash, it compared equal, so s1 is an "initial" 
-     string of s2.
-   */
-  if (!*s1 && s1 != s1_0 && (*(s1-1) == '/' || *(s1-1) == '\\')) return 0;
+       /* if s1 has a trailing slash, it compared equal, so s1 is an "initial" 
+               string of s2.
+       */
+       if (!*s1 && s1 != s1_0 && (*(s1-1) == '/' || *(s1-1) == '\\'))
+               return 0;
 
-  /* ignore trailing slash on s1 */
-  if (!*s2 && (*s1 == '/' || *s1 == '\\') && !*(s1+1)) return 0;
+       /* ignore trailing slash on s1 */
+       if (!*s2 && (*s1 == '/' || *s1 == '\\') && !*(s1+1))
+               return 0;
 
-  /* check for s1 is an "initial" string of s2 */
-  if ((*s2 == '/' || *s2 == '\\') && !*s1) return 0;
+       /* check for s1 is an "initial" string of s2 */
+       if ((*s2 == '/' || *s2 == '\\') && !*s1)
+               return 0;
 
-  return *s1-*s2;
+       return *s1-*s2;
 }
 
-
 /****************************************************************************
 Ensure a remote path exists (make if necessary)
 ***************************************************************************/
+
 static BOOL ensurepath(char *fname)
 {
-  /* *must* be called with buffer ready malloc'ed */
-  /* ensures path exists */
-
-  char *partpath, *ffname;
-  char *p=fname, *basehack;
-
-  DEBUG(5, ( "Ensurepath called with: %s\n", fname));
+       /* *must* be called with buffer ready malloc'ed */
+       /* ensures path exists */
 
-  partpath = string_create_s(strlen(fname));
-  ffname = string_create_s(strlen(fname));
+       char *partpath, *ffname;
+       char *p=fname, *basehack;
 
-  if ((partpath == NULL) || (ffname == NULL)){
+       DEBUG(5, ( "Ensurepath called with: %s\n", fname));
 
-    DEBUG(0, ("Out of memory in ensurepath: %s\n", fname));
-    return(False);
+       partpath = string_create_s(strlen(fname));
+       ffname = string_create_s(strlen(fname));
 
-  }
+       if ((partpath == NULL) || (ffname == NULL)){
+               DEBUG(0, ("Out of memory in ensurepath: %s\n", fname));
+               return(False);
+       }
 
-  *partpath = 0;
+       *partpath = 0;
 
-  /* fname copied to ffname so can strtok */
+       /* fname copied to ffname so can strtok */
 
-  safe_strcpy(ffname, fname, strlen(fname));
+       safe_strcpy(ffname, fname, strlen(fname));
 
-  /* do a `basename' on ffname, so don't try and make file name directory */
-  if ((basehack=strrchr_m(ffname, '\\')) == NULL)
-    return True;
-  else
-    *basehack='\0';
+       /* do a `basename' on ffname, so don't try and make file name directory */
+       if ((basehack=strrchr_m(ffname, '\\')) == NULL)
+               return True;
+       else
+               *basehack='\0';
 
-  p=strtok(ffname, "\\");
+       p=strtok(ffname, "\\");
 
-  while (p)
-    {
-      safe_strcat(partpath, p, strlen(fname) + 1);
+       while (p) {
+               safe_strcat(partpath, p, strlen(fname) + 1);
 
-      if (!cli_chkpath(cli, partpath)) {
-       if (!cli_mkdir(cli, partpath))
-         {
-           DEBUG(0, ("Error mkdirhiering\n"));
-           return False;
-         }
-       else
-         DEBUG(3, ("mkdirhiering %s\n", partpath));
-
-      }
+               if (!cli_chkpath(cli, partpath)) {
+                       if (!cli_mkdir(cli, partpath)) {
+                               DEBUG(0, ("Error mkdirhiering\n"));
+                               return False;
+                       } else {
+                               DEBUG(3, ("mkdirhiering %s\n", partpath));
+                       }
+               }
 
-      safe_strcat(partpath, "\\", strlen(fname) + 1);
-      p = strtok(NULL,"/\\");
-    }
+               safe_strcat(partpath, "\\", strlen(fname) + 1);
+               p = strtok(NULL,"/\\");
+       }
 
-    return True;
+       return True;
 }
 
 static int padit(char *buf, int bufsize, int padsize)
@@ -583,7 +574,6 @@ static int padit(char *buf, int bufsize, int padsize)
        return berr;
 }
 
-
 static void do_setrattr(char *name, uint16 attr, int set)
 {
        uint16 oldattr;
@@ -601,268 +591,258 @@ static void do_setrattr(char *name, uint16 attr, int set)
        }
 }
 
-
 /****************************************************************************
 append one remote file to the tar file
 ***************************************************************************/
+
 static void do_atar(char *rname,char *lname,file_info *finfo1)
 {
-  int fnum;
-  SMB_BIG_UINT nread=0;
-  char ftype;
-  file_info2 finfo;
-  BOOL close_done = False;
-  BOOL shallitime=True;
-  char data[65520];
-  int read_size = 65520;
-  int datalen=0;
-
-  struct timeval tp_start;
-  GetTimeOfDay(&tp_start);
-
-  ftype = '0'; /* An ordinary file ... */
-
-  if (finfo1) {
-    finfo.size  = finfo1 -> size;
-    finfo.mode  = finfo1 -> mode;
-    finfo.uid   = finfo1 -> uid;
-    finfo.gid   = finfo1 -> gid;
-    finfo.mtime = finfo1 -> mtime;
-    finfo.atime = finfo1 -> atime;
-    finfo.ctime = finfo1 -> ctime;
-    finfo.name  = finfo1 -> name;
-  }
-  else {
-    finfo.size  = def_finfo.size;
-    finfo.mode  = def_finfo.mode;
-    finfo.uid   = def_finfo.uid;
-    finfo.gid   = def_finfo.gid;
-    finfo.mtime = def_finfo.mtime;
-    finfo.atime = def_finfo.atime;
-    finfo.ctime = def_finfo.ctime;
-    finfo.name  = def_finfo.name;
-  }
-
-  if (dry_run)
-    {
-      DEBUG(3,("skipping file %s of size %12.0f bytes\n",
-              finfo.name,
-              (double)finfo.size));
-      shallitime=0;
-      ttarf+=finfo.size + TBLOCK - (finfo.size % TBLOCK);
-      ntarf++;
-      return;
-    }
-
-  fnum = cli_open(cli, rname, O_RDONLY, DENY_NONE);
-
-  dos_clean_name(rname);
-
-  if (fnum == -1) {
-         DEBUG(0,("%s opening remote file %s (%s)\n",
-                  cli_errstr(cli),rname, cur_dir));
-         return;
-  }
-
-  finfo.name = string_create_s(strlen(rname));
-  if (finfo.name == NULL) {
-         DEBUG(0, ("Unable to allocate space for finfo.name in do_atar\n"));
-         return;
-  }
-
-  safe_strcpy(finfo.name,rname, strlen(rname));
-  if (!finfo1) {
-         if (!cli_getattrE(cli, fnum, &finfo.mode, &finfo.size, NULL, &finfo.atime, &finfo.mtime)) {
-                 DEBUG(0, ("getattrE: %s\n", cli_errstr(cli)));
-                 return;
-         }
-         finfo.ctime = finfo.mtime;
-  }
-
-  DEBUG(3,("file %s attrib 0x%X\n",finfo.name,finfo.mode));
-
-  if (tar_inc && !(finfo.mode & aARCH))
-    {
-      DEBUG(4, ("skipping %s - archive bit not set\n", finfo.name));
-      shallitime=0;
-    }
-  else if (!tar_system && (finfo.mode & aSYSTEM))
-    {
-      DEBUG(4, ("skipping %s - system bit is set\n", finfo.name));
-      shallitime=0;
-    }
-  else if (!tar_hidden && (finfo.mode & aHIDDEN))
-    {
-      DEBUG(4, ("skipping %s - hidden bit is set\n", finfo.name));
-      shallitime=0;
-    }
-  else
-    {
-      DEBUG(3,("getting file %s of size %.0f bytes as a tar file %s",
-              finfo.name,
-              (double)finfo.size,
-              lname));
+       int fnum;
+       SMB_BIG_UINT nread=0;
+       char ftype;
+       file_info2 finfo;
+       BOOL close_done = False;
+       BOOL shallitime=True;
+       char data[65520];
+       int read_size = 65520;
+       int datalen=0;
+
+       struct timeval tp_start;
+
+       GetTimeOfDay(&tp_start);
+
+       ftype = '0'; /* An ordinary file ... */
+
+       if (finfo1) {
+               finfo.size  = finfo1 -> size;
+               finfo.mode  = finfo1 -> mode;
+               finfo.uid   = finfo1 -> uid;
+               finfo.gid   = finfo1 -> gid;
+               finfo.mtime = finfo1 -> mtime;
+               finfo.atime = finfo1 -> atime;
+               finfo.ctime = finfo1 -> ctime;
+               finfo.name  = finfo1 -> name;
+       } else {
+               finfo.size  = def_finfo.size;
+               finfo.mode  = def_finfo.mode;
+               finfo.uid   = def_finfo.uid;
+               finfo.gid   = def_finfo.gid;
+               finfo.mtime = def_finfo.mtime;
+               finfo.atime = def_finfo.atime;
+               finfo.ctime = def_finfo.ctime;
+               finfo.name  = def_finfo.name;
+       }
+
+       if (dry_run) {
+               DEBUG(3,("skipping file %s of size %12.0f bytes\n", finfo.name,
+                               (double)finfo.size));
+               shallitime=0;
+               ttarf+=finfo.size + TBLOCK - (finfo.size % TBLOCK);
+               ntarf++;
+               return;
+       }
+
+       fnum = cli_open(cli, rname, O_RDONLY, DENY_NONE);
+
+       dos_clean_name(rname);
+
+       if (fnum == -1) {
+               DEBUG(0,("%s opening remote file %s (%s)\n",
+                               cli_errstr(cli),rname, cur_dir));
+               return;
+       }
+
+       finfo.name = string_create_s(strlen(rname));
+       if (finfo.name == NULL) {
+               DEBUG(0, ("Unable to allocate space for finfo.name in do_atar\n"));
+               return;
+       }
+
+       safe_strcpy(finfo.name,rname, strlen(rname));
+       if (!finfo1) {
+               if (!cli_getattrE(cli, fnum, &finfo.mode, &finfo.size, NULL, &finfo.atime, &finfo.mtime)) {
+                       DEBUG(0, ("getattrE: %s\n", cli_errstr(cli)));
+                       return;
+               }
+               finfo.ctime = finfo.mtime;
+       }
+
+       DEBUG(3,("file %s attrib 0x%X\n",finfo.name,finfo.mode));
+
+       if (tar_inc && !(finfo.mode & aARCH)) {
+               DEBUG(4, ("skipping %s - archive bit not set\n", finfo.name));
+               shallitime=0;
+       } else if (!tar_system && (finfo.mode & aSYSTEM)) {
+               DEBUG(4, ("skipping %s - system bit is set\n", finfo.name));
+               shallitime=0;
+       } else if (!tar_hidden && (finfo.mode & aHIDDEN)) {
+               DEBUG(4, ("skipping %s - hidden bit is set\n", finfo.name));
+               shallitime=0;
+       } else {
+               DEBUG(3,("getting file %s of size %.0f bytes as a tar file %s",
+                       finfo.name, (double)finfo.size, lname));
       
-      /* write a tar header, don't bother with mode - just set to 100644 */
-      writetarheader(tarhandle, rname, finfo.size, finfo.mtime, "100644 \0", ftype);
+               /* write a tar header, don't bother with mode - just set to 100644 */
+               writetarheader(tarhandle, rname, finfo.size, finfo.mtime, "100644 \0", ftype);
 
-      while (nread < finfo.size && !close_done)        {
+               while (nread < finfo.size && !close_done) {
              
-             DEBUG(3,("nread=%.0f\n",(double)nread));
+                       DEBUG(3,("nread=%.0f\n",(double)nread));
              
-             datalen = cli_read(cli, fnum, data, nread, read_size);
+                       datalen = cli_read(cli, fnum, data, nread, read_size);
              
-             if (datalen == -1) {
-                     DEBUG(0,("Error reading file %s : %s\n", rname, cli_errstr(cli)));
-                     break;
-             }
+                       if (datalen == -1) {
+                               DEBUG(0,("Error reading file %s : %s\n", rname, cli_errstr(cli)));
+                               break;
+                       }
              
-                 nread += datalen;
-
-                 /* if file size has increased since we made file size query, truncate
-                       read so tar header for this file will be correct.
-                  */
-
-                 if (nread > finfo.size) {
-                       datalen -= nread - finfo.size;
-                       DEBUG(0,("File size change - truncating %s to %.0f bytes\n", finfo.name, (double)finfo.size));
-                 }
-
-             /* add received bits of file to buffer - dotarbuf will
-              * write out in 512 byte intervals */
-             if (dotarbuf(tarhandle,data,datalen) != datalen) {
-                     DEBUG(0,("Error writing to tar file - %s\n", strerror(errno)));
-                     break;
-             }
+                       nread += datalen;
+
+                       /* if file size has increased since we made file size query, truncate
+                               read so tar header for this file will be correct.
+                       */
+
+                       if (nread > finfo.size) {
+                               datalen -= nread - finfo.size;
+                               DEBUG(0,("File size change - truncating %s to %.0f bytes\n",
+                                                       finfo.name, (double)finfo.size));
+                       }
+
+                       /* add received bits of file to buffer - dotarbuf will
+                       * write out in 512 byte intervals */
+
+                       if (dotarbuf(tarhandle,data,datalen) != datalen) {
+                               DEBUG(0,("Error writing to tar file - %s\n", strerror(errno)));
+                               break;
+                       }
              
-             if (datalen == 0) {
-                     DEBUG(0,("Error reading file %s. Got 0 bytes\n", rname));
-                     break;
-             }
-
-             datalen=0;
-      }
-
-      /* pad tar file with zero's if we couldn't get entire file */
-      if (nread < finfo.size) {
-             DEBUG(0, ("Didn't get entire file. size=%.0f, nread=%d\n", (double)finfo.size, (int)nread));
-             if (padit(data, sizeof(data), finfo.size - nread))
-                     DEBUG(0,("Error writing tar file - %s\n", strerror(errno)));
-      }
-
-      /* round tar file to nearest block */
-      if (finfo.size % TBLOCK)
-       dozerobuf(tarhandle, TBLOCK - (finfo.size % TBLOCK));
+                       if (datalen == 0) {
+                               DEBUG(0,("Error reading file %s. Got 0 bytes\n", rname));
+                               break;
+                       }
+
+                       datalen=0;
+               }
+
+               /* pad tar file with zero's if we couldn't get entire file */
+               if (nread < finfo.size) {
+                       DEBUG(0, ("Didn't get entire file. size=%.0f, nread=%d\n",
+                                               (double)finfo.size, (int)nread));
+                       if (padit(data, sizeof(data), finfo.size - nread))
+                               DEBUG(0,("Error writing tar file - %s\n", strerror(errno)));
+               }
+
+               /* round tar file to nearest block */
+               if (finfo.size % TBLOCK)
+                       dozerobuf(tarhandle, TBLOCK - (finfo.size % TBLOCK));
       
-      ttarf+=finfo.size + TBLOCK - (finfo.size % TBLOCK);
-      ntarf++;
-    }
+               ttarf+=finfo.size + TBLOCK - (finfo.size % TBLOCK);
+               ntarf++;
+       }
   
-  cli_close(cli, fnum);
+       cli_close(cli, fnum);
 
-  if (shallitime)
-    {
-      struct timeval tp_end;
-      int this_time;
+       if (shallitime) {
+               struct timeval tp_end;
+               int this_time;
 
-      /* if shallitime is true then we didn't skip */
-      if (tar_reset && !dry_run)
-       (void) do_setrattr(finfo.name, aARCH, ATTRRESET);
+               /* if shallitime is true then we didn't skip */
+               if (tar_reset && !dry_run)
+                       (void) do_setrattr(finfo.name, aARCH, ATTRRESET);
       
-      GetTimeOfDay(&tp_end);
-      this_time = 
-       (tp_end.tv_sec - tp_start.tv_sec)*1000 +
-         (tp_end.tv_usec - tp_start.tv_usec)/1000;
-      get_total_time_ms += this_time;
-      get_total_size += finfo.size;
-
-      if (tar_noisy)
-       {
-         DEBUG(0, ("%12.0f (%7.1f kb/s) %s\n",
-              (double)finfo.size, finfo.size / MAX(0.001, (1.024*this_time)),
-               finfo.name));
-       }
+               GetTimeOfDay(&tp_end);
+               this_time = (tp_end.tv_sec - tp_start.tv_sec)*1000 + (tp_end.tv_usec - tp_start.tv_usec)/1000;
+               get_total_time_ms += this_time;
+               get_total_size += finfo.size;
+
+               if (tar_noisy) {
+                       DEBUG(0, ("%12.0f (%7.1f kb/s) %s\n",
+                               (double)finfo.size, finfo.size / MAX(0.001, (1.024*this_time)),
+                               finfo.name));
+               }
 
-      /* Thanks to Carel-Jan Engel (ease@mail.wirehub.nl) for this one */
-      DEBUG(3,("(%g kb/s) (average %g kb/s)\n",
-              finfo.size / MAX(0.001, (1.024*this_time)),
-              get_total_size / MAX(0.001, (1.024*get_total_time_ms))));
-    }
+               /* Thanks to Carel-Jan Engel (ease@mail.wirehub.nl) for this one */
+               DEBUG(3,("(%g kb/s) (average %g kb/s)\n",
+                               finfo.size / MAX(0.001, (1.024*this_time)),
+                               get_total_size / MAX(0.001, (1.024*get_total_time_ms))));
+       }
 }
 
 /****************************************************************************
 Append single file to tar file (or not)
 ***************************************************************************/
+
 static void do_tar(file_info *finfo)
 {
-  pstring rname;
+       pstring rname;
 
-  if (strequal(finfo->name,"..") || strequal(finfo->name,"."))
-    return;
+       if (strequal(finfo->name,"..") || strequal(finfo->name,"."))
+               return;
 
-  /* Is it on the exclude list ? */
-  if (!tar_excl && clipn) {
-    pstring exclaim;
+       /* Is it on the exclude list ? */
+       if (!tar_excl && clipn) {
+               pstring exclaim;
 
-    DEBUG(5, ("Excl: strlen(cur_dir) = %d\n", (int)strlen(cur_dir)));
+               DEBUG(5, ("Excl: strlen(cur_dir) = %d\n", (int)strlen(cur_dir)));
 
-    pstrcpy(exclaim, cur_dir);
-    *(exclaim+strlen(exclaim)-1)='\0';
+               pstrcpy(exclaim, cur_dir);
+               *(exclaim+strlen(exclaim)-1)='\0';
 
-    pstrcat(exclaim, "\\");
-    pstrcat(exclaim, finfo->name);
+               pstrcat(exclaim, "\\");
+               pstrcat(exclaim, finfo->name);
 
-    DEBUG(5, ("...tar_re_search: %d\n", tar_re_search));
+               DEBUG(5, ("...tar_re_search: %d\n", tar_re_search));
 
-    if ((!tar_re_search && clipfind(cliplist, clipn, exclaim)) ||
+               if ((!tar_re_search && clipfind(cliplist, clipn, exclaim)) ||
 #ifdef HAVE_REGEX_H
-       (tar_re_search && !regexec(preg, exclaim, 0, NULL, 0))) {
+                               (tar_re_search && !regexec(preg, exclaim, 0, NULL, 0))) {
 #else
-        (tar_re_search && mask_match(exclaim, cliplist[0], True))) {
+                               (tar_re_search && mask_match(exclaim, cliplist[0], True))) {
 #endif
-      DEBUG(3,("Skipping file %s\n", exclaim));
-      return;
-    }
-  }
-
-  if (finfo->mode & aDIR)
-    {
-      pstring saved_curdir;
-      pstring mtar_mask;
-
-      pstrcpy(saved_curdir, cur_dir);
-
-      DEBUG(5, ("Sizeof(cur_dir)=%d, strlen(cur_dir)=%d, strlen(finfo->name)=%d\nname=%s,cur_dir=%s\n", (int)sizeof(cur_dir), (int)strlen(cur_dir), (int)strlen(finfo->name), finfo->name, cur_dir));
-
-      pstrcat(cur_dir,finfo->name);
-      pstrcat(cur_dir,"\\");
-
-      DEBUG(5, ("Writing a dir, Name = %s\n", cur_dir));
-
-      /* write a tar directory, don't bother with mode - just set it to
-       * 40755 */
-      writetarheader(tarhandle, cur_dir, 0, finfo->mtime, "040755 \0", '5');
-      if (tar_noisy) {
-          DEBUG(0,("                directory %s\n", cur_dir));
-      }
-      ntarf++;  /* Make sure we have a file on there */
-      pstrcpy(mtar_mask,cur_dir);
-      pstrcat(mtar_mask,"*");
-      DEBUG(5, ("Doing list with mtar_mask: %s\n", mtar_mask));
-      do_list(mtar_mask, attribute, do_tar, False, True);
-      pstrcpy(cur_dir,saved_curdir);
-    }
-  else
-    {
-      pstrcpy(rname,cur_dir);
-      pstrcat(rname,finfo->name);
-      do_atar(rname,finfo->name,finfo);
-    }
+                       DEBUG(3,("Skipping file %s\n", exclaim));
+                       return;
+               }
+       }
+
+       if (finfo->mode & aDIR) {
+               pstring saved_curdir;
+               pstring mtar_mask;
+
+               pstrcpy(saved_curdir, cur_dir);
+
+               DEBUG(5, ("Sizeof(cur_dir)=%d, strlen(cur_dir)=%d, \
+strlen(finfo->name)=%d\nname=%s,cur_dir=%s\n",
+                       (int)sizeof(cur_dir), (int)strlen(cur_dir),
+                       (int)strlen(finfo->name), finfo->name, cur_dir));
+
+               pstrcat(cur_dir,finfo->name);
+               pstrcat(cur_dir,"\\");
+
+               DEBUG(5, ("Writing a dir, Name = %s\n", cur_dir));
+
+               /* write a tar directory, don't bother with mode - just set it to
+                       * 40755 */
+               writetarheader(tarhandle, cur_dir, 0, finfo->mtime, "040755 \0", '5');
+               if (tar_noisy) {
+                       DEBUG(0,("                directory %s\n", cur_dir));
+               }
+               ntarf++;  /* Make sure we have a file on there */
+               pstrcpy(mtar_mask,cur_dir);
+               pstrcat(mtar_mask,"*");
+               DEBUG(5, ("Doing list with mtar_mask: %s\n", mtar_mask));
+               do_list(mtar_mask, attribute, do_tar, False, True);
+               pstrcpy(cur_dir,saved_curdir);
+       } else {
+               pstrcpy(rname,cur_dir);
+               pstrcat(rname,finfo->name);
+               do_atar(rname,finfo->name,finfo);
+       }
 }
 
 /****************************************************************************
 Convert from UNIX to DOS file names
 ***************************************************************************/
+
 static void unfixtarname(char *tptr, char *fp, int l, BOOL first)
 {
        /* remove '.' from start of file name, convert from unix /'s to
@@ -886,79 +866,72 @@ static void unfixtarname(char *tptr, char *fp, int l, BOOL first)
        string_replace(tptr, '/', '\\');
 }
 
-
 /****************************************************************************
 Move to the next block in the buffer, which may mean read in another set of
 blocks. FIXME, we should allow more than one block to be skipped.
 ****************************************************************************/
+
 static int next_block(char *ltarbuf, char **bufferp, int bufsiz)
 {
-  int bufread, total = 0;
-
-  DEBUG(5, ("Advancing to next block: %0lx\n", (unsigned long)*bufferp));
-  *bufferp += TBLOCK;
-  total = TBLOCK;
-
-  if (*bufferp >= (ltarbuf + bufsiz)) {
-
-    DEBUG(5, ("Reading more data into ltarbuf ...\n"));
-
-    /*
-     * Bugfix from Bob Boehmer <boehmer@worldnet.att.net>
-     * Fixes bug where read can return short if coming from
-     * a pipe.
-     */
-
-    bufread = read(tarhandle, ltarbuf, bufsiz);
-    total = bufread;
-
-    while (total < bufsiz) {
-      if (bufread < 0) { /* An error, return false */
-        return (total > 0 ? -2 : bufread);
-      }
-      if (bufread == 0) {
-        if (total <= 0) {
-            return -2;
-        }
-        break;
-      }
-      bufread = read(tarhandle, &ltarbuf[total], bufsiz - total);
-      total += bufread;
-    }
-
-    DEBUG(5, ("Total bytes read ... %i\n", total));
-
-    *bufferp = ltarbuf;
+       int bufread, total = 0;
+
+       DEBUG(5, ("Advancing to next block: %0lx\n", (unsigned long)*bufferp));
+       *bufferp += TBLOCK;
+       total = TBLOCK;
+
+       if (*bufferp >= (ltarbuf + bufsiz)) {
+
+               DEBUG(5, ("Reading more data into ltarbuf ...\n"));
+
+               /*
+                * Bugfix from Bob Boehmer <boehmer@worldnet.att.net>
+                * Fixes bug where read can return short if coming from
+                * a pipe.
+                */
+
+               bufread = read(tarhandle, ltarbuf, bufsiz);
+               total = bufread;
+
+               while (total < bufsiz) {
+                       if (bufread < 0) { /* An error, return false */
+                               return (total > 0 ? -2 : bufread);
+                       }
+                       if (bufread == 0) {
+                               if (total <= 0) {
+                                       return -2;
+                               }
+                               break;
+                       }
+                       bufread = read(tarhandle, &ltarbuf[total], bufsiz - total);
+                       total += bufread;
+               }
 
-  }
+               DEBUG(5, ("Total bytes read ... %i\n", total));
 
-  return(total);
+               *bufferp = ltarbuf;
+       }
 
+       return(total);
 }
 
 /* Skip a file, even if it includes a long file name? */
 static int skip_file(int skipsize)
 {
-  int dsize = skipsize;
-
-  DEBUG(5, ("Skiping file. Size = %i\n", skipsize));
-
-  /* FIXME, we should skip more than one block at a time */
-
-  while (dsize > 0) {
+       int dsize = skipsize;
 
-    if (next_block(tarbuf, &buffer_p, tbufsiz) <= 0) {
+       DEBUG(5, ("Skiping file. Size = %i\n", skipsize));
 
-       DEBUG(0, ("Empty file, short tar file, or read error: %s\n", strerror(errno)));
-       return(False);
+       /* FIXME, we should skip more than one block at a time */
 
-    }
-
-    dsize -= TBLOCK;
-
-  }
+       while (dsize > 0) {
+               if (next_block(tarbuf, &buffer_p, tbufsiz) <= 0) {
+                       DEBUG(0, ("Empty file, short tar file, or read error: %s\n", strerror(errno)));
+                       return(False);
+               }
+               dsize -= TBLOCK;
+       }
 
-  return(True);
+       return(True);
 }
 
 /*************************************************************
@@ -969,103 +942,94 @@ static int skip_file(int skipsize)
 
 static int get_file(file_info2 finfo)
 {
-  int fnum = -1, pos = 0, dsize = 0, bpos = 0;
-  SMB_BIG_UINT rsize = 0;
-
-  DEBUG(5, ("get_file: file: %s, size %.0f\n", finfo.name, (double)finfo.size));
-
-  if (ensurepath(finfo.name) && 
-      (fnum=cli_open(cli, finfo.name, O_RDWR|O_CREAT|O_TRUNC, DENY_NONE)) == -1) {
-      DEBUG(0, ("abandoning restore\n"));
-      return(False);
-  }
-
-  /* read the blocks from the tar file and write to the remote file */
-
-  rsize = finfo.size;  /* This is how much to write */
-
-  while (rsize > 0) {
+       int fnum = -1, pos = 0, dsize = 0, bpos = 0;
+       SMB_BIG_UINT rsize = 0;
 
-    /* We can only write up to the end of the buffer */
+       DEBUG(5, ("get_file: file: %s, size %.0f\n", finfo.name, (double)finfo.size));
 
-    dsize = MIN(tbufsiz - (buffer_p - tarbuf) - bpos, 65520); /* Calculate the size to write */
-    dsize = MIN(dsize, rsize);  /* Should be only what is left */
-    DEBUG(5, ("writing %i bytes, bpos = %i ...\n", dsize, bpos));
-
-    if (cli_write(cli, fnum, 0, buffer_p + bpos, pos, dsize) != dsize) {
-           DEBUG(0, ("Error writing remote file\n"));
-           return 0;
-    }
-
-    rsize -= dsize;
-    pos += dsize;
-
-    /* Now figure out how much to move in the buffer */
+       if (ensurepath(finfo.name) && 
+                       (fnum=cli_open(cli, finfo.name, O_RDWR|O_CREAT|O_TRUNC, DENY_NONE)) == -1) {
+               DEBUG(0, ("abandoning restore\n"));
+               return(False);
+       }
 
-    /* FIXME, we should skip more than one block at a time */
+       /* read the blocks from the tar file and write to the remote file */
 
-    /* First, skip any initial part of the part written that is left over */
-    /* from the end of the first TBLOCK                                   */
+       rsize = finfo.size;  /* This is how much to write */
 
-    if ((bpos) && ((bpos + dsize) >= TBLOCK)) {
+       while (rsize > 0) {
 
-      dsize -= (TBLOCK - bpos);  /* Get rid of the end of the first block */
-      bpos = 0;
+               /* We can only write up to the end of the buffer */
+               dsize = MIN(tbufsiz - (buffer_p - tarbuf) - bpos, 65520); /* Calculate the size to write */
+               dsize = MIN(dsize, rsize);  /* Should be only what is left */
+               DEBUG(5, ("writing %i bytes, bpos = %i ...\n", dsize, bpos));
 
-      if (next_block(tarbuf, &buffer_p, tbufsiz) <=0) {  /* and skip the block */
-       DEBUG(0, ("Empty file, short tar file, or read error: %s\n", strerror(errno)));
-       return False;
+               if (cli_write(cli, fnum, 0, buffer_p + bpos, pos, dsize) != dsize) {
+                       DEBUG(0, ("Error writing remote file\n"));
+                       return 0;
+               }
 
-      }
+               rsize -= dsize;
+               pos += dsize;
 
-    }
+               /* Now figure out how much to move in the buffer */
 
-    /*
-     * Bugfix from Bob Boehmer <boehmer@worldnet.att.net>.
-     * If the file being extracted is an exact multiple of
-     * TBLOCK bytes then we don't want to extract the next
-     * block from the tarfile here, as it will be done in
-     * the caller of get_file().
-     */
+               /* FIXME, we should skip more than one block at a time */
 
-    while (((rsize != 0) && (dsize >= TBLOCK)) ||
-         ((rsize == 0) && (dsize > TBLOCK))) {
+               /* First, skip any initial part of the part written that is left over */
+               /* from the end of the first TBLOCK                                   */
 
-      if (next_block(tarbuf, &buffer_p, tbufsiz) <=0) {
-       DEBUG(0, ("Empty file, short tar file, or read error: %s\n", strerror(errno)));
-       return False;
-      }
+               if ((bpos) && ((bpos + dsize) >= TBLOCK)) {
+                       dsize -= (TBLOCK - bpos);  /* Get rid of the end of the first block */
+                       bpos = 0;
 
-      dsize -= TBLOCK;
-    }
+                       if (next_block(tarbuf, &buffer_p, tbufsiz) <=0) {  /* and skip the block */
+                               DEBUG(0, ("Empty file, short tar file, or read error: %s\n", strerror(errno)));
+                               return False;
+                       }
+               }
 
-    bpos = dsize;
+               /*
+                * Bugfix from Bob Boehmer <boehmer@worldnet.att.net>.
+                * If the file being extracted is an exact multiple of
+                * TBLOCK bytes then we don't want to extract the next
+                * block from the tarfile here, as it will be done in
+                * the caller of get_file().
+                */
 
-  }
+               while (((rsize != 0) && (dsize >= TBLOCK)) ||
+                               ((rsize == 0) && (dsize > TBLOCK))) {
 
-  /* Now close the file ... */
+                       if (next_block(tarbuf, &buffer_p, tbufsiz) <=0) {
+                               DEBUG(0, ("Empty file, short tar file, or read error: %s\n", strerror(errno)));
+                               return False;
+                       }
 
-  if (!cli_close(cli, fnum)) {
-         DEBUG(0, ("Error closing remote file\n"));
-         return(False);
-  }
+                       dsize -= TBLOCK;
+               }
+               bpos = dsize;
+       }
 
-  /* Now we update the creation date ... */
+       /* Now close the file ... */
 
-  DEBUG(5, ("Updating creation date on %s\n", finfo.name));
+       if (!cli_close(cli, fnum)) {
+               DEBUG(0, ("Error closing remote file\n"));
+               return(False);
+       }
 
-  if (!cli_setatr(cli, finfo.name, finfo.mode, finfo.mtime)) {
-         if (tar_real_noisy) {
-                 DEBUG(0, ("Could not set time on file: %s\n", finfo.name));
-                 /*return(False); */ /* Ignore, as Win95 does not allow changes */
-         }
-  }
+       /* Now we update the creation date ... */
+       DEBUG(5, ("Updating creation date on %s\n", finfo.name));
 
-  ntarf++;
+       if (!cli_setatr(cli, finfo.name, finfo.mode, finfo.mtime)) {
+               if (tar_real_noisy) {
+                       DEBUG(0, ("Could not set time on file: %s\n", finfo.name));
+                       /*return(False); */ /* Ignore, as Win95 does not allow changes */
+               }
+       }
 
-  DEBUG(0, ("restore tar file %s of size %.0f bytes\n", finfo.name, (double)finfo.size));
-  
-  return(True);
+       ntarf++;
+       DEBUG(0, ("restore tar file %s of size %.0f bytes\n", finfo.name, (double)finfo.size));
+       return(True);
 }
 
 /* Create a directory.  We just ensure that the path exists and return as there
@@ -1073,214 +1037,167 @@ static int get_file(file_info2 finfo)
 */
 static int get_dir(file_info2 finfo)
 {
+       DEBUG(0, ("restore directory %s\n", finfo.name));
 
-  DEBUG(0, ("restore directory %s\n", finfo.name));
-
-  if (!ensurepath(finfo.name)) {
-
-    DEBUG(0, ("Problems creating directory\n"));
-    return(False);
-
-  }
-
-  ntarf++;
-  return(True);
-
+       if (!ensurepath(finfo.name)) {
+               DEBUG(0, ("Problems creating directory\n"));
+               return(False);
+       }
+       ntarf++;
+       return(True);
 }
+
 /* Get a file with a long file name ... first file has file name, next file 
    has the data. We only want the long file name, as the loop in do_tarput
    will deal with the rest.
 */
 static char * get_longfilename(file_info2 finfo)
 {
-  int namesize = strlen(finfo.name) + strlen(cur_dir) + 2;
-  char *longname = malloc(namesize);
-  int offset = 0, left = finfo.size;
-  BOOL first = True;
-
-  DEBUG(5, ("Restoring a long file name: %s\n", finfo.name));
-  DEBUG(5, ("Len = %.0f\n", (double)finfo.size));
-
-  if (longname == NULL) {
-
-    DEBUG(0, ("could not allocate buffer of size %d for longname\n", 
-             namesize));
-    return(NULL);
-  }
-
-  /* First, add cur_dir to the long file name */
+       int namesize = strlen(finfo.name) + strlen(cur_dir) + 2;
+       char *longname = malloc(namesize);
+       int offset = 0, left = finfo.size;
+       BOOL first = True;
 
-  if (strlen(cur_dir) > 0) {
-    strncpy(longname, cur_dir, namesize);
-    offset = strlen(cur_dir);
-  }
+       DEBUG(5, ("Restoring a long file name: %s\n", finfo.name));
+       DEBUG(5, ("Len = %.0f\n", (double)finfo.size));
 
-  /* Loop through the blocks picking up the name */
-
-  while (left > 0) {
-
-    if (next_block(tarbuf, &buffer_p, tbufsiz) <= 0) {
+       if (longname == NULL) {
+               DEBUG(0, ("could not allocate buffer of size %d for longname\n", namesize));
+               return(NULL);
+       }
 
-      DEBUG(0, ("Empty file, short tar file, or read error: %s\n", strerror(errno)));
-      return(NULL);
+       /* First, add cur_dir to the long file name */
 
-    }
+       if (strlen(cur_dir) > 0) {
+               strncpy(longname, cur_dir, namesize);
+               offset = strlen(cur_dir);
+       }
 
-    unfixtarname(longname + offset, buffer_p, MIN(TBLOCK, finfo.size), first--);
-    DEBUG(5, ("UnfixedName: %s, buffer: %s\n", longname, buffer_p));
+       /* Loop through the blocks picking up the name */
 
-    offset += TBLOCK;
-    left -= TBLOCK;
+       while (left > 0) {
+               if (next_block(tarbuf, &buffer_p, tbufsiz) <= 0) {
+                       DEBUG(0, ("Empty file, short tar file, or read error: %s\n", strerror(errno)));
+                       return(NULL);
+               }
 
-  }
+               unfixtarname(longname + offset, buffer_p, MIN(TBLOCK, finfo.size), first--);
+               DEBUG(5, ("UnfixedName: %s, buffer: %s\n", longname, buffer_p));
 
-  return(longname);
+               offset += TBLOCK;
+               left -= TBLOCK;
+       }
 
+       return(longname);
 }
 
 static void do_tarput(void)
 {
-  file_info2 finfo;
-  struct timeval tp_start;
-  char *longfilename = NULL, linkflag;
-  int skip = False;
-
-  GetTimeOfDay(&tp_start);
-
-  DEBUG(5, ("RJS do_tarput called ...\n"));
-
-  buffer_p = tarbuf + tbufsiz;  /* init this to force first read */
-
-  /* Now read through those files ... */
-
-  while (True) {
-
-    /* Get us to the next block, or the first block first time around */
-
-    if (next_block(tarbuf, &buffer_p, tbufsiz) <= 0) {
-
-      DEBUG(0, ("Empty file, short tar file, or read error: %s\n", strerror(errno)));
-
-      return;
-
-    }
-
-    DEBUG(5, ("Reading the next header ...\n"));
-
-    switch (readtarheader((union hblock *) buffer_p, &finfo, cur_dir)) {
-
-    case -2:    /* Hmm, not good, but not fatal */
-      DEBUG(0, ("Skipping %s...\n", finfo.name));
-      if ((next_block(tarbuf, &buffer_p, tbufsiz) <= 0) &&
-          !skip_file(finfo.size)) {
-
-       DEBUG(0, ("Short file, bailing out...\n"));
-       return;
-
-      }
-
-      break;
-
-    case -1:
-      DEBUG(0, ("abandoning restore, -1 from read tar header\n"));
-      return;
-
-    case 0: /* chksum is zero - looks like an EOF */
-      DEBUG(0, ("tar: restored %d files and directories\n", ntarf));
-      return;        /* Hmmm, bad here ... */
-
-    default: 
-      /* No action */
-
-      break;
-
-    }
+       file_info2 finfo;
+       struct timeval tp_start;
+       char *longfilename = NULL, linkflag;
+       int skip = False;
+
+       GetTimeOfDay(&tp_start);
+       DEBUG(5, ("RJS do_tarput called ...\n"));
+
+       buffer_p = tarbuf + tbufsiz;  /* init this to force first read */
+
+       /* Now read through those files ... */
+       while (True) {
+               /* Get us to the next block, or the first block first time around */
+               if (next_block(tarbuf, &buffer_p, tbufsiz) <= 0) {
+                       DEBUG(0, ("Empty file, short tar file, or read error: %s\n", strerror(errno)));
+                       return;
+               }
 
-    /* Now, do we have a long file name? */
+               DEBUG(5, ("Reading the next header ...\n"));
 
-    if (longfilename != NULL) {
+               switch (readtarheader((union hblock *) buffer_p, &finfo, cur_dir)) {
+                       case -2:    /* Hmm, not good, but not fatal */
+                               DEBUG(0, ("Skipping %s...\n", finfo.name));
+                               if ((next_block(tarbuf, &buffer_p, tbufsiz) <= 0) && !skip_file(finfo.size)) {
+                                       DEBUG(0, ("Short file, bailing out...\n"));
+                                       return;
+                               }
+                               break;
 
-      SAFE_FREE(finfo.name);   /* Free the space already allocated */
-      finfo.name = longfilename;
-      longfilename = NULL;
+                       case -1:
+                               DEBUG(0, ("abandoning restore, -1 from read tar header\n"));
+                               return;
 
-    }
+                       case 0: /* chksum is zero - looks like an EOF */
+                               DEBUG(0, ("tar: restored %d files and directories\n", ntarf));
+                               return;        /* Hmmm, bad here ... */
 
-    /* Well, now we have a header, process the file ...            */
+                       default: 
+                               /* No action */
+                               break;
+               }
 
-    /* Should we skip the file? We have the long name as well here */
+               /* Now, do we have a long file name? */
+               if (longfilename != NULL) {
+                       SAFE_FREE(finfo.name);   /* Free the space already allocated */
+                       finfo.name = longfilename;
+                       longfilename = NULL;
+               }
 
-    skip = clipn &&
-      ((!tar_re_search && clipfind(cliplist, clipn, finfo.name) ^ tar_excl)
+               /* Well, now we have a header, process the file ...            */
+               /* Should we skip the file? We have the long name as well here */
+               skip = clipn && ((!tar_re_search && clipfind(cliplist, clipn, finfo.name) ^ tar_excl) ||
 #ifdef HAVE_REGEX_H
-      || (tar_re_search && !regexec(preg, finfo.name, 0, NULL, 0)));
+                                       (tar_re_search && !regexec(preg, finfo.name, 0, NULL, 0)));
 #else
-      || (tar_re_search && mask_match(finfo.name, cliplist[0], True)));
+                                       (tar_re_search && mask_match(finfo.name, cliplist[0], True)));
 #endif
 
-  DEBUG(5, ("Skip = %i, cliplist=%s, file=%s\n", skip, (cliplist?cliplist[0]:NULL), finfo.name));
-
-  if (skip) {
-
-    skip_file(finfo.size);
-    continue;
-
-  }
-
-    /* We only get this far if we should process the file */
-  linkflag = ((union hblock *)buffer_p) -> dbuf.linkflag;
-
-    switch (linkflag) {
-
-    case '0':  /* Should use symbolic names--FIXME */
-
-      /* 
-       * Skip to the next block first, so we can get the file, FIXME, should
-       * be in get_file ...
-       * The 'finfo.size != 0' fix is from Bob Boehmer <boehmer@worldnet.att.net>
-       * Fixes bug where file size in tarfile is zero.
-       */
-
-      if ((finfo.size != 0) && next_block(tarbuf, &buffer_p, tbufsiz) <=0) {
-       DEBUG(0, ("Short file, bailing out...\n"));
-       return;
-      }
-      if (!get_file(finfo)) {
-       DEBUG(0, ("Abandoning restore\n"));
-       return;
-
-      }
-      break;
-
-    case '5':
-      if (!get_dir(finfo)) {
-       DEBUG(0, ("Abandoning restore \n"));
-       return;
-      }
-      break;
-
-    case 'L':
-      longfilename = get_longfilename(finfo);
-      if (!longfilename) {
-       DEBUG(0, ("abandoning restore\n"));
-       return;
-
-      }
-      DEBUG(5, ("Long file name: %s\n", longfilename));
-      break;
-
-    default:
-      skip_file(finfo.size);  /* Don't handle these yet */
-      break;
-
-    }
-
-  }
-
+               DEBUG(5, ("Skip = %i, cliplist=%s, file=%s\n", skip, (cliplist?cliplist[0]:NULL), finfo.name));
+               if (skip) {
+                       skip_file(finfo.size);
+                       continue;
+               }
 
+               /* We only get this far if we should process the file */
+               linkflag = ((union hblock *)buffer_p) -> dbuf.linkflag;
+               switch (linkflag) {
+                       case '0':  /* Should use symbolic names--FIXME */
+                               /* 
+                                * Skip to the next block first, so we can get the file, FIXME, should
+                                * be in get_file ...
+                                * The 'finfo.size != 0' fix is from Bob Boehmer <boehmer@worldnet.att.net>
+                                * Fixes bug where file size in tarfile is zero.
+                                */
+                               if ((finfo.size != 0) && next_block(tarbuf, &buffer_p, tbufsiz) <=0) {
+                                       DEBUG(0, ("Short file, bailing out...\n"));
+                                       return;
+                               }
+                               if (!get_file(finfo)) {
+                                       DEBUG(0, ("Abandoning restore\n"));
+                                       return;
+                               }
+                               break;
+                       case '5':
+                               if (!get_dir(finfo)) {
+                                       DEBUG(0, ("Abandoning restore \n"));
+                                       return;
+                               }
+                               break;
+                       case 'L':
+                               longfilename = get_longfilename(finfo);
+                               if (!longfilename) {
+                                       DEBUG(0, ("abandoning restore\n"));
+                                       return;
+                               }
+                               DEBUG(5, ("Long file name: %s\n", longfilename));
+                               break;
+
+                       default:
+                               skip_file(finfo.size);  /* Don't handle these yet */
+                               break;
+               }
+       }
 }
 
-
 /*
  * samba interactive commands
  */
@@ -1288,577 +1205,594 @@ static void do_tarput(void)
 /****************************************************************************
 Blocksize command
 ***************************************************************************/
+
 int cmd_block(void)
 {
-  fstring buf;
-  int block;
-
-  if (!next_token_nr(NULL,buf,NULL,sizeof(buf)))
-    {
-      DEBUG(0, ("blocksize <n>\n"));
-      return 1;
-    }
-
-  block=atoi(buf);
-  if (block < 0 || block > 65535)
-    {
-      DEBUG(0, ("blocksize out of range"));
-      return 1;
-    }
-
-  blocksize=block;
-  DEBUG(2,("blocksize is now %d\n", blocksize));
-
-  return 0;
+       fstring buf;
+       int block;
+
+       if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) {
+               DEBUG(0, ("blocksize <n>\n"));
+               return 1;
+       }
+
+       block=atoi(buf);
+       if (block < 0 || block > 65535) {
+               DEBUG(0, ("blocksize out of range"));
+               return 1;
+       }
+
+       blocksize=block;
+       DEBUG(2,("blocksize is now %d\n", blocksize));
+
+       return 0;
 }
 
 /****************************************************************************
 command to set incremental / reset mode
 ***************************************************************************/
+
 int cmd_tarmode(void)
 {
-  fstring buf;
-
-  while (next_token_nr(NULL,buf,NULL,sizeof(buf))) {
-    if (strequal(buf, "full"))
-      tar_inc=False;
-    else if (strequal(buf, "inc"))
-      tar_inc=True;
-    else if (strequal(buf, "reset"))
-      tar_reset=True;
-    else if (strequal(buf, "noreset"))
-      tar_reset=False;
-    else if (strequal(buf, "system"))
-      tar_system=True;
-    else if (strequal(buf, "nosystem"))
-      tar_system=False;
-    else if (strequal(buf, "hidden"))
-      tar_hidden=True;
-    else if (strequal(buf, "nohidden"))
-      tar_hidden=False;
-    else if (strequal(buf, "verbose") || strequal(buf, "noquiet"))
-      tar_noisy=True;
-    else if (strequal(buf, "quiet") || strequal(buf, "noverbose"))
-      tar_noisy=False;
-    else DEBUG(0, ("tarmode: unrecognised option %s\n", buf));
-  }
-
-  DEBUG(0, ("tarmode is now %s, %s, %s, %s, %s\n",
-           tar_inc ? "incremental" : "full",
-           tar_system ? "system" : "nosystem",
-           tar_hidden ? "hidden" : "nohidden",
-           tar_reset ? "reset" : "noreset",
-           tar_noisy ? "verbose" : "quiet"));
-
-  return 0;
+       fstring buf;
+
+       while (next_token_nr(NULL,buf,NULL,sizeof(buf))) {
+               if (strequal(buf, "full"))
+                       tar_inc=False;
+               else if (strequal(buf, "inc"))
+                       tar_inc=True;
+               else if (strequal(buf, "reset"))
+                       tar_reset=True;
+               else if (strequal(buf, "noreset"))
+                       tar_reset=False;
+               else if (strequal(buf, "system"))
+                       tar_system=True;
+               else if (strequal(buf, "nosystem"))
+                       tar_system=False;
+               else if (strequal(buf, "hidden"))
+                       tar_hidden=True;
+               else if (strequal(buf, "nohidden"))
+                       tar_hidden=False;
+               else if (strequal(buf, "verbose") || strequal(buf, "noquiet"))
+                       tar_noisy=True;
+               else if (strequal(buf, "quiet") || strequal(buf, "noverbose"))
+                       tar_noisy=False;
+               else
+                       DEBUG(0, ("tarmode: unrecognised option %s\n", buf));
+       }
+
+       DEBUG(0, ("tarmode is now %s, %s, %s, %s, %s\n",
+                       tar_inc ? "incremental" : "full",
+                       tar_system ? "system" : "nosystem",
+                       tar_hidden ? "hidden" : "nohidden",
+                       tar_reset ? "reset" : "noreset",
+                       tar_noisy ? "verbose" : "quiet"));
+       return 0;
 }
 
 /****************************************************************************
 Feeble attrib command
 ***************************************************************************/
+
 int cmd_setmode(void)
 {
-  char *q;
-  fstring buf;
-  pstring fname;
-  uint16 attra[2];
-  int direct=1;
-
-  attra[0] = attra[1] = 0;
-
-  if (!next_token_nr(NULL,buf,NULL,sizeof(buf)))
-    {
-      DEBUG(0, ("setmode <filename> <[+|-]rsha>\n"));
-      return 1;
-    }
-
-  pstrcpy(fname, cur_dir);
-  pstrcat(fname, buf);
-
-  while (next_token_nr(NULL,buf,NULL,sizeof(buf))) {
-    q=buf;
-
-    while(*q)
-      switch (*q++) {
-      case '+': direct=1;
-       break;
-      case '-': direct=0;
-       break;
-      case 'r': attra[direct]|=aRONLY;
-       break;
-      case 'h': attra[direct]|=aHIDDEN;
-       break;
-      case 's': attra[direct]|=aSYSTEM;
-       break;
-      case 'a': attra[direct]|=aARCH;
-       break;
-      default: DEBUG(0, ("setmode <filename> <perm=[+|-]rsha>\n"));
-       return 1;
-      }
-  }
+       char *q;
+       fstring buf;
+       pstring fname;
+       uint16 attra[2];
+       int direct=1;
+
+       attra[0] = attra[1] = 0;
 
-  if (attra[ATTRSET]==0 && attra[ATTRRESET]==0)
-    {
-      DEBUG(0, ("setmode <filename> <[+|-]rsha>\n"));
-      return 1;
-    }
+       if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) {
+               DEBUG(0, ("setmode <filename> <[+|-]rsha>\n"));
+               return 1;
+       }
+
+       pstrcpy(fname, cur_dir);
+       pstrcat(fname, buf);
+
+       while (next_token_nr(NULL,buf,NULL,sizeof(buf))) {
+               q=buf;
+
+               while(*q) {
+                       switch (*q++) {
+                               case '+':
+                                       direct=1;
+                                       break;
+                               case '-':
+                                       direct=0;
+                                       break;
+                               case 'r':
+                                       attra[direct]|=aRONLY;
+                                       break;
+                               case 'h':
+                                       attra[direct]|=aHIDDEN;
+                                       break;
+                               case 's':
+                                       attra[direct]|=aSYSTEM;
+                                       break;
+                               case 'a':
+                                       attra[direct]|=aARCH;
+                                       break;
+                               default:
+                                       DEBUG(0, ("setmode <filename> <perm=[+|-]rsha>\n"));
+                                       return 1;
+                       }
+               }
+       }
 
-  DEBUG(2, ("\nperm set %d %d\n", attra[ATTRSET], attra[ATTRRESET]));
-  do_setrattr(fname, attra[ATTRSET], ATTRSET);
-  do_setrattr(fname, attra[ATTRRESET], ATTRRESET);
+       if (attra[ATTRSET]==0 && attra[ATTRRESET]==0) {
+               DEBUG(0, ("setmode <filename> <[+|-]rsha>\n"));
+               return 1;
+       }
 
-  return 0;
+       DEBUG(2, ("\nperm set %d %d\n", attra[ATTRSET], attra[ATTRRESET]));
+       do_setrattr(fname, attra[ATTRSET], ATTRSET);
+       do_setrattr(fname, attra[ATTRRESET], ATTRRESET);
+       return 0;
 }
 
 /****************************************************************************
 Principal command for creating / extracting
 ***************************************************************************/
+
 int cmd_tar(void)
 {
-  fstring buf;
-  char **argl;
-  int argcl;
-
-  if (!next_token_nr(NULL,buf,NULL,sizeof(buf)))
-    {
-      DEBUG(0,("tar <c|x>[IXbgan] <filename>\n"));
-      return 1;
-    }
-
-  argl=toktocliplist(&argcl, NULL);
-  if (!tar_parseargs(argcl, argl, buf, 0))
-    return 1;
+       fstring buf;
+       char **argl;
+       int argcl;
 
-  process_tar();
+       if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) {
+               DEBUG(0,("tar <c|x>[IXbgan] <filename>\n"));
+               return 1;
+       }
 
-  SAFE_FREE(argl);
+       argl=toktocliplist(&argcl, NULL);
+       if (!tar_parseargs(argcl, argl, buf, 0))
+               return 1;
 
-  return 0;
+       process_tar();
+       SAFE_FREE(argl);
+       return 0;
 }
 
 /****************************************************************************
 Command line (option) version
 ***************************************************************************/
+
 int process_tar(void)
 {
-  initarbuf();
-  switch(tar_type) {
-  case 'x':
+       initarbuf();
+       switch(tar_type) {
+               case 'x':
 
 #if 0
-    do_tarput2();
+                       do_tarput2();
 #else
-    do_tarput();
+                       do_tarput();
 #endif
-    SAFE_FREE(tarbuf);
-    close(tarhandle);
-    break;
-  case 'r':
-  case 'c':
-    if (clipn && tar_excl) {
-      int i;
-      pstring tarmac;
-
-      for (i=0; i<clipn; i++) {
-       DEBUG(5,("arg %d = %s\n", i, cliplist[i]));
-
-       if (*(cliplist[i]+strlen(cliplist[i])-1)=='\\') {
-         *(cliplist[i]+strlen(cliplist[i])-1)='\0';
-       }
+                       SAFE_FREE(tarbuf);
+                       close(tarhandle);
+                       break;
+               case 'r':
+               case 'c':
+                       if (clipn && tar_excl) {
+                               int i;
+                               pstring tarmac;
+
+                               for (i=0; i<clipn; i++) {
+                                       DEBUG(5,("arg %d = %s\n", i, cliplist[i]));
+
+                                       if (*(cliplist[i]+strlen(cliplist[i])-1)=='\\') {
+                                               *(cliplist[i]+strlen(cliplist[i])-1)='\0';
+                                       }
        
-       if (strrchr_m(cliplist[i], '\\')) {
-         pstring saved_dir;
+                                       if (strrchr_m(cliplist[i], '\\')) {
+                                               pstring saved_dir;
          
-         pstrcpy(saved_dir, cur_dir);
+                                               pstrcpy(saved_dir, cur_dir);
          
-         if (*cliplist[i]=='\\') {
-           pstrcpy(tarmac, cliplist[i]);
-         } else {
-           pstrcpy(tarmac, cur_dir);
-           pstrcat(tarmac, cliplist[i]);
-         }
-         pstrcpy(cur_dir, tarmac);
-         *(strrchr_m(cur_dir, '\\')+1)='\0';
-
-         DEBUG(5, ("process_tar, do_list with tarmac: %s\n", tarmac));
-         do_list(tarmac,attribute,do_tar, False, True);
-         pstrcpy(cur_dir,saved_dir);
-       } else {
-         pstrcpy(tarmac, cur_dir);
-         pstrcat(tarmac, cliplist[i]);
-         DEBUG(5, ("process_tar, do_list with tarmac: %s\n", tarmac));
-         do_list(tarmac,attribute,do_tar, False, True);
-       }
-      }
-    } else {
-      pstring mask;
-      pstrcpy(mask,cur_dir);
-      DEBUG(5, ("process_tar, do_list with mask: %s\n", mask));
-      pstrcat(mask,"\\*");
-      do_list(mask,attribute,do_tar,False, True);
-    }
+                                               if (*cliplist[i]=='\\') {
+                                                       pstrcpy(tarmac, cliplist[i]);
+                                               } else {
+                                                       pstrcpy(tarmac, cur_dir);
+                                                       pstrcat(tarmac, cliplist[i]);
+                                               }
+                                               pstrcpy(cur_dir, tarmac);
+                                               *(strrchr_m(cur_dir, '\\')+1)='\0';
+
+                                               DEBUG(5, ("process_tar, do_list with tarmac: %s\n", tarmac));
+                                               do_list(tarmac,attribute,do_tar, False, True);
+                                               pstrcpy(cur_dir,saved_dir);
+                                       } else {
+                                               pstrcpy(tarmac, cur_dir);
+                                               pstrcat(tarmac, cliplist[i]);
+                                               DEBUG(5, ("process_tar, do_list with tarmac: %s\n", tarmac));
+                                               do_list(tarmac,attribute,do_tar, False, True);
+                                       }
+                               }
+                       } else {
+                               pstring mask;
+                               pstrcpy(mask,cur_dir);
+                               DEBUG(5, ("process_tar, do_list with mask: %s\n", mask));
+                               pstrcat(mask,"\\*");
+                               do_list(mask,attribute,do_tar,False, True);
+                       }
     
-    if (ntarf) dotareof(tarhandle);
-    close(tarhandle);
-    SAFE_FREE(tarbuf);
+                       if (ntarf)
+                               dotareof(tarhandle);
+                       close(tarhandle);
+                       SAFE_FREE(tarbuf);
     
-    DEBUG(0, ("tar: dumped %d files and directories\n", ntarf));
-    DEBUG(0, ("Total bytes written: %.0f\n", (double)ttarf));
-    break;
-  }
-
-  if (must_free_cliplist) {
-    int i;
-    for (i = 0; i < clipn; ++i) {
-      SAFE_FREE(cliplist[i]);
-    }
-    SAFE_FREE(cliplist);
-    cliplist = NULL;
-    clipn = 0;
-    must_free_cliplist = False;
-  }
-
-  return(0);
+                       DEBUG(0, ("tar: dumped %d files and directories\n", ntarf));
+                       DEBUG(0, ("Total bytes written: %.0f\n", (double)ttarf));
+                       break;
+       }
+
+       if (must_free_cliplist) {
+               int i;
+               for (i = 0; i < clipn; ++i) {
+                       SAFE_FREE(cliplist[i]);
+               }
+               SAFE_FREE(cliplist);
+               cliplist = NULL;
+               clipn = 0;
+               must_free_cliplist = False;
+       }
+       return(0);
 }
 
 /****************************************************************************
 Find a token (filename) in a clip list
 ***************************************************************************/
+
 static int clipfind(char **aret, int ret, char *tok)
 {
-  if (aret==NULL) return 0;
+       if (aret==NULL)
+               return 0;
 
-  /* ignore leading slashes or dots in token */
-  while(strchr_m("/\\.", *tok)) tok++;
+       /* ignore leading slashes or dots in token */
+       while(strchr_m("/\\.", *tok))
+               tok++;
 
-  while(ret--) {
-    char *pkey=*aret++;
+       while(ret--) {
+               char *pkey=*aret++;
 
-    /* ignore leading slashes or dots in list */
-    while(strchr_m("/\\.", *pkey)) pkey++;
+               /* ignore leading slashes or dots in list */
+               while(strchr_m("/\\.", *pkey))
+                       pkey++;
 
-    if (!strslashcmp(pkey, tok)) return 1;
-  }
-
-  return 0;
+               if (!strslashcmp(pkey, tok))
+                       return 1;
+       }
+       return 0;
 }
 
 /****************************************************************************
 Read list of files to include from the file and initialize cliplist
 accordingly.
 ***************************************************************************/
+
 static int read_inclusion_file(char *filename)
 {
-  XFILE *inclusion = NULL;
-  char buf[MAXPATHLEN + 1];
-  char *inclusion_buffer = NULL;
-  int inclusion_buffer_size = 0;
-  int inclusion_buffer_sofar = 0;
-  char *p;
-  char *tmpstr;
-  int i;
-  int error = 0;
-
-  clipn = 0;
-  buf[MAXPATHLEN] = '\0'; /* guarantee null-termination */
-  if ((inclusion = x_fopen(filename, O_RDONLY, 0)) == NULL) {
-    /* XXX It would be better to include a reason for failure, but without
-     * autoconf, it's hard to use strerror, sys_errlist, etc.
-     */
-    DEBUG(0,("Unable to open inclusion file %s\n", filename));
-    return 0;
-  }
-
-  while ((! error) && (x_fgets(buf, sizeof(buf)-1, inclusion))) {
-    if (inclusion_buffer == NULL) {
-      inclusion_buffer_size = 1024;
-      if ((inclusion_buffer = malloc(inclusion_buffer_size)) == NULL) {
-       DEBUG(0,("failure allocating buffer to read inclusion file\n"));
-       error = 1;
-       break;
-      }
-    }
+       XFILE *inclusion = NULL;
+       char buf[MAXPATHLEN + 1];
+       char *inclusion_buffer = NULL;
+       int inclusion_buffer_size = 0;
+       int inclusion_buffer_sofar = 0;
+       char *p;
+       char *tmpstr;
+       int i;
+       int error = 0;
+
+       clipn = 0;
+       buf[MAXPATHLEN] = '\0'; /* guarantee null-termination */
+       if ((inclusion = x_fopen(filename, O_RDONLY, 0)) == NULL) {
+               /* XXX It would be better to include a reason for failure, but without
+                * autoconf, it's hard to use strerror, sys_errlist, etc.
+                */
+               DEBUG(0,("Unable to open inclusion file %s\n", filename));
+               return 0;
+       }
+
+       while ((! error) && (x_fgets(buf, sizeof(buf)-1, inclusion))) {
+               if (inclusion_buffer == NULL) {
+                       inclusion_buffer_size = 1024;
+                       if ((inclusion_buffer = malloc(inclusion_buffer_size)) == NULL) {
+                               DEBUG(0,("failure allocating buffer to read inclusion file\n"));
+                               error = 1;
+                               break;
+                       }
+               }
     
-    if (buf[strlen(buf)-1] == '\n') {
-      buf[strlen(buf)-1] = '\0';
-    }
+               if (buf[strlen(buf)-1] == '\n') {
+                       buf[strlen(buf)-1] = '\0';
+               }
     
-    if ((strlen(buf) + 1 + inclusion_buffer_sofar) >= inclusion_buffer_size) {
-      char *ib;
-      inclusion_buffer_size *= 2;
-      ib = Realloc(inclusion_buffer,inclusion_buffer_size);
-      if (! ib) {
-       DEBUG(0,("failure enlarging inclusion buffer to %d bytes\n",
-                inclusion_buffer_size));
-       error = 1;
-       break;
-      }
-      else inclusion_buffer = ib;
-    }
+               if ((strlen(buf) + 1 + inclusion_buffer_sofar) >= inclusion_buffer_size) {
+                       char *ib;
+                       inclusion_buffer_size *= 2;
+                       ib = Realloc(inclusion_buffer,inclusion_buffer_size);
+                       if (! ib) {
+                               DEBUG(0,("failure enlarging inclusion buffer to %d bytes\n",
+                                               inclusion_buffer_size));
+                               error = 1;
+                               break;
+                       } else {
+                               inclusion_buffer = ib;
+                       }
+               }
     
-    safe_strcpy(inclusion_buffer + inclusion_buffer_sofar, buf, inclusion_buffer_size - inclusion_buffer_sofar);
-    inclusion_buffer_sofar += strlen(buf) + 1;
-    clipn++;
-  }
-  x_fclose(inclusion);
-
-  if (! error) {
-    /* Allocate an array of clipn + 1 char*'s for cliplist */
-    cliplist = malloc((clipn + 1) * sizeof(char *));
-    if (cliplist == NULL) {
-      DEBUG(0,("failure allocating memory for cliplist\n"));
-      error = 1;
-    } else {
-      cliplist[clipn] = NULL;
-      p = inclusion_buffer;
-      for (i = 0; (! error) && (i < clipn); i++) {
-       /* set current item to NULL so array will be null-terminated even if
-        * malloc fails below. */
-       cliplist[i] = NULL;
-       if ((tmpstr = (char *)malloc(strlen(p)+1)) == NULL) {
-         DEBUG(0, ("Could not allocate space for a cliplist item, # %i\n", i));
-         error = 1;
-       } else {
-         unfixtarname(tmpstr, p, strlen(p) + 1, True);
-         cliplist[i] = tmpstr;
-         if ((p = strchr_m(p, '\000')) == NULL) {
-           DEBUG(0,("INTERNAL ERROR: inclusion_buffer is of unexpected contents.\n"));
-           abort();
-         }
+               safe_strcpy(inclusion_buffer + inclusion_buffer_sofar, buf, inclusion_buffer_size - inclusion_buffer_sofar);
+               inclusion_buffer_sofar += strlen(buf) + 1;
+               clipn++;
+       }
+       x_fclose(inclusion);
+
+       if (! error) {
+               /* Allocate an array of clipn + 1 char*'s for cliplist */
+               cliplist = malloc((clipn + 1) * sizeof(char *));
+               if (cliplist == NULL) {
+                       DEBUG(0,("failure allocating memory for cliplist\n"));
+                       error = 1;
+               } else {
+                       cliplist[clipn] = NULL;
+                       p = inclusion_buffer;
+                       for (i = 0; (! error) && (i < clipn); i++) {
+                               /* set current item to NULL so array will be null-terminated even if
+                                               * malloc fails below. */
+                               cliplist[i] = NULL;
+                               if ((tmpstr = (char *)malloc(strlen(p)+1)) == NULL) {
+                                       DEBUG(0, ("Could not allocate space for a cliplist item, # %i\n", i));
+                                       error = 1;
+                               } else {
+                                       unfixtarname(tmpstr, p, strlen(p) + 1, True);
+                                       cliplist[i] = tmpstr;
+                                       if ((p = strchr_m(p, '\000')) == NULL) {
+                                               DEBUG(0,("INTERNAL ERROR: inclusion_buffer is of unexpected contents.\n"));
+                                               abort();
+                                       }
+                               }
+                               ++p;
+                       }
+                       must_free_cliplist = True;
+               }
+       }
+
+       SAFE_FREE(inclusion_buffer);
+       if (error) {
+               if (cliplist) {
+                       char **pp;
+                       /* We know cliplist is always null-terminated */
+                       for (pp = cliplist; *pp; ++pp) {
+                               SAFE_FREE(*pp);
+                       }
+                       SAFE_FREE(cliplist);
+                       cliplist = NULL;
+                       must_free_cliplist = False;
+               }
+               return 0;
        }
-       ++p;
-      }
-      must_free_cliplist = True;
-    }
-  }
-
-  SAFE_FREE(inclusion_buffer);
-  if (error) {
-    if (cliplist) {
-      char **pp;
-      /* We know cliplist is always null-terminated */
-      for (pp = cliplist; *pp; ++pp) {
-        SAFE_FREE(*pp);
-      }
-      SAFE_FREE(cliplist);
-      cliplist = NULL;
-      must_free_cliplist = False;
-    }
-    return 0;
-  }
   
-  /* cliplist and its elements are freed at the end of process_tar. */
-  return 1;
+       /* cliplist and its elements are freed at the end of process_tar. */
+       return 1;
 }
 
 /****************************************************************************
 Parse tar arguments. Sets tar_type, tar_excl, etc.
 ***************************************************************************/
+
 int tar_parseargs(int argc, char *argv[], char *Optarg, int Optind)
 {
-  char tar_clipfl='\0';
-
-  /* Reset back to defaults - could be from interactive version 
-   * reset mode and archive mode left as they are though
-   */
-  tar_type='\0';
-  tar_excl=True;
-  dry_run=False;
-
-  while (*Optarg) 
-    switch(*Optarg++) {
-    case 'c':
-      tar_type='c';
-      break;
-    case 'x':
-      if (tar_type=='c') {
-       printf("Tar must be followed by only one of c or x.\n");
-       return 0;
-      }
-      tar_type='x';
-      break;
-    case 'b':
-      if (Optind>=argc || !(blocksize=atoi(argv[Optind]))) {
-       DEBUG(0,("Option b must be followed by valid blocksize\n"));
-       return 0;
-      } else {
-       Optind++;
-      }
-      break;
-    case 'g':
-      tar_inc=True;
-      break;
-    case 'N':
-      if (Optind>=argc) {
-       DEBUG(0,("Option N must be followed by valid file name\n"));
-       return 0;
-      } else {
-       SMB_STRUCT_STAT stbuf;
-       extern time_t newer_than;
+       int newOptind = Optind;
+       char tar_clipfl='\0';
+
+       /* Reset back to defaults - could be from interactive version 
+        * reset mode and archive mode left as they are though
+        */
+       tar_type='\0';
+       tar_excl=True;
+       dry_run=False;
+
+       while (*Optarg) {
+               switch(*Optarg++) {
+                       case 'c':
+                               tar_type='c';
+                               break;
+                       case 'x':
+                               if (tar_type=='c') {
+                                       printf("Tar must be followed by only one of c or x.\n");
+                                       return 0;
+                               }
+                               tar_type='x';
+                               break;
+                       case 'b':
+                               if (Optind>=argc || !(blocksize=atoi(argv[Optind]))) {
+                                       DEBUG(0,("Option b must be followed by valid blocksize\n"));
+                                       return 0;
+                               } else {
+                                       Optind++;
+                                       newOptind++;
+                               }
+                               break;
+                       case 'g':
+                               tar_inc=True;
+                               break;
+                       case 'N':
+                               if (Optind>=argc) {
+                                       DEBUG(0,("Option N must be followed by valid file name\n"));
+                                       return 0;
+                               } else {
+                                       SMB_STRUCT_STAT stbuf;
+                                       extern time_t newer_than;
        
-       if (sys_stat(argv[Optind], &stbuf) == 0) {
-         newer_than = stbuf.st_mtime;
-         DEBUG(1,("Getting files newer than %s",
-                  asctime(LocalTime(&newer_than))));
-         Optind++;
-       } else {
-         DEBUG(0,("Error setting newer-than time\n"));
-         return 0;
+                                       if (sys_stat(argv[Optind], &stbuf) == 0) {
+                                               newer_than = stbuf.st_mtime;
+                                               DEBUG(1,("Getting files newer than %s",
+                                                       asctime(LocalTime(&newer_than))));
+                                               newOptind++;
+                                               Optind++;
+                                       } else {
+                                               DEBUG(0,("Error setting newer-than time\n"));
+                                               return 0;
+                                       }
+                               }
+                               break;
+                       case 'a':
+                               tar_reset=True;
+                               break;
+                       case 'q':
+                               tar_noisy=False;
+                               break;
+                       case 'I':
+                               if (tar_clipfl) {
+                                       DEBUG(0,("Only one of I,X,F must be specified\n"));
+                                       return 0;
+                               }
+                               tar_clipfl='I';
+                               break;
+                       case 'X':
+                               if (tar_clipfl) {
+                                       DEBUG(0,("Only one of I,X,F must be specified\n"));
+                                       return 0;
+                               }
+                               tar_clipfl='X';
+                               break;
+                       case 'F':
+                               if (tar_clipfl) {
+                                       DEBUG(0,("Only one of I,X,F must be specified\n"));
+                                       return 0;
+                               }
+                               tar_clipfl='F';
+                               break;
+                       case 'r':
+                               DEBUG(0, ("tar_re_search set\n"));
+                               tar_re_search = True;
+                               break;
+                       case 'n':
+                               if (tar_type == 'c') {
+                                       DEBUG(0, ("dry_run set\n"));
+                                       dry_run = True;
+                               } else {
+                                       DEBUG(0, ("n is only meaningful when creating a tar-file\n"));
+                                       return 0;
+                               }
+                               break;
+                       default:
+                               DEBUG(0,("Unknown tar option\n"));
+                               return 0;
+               }
        }
-      }
-      break;
-    case 'a':
-      tar_reset=True;
-      break;
-    case 'q':
-      tar_noisy=False;
-      break;
-    case 'I':
-      if (tar_clipfl) {
-       DEBUG(0,("Only one of I,X,F must be specified\n"));
-       return 0;
-      }
-      tar_clipfl='I';
-      break;
-    case 'X':
-      if (tar_clipfl) {
-       DEBUG(0,("Only one of I,X,F must be specified\n"));
-       return 0;
-      }
-      tar_clipfl='X';
-      break;
-    case 'F':
-      if (tar_clipfl) {
-       DEBUG(0,("Only one of I,X,F must be specified\n"));
-       return 0;
-      }
-      tar_clipfl='F';
-      break;
-    case 'r':
-      DEBUG(0, ("tar_re_search set\n"));
-      tar_re_search = True;
-      break;
-    case 'n':
-      if (tar_type == 'c') {
-       DEBUG(0, ("dry_run set\n"));
-       dry_run = True;
-      } else {
-       DEBUG(0, ("n is only meaningful when creating a tar-file\n"));
-       return 0;
-      }
-      break;
-    default:
-      DEBUG(0,("Unknown tar option\n"));
-      return 0;
-    }
-
-  if (!tar_type) {
-    printf("Option T must be followed by one of c or x.\n");
-    return 0;
-  }
-
-  /* tar_excl is true if cliplist lists files to be included.
-   * Both 'I' and 'F' mean include. */
-  tar_excl=tar_clipfl!='X';
-
-  if (tar_clipfl=='F') {
-    if (argc-Optind-1 != 1) {
-      DEBUG(0,("Option F must be followed by exactly one filename.\n"));
-      return 0;
-    }
-    if (! read_inclusion_file(argv[Optind+1])) {
-      return 0;
-    }
-  } else if (Optind+1<argc && !tar_re_search) { /* For backwards compatibility */
-    char *tmpstr;
-    char **tmplist;
-    int clipcount;
-
-    cliplist=argv+Optind+1;
-    clipn=argc-Optind-1;
-    clipcount = clipn;
-
-    if ((tmplist=malloc(clipn*sizeof(char *))) == NULL) {
-      DEBUG(0, ("Could not allocate space to process cliplist, count = %i\n", 
-               clipn)
-           );
-      return 0;
-    }
-
-    for (clipcount = 0; clipcount < clipn; clipcount++) {
-
-      DEBUG(5, ("Processing an item, %s\n", cliplist[clipcount]));
-
-      if ((tmpstr = (char *)malloc(strlen(cliplist[clipcount])+1)) == NULL) {
-        DEBUG(0, ("Could not allocate space for a cliplist item, # %i\n",
-                 clipcount)
-             );
-        return 0;
-      }
-      unfixtarname(tmpstr, cliplist[clipcount], strlen(cliplist[clipcount]) + 1, True);
-      tmplist[clipcount] = tmpstr;
-      DEBUG(5, ("Processed an item, %s\n", tmpstr));
-
-      DEBUG(5, ("Cliplist is: %s\n", cliplist[0]));
-    }
-    cliplist = tmplist;
-    must_free_cliplist = True;
-  }
-
-  if (Optind+1<argc && tar_re_search) {  /* Doing regular expression seaches */
-#ifdef HAVE_REGEX_H
-    int errcode;
 
-    if ((preg = (regex_t *)malloc(65536)) == NULL) {
+       if (!tar_type) {
+               printf("Option T must be followed by one of c or x.\n");
+               return 0;
+       }
 
-      DEBUG(0, ("Could not allocate buffer for regular expression search\n"));
-      return;
+       /* tar_excl is true if cliplist lists files to be included.
+        * Both 'I' and 'F' mean include. */
+       tar_excl=tar_clipfl!='X';
 
-    }
+       if (tar_clipfl=='F') {
+               if (argc-Optind-1 != 1) {
+                       DEBUG(0,("Option F must be followed by exactly one filename.\n"));
+                       return 0;
+               }
+               newOptind++;
+               Optind++;
+               if (! read_inclusion_file(argv[Optind])) {
+                       return 0;
+               }
+       } else if (Optind+1<argc && !tar_re_search) { /* For backwards compatibility */
+               char *tmpstr;
+               char **tmplist;
+               int clipcount;
+
+               cliplist=argv+Optind+1;
+               clipn=argc-Optind-1;
+               clipcount = clipn;
+
+               if ((tmplist=malloc(clipn*sizeof(char *))) == NULL) {
+                       DEBUG(0, ("Could not allocate space to process cliplist, count = %i\n", clipn));
+                       return 0;
+               }
 
-    if (errcode = regcomp(preg, argv[Optind + 1], REG_EXTENDED)) {
-      char errstr[1024];
-      size_t errlen;
+               for (clipcount = 0; clipcount < clipn; clipcount++) {
 
-      errlen = regerror(errcode, preg, errstr, sizeof(errstr) - 1);
-      
-      DEBUG(0, ("Could not compile pattern buffer for re search: %s\n%s\n", argv[Optind + 1], errstr));
-      return;
+                       DEBUG(5, ("Processing an item, %s\n", cliplist[clipcount]));
+
+                       if ((tmpstr = (char *)malloc(strlen(cliplist[clipcount])+1)) == NULL) {
+                               DEBUG(0, ("Could not allocate space for a cliplist item, # %i\n", clipcount));
+                               return 0;
+                       }
+
+                       unfixtarname(tmpstr, cliplist[clipcount], strlen(cliplist[clipcount]) + 1, True);
+                       tmplist[clipcount] = tmpstr;
+                       DEBUG(5, ("Processed an item, %s\n", tmpstr));
+
+                       DEBUG(5, ("Cliplist is: %s\n", cliplist[0]));
+               }
 
-    }
+               cliplist = tmplist;
+               must_free_cliplist = True;
+
+               newOptind += clipn;
+       }
+
+       if (Optind+1<argc && tar_re_search) {  /* Doing regular expression seaches */
+#ifdef HAVE_REGEX_H
+               int errcode;
+
+               if ((preg = (regex_t *)malloc(65536)) == NULL) {
+
+                       DEBUG(0, ("Could not allocate buffer for regular expression search\n"));
+                       return;
+               }
+
+               if (errcode = regcomp(preg, argv[Optind + 1], REG_EXTENDED)) {
+                       char errstr[1024];
+                       size_t errlen;
+
+                       errlen = regerror(errcode, preg, errstr, sizeof(errstr) - 1);
+                       DEBUG(0, ("Could not compile pattern buffer for re search: %s\n%s\n", argv[Optind + 1], errstr));
+                       return;
+               }
 #endif
 
-    clipn=argc-Optind-1;
-    cliplist=argv+Optind+1;
-
-  }
-
-  if (Optind>=argc || !strcmp(argv[Optind], "-")) {
-    /* Sets tar handle to either 0 or 1, as appropriate */
-    tarhandle=(tar_type=='c');
-    /*
-     * Make sure that dbf points to stderr if we are using stdout for 
-     * tar output
-    */
-    if (tarhandle == 1) 
-      dbf = x_stderr;
-  } else {
-    if (tar_type=='c' && (dry_run || strcmp(argv[Optind], "/dev/null")==0))
-      {
-       if (!dry_run) {
-         DEBUG(0,("Output is /dev/null, assuming dry_run\n"));
-         dry_run = True;
+               clipn=argc-Optind-1;
+               cliplist=argv+Optind+1;
+               newOptind += clipn;
+       }
+
+       if (Optind>=argc || !strcmp(argv[Optind], "-")) {
+               /* Sets tar handle to either 0 or 1, as appropriate */
+               tarhandle=(tar_type=='c');
+               /*
+                * Make sure that dbf points to stderr if we are using stdout for 
+                * tar output
+                */
+               if (tarhandle == 1)  {
+                       dbf = x_stderr;
+               }
+               if (!strcmp(argv[Optind], "-")) {
+                       newOptind++;
+               }
+
+       } else {
+               if (tar_type=='c' && (dry_run || strcmp(argv[Optind], "/dev/null")==0)) {
+                       if (!dry_run) {
+                               DEBUG(0,("Output is /dev/null, assuming dry_run\n"));
+                               dry_run = True;
+                       }
+                       tarhandle=-1;
+               } else if ((tar_type=='x' && (tarhandle = sys_open(argv[Optind], O_RDONLY, 0)) == -1)
+                                       || (tar_type=='c' && (tarhandle=sys_creat(argv[Optind], 0644)) < 0)) {
+                       DEBUG(0,("Error opening local file %s - %s\n", argv[Optind], strerror(errno)));
+                       return(0);
+               }
+               newOptind++;
        }
-       tarhandle=-1;
-      } else
-    if ((tar_type=='x' && (tarhandle = sys_open(argv[Optind], O_RDONLY, 0)) == -1)
-       || (tar_type=='c' && (tarhandle=sys_creat(argv[Optind], 0644)) < 0))
-      {
-       DEBUG(0,("Error opening local file %s - %s\n",
-                argv[Optind], strerror(errno)));
-       return(0);
-      }
-  }
 
-  return 1;
+       return newOptind;
 }
index 68165792da3df3f86f95284d67b0113485aa369f..5daefec5a550f2dd0a8f610b1705f2e437dedfda 100644 (file)
@@ -282,7 +282,7 @@ smb_connect(const char *workgroup,          /* I - Workgroup */
   get_myname(myname);  
        
   nt_status = cli_full_connection(&c, myname, server, NULL, 0, share, "?????", 
-                                 username, workgroup, password, 0, NULL);
+                                 username, workgroup, password, 0, Undefined, NULL);
   
   if (!NT_STATUS_IS_OK(nt_status)) {
          fprintf(stderr, "ERROR:  Connection failed with error %s\n", nt_errstr(nt_status));
index 3b90d15f65217ef12b8bd07d7b285655f6ceacae..97ad7742e314fe1b7a861a0efc87cfaa8cd31710 100644 (file)
@@ -69,7 +69,7 @@ static void tree_error_message(gchar *message) {
  * workgroup type and return a path from there
  */
 
-static char path_string[1024];
+static pstring path_string;
 
 char *get_path(GtkWidget *item)
 {
@@ -112,7 +112,7 @@ char *get_path(GtkWidget *item)
    * Now, build the path
    */
 
-  snprintf(path_string, sizeof(path_string), "smb:/");
+  pstrcpy( path_string, "smb:/" );
 
   for (j = i - 1; j >= 0; j--) {
 
@@ -151,7 +151,7 @@ static void cb_select_child (GtkWidget *root_tree, GtkWidget *child,
   char dirbuf[512];
   struct smbc_dirent *dirp;
   struct stat st1;
-  char path[1024], path1[1024];
+  pstring path, path1;
 
   g_print ("select_child called for root tree %p, subtree %p, child %p\n",
           root_tree, subtree, child);
index fd7ee9fc30d12bae6b1ce9fdeac3b8bd459e16ad..f964bc719f71527d4586673382f3162039bce373 100644 (file)
@@ -152,12 +152,10 @@ AC_SUBST(LIBSMBCLIENT)
 AC_SUBST(PRINTLIBS)
 AC_SUBST(AUTHLIBS)
 AC_SUBST(ACLLIBS)
-AC_SUBST(ADSLIBS)
 AC_SUBST(PASSDBLIBS)
 AC_SUBST(IDMAP_LIBS)
 AC_SUBST(KRB5_LIBS)
 AC_SUBST(LDAP_LIBS)
-AC_SUBST(LDAP_OBJ)
 AC_SUBST(SHLIB_PROGS)
 AC_SUBST(SMBWRAPPER)
 AC_SUBST(EXTRA_BIN_PROGS)
@@ -289,7 +287,7 @@ dnl These have to be built static:
 default_static_modules="pdb_smbpasswd pdb_tdbsam rpc_lsa rpc_samr rpc_reg rpc_wks rpc_net rpc_dfs rpc_srv rpc_spoolss auth_rhosts auth_sam auth_unix auth_winbind auth_server auth_domain auth_builtin"
 
 dnl These are preferably build shared, and static if dlopen() is not available
-default_shared_modules="vfs_recycle vfs_audit vfs_extd_audit vfs_netatalk vfs_fake_perms"
+default_shared_modules="vfs_recycle vfs_audit vfs_extd_audit vfs_netatalk vfs_fake_perms vfs_default_quota"
 
 if test "x$developer" = xyes; then
    default_static_modules="$default_static_modules rpc_echo"
@@ -552,7 +550,7 @@ AC_CHECK_HEADERS(shadow.h netinet/ip.h netinet/tcp.h netinet/in_systm.h netinet/
 AC_CHECK_HEADERS(nss.h nss_common.h ns_api.h sys/security.h security/pam_appl.h security/pam_modules.h)
 AC_CHECK_HEADERS(stropts.h poll.h)
 AC_CHECK_HEADERS(sys/capability.h syscall.h sys/syscall.h)
-AC_CHECK_HEADERS(sys/acl.h attr/xattr.h sys/cdefs.h glob.h)
+AC_CHECK_HEADERS(sys/acl.h sys/attributes.h attr/xattr.h sys/cdefs.h glob.h)
 
 # For experimental utmp support (lastlog on some BSD-like systems)
 AC_CHECK_HEADERS(utmp.h utmpx.h lastlog.h)
@@ -843,7 +841,7 @@ AC_CHECK_FUNCS(setpriv setgidx setuidx setgroups sysconf mktime rename ftruncate
 AC_CHECK_FUNCS(lstat64 fopen64 atexit grantpt dup2 lseek64 ftruncate64 readdir64)
 AC_CHECK_FUNCS(fseek64 fseeko64 ftell64 ftello64 setluid getpwanam setlinebuf)
 AC_CHECK_FUNCS(srandom random srand rand setenv usleep strcasecmp fcvt fcvtl symlink readlink)
-AC_CHECK_FUNCS(syslog vsyslog getgrouplist timegm)
+AC_CHECK_FUNCS(syslog vsyslog timegm)
 AC_CHECK_FUNCS(setlocale nl_langinfo)
 # setbuffer, shmget, shm_open are needed for smbtorture
 AC_CHECK_FUNCS(setbuffer shmget shm_open backtrace_symbols)
@@ -866,6 +864,38 @@ AC_CHECK_FUNCS(pread _pread __pread pread64 _pread64 __pread64)
 AC_CHECK_FUNCS(pwrite _pwrite __pwrite pwrite64 _pwrite64 __pwrite64)
 AC_CHECK_FUNCS(open64 _open64 __open64 creat64)
 
+#
+# 
+#
+case "$host_os" in
+    *linux*)
+       # glibc <= 2.3.2 has a broken getgrouplist
+       AC_TRY_RUN([
+#include <unistd.h>
+#include <sys/utsname.h>
+main() {
+       /* glibc up to 2.3 has a broken getgrouplist */
+#if defined(__GLIBC__) && defined(__GLIBC_MINOR__)
+       int libc_major = __GLIBC__;
+       int libc_minor = __GLIBC_MINOR__;
+
+       if (libc_major < 2)
+              exit(1);
+       if ((libc_major == 2) && (libc_minor <= 3))
+              exit(1);
+#endif
+       exit(0);
+}
+], [linux_getgrouplist_ok=yes], [linux_getgrouplist_ok=no])
+       if test x"$linux_getgrouplist_ok" = x"yes"; then
+          AC_DEFINE(HAVE_GETGROUPLIST, 1, [Have good getgrouplist])
+       fi
+       ;;
+    *)
+       AC_CHECK_FUNCS(getgrouplist)
+       ;;
+esac
+
 #
 # stat64 family may need <sys/stat.h> on some systems, notably ReliantUNIX
 #
@@ -946,6 +976,8 @@ AC_SEARCH_LIBS(getxattr, [attr])
 AC_CHECK_FUNCS(getxattr lgetxattr fgetxattr listxattr llistxattr)
 AC_CHECK_FUNCS(flistxattr removexattr lremovexattr fremovexattr)
 AC_CHECK_FUNCS(setxattr lsetxattr fsetxattr)
+AC_CHECK_FUNCS(attr_get attr_list attr_set attr_remove)
+AC_CHECK_FUNCS(attr_getf attr_listf attr_setf attr_removef)
 
 # Assume non-shared by default and override below
 BLDSHARED="false"
@@ -2095,14 +2127,105 @@ AC_ARG_WITH(dfs,
   AC_MSG_RESULT(no)
 )
 
+########################################################
+# Compile with LDAP support?
+
+with_ldap_support=auto
+AC_MSG_CHECKING([for LDAP support])
+
+AC_ARG_WITH(ldap,
+[  --with-ldap             LDAP support (default yes)],
+[ case "$withval" in
+    yes|no)
+       with_ldap_support=$withval
+       ;;
+  esac ])
+
+AC_MSG_RESULT($with_ldap_support)
+
+SMBLDAP=""
+AC_SUBST(SMBLDAP)
+if test x"$with_ldap_support" != x"no"; then
+
+  ##################################################################
+  # first test for ldap.h and lber.h
+  # (ldap.h is required for this test)
+  AC_CHECK_HEADERS(ldap.h lber.h)
+  
+  if test x"$ac_cv_header_ldap_h" != x"yes"; then
+       if test x"$with_ldap_support" = x"yes"; then
+        AC_MSG_ERROR(ldap.h is needed for LDAP support)
+       else
+        AC_MSG_WARN(ldap.h is needed for LDAP support)
+       fi
+       
+       with_ldap_support=no
+  fi
+fi
+
+if test x"$with_ldap_support" != x"no"; then
+  ac_save_LIBS=$LIBS
+
+  ##################################################################
+  # we might need the lber lib on some systems. To avoid link errors
+  # this test must be before the libldap test
+  AC_CHECK_LIB_EXT(lber, LDAP_LIBS, ber_scanf)
+
+  ########################################################
+  # now see if we can find the ldap libs in standard paths
+  AC_CHECK_LIB_EXT(ldap, LDAP_LIBS, ldap_init)
+
+  AC_CHECK_FUNC_EXT(ldap_domain2hostlist,$LDAP_LIBS)
+  
+  ########################################################
+  # If we have LDAP, does it's rebind procedure take 2 or 3 arguments?
+  # Check found in pam_ldap 145.
+  AC_CHECK_FUNC_EXT(ldap_set_rebind_proc,$LDAP_LIBS)
+
+  LIBS="$LIBS $LDAP_LIBS"
+  AC_CACHE_CHECK(whether ldap_set_rebind_proc takes 3 arguments, smb_ldap_cv_ldap_set_rebind_proc, [
+    AC_TRY_COMPILE([
+       #include <lber.h>
+       #include <ldap.h>], 
+       [ldap_set_rebind_proc(0, 0, 0);], 
+       [smb_ldap_cv_ldap_set_rebind_proc=3], 
+       [smb_ldap_cv_ldap_set_rebind_proc=2]
+    ) 
+  ])
+  
+  AC_DEFINE_UNQUOTED(LDAP_SET_REBIND_PROC_ARGS, $smb_ldap_cv_ldap_set_rebind_proc, [Number of arguments to ldap_set_rebind_proc])
+
+  AC_CHECK_FUNC_EXT(ldap_initialize,$LDAP_LIBS)        
+  
+  if test x"$ac_cv_lib_ext_ldap_ldap_init" = x"yes" -a x"$ac_cv_func_ext_ldap_domain2hostlist" = x"yes"; then
+    AC_DEFINE(HAVE_LDAP,1,[Whether ldap is available])
+    default_static_modules="$default_static_modules pdb_ldap idmap_ldap";
+    SMBLDAP="lib/smbldap.o"
+    with_ldap_support=yes
+    AC_MSG_CHECKING(whether LDAP support is used)
+    AC_MSG_RESULT(yes)
+  else
+    if test x"$with_ldap_support" = x"yes"; then
+       AC_MSG_ERROR(libldap is needed for LDAP support)
+    else
+       AC_MSG_WARN(libldap is needed for LDAP support)
+    fi
+    
+    LDAP_LIBS=""
+    with_ldap_support=no
+  fi
+  LIBS=$ac_save_LIBS
+fi
+
+
 #################################################
 # active directory support
 
 with_ads_support=auto
-AC_MSG_CHECKING([whether to use Active Directory])
+AC_MSG_CHECKING([for Active Directory and krb5 support])
 
 AC_ARG_WITH(ads,
-[  --with-ads              Active Directory support (default yes)],
+[  --with-ads              Active Directory support (default auto)],
 [ case "$withval" in
     yes|no)
        with_ads_support="$withval"
@@ -2114,22 +2237,34 @@ AC_MSG_RESULT($with_ads_support)
 FOUND_KRB5=no
 KRB5_LIBS=""
 
+if test x"$with_ldap_support" != x"yes"; then
+    if test x"$with_ads_support" = x"yes"; then
+       AC_MSG_ERROR(Active Directory Support requires LDAP support)
+    elif test x"$with_ads_support" != x"no"; then
+       AC_MSG_WARN(Active Directory Support requires LDAP support)
+    fi
+    with_ads_support=no
+fi
+
 if test x"$with_ads_support" != x"no"; then
 
   # Do no harm to the values of CFLAGS and LIBS while testing for
   # Kerberos support.
 
-  ac_save_CFLAGS="$CFLAGS"
-  ac_save_LIBS="$LIBS"
-
   #################################################
   # check for krb5-config from recent MIT and Heimdal kerberos 5
   AC_PATH_PROG(KRB5_CONFIG, krb5-config)
   AC_MSG_CHECKING(for working krb5-config)
   if test -x "$KRB5_CONFIG"; then
-    LIBS="$LIBS `$KRB5_CONFIG --libs`"
-    CFLAGS="$CFLAGS `$KRB5_CONFIG --cflags | sed s/@INCLUDE_des@//`" 
-    CPPFLAGS="$CPPFLAGS `$KRB5_CONFIG --cflags | sed s/@INCLUDE_des@//`"
+    ac_save_CFLAGS=$CFLAGS
+    CFLAGS="";export CFLAGS
+    ac_save_LDFLAGS=$LDFLAGS
+    LDFLAGS="";export LDFLAGS
+    KRB5_LIBS="`$KRB5_CONFIG --libs gssapi`"
+    KRB5_CFLAGS="`$KRB5_CONFIG --cflags | sed s/@INCLUDE_des@//`" 
+    KRB5_CPPFLAGS="`$KRB5_CONFIG --cflags | sed s/@INCLUDE_des@//`"
+    CFLAGS=$ac_save_CFLAGS;export CFLAGS
+    LDFLAGS=$ac_save_LDFLAGS;export LDFLAGS
     FOUND_KRB5=yes
     AC_MSG_RESULT(yes)
   else
@@ -2144,18 +2279,21 @@ if test x"$with_ads_support" != x"no"; then
     [  --with-krb5=base-dir    Locate Kerberos 5 support (default=/usr)],
     [ case "$withval" in
       no)
-        AC_MSG_RESULT(no)
+        AC_MSG_RESULT(no krb5-path given)
+        ;;
+      yes)
+        AC_MSG_RESULT(/usr)
+        FOUND_KRB5=yes
         ;;
       *)
-        AC_MSG_RESULT(yes)
-        LIBS="$LIBS -lkrb5"
-        CFLAGS="$CFLAGS -I$withval/include"
-        CPPFLAGS="$CPPFLAGS -I$withval/include"
-        LDFLAGS="$LDFLAGS -L$withval/lib"
+        AC_MSG_RESULT($withval)
+        KRB5_CFLAGS="-I$withval/include"
+        KRB5_CPPFLAGS="-I$withval/include"
+        KRB5_LDFLAGS="-L$withval/lib"
         FOUND_KRB5=yes
         ;;
       esac ],
-      AC_MSG_RESULT(no)
+      AC_MSG_RESULT(no krb5-path given)
     )
   fi
 
@@ -2165,15 +2303,13 @@ if test x"$with_ads_support" != x"no"; then
     AC_MSG_CHECKING(for /usr/include/heimdal)
     if test -d /usr/include/heimdal; then
       if test -f /usr/lib/heimdal/lib/libkrb5.a; then
-          LIBS="$LIBS -lkrb5"
-          CFLAGS="$CFLAGS -I/usr/include/heimdal"
-          CPPFLAGS="$CPPFLAGS -I/usr/include/heimdal"
-          LDFLAGS="$LDFLAGS -L/usr/lib/heimdal/lib"
+          KRB5_CFLAGS="-I/usr/include/heimdal"
+          KRB5_CPPFLAGS="-I/usr/include/heimdal"
+          KRB5_LDFLAGS="-L/usr/lib/heimdal/lib"
           AC_MSG_RESULT(yes)
       else
-          LIBS="$LIBS -lkrb5"
-          CFLAGS="$CFLAGS -I/usr/include/heimdal"
-          CPPFLAGS="$CPPFLAGS -I/usr/include/heimdal"
+          KRB5_CFLAGS="-I/usr/include/heimdal"
+          KRB5_CPPFLAGS="-I/usr/include/heimdal"
           AC_MSG_RESULT(yes)
       fi
     else
@@ -2186,16 +2322,25 @@ if test x"$with_ads_support" != x"no"; then
     # see if this box has the RedHat location for kerberos
     AC_MSG_CHECKING(for /usr/kerberos)
     if test -d /usr/kerberos -a -f /usr/kerberos/lib/libkrb5.a; then
-      LIBS="$LIBS -lkrb5"
-      LDFLAGS="$LDFLAGS -L/usr/kerberos/lib"
-      CFLAGS="$CFLAGS -I/usr/kerberos/include"
-      CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include"
+      KRB5_LDFLAGS="-L/usr/kerberos/lib"
+      KRB5_CFLAGS="-I/usr/kerberos/include"
+      KRB5_CPPFLAGS="-I/usr/kerberos/include"
       AC_MSG_RESULT(yes)
     else
       AC_MSG_RESULT(no)
     fi
   fi
 
+  ac_save_CFLAGS=$CFLAGS
+  ac_save_CPPFLAGS=$CPPFLAGS
+  ac_save_LDFLAGS=$LDFLAGS
+
+  CFLAGS="$CFLAGS $KRB5_CFLAGS"
+  CPPFLAGS="$CPPFLAGS $KRB5_CPPFLAGS"
+  LDFLAGS="$LDFLAGS $KRB5_LDFLAGS"
+
+  KRB5_LIBS="$KRB5_LDFLAGS $KRB5_LIBS"
+
   # now check for krb5.h. Some systems have the libraries without the headers!
   # note that this check is done here to allow for different kerberos
   # include paths
@@ -2215,24 +2360,17 @@ if test x"$with_ads_support" != x"no"; then
     # Turn off AD support and restore CFLAGS and LIBS variables
 
     with_ads_support="no"
-
-    CFLAGS="$ac_save_CFLAGS"
-    LIBS="$ac_save_LIBS"
-
-  else
-
-    # Get rid of case where $with_ads_support=auto
-
-    with_ads_support="yes"
-
+    
+    CFLAGS=$ac_save_CFLAGS
+    CPPFLAGS=$ac_save_CPPFLAGS
+    LDFLAGS=$ac_save_LDFLAGS
   fi
 fi
 
 # Now we have determined whether we really want ADS support
 
-if test x"$with_ads_support" = x"yes"; then
-
-  AC_DEFINE(WITH_ADS,1,[Whether to include Active Directory support])
+if test x"$with_ads_support" != x"no"; then
+  ac_save_LIBS=$LIBS
 
   # now check for gssapi headers.  This is also done here to allow for
   # different kerberos include paths
@@ -2240,62 +2378,46 @@ if test x"$with_ads_support" = x"yes"; then
 
   ##################################################################
   # we might need the k5crypto and com_err libraries on some systems
-  AC_CHECK_LIB(com_err, _et_list)
-  AC_CHECK_LIB(k5crypto, krb5_encrypt_data)
+  AC_CHECK_LIB_EXT(com_err, KRB5_LIBS, _et_list)
+  AC_CHECK_LIB_EXT(k5crypto, KRB5_LIBS, krb5_encrypt_data)
 
   # Heimdal checks.
-  AC_CHECK_LIB(crypto, des_set_key)
-  AC_CHECK_LIB(asn1, copy_Authenticator)
-  AC_CHECK_LIB(roken, roken_getaddrinfo_hostspec)
+  AC_CHECK_LIB_EXT(crypto, KRB5_LIBS, des_set_key)
+  AC_CHECK_LIB_EXT(asn1, KRB5_LIBS, copy_Authenticator)
+  AC_CHECK_LIB_EXT(roken, KRB5_LIBS, roken_getaddrinfo_hostspec)
 
   # Heimdal checks. On static Heimdal gssapi must be linked before krb5.
-  AC_CHECK_LIB(gssapi, gss_display_status, [LIBS="$LIBS -lgssapi -lkrb5";
-                 AC_DEFINE(HAVE_GSSAPI,1,[Whether GSSAPI is available])])
-
-  AC_CHECK_LIB(krb5, krb5_set_real_time, 
-                [AC_DEFINE(HAVE_KRB5_SET_REAL_TIME,1,
-                   [Whether krb5_set_real_time is available])])
-  AC_CHECK_LIB(krb5, krb5_set_default_in_tkt_etypes, 
-                 [AC_DEFINE(HAVE_KRB5_SET_DEFAULT_IN_TKT_ETYPES,1,
-                   [Whether krb5_set_default_in_tkt_etypes, is available])])
-  AC_CHECK_LIB(krb5, krb5_set_default_tgs_ktypes, 
-                 [AC_DEFINE(HAVE_KRB5_SET_DEFAULT_TGS_KTYPES,1,
-                   [Whether krb5_set_default_tgs_ktypes is available])])
-
-  AC_CHECK_LIB(krb5, krb5_principal2salt, 
-                [AC_DEFINE(HAVE_KRB5_PRINCIPAL2SALT,1,
-                   [Whether krb5_principal2salt is available])])
-  AC_CHECK_LIB(krb5, krb5_use_enctype, 
-                [AC_DEFINE(HAVE_KRB5_USE_ENCTYPE,1,
-                   [Whether krb5_use_enctype is available])])
-  AC_CHECK_LIB(krb5, krb5_string_to_key, 
-                [AC_DEFINE(HAVE_KRB5_STRING_TO_KEY,1,
-                   [Whether krb5_string_to_key is available])])
-  AC_CHECK_LIB(krb5, krb5_get_pw_salt, 
-                [AC_DEFINE(HAVE_KRB5_GET_PW_SALT,1,
-                   [Whether krb5_get_pw_salt is available])])
-  AC_CHECK_LIB(krb5, krb5_string_to_key_salt, 
-                [AC_DEFINE(HAVE_KRB5_STRING_TO_KEY_SALT,1,
-                   [Whether krb5_string_to_key_salt is available])])
-  AC_CHECK_LIB(krb5, krb5_auth_con_setkey, 
-                [AC_DEFINE(HAVE_KRB5_AUTH_CON_SETKEY,1,
-                   [Whether krb5_auth_con_setkey is available])])
-  AC_CHECK_LIB(krb5, krb5_auth_con_setuseruserkey, 
-                [AC_DEFINE(HAVE_KRB5_AUTH_CON_SETUSERUSERKEY,1,
-                   [Whether krb5_auth_con_setuseruserkey is available])])
-  AC_CHECK_LIB(krb5, krb5_locate_kdc, 
-                [AC_DEFINE(HAVE_KRB5_LOCATE_KDC,1,
-                   [Whether krb5_locate_kdc is available])])
-  AC_CHECK_LIB(krb5, krb5_get_permitted_enctypes, 
-                [AC_DEFINE(HAVE_KRB5_GET_PERMITTED_ENCTYPES,1,
-                   [Whether krb5_get_permitted_enctypes is available])])
-  AC_CHECK_LIB(krb5, krb5_get_default_in_tkt_etypes, 
-                [AC_DEFINE(HAVE_KRB5_GET_DEFAULT_IN_TKT_ETYPES,1,
-                   [Whether krb5_get_default_in_tkt_etypes is available])])
-  AC_CHECK_LIB(krb5, krb5_free_ktypes, 
-                [AC_DEFINE(HAVE_KRB5_FREE_KTYPES,1,
-                   [Whether krb5_free_ktypes is available])])
+  AC_CHECK_LIB_EXT(gssapi, KRB5_LIBS, gss_display_status,[],[],
+                               AC_DEFINE(HAVE_GSSAPI,1,[Whether GSSAPI is available]))
 
+  ########################################################
+  # now see if we can find the krb5 libs in standard paths
+  # or as specified above
+  AC_CHECK_LIB_EXT(krb5, KRB5_LIBS, krb5_mk_req_extended)
+
+  ########################################################
+  # now see if we can find the gssapi libs in standard paths
+  AC_CHECK_LIB_EXT(gssapi_krb5, KRB5_LIBS,gss_display_status,[],[],
+           AC_DEFINE(HAVE_GSSAPI,1,[Whether GSSAPI is available]))
+
+  AC_CHECK_FUNC_EXT(krb5_set_real_time, $KRB5_LIBS)
+  AC_CHECK_FUNC_EXT(krb5_set_default_in_tkt_etypes, $KRB5_LIBS)
+  AC_CHECK_FUNC_EXT(krb5_set_default_tgs_ktypes, $KRB5_LIBS)
+  AC_CHECK_FUNC_EXT(krb5_principal2salt, $KRB5_LIBS)
+  AC_CHECK_FUNC_EXT(krb5_use_enctype, $KRB5_LIBS)
+  AC_CHECK_FUNC_EXT(krb5_string_to_key, $KRB5_LIBS) 
+  AC_CHECK_FUNC_EXT(krb5_get_pw_salt, $KRB5_LIBS)
+  AC_CHECK_FUNC_EXT(krb5_string_to_key_salt, $KRB5_LIBS) 
+  AC_CHECK_FUNC_EXT(krb5_auth_con_setkey, $KRB5_LIBS)
+  AC_CHECK_FUNC_EXT(krb5_auth_con_setuseruserkey, $KRB5_LIBS) 
+  AC_CHECK_FUNC_EXT(krb5_locate_kdc, $KRB5_LIBS)
+  AC_CHECK_FUNC_EXT(krb5_get_permitted_enctypes, $KRB5_LIBS) 
+  AC_CHECK_FUNC_EXT(krb5_get_default_in_tkt_etypes, $KRB5_LIBS) 
+  AC_CHECK_FUNC_EXT(krb5_free_ktypes, $KRB5_LIBS)
+  AC_CHECK_FUNC_EXT(krb5_principal_get_comp_string, $KRB5_LIBS)
+
+  LIBS="$LIBS $KRB5_LIBS"
+  
   AC_CACHE_CHECK([for addrtype in krb5_address],
                 samba_cv_HAVE_ADDRTYPE_IN_KRB5_ADDRESS,[
     AC_TRY_COMPILE([#include <krb5.h>],
@@ -2355,87 +2477,34 @@ if test x"$with_ads_support" = x"yes"; then
               [Whether the ENCTYPE_ARCFOUR_HMAC_MD5 key type is available])
   fi
 
-  ########################################################
-  # now see if we can find the krb5 libs in standard paths
-  # or as specified above
-  AC_CHECK_LIB(krb5, krb5_mk_req_extended, [KRB5_LIBS="$LIBS -lkrb5";
-              KRB5_CFLAGS="$CFLAGS";
-               AC_DEFINE(HAVE_KRB5,1,[Whether KRB5 is available])])
+  AC_CACHE_CHECK([for the krb5_princ_component macro],
+                samba_cv_HAVE_KRB5_PRINC_COMPONENT,[
+    AC_TRY_LINK([#include <krb5.h>],
+      [const krb5_data *pkdata; krb5_context context; krb5_principal principal; pkdata = krb5_princ_component(context, principal, 0);],
+      samba_cv_HAVE_KRB5_PRINC_COMPONENT=yes,
+      samba_cv_HAVE_KRB5_PRINC_COMPONENT=no)])
 
-  ########################################################
-  # now see if we can find the gssapi libs in standard paths
-  AC_CHECK_LIB(gssapi_krb5, gss_display_status, 
-               [KRB5_LIBS="$KRB5_LIBS -lgssapi_krb5";
-                AC_DEFINE(HAVE_GSSAPI,1,[Whether GSSAPI is available])])
-
-  CFLAGS="$ac_save_CFLAGS"
-  LIBS="$ac_save_LIBS"
-fi
-
-########################################################
-# Compile with LDAP support?
-
-LDAP_OBJ=""
-with_ldap_support=yes
-AC_MSG_CHECKING([whether to use LDAP])
-
-AC_ARG_WITH(ldap,
-[  --with-ldap             LDAP support (default yes)],
-[ case "$withval" in
-    no)
-       with_ldap_support=no
-       ;;
-  esac ])
-
-AC_MSG_RESULT($with_ldap_support)
+  if test x"$samba_cv_HAVE_KRB5_PRINC_COMPONENT" = x"yes"; then
+    AC_DEFINE(HAVE_KRB5_PRINC_COMPONENT,1,
+               [Whether krb5_princ_component is available])
+  fi
 
-SMBLDAP=""
-if test x"$with_ldap_support" = x"yes"; then
-  ac_save_LIBS="$LIBS"
-  LIBS=""
 
-  ##################################################################
-  # we might need the lber lib on some systems. To avoid link errors
-  # this test must be before the libldap test
-  AC_CHECK_LIB(lber, ber_scanf)
-
-  ########################################################
-  # now see if we can find the ldap libs in standard paths
-  if test x$have_ldap != xyes; then
-        AC_CHECK_LIB(ldap, ldap_init, [
-           LIBS="$LIBS -lldap";
-           AC_CHECK_LIB(ldap, ldap_domain2hostlist, [
-             AC_DEFINE(HAVE_LDAP,1,[Whether ldap is available])
-             AC_CHECK_HEADERS([ldap.h lber.h], 
-                 [default_static_modules="$default_static_modules pdb_ldap idmap_ldap";
-                  SMBLDAP="lib/smbldap.o"])
-           ])
-        ])
-
-       ########################################################
-       # If we have LDAP, does it's rebind procedure take 2 or 3 arguments?
-       # Check found in pam_ldap 145.
-       AC_CHECK_FUNCS(ldap_set_rebind_proc)
-       AC_CACHE_CHECK(whether ldap_set_rebind_proc takes 3 arguments, pam_ldap_cv_ldap_set_rebind_proc, [
-       AC_TRY_COMPILE([
-       #include <lber.h>
-       #include <ldap.h>], [ldap_set_rebind_proc(0, 0, 0);], [pam_ldap_cv_ldap_set_rebind_proc=3], [pam_ldap_cv_ldap_set_rebind_proc=2]) ])
-       AC_DEFINE_UNQUOTED(LDAP_SET_REBIND_PROC_ARGS, $pam_ldap_cv_ldap_set_rebind_proc, [Number of arguments to ldap_set_rebind_proc])
-       AC_CHECK_FUNCS(ldap_initialize) 
-  fi
-  
-  AC_SUBST(SMBLDAP)
-  LDAP_LIBS="$LIBS";
-  LIBS="$ac_save_LIBS";
-else
-    # Can't have ADS support without LDAP
+  if test x"$ac_cv_lib_ext_krb5_krb5_mk_req_extended" = x"yes"; then
+    AC_DEFINE(HAVE_KRB5,1,[Whether to have KRB5 support])
+    AC_DEFINE(WITH_ADS,1,[Whether to include Active Directory support])
+    AC_MSG_CHECKING(whether Active Directory and krb5 support is used)
+    AC_MSG_RESULT(yes)
+  else
     if test x"$with_ads_support" = x"yes"; then
-       AC_MSG_ERROR(Active directory support requires LDAP)
+       AC_MSG_ERROR(libkrb5 is needed for Active Directory support)
+    else
+       AC_MSG_WARN(libkrb5 is needed for Active Directory support)
     fi
-fi
-
-if test x"$with_ads_support" = x"yes"; then
-       ADSLIBS="$LDAP_LIBS $KRB5_LIBS"
+    KRB5_LIBS=""
+    with_ads_support=no 
+  fi
+  LIBS="$ac_save_LIBS"
 fi
 
 ########################################################
@@ -3641,7 +3710,7 @@ WINBIND_WINS_NSS="nsswitch/libnss_wins.$SHLIBEXT"
 WINBIND_NSS_LDSHFLAGS=$LDSHFLAGS
 
 case "$host_os" in
-       *linux*)
+       *linux*|*freebsd*)
                WINBIND_NSS_EXTRA_OBJS="nsswitch/winbind_nss_linux.o"
                ;;
        *irix*)
@@ -3887,6 +3956,7 @@ SMB_MODULE(vfs_audit, \$(VFS_AUDIT_OBJ), "bin/audit.$SHLIBEXT", VFS)
 SMB_MODULE(vfs_extd_audit, \$(VFS_EXTD_AUDIT_OBJ), "bin/extd_audit.$SHLIBEXT", VFS)
 SMB_MODULE(vfs_netatalk, \$(VFS_NETATALK_OBJ), "bin/netatalk.$SHLIBEXT", VFS)
 SMB_MODULE(vfs_fake_perms, \$(VFS_FAKE_PERMS_OBJ), "bin/fake_perms.$SHLIBEXT", VFS)
+SMB_MODULE(vfs_default_quota, \$(VFS_DEFAULT_QUOTA_OBJ), "bin/default_quota.$SHLIBEXT", VFS)
 SMB_SUBSYSTEM(VFS)
 
 AC_DEFINE_UNQUOTED(STRING_STATIC_MODULES, "$string_static_modules", [String list of builtin modules])
@@ -3903,10 +3973,10 @@ fi
 
 AC_MSG_RESULT([Using libraries:])
 AC_MSG_RESULT([    LIBS = $LIBS])
-if test x"$with_ads_support" = x"yes"; then
+if test x"$with_ads_support" != x"no"; then
    AC_MSG_RESULT([    KRB5_LIBS = $KRB5_LIBS])
 fi
-if test x"$with_ldap_support" = x"yes"; then
+if test x"$with_ldap_support" != x"no"; then
    AC_MSG_RESULT([    LDAP_LIBS = $LDAP_LIBS])
 fi
 
index 4577c3947c899db84eec9eeab2acbf53bbd6f5c9..34c716926ccf9a803e72dfd98cae4085b4050607 100644 (file)
@@ -1,7 +1,7 @@
 /* 
    Unix SMB/CIFS implementation.
    Copyright (C) 2001 by Martin Pool <mbp@samba.org>
-   Copyright (C) 2003 by Anthony Liguori <aliguor@us.ibm.com>
+   Copyright (C) 2003 by Jim McDonough <jmcd@us.ibm.com>
    
    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
index 3d2af5d0ba6a1dcff7e33614e6f9dd40a2400958..cd903fa28be1e38af839ed4eaeabba453a45db17 100644 (file)
@@ -509,7 +509,7 @@ BOOL get_domain_group_from_sid(DOM_SID sid, GROUP_MAP *map)
                return False;
        }
 
-       DEBUG(10, ("get_domain_group_from_sid: SID is mapped to gid:%d\n",map->gid));
+       DEBUG(10, ("get_domain_group_from_sid: SID is mapped to gid:%lu\n",(unsigned long)map->gid));
 
        if ( (grp=getgrgid(map->gid)) == NULL) {
                DEBUG(10, ("get_domain_group_from_sid: gid DOESN'T exist in UNIX security\n"));
index 0798b72bdf9cc7193ea0f978c6937d172e600113..9d80745fb0669d3198e70ae1b90505240ca3a7cb 100644 (file)
@@ -1,7 +1,7 @@
 /* 
    Unix SMB/CIFS implementation.
    Kerberos authorization data
-   Copyright (C) Jim McDonough                2003
+   Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2003
    
    
    This program is free software; you can redistribute it and/or modify
index c262dd2d3374ea3da74b68acc9740ecc10389019..0eef55730662e97ccb831de6bb37bad00caeee61 100644 (file)
@@ -105,7 +105,7 @@ it also defines lots of intermediate macros, just ignore those :-)
 #define CAREFUL_ALIGNMENT 1
 #endif
 
-#define CVAL(buf,pos) (((const unsigned char *)(buf))[pos])
+#define CVAL(buf,pos) ((unsigned)(((const unsigned char *)(buf))[pos]))
 #define CVAL_NC(buf,pos) (((unsigned char *)(buf))[pos]) /* Non-const version of CVAL */
 #define PVAL(buf,pos) (CVAL(buf,pos))
 #define SCVAL(buf,pos,val) (CVAL_NC(buf,pos) = (val))
index c56984ca7b2d209dd667255fa00fab5aa7f64420..f999a9cf7205c4cd9ff1fbc6142a7e8605df4469 100644 (file)
@@ -24,9 +24,9 @@ typedef enum {CH_UCS2=0, CH_UNIX=1, CH_DISPLAY=2, CH_DOS=3, CH_UTF8=4} charset_t
 
 #define NUM_CHARSETS 5
 
-/*
- *   for each charset we have a function that pulls from that charset to
- *     a ucs2 buffer, and a function that pushes to a ucs2 buffer
+/* 
+ *   for each charset we have a function that pushes from that charset to a ucs2
+ *   buffer, and a function that pulls from ucs2 buffer to that  charset.
  *     */
 
 struct charset_functions {
index fad2c099b9677e68de61e885f529837d4cd3863e..598e6c0bda521ef72251cddabc20238c377e4a52 100644 (file)
@@ -57,18 +57,6 @@ struct print_job_info
        time_t t;
 };
 
-typedef struct smb_sign_info {
-       void (*sign_outgoing_message)(struct cli_state *cli);
-       BOOL (*check_incoming_message)(struct cli_state *cli);
-       void (*free_signing_context)(struct cli_state *cli);
-       void *signing_context;
-
-       BOOL negotiated_smb_signing;
-       BOOL allow_smb_signing;
-       BOOL doing_signing;
-       BOOL mandatory_signing;
-} smb_sign_info;
-
 struct cli_state {
        int port;
        int fd;
index ce256f061300eda90a4af183cf609159ea0f25ae..a74d77e41f72e62f15dc45028158e6987174f487 100644 (file)
@@ -1,7 +1,7 @@
 /* 
    Unix SMB/CIFS implementation.
    Copyright (C) 2001 by Martin Pool <mbp@samba.org>
-   Copyright (C) 2003 by Anthony Liguori <aliguor@us.ibm.com>
+   Copyright (C) 2003 by Jim McDonough <jmcd@us.ibm.com>
    
    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
index ae7e4e5101b044624bb12853e2781e79eb9dce3e..20b1015285ee266a93cc8bbedfff867b3ad80c5f 100644 (file)
@@ -5,7 +5,7 @@
 
    Idmap headers
 
-   Copyright (C) Anthony Liguori 2003
+   Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2003
    Copyright (C) Simo Sorce 2003
    
    This library is free software; you can redistribute it and/or
index edaeda3abedaf55bb659aeb10f0b3639d6a8851f..eb7f73b9d35c68b364a9bbde03dc1f397019f704 100644 (file)
@@ -835,6 +835,8 @@ extern int errno;
 
 #include "nsswitch/winbind_client.h"
 
+#include "spnego.h"
+
 /*
  * Type for wide character dirent structure.
  * Only d_name is defined by POSIX.
@@ -1232,6 +1234,14 @@ int snprintf(char *,size_t ,const char *, ...) PRINTF_ATTRIBUTE(3,4);
 int asprintf(char **,const char *, ...) PRINTF_ATTRIBUTE(2,3);
 #endif
 
+/* Fix prototype problem with non-C99 compliant snprintf implementations, esp
+   HPUX 11.  Don't change the sense of this #if statement.  Read the comments
+   in lib/snprint.c if you think you need to.  See also bugzilla bug 174. */
+
+#if !defined(HAVE_SNPRINTF) || !defined(HAVE_C99_VSNPRINTF)
+#define snprintf smb_snprintf
+#endif
+
 void sys_adminlog(int priority, const char *format_str, ...) PRINTF_ATTRIBUTE(2,3);
 
 int pstr_sprintf(pstring s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3);
@@ -1288,7 +1298,7 @@ krb5_const_principal get_principal_from_tkt(krb5_ticket *tkt);
 krb5_error_code krb5_locate_kdc(krb5_context ctx, const krb5_data *realm, struct sockaddr **addr_pp, int *naddrs, int get_masters);
 krb5_error_code get_kerberos_allowed_etypes(krb5_context context, krb5_enctype **enctypes);
 void free_kerberos_etypes(krb5_context context, krb5_enctype *enctypes);
-BOOL get_krb5_smb_session_key(krb5_context context, krb5_auth_context auth_context, uint8 session_key[16]);
+BOOL get_krb5_smb_session_key(krb5_context context, krb5_auth_context auth_context, uint8 session_key[16], BOOL remote);
 #endif /* HAVE_KRB5 */
 
 /* TRUE and FALSE are part of the C99 standard and gcc, but
index 57850bf68267e850f49ee61000b24798e70401c4..6db30fbc0acaf27d36b60a236beb1fd691f40b12 100644 (file)
@@ -41,6 +41,7 @@ struct user_auth_info {
        pstring password;
        BOOL got_pass;
        BOOL use_kerberos;
+       int signing_state;
 };
 
 extern struct user_auth_info cmdline_auth_info;
index c01d10554ec444e45c147c289e22057028236bdb..7350fdba1f9a7f52146a57596f067c0230a3d04e 100644 (file)
 
 #define DS_GETPRIMDOMINFO      0x00
 
+/* Opcodes available on PIPE_NETLOGON */
+
+#define DS_ENUM_DOM_TRUSTS      0x28
+
 
 /* macros for RPC's */
 
@@ -50,10 +54,9 @@ typedef struct
        GUID            domain_guid;
        
        UNISTR2 netbios_domain;
-       /* these 2 might be reversed in order.  I can't tell from 
-          my tests as both values are the same --jerry */
-       UNISTR2 dns_domain;
-       UNISTR2 forest_domain;
+
+       UNISTR2 dns_domain;     /* our dns domain */
+       UNISTR2 forest_domain;  /* root domain of the forest to which we belong */
 } DSROLE_PRIMARY_DOMAIN_INFO_BASIC;
 
 typedef struct
@@ -85,7 +88,58 @@ typedef struct
        NTSTATUS status;
 } DS_R_GETPRIMDOMINFO;
 
+typedef struct {
+       /* static portion of structure */
+       uint32          netbios_ptr;
+       uint32          dns_ptr;
+       uint32          flags;
+       uint32          parent_index;
+       uint32          trust_type;
+       uint32          trust_attributes;
+       uint32          sid_ptr;
+       GUID            guid;
+       
+       UNISTR2         netbios_domain;
+       UNISTR2         dns_domain;
+       DOM_SID2        sid;
+
+} DS_DOMAIN_TRUSTS;
+
+typedef struct {
+
+       uint32                  ptr;
+       uint32                  max_count;
+       DS_DOMAIN_TRUSTS        *trusts;
+       
+} DS_DOMAIN_TRUSTS_CTR;
+
+#define DS_DOMAIN_IN_FOREST           0x0001   /* domains in the forest to which 
+                                                  we belong; even different domain trees */
+#define DS_DOMAIN_DIRECT_OUTBOUND     0x0002   /* trusted domains */
+#define DS_DOMAIN_TREE_ROOT           0x0004   /* root of our forest; also available in
+                                                  DsRoleGetPrimaryDomainInfo() */
+#define DS_DOMAIN_PRIMARY             0x0008   /* our domain */
+#define DS_DOMAIN_NATIVE_MODE         0x0010   /* native mode AD servers */
+#define DS_DOMAIN_DIRECT_INBOUND      0x0020   /* trusting domains */
+
+/* DS_Q_ENUM_DOM_TRUSTS - DsEnumerateDomainTrusts() request */
+typedef struct 
+{
+       uint32          server_ptr;
+       UNISTR2         server;
+       uint32          flags;
+       
+} DS_Q_ENUM_DOM_TRUSTS;
+
+/* DS_R_ENUM_DOM_TRUSTS - DsEnumerateDomainTrusts() response */
+typedef struct 
+{
+       uint32                  num_domains;
+       DS_DOMAIN_TRUSTS_CTR    domains;
+               
+       NTSTATUS status;
 
+} DS_R_ENUM_DOM_TRUSTS;
 
 
 #endif /* _RPC_DS_H */
index 7d28a0f3a71077b660cc63753205f8ce7ff63714..8ec274176a7aa846ae9a15cfbbc67715b0689b46 100644 (file)
@@ -5,8 +5,7 @@
    Copyright (C) Luke Kenneth Casson Leighton 1996-2000
    Copyright (C) Paul Ashton                  1997-2000
    Copyright (C) Jean Fran├žois Micouleau      1998-2001
-   Copyright (C) Anthony Liguori              2002
-   Copyright (C) Jim McDonough                2002
+   Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2002
    
    
    This program is free software; you can redistribute it and/or modify
index fb7060cde3bafe5b4925c84ab475d68735b03c10..5e718f8167d6094cad8cbb8fa2122a98109f62b5 100644 (file)
@@ -305,12 +305,12 @@ typedef struct standard_mapping {
                SA_RIGHT_FILE_EXECUTE)            
 
                
-/* SAM Object specific access rights */
+/* SAM server specific access rights */
 
-#define SA_RIGHT_SAM_UNKNOWN_1         0x00000001
+#define SA_RIGHT_SAM_CONNECT_SERVER    0x00000001
 #define SA_RIGHT_SAM_SHUTDOWN_SERVER   0x00000002
-#define SA_RIGHT_SAM_UNKNOWN_4         0x00000004
-#define SA_RIGHT_SAM_UNKNOWN_8         0x00000008
+#define SA_RIGHT_SAM_INITIALISE_SERVER 0x00000004
+#define SA_RIGHT_SAM_CREATE_DOMAIN     0x00000008
 #define SA_RIGHT_SAM_ENUM_DOMAINS      0x00000010
 #define SA_RIGHT_SAM_OPEN_DOMAIN       0x00000020
 
@@ -326,14 +326,14 @@ typedef struct standard_mapping {
 
 #define GENERIC_RIGHTS_SAM_WRITE \
                (STANDARD_RIGHTS_WRITE_ACCESS   | \
-               SA_RIGHT_SAM_UNKNOWN_8          | \
-               SA_RIGHT_SAM_UNKNOWN_4          | \
+               SA_RIGHT_SAM_CREATE_DOMAIN      | \
+               SA_RIGHT_SAM_INITIALISE_SERVER  | \
                SA_RIGHT_SAM_SHUTDOWN_SERVER)
 
 #define GENERIC_RIGHTS_SAM_EXECUTE \
                (STANDARD_RIGHTS_EXECUTE_ACCESS | \
                SA_RIGHT_SAM_OPEN_DOMAIN        | \
-               SA_RIGHT_SAM_UNKNOWN_1)            
+               SA_RIGHT_SAM_CONNECT_SERVER)            
 
 
 /* Domain Object specific access rights */
@@ -388,8 +388,8 @@ typedef struct standard_mapping {
 #define SA_RIGHT_USER_CHANGE_PASSWORD  0x00000040
 #define SA_RIGHT_USER_SET_PASSWORD     0x00000080
 #define SA_RIGHT_USER_GET_GROUPS       0x00000100
-#define SA_RIGHT_USER_UNKNOWN_200      0x00000200
-#define SA_RIGHT_USER_UNKNOWN_400      0x00000400
+#define SA_RIGHT_USER_READ_GROUP_MEM   0x00000200
+#define SA_RIGHT_USER_CHANGE_GROUP_MEM 0x00000400
 
 #define SA_RIGHT_USER_ALL_ACCESS       0x000007FF
 
@@ -399,7 +399,7 @@ typedef struct standard_mapping {
 
 #define GENERIC_RIGHTS_USER_READ \
                (STANDARD_RIGHTS_READ_ACCESS    | \
-               SA_RIGHT_USER_UNKNOWN_200       | \
+               SA_RIGHT_USER_READ_GROUP_MEM    | \
                SA_RIGHT_USER_GET_GROUPS        | \
                SA_RIGHT_USER_ACCT_FLAGS_EXPIRY | \
                SA_RIGHT_USER_GET_LOGONINFO     | \
index d2714e78bc87ca6782201dcf8d3e397fbf75cba1..deeb61034da3c3eaf9c94f5faabbd2f5f9fb1c73 100644 (file)
@@ -42,6 +42,7 @@
 #define SMB_PORT2 139
 #define SMB_PORTS "445 139"
 
+#define Undefined (-1)
 #define False (0)
 #define True (1)
 #define Auto (2)
@@ -79,9 +80,7 @@ typedef int BOOL;
 #define READ_TIMEOUT 1
 #define READ_EOF 2
 #define READ_ERROR 3
-
-/* This error code can go into the client smb_rw_error. */
-#define WRITE_ERROR 4
+#define WRITE_ERROR 4 /* This error code can go into the client smb_rw_error. */
 #define READ_BAD_SIG 5
 
 #define DIR_STRUCT_SIZE 43
@@ -707,13 +706,14 @@ struct bitmap {
        unsigned int n;
 };
 
-#define FLAG_BASIC     0x0001 /* fundamental options */
+/* The following flags are used in SWAT */
+#define FLAG_BASIC     0x0001 /* Display only in BASIC view */
 #define FLAG_SHARE     0x0002 /* file sharing options */
 #define FLAG_PRINT     0x0004 /* printing options */
 #define FLAG_GLOBAL    0x0008 /* local options that should be globally settable in SWAT */
 #define FLAG_WIZARD    0x0010 /* Parameters that the wizard will operate on */
-#define FLAG_ADVANCED  0x0020 /* Parameters that the wizard will operate on */
-#define FLAG_DEVELOPER         0x0040 /* Parameters that the wizard will operate on */
+#define FLAG_ADVANCED  0x0020 /* Parameters that will be visible in advanced view */
+#define FLAG_DEVELOPER         0x0040 /* No longer used */
 #define FLAG_DEPRECATED 0x1000 /* options that should no longer be used */
 #define FLAG_HIDE      0x2000 /* options that should be hidden in SWAT */
 #define FLAG_DOS_STRING 0x4000 /* convert from UNIX to DOS codepage when reading this string. */
@@ -1630,4 +1630,18 @@ struct ip_service {
        unsigned port;
 };
 
+/* Used by the SMB signing functions. */
+
+typedef struct smb_sign_info {
+       void (*sign_outgoing_message)(char *outbuf, struct smb_sign_info *si);
+       BOOL (*check_incoming_message)(char *inbuf, struct smb_sign_info *si);
+       void (*free_signing_context)(struct smb_sign_info *si);
+       void *signing_context;
+
+       BOOL negotiated_smb_signing;
+       BOOL allow_smb_signing;
+       BOOL doing_signing;
+       BOOL mandatory_signing;
+} smb_sign_info;
+
 #endif /* _SMB_H */
index 589d01aa6dd592f76149cea731912c7a216fe3f6..826fc3c55a17af3a6d27ea5dcf0bd777b38290d6 100644 (file)
@@ -132,6 +132,9 @@ struct smbldap_state {
        char *bind_secret;
 
        unsigned int num_failures;
+
+       time_t last_use;
+       smb_event_id_t event_id;
 };
 
 #endif         /* HAVE_LDAP */
index cfdac0609aafe2525a50708d31bc8f43b104c9e3..b803e6277abbf0fba70f9430aedadeacc4308712 100644 (file)
 #define SMB_QUOTAS_NO_LIMIT    ((SMB_BIG_UINT)(0))
 #define SMB_QUOTAS_NO_SPACE    ((SMB_BIG_UINT)(1))
 
+#define SMB_QUOTAS_SET_NO_LIMIT(dp) \
+{\
+       (dp)->softlimit = SMB_QUOTAS_NO_LIMIT;\
+       (dp)->hardlimit = SMB_QUOTAS_NO_LIMIT;\
+       (dp)->isoftlimit = SMB_QUOTAS_NO_LIMIT;\
+       (dp)->ihardlimit = SMB_QUOTAS_NO_LIMIT;\
+}
+
+#define SMB_QUOTAS_SET_NO_SPACE(dp) \
+{\
+       (dp)->softlimit = SMB_QUOTAS_NO_SPACE;\
+       (dp)->hardlimit = SMB_QUOTAS_NO_SPACE;\
+       (dp)->isoftlimit = SMB_QUOTAS_NO_SPACE;\
+       (dp)->ihardlimit = SMB_QUOTAS_NO_SPACE;\
+}
+
 typedef struct _SMB_DISK_QUOTA {
        enum SMB_QUOTA_TYPE qtype;
        SMB_BIG_UINT bsize;
index 5e2d47e1ded8b8aa7b4fbeb656b4b45841d5a6f2..68bc140dafbf65f5e91369ff3cdd090ef83f6c14 100644 (file)
@@ -1 +1 @@
-#define VERSION "3.0.0beta3"
+#define VERSION "3.0.0rc1"
index 924d7063217b3bdbadac36f43a1251890d982093..452f4dc23b94c35b78b74c0a33a59cbbfcb53233 100644 (file)
@@ -466,6 +466,9 @@ typedef struct vfs_handle_struct {
        } \
 }
 
+/* Check whether module-specific data handle was already allocated or not */
+#define SMB_VFS_HANDLE_TEST_DATA(handle)  ( !(handle) || !(handle)->data ? False : True )
+
 #define SMB_VFS_OP(x) ((void *) x)
 
 
index e8b382c7ab9dfa00d61370309b6bd0d3b15b8d07..dc131985a1a93c1fe74e485d44d53bf91c608df4 100644 (file)
@@ -53,7 +53,7 @@ BOOL init_account_policy(void)
                account_policy_set(AP_MIN_PASSWORD_LEN, MINPASSWDLENGTH);   /* 5 chars minimum             */
                account_policy_set(AP_PASSWORD_HISTORY, 0);                 /* don't keep any old password */
                account_policy_set(AP_USER_MUST_LOGON_TO_CHG_PASS, 0);      /* don't force user to logon   */
-               account_policy_set(AP_MAX_PASSWORD_AGE, MAX_PASSWORD_AGE);  /* 21 days                     */
+               account_policy_set(AP_MAX_PASSWORD_AGE, (uint32)-1);        /* don't expire                */
                account_policy_set(AP_MIN_PASSWORD_AGE, 0);                 /* 0 days                      */
                account_policy_set(AP_LOCK_ACCOUNT_DURATION, 0);            /* lockout for 0 minutes       */
                account_policy_set(AP_RESET_COUNT_TIME, 0);                 /* reset immediatly            */
index 4e9c2c15923fa406af22a75b41fe4b6da993702c..ca5e378970cb59d7dc8a45e70c435f58bad211ed 100644 (file)
@@ -190,8 +190,8 @@ size_t convert_string(charset_t from, charset_t to,
                                break;
                        case E2BIG:
                                reason="No more room"; 
-                               DEBUG(0, ("convert_string: Required %d, available %d\n",
-                                       srclen, destlen));
+                               DEBUG(0, ("convert_string: Required %lu, available %lu\n",
+                                       (unsigned long)srclen, (unsigned long)destlen));
                                /* we are not sure we need srclen bytes,
                                  may be more, may be less.
                                  We only know we need more than destlen
@@ -319,8 +319,7 @@ size_t unix_strupper(const char *src, size_t srclen, char *dest, size_t destlen)
        size_t size;
        smb_ucs2_t *buffer;
        
-       size = convert_string_allocate(CH_UNIX, CH_UCS2, src, srclen,
-                                      (void **) &buffer);
+       size = push_ucs2_allocate(&buffer, src);
        if (size == -1) {
                smb_panic("failed to create UCS2 buffer");
        }
@@ -334,6 +333,33 @@ size_t unix_strupper(const char *src, size_t srclen, char *dest, size_t destlen)
        return size;
 }
 
+/**
+ strdup() a unix string to upper case.
+**/
+
+char *strdup_upper(const char *s)
+{
+       size_t size;
+       smb_ucs2_t *buffer;
+       char *out_buffer;
+       
+       size = push_ucs2_allocate(&buffer, s);
+       if (size == -1) {
+               return NULL;
+       }
+
+       strupper_w(buffer);
+       
+       size = pull_ucs2_allocate(&out_buffer, buffer);
+       SAFE_FREE(buffer);
+
+       if (size == -1) {
+               return NULL;
+       }
+       
+       return out_buffer;
+}
+
 size_t unix_strlower(const char *src, size_t srclen, char *dest, size_t destlen)
 {
        size_t size;
@@ -353,6 +379,32 @@ size_t unix_strlower(const char *src, size_t srclen, char *dest, size_t destlen)
        return size;
 }
 
+/**
+ strdup() a unix string to lower case.
+**/
+
+char *strdup_lower(const char *s)
+{
+       size_t size;
+       smb_ucs2_t *buffer;
+       char *out_buffer;
+       
+       size = push_ucs2_allocate(&buffer, s);
+       if (size == -1) {
+               return NULL;
+       }
+
+       strlower_w(buffer);
+       
+       size = pull_ucs2_allocate(&out_buffer, buffer);
+       SAFE_FREE(buffer);
+
+       if (size == -1) {
+               return NULL;
+       }
+       
+       return out_buffer;
+}
 
 static size_t ucs2_align(const void *base_ptr, const void *p, int flags)
 {
@@ -480,18 +532,11 @@ size_t push_ucs2(const void *base_ptr, void *dest, const char *src, size_t dest_
 {
        size_t len=0;
        size_t src_len = strlen(src);
-       pstring tmpbuf;
 
        /* treat a pstring as "unlimited" length */
        if (dest_len == (size_t)-1)
                dest_len = sizeof(pstring);
 
-       if (flags & STR_UPPER) {
-               pstrcpy(tmpbuf, src);
-               strupper_m(tmpbuf);
-               src = tmpbuf;
-       }
-
        if (flags & STR_TERMINATE)
                src_len++;
 
@@ -506,6 +551,18 @@ size_t push_ucs2(const void *base_ptr, void *dest, const char *src, size_t dest_
        dest_len &= ~1;
 
        len += convert_string(CH_UNIX, CH_UCS2, src, src_len, dest, dest_len);
+
+       if (flags & STR_UPPER) {
+               smb_ucs2_t *dest_ucs2 = dest;
+               size_t i;
+               for (i = 0; i < (dest_len / 2) && dest_ucs2[i]; i++) {
+                       smb_ucs2_t v = toupper_w(dest_ucs2[i]);
+                       if (v != dest_ucs2[i]) {
+                               dest_ucs2[i] = v;
+                       }
+               }
+       }
+
        return len;
 }
 
@@ -809,44 +866,3 @@ size_t align_string(const void *base_ptr, const char *p, int flags)
        return 0;
 }
 
-/**
- Convert from unix to ucs2 charset and return the
- allocated and converted string or NULL if an error occurred.
- You must provide a zero terminated string.
- The returning string will be zero terminated.
-**/
-
-smb_ucs2_t *acnv_uxu2(const char *src)
-{
-       size_t slen;
-       size_t dlen;
-       void *dest;
-       
-       slen = strlen(src) + 1;
-       dlen = convert_string_allocate(CH_UNIX, CH_UCS2, src, slen, &dest);
-       if (dlen == (size_t)-1)
-               return NULL;
-       else
-               return dest;
-}
-
-/**
- Convert from dos to ucs2 charset and return the
- allocated and converted string or NULL if an error occurred.
- You must provide a zero terminated string.
- The returning string will be zero terminated.
-**/
-
-smb_ucs2_t *acnv_dosu2(const char *src)
-{
-       size_t slen;
-       size_t dlen;
-       void *dest;
-       
-       slen = strlen(src) + 1;
-       dlen = convert_string_allocate(CH_DOS, CH_UCS2, src, slen, &dest);
-       if (dlen == (size_t)-1)
-               return NULL;
-       else
-               return dest;
-}
index b8e77b2d9ec2f74ad93879bc8fe8e5038cc0f31f..af1cbcfe80caff856d5a0f76fb3dc1991089237b 100644 (file)
@@ -258,19 +258,21 @@ static void get_credentials_file(const char *file, struct user_auth_info *info)
  *             -A,--authentication-file
  *             -k,--use-kerberos
  *             -N,--no-pass
+ *             -S,--signing
  */
 
 
 static void popt_common_credentials_callback(poptContext con, 
-                                                                                        enum poptCallbackReason reason,
-                                                                                        const struct poptOption *opt,
-                                                                                        const char *arg, const void *data)
+                                       enum poptCallbackReason reason,
+                                       const struct poptOption *opt,
+                                       const char *arg, const void *data)
 {
        char *p;
 
        if (reason == POPT_CALLBACK_REASON_PRE) {
                cmdline_auth_info.use_kerberos = False;
                cmdline_auth_info.got_pass = False;
+               cmdline_auth_info.signing_state = Undefined;
                pstrcpy(cmdline_auth_info.username, "GUEST");   
 
                if (getenv("LOGNAME"))pstrcpy(cmdline_auth_info.username,getenv("LOGNAME"));
@@ -327,6 +329,22 @@ static void popt_common_credentials_callback(poptContext con,
                cmdline_auth_info.got_pass = True;
 #endif
                break;
+
+       case 'S':
+               {
+                       cmdline_auth_info.signing_state = -1;
+                       if (strequal(arg, "off") || strequal(arg, "no") || strequal(arg, "false"))
+                               cmdline_auth_info.signing_state = False;
+                       else if (strequal(arg, "on") || strequal(arg, "yes") || strequal(arg, "true"))
+                               cmdline_auth_info.signing_state = True;
+                       else if (strequal(arg, "force") || strequal(arg, "required") || strequal(arg, "forced"))
+                               cmdline_auth_info.signing_state = Required;
+                       else {
+                               fprintf(stderr, "Unknown signing option %s\n", arg );
+                               exit(1);
+                       }
+               }
+               break;
        }
 }
 
@@ -338,5 +356,6 @@ struct poptOption popt_common_credentials[] = {
        { "no-pass", 'N', POPT_ARG_NONE, &cmdline_auth_info.got_pass, 0, "Don't ask for a password" },
        { "kerberos", 'k', POPT_ARG_NONE, &cmdline_auth_info.use_kerberos, 'k', "Use kerberos (active directory) authentication" },
        { "authentication-file", 'A', POPT_ARG_STRING, NULL, 'A', "Get the credentials from a file", "FILE" },
+       { "signing", 'S', POPT_ARG_STRING, NULL, 'S', "Set the client signing state", "on|off|required" },
        POPT_TABLEEND
 };
index 0c62ec9bfa5795526b232074e03ce4abc36b9c87..cd48b8d160fe4f7f249694492c62afb886351c1f 100644 (file)
@@ -447,21 +447,3 @@ char *rep_inet_ntoa(struct in_addr ip)
        return t;
 }
 #endif
-
-#ifndef HAVE_SETENV
- int setenv(const char *name, const char *value, int overwrite) 
-{
-       char *p = NULL;
-       int ret = -1;
-
-       asprintf(&p, "%s=%s", name, value);
-
-       if (overwrite || getenv(name)) {
-               if (p) ret = putenv(p);
-       } else {
-               ret = 0;
-       }
-
-       return ret;     
-}
-#endif
index 39c1990decb58c6cbf3f41b00b62e7566c62d5bf..3f56d066ec0e400c778d566634b46e0c8d391473 100644 (file)
@@ -5,7 +5,7 @@
    Copyright (C) Gerald Carter                 2001-2003
    Copyright (C) Shahms King                   2001
    Copyright (C) Andrew Bartlett               2002-2003
-   Copyright (C) Stefan (metze) Metzmacher     2002
+   Copyright (C) Stefan (metze) Metzmacher     2002-2003
     
    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
@@ -35,6 +35,8 @@
 #define SMBLDAP_DONT_PING_TIME 10      /* ping only all 10 seconds */
 #define SMBLDAP_NUM_RETRIES 8          /* retry only 8 times */
 
+#define SMBLDAP_IDLE_TIME 150          /* After 2.5 minutes disconnect */
+
 
 /* attributes used by Samba 2.2 */
 
@@ -925,6 +927,8 @@ int smbldap_search(struct smbldap_state *ldap_state,
                smbldap_close(ldap_state);      
        }
 
+       ldap_state->last_use = time(NULL);
+
        SAFE_FREE(utf8_filter);
        return rc;
 }
@@ -954,6 +958,8 @@ int smbldap_modify(struct smbldap_state *ldap_state, const char *dn, LDAPMod *at
                smbldap_close(ldap_state);      
        }
        
+       ldap_state->last_use = time(NULL);
+
        SAFE_FREE(utf8_dn);
        return rc;
 }
@@ -983,6 +989,8 @@ int smbldap_add(struct smbldap_state *ldap_state, const char *dn, LDAPMod *attrs
                smbldap_close(ldap_state);      
        }
                
+       ldap_state->last_use = time(NULL);
+
        SAFE_FREE(utf8_dn);
        return rc;
 }
@@ -1012,6 +1020,8 @@ int smbldap_delete(struct smbldap_state *ldap_state, const char *dn)
                smbldap_close(ldap_state);      
        }
                
+       ldap_state->last_use = time(NULL);
+
        SAFE_FREE(utf8_dn);
        return rc;
 }
@@ -1041,6 +1051,8 @@ int smbldap_extended_operation(struct smbldap_state *ldap_state,
                smbldap_close(ldap_state);      
        }
                
+       ldap_state->last_use = time(NULL);
+
        return rc;
 }
 
@@ -1071,6 +1083,24 @@ int smbldap_search_suffix (struct smbldap_state *ldap_state, const char *filter,
        return rc;
 }
 
+static void smbldap_idle_fn(void **data, time_t *interval, time_t now)
+{
+       struct smbldap_state *state = (struct smbldap_state *)(*data);
+
+       if (state->ldap_struct == NULL) {
+               DEBUG(10,("ldap connection not connected...\n"));
+               return;
+       }
+               
+       if ((state->last_use+SMBLDAP_IDLE_TIME) > now) {
+               DEBUG(10,("ldap connection not idle...\n"));
+               return;
+       }
+               
+       DEBUG(7,("ldap connection idle...closing connection\n"));
+       smbldap_close(state);
+}
+
 /**********************************************************************
  Housekeeping
  *********************************************************************/
@@ -1086,6 +1116,8 @@ void smbldap_free_struct(struct smbldap_state **ldap_state)
        SAFE_FREE((*ldap_state)->bind_dn);
        SAFE_FREE((*ldap_state)->bind_secret);
 
+       smb_unregister_idle_event((*ldap_state)->event_id);
+
        *ldap_state = NULL;
 
        /* No need to free any further, as it is talloc()ed */
@@ -1109,6 +1141,16 @@ NTSTATUS smbldap_init(TALLOC_CTX *mem_ctx, const char *location, struct smbldap_
        } else {
                (*smbldap_state)->uri = "ldap://localhost";
        }
+
+       (*smbldap_state)->event_id =
+               smb_register_idle_event(smbldap_idle_fn, (void *)(*smbldap_state),
+                                       SMBLDAP_IDLE_TIME);
+
+       if ((*smbldap_state)->event_id == SMB_EVENT_ID_INVALID) {
+               DEBUG(0,("Failed to register LDAP idle event!\n"));
+               return NT_STATUS_INVALID_HANDLE;
+       }
+
        return NT_STATUS_OK;
 }
 
@@ -1155,7 +1197,7 @@ static NTSTATUS add_new_domain_info(struct smbldap_state *ldap_state,
        DEBUG(3,("Adding new domain\n"));
        ldap_op = LDAP_MOD_ADD;
 
-       snprintf(dn, sizeof(dn), "%s=%s,%s", get_attr_key2string(dominfo_attr_list, LDAP_ATTR_DOMAIN),
+       pstr_sprintf(dn, "%s=%s,%s", get_attr_key2string(dominfo_attr_list, LDAP_ATTR_DOMAIN),
                domain_name, lp_ldap_suffix());
 
        /* Free original search */
@@ -1220,7 +1262,7 @@ NTSTATUS smbldap_search_domain_info(struct smbldap_state *ldap_state,
        char **attr_list;
        int count;
 
-       snprintf(filter, sizeof(filter)-1, "(&(objectClass=%s)(%s=%s))",
+       pstr_sprintf(filter, "(&(objectClass=%s)(%s=%s))",
                LDAP_OBJ_DOMINFO,
                get_attr_key2string(dominfo_attr_list, LDAP_ATTR_DOMAIN), 
                domain_name);
index 9b9ceb60cacf62702eebd52454406ca43bb838dc..a2f9f592db3e04f93d24f2b25f6399b1f8f59caa 100644 (file)
@@ -823,12 +823,10 @@ static void dopr_outch(char *buffer, size_t *currlen, size_t maxlen, char c)
  *
  * The logic for these two is that we need our own definition if the
  * OS *either* has no definition of *sprintf, or if it does have one
- * that doesn't work properly according to the autoconf test.  Perhaps
- * these should really be smb_snprintf to avoid conflicts with buggy
- * linkers? -- mbp
+ * that doesn't work properly according to the autoconf test.
  */
 #if !defined(HAVE_SNPRINTF) || !defined(HAVE_C99_VSNPRINTF)
- int snprintf(char *str,size_t count,const char *fmt,...)
+int smb_snprintf(char *str,size_t count,const char *fmt,...)
 {
        size_t ret;
        va_list ap;
index ac2cf687c498f2fa3b79b8847d47a23194be6cfc..c0d0096806aa1c5c5a2eed919e0651673c0e1fa5 100644 (file)
@@ -58,8 +58,8 @@ void set_local_machine_name(const char* local_name, BOOL perm)
 
        fstrcpy(tmp_local_machine,local_name);
        trim_string(tmp_local_machine," "," ");
-       strlower_m(tmp_local_machine);
        alpha_strcpy(local_machine,tmp_local_machine,SAFE_NETBIOS_CHARS,sizeof(local_machine)-1);
+       strlower_m(local_machine);
 }
 
 /** 
@@ -80,8 +80,8 @@ void set_remote_machine_name(const char* remote_name, BOOL perm)
 
        fstrcpy(tmp_remote_machine,remote_name);
        trim_string(tmp_remote_machine," "," ");
-       strlower_m(tmp_remote_machine);
        alpha_strcpy(remote_machine,tmp_remote_machine,SAFE_NETBIOS_CHARS,sizeof(remote_machine)-1);
+       strlower_m(remote_machine);
 }
 
 const char* get_remote_machine_name(void) 
index efc9e65b9de71a28de28cce386f3d87cda6e4549..617f624daea5ccafba9682e32f063d572ff151fe 100644 (file)
@@ -48,12 +48,6 @@ static int sys_get_vfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_
 
        switch (qtype) {
                case SMB_USER_QUOTA_TYPE:
-                       /* we use id.uid == 0 for default quotas */
-                       if (id.uid == 0) {
-                               ret = 0;
-                               break;
-                       }
-       
                        if ((ret = quotactl(QCMD(Q_GETQUOTA,USRQUOTA), bdev, id.uid, (CADDR_T)&D))) {
                                return ret;
                        }
@@ -88,13 +82,19 @@ static int sys_get_vfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_
                                qflags |= QUOTAS_DENY_DISK;
                        }
 
-                       /* get the default quotas stored in the root's (uid =0) record */
-                       if ((ret = quotactl(QCMD(Q_GETQUOTA,USRQUOTA), bdev, 0, (CADDR_T)&D))) {
-                               return ret;
+                       ret = 0;
+                       break;
+#ifdef HAVE_GROUP_QUOTA
+               case SMB_GROUP_FS_QUOTA_TYPE:
+                       id.gid = getgid();
+
+                       if ((ret = quotactl(QCMD(Q_GETQUOTA,GRPQUOTA), bdev, id.gid, (CADDR_T)&D))==0) {
+                               qflags |= QUOTAS_DENY_DISK;
                        }
 
                        ret = 0;
                        break;
+#endif /* HAVE_GROUP_QUOTA */
                default:
                        errno = ENOSYS;
                        return -1;
@@ -122,6 +122,7 @@ static int sys_set_vfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_
 {
        int ret = -1;
        uint32 qflags = 0;
+       uint32 oldqflags = 0;
        struct SYS_DQBLK D;
        SMB_BIG_UINT bsize = (SMB_BIG_UINT)QUOTABLOCK_SIZE;
 
@@ -146,10 +147,7 @@ static int sys_set_vfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_
 
        switch (qtype) {
                case SMB_USER_QUOTA_TYPE:
-                       /* we use id.uid == 0 for default quotas */
-                       if (id.uid>0) {
-                               ret = quotactl(QCMD(Q_SETQLIM,USRQUOTA), bdev, id.uid, (CADDR_T)&D);
-                       }
+                       ret = quotactl(QCMD(Q_SETQLIM,USRQUOTA), bdev, id.uid, (CADDR_T)&D);
                        break;
 #ifdef HAVE_GROUP_QUOTA
                case SMB_GROUP_QUOTA_TYPE:
@@ -160,7 +158,7 @@ static int sys_set_vfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_
                        /* this stuff didn't work as it should:
                         * switching on/off quota via quotactl()
                         * didn't work!
-                        * So we only set the default limits
+                        * So we just return 0
                         * --metze
                         * 
                         * On HPUX we didn't have the mount path,
@@ -168,9 +166,9 @@ static int sys_set_vfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_
                         *
                         */
 #if 0
-                       uid = getuid();
+                       id.uid = getuid();
 
-                       ret = quotactl(QCMD(Q_GETQUOTA,USRQUOTA), bdev, uid, (CADDR_T)&D);
+                       ret = quotactl(QCMD(Q_GETQUOTA,USRQUOTA), bdev, id.uid, (CADDR_T)&D);
 
                        if ((qflags&QUOTAS_DENY_DISK)||(qflags&QUOTAS_ENABLED)) {
                                if (ret == 0) {
@@ -197,14 +195,79 @@ static int sys_set_vfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_
                        }
 
                        DEBUG(0,("vfs_fs_quota: ret(%d) errno(%d)[%s] uid(%d) bdev[%s]\n",
-                               ret,errno,strerror(errno),uid,bdev));
+                               ret,errno,strerror(errno),id.uid,bdev));
+#else
+                       id.uid = getuid();
+
+                       if ((ret = quotactl(QCMD(Q_GETQUOTA,USRQUOTA), bdev, id.uid, (CADDR_T)&D))==0) {
+                               oldqflags |= QUOTAS_DENY_DISK;
+                       }
+
+                       if (oldqflags == qflags) {
+                               ret = 0;
+                       } else {
+                               ret = -1;
+                       }
 #endif
-                               
-                       /* we use uid == 0 for default quotas */
-                       ret = quotactl(QCMD(Q_SETQLIM,USRQUOTA), bdev, 0, (CADDR_T)&D);
-                       
                        break;
+#ifdef HAVE_GROUP_QUOTA
+               case SMB_GROUP_FS_QUOTA_TYPE:
+                       /* this stuff didn't work as it should:
+                        * switching on/off quota via quotactl()
+                        * didn't work!
+                        * So we just return 0
+                        * --metze
+                        * 
+                        * On HPUX we didn't have the mount path,
+                        * we need to fix sys_path_to_bdev()
+                        *
+                        */
+#if 0
+                       id.gid = getgid();
+
+                       ret = quotactl(QCMD(Q_GETQUOTA,GRPQUOTA), bdev, id, (CADDR_T)&D);
+
+                       if ((qflags&QUOTAS_DENY_DISK)||(qflags&QUOTAS_ENABLED)) {
+                               if (ret == 0) {
+                                       char *quota_file = NULL;
+                                       
+                                       asprintf(&quota_file,"/%s/%s%s",path, QUOTAFILENAME,GROUPQUOTAFILE_EXTENSION);
+                                       if (quota_file == NULL) {
+                                               DEBUG(0,("asprintf() failed!\n"));
+                                               errno = ENOMEM;
+                                               return -1;
+                                       }
+                                       
+                                       ret = quotactl(QCMD(Q_QUOTAON,GRPQUOTA), bdev, -1,(CADDR_T)quota_file);
+                               } else {
+                                       ret = 0;        
+                               }
+                       } else {
+                               if (ret != 0) {
+                                       /* turn off */
+                                       ret = quotactl(QCMD(Q_QUOTAOFF,GRPQUOTA), bdev, -1, (CADDR_T)0);        
+                               } else {
+                                       ret = 0;
+                               }               
+                       }
+
+                       DEBUG(0,("vfs_fs_quota: ret(%d) errno(%d)[%s] uid(%d) bdev[%s]\n",
+                               ret,errno,strerror(errno),id.gid,bdev));
+#else
+                       id.gid = getgid();
+
+                       if ((ret = quotactl(QCMD(Q_GETQUOTA,GRPQUOTA), bdev, id.gid, (CADDR_T)&D))==0) {
+                               oldqflags |= QUOTAS_DENY_DISK;
+                       }
 
+                       if (oldqflags == qflags) {
+                               ret = 0;
+                       } else {
+                               ret = -1;
+                       }
+#endif
+                       break;
+#endif /* HAVE_GROUP_QUOTA */
                default:
                        errno = ENOSYS;
                        return -1;
@@ -383,7 +446,7 @@ static int sys_path_to_bdev(const char *path, char **mntpath, char **bdev, char
 ****************************************************************************/
 static int sys_get_xfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *dp)
 {
-       int ret;
+       int ret = -1;
        uint32 qflags = 0;
        SMB_BIG_UINT bsize = (SMB_BIG_UINT)BBSIZE;
        struct fs_disk_quota D;
@@ -399,11 +462,6 @@ static int sys_get_xfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_
                
        switch (qtype) {
                case SMB_USER_QUOTA_TYPE:
-                       /* we use id.uid == 0 for default quotas */
-                       if (id.uid == 0) {
-                               ret = 0;
-                               break;
-                       }
                        if ((ret=quotactl(QCMD(Q_XGETQUOTA,USRQUOTA), bdev, id.uid, (CADDR_T)&D)))
                                return ret;
                        break;
@@ -413,10 +471,8 @@ static int sys_get_xfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_
                                return ret;
                        break;
 #endif /* HAVE_GROUP_QUOTA */
-               case SMB_USER_FS_QUOTA_TYPE:
-                       /* TODO: get quota status from quotactl() ... */        
-                       if ((ret = quotactl(QCMD(Q_XGETQSTAT,USRQUOTA), bdev, -1, (CADDR_T)&F)))
-                               return ret;
+               case SMB_USER_FS_QUOTA_TYPE:    
+                       quotactl(QCMD(Q_XGETQSTAT,USRQUOTA), bdev, -1, (CADDR_T)&F);
 
                        if (F.qs_flags & XFS_QUOTA_UDQ_ENFD) {
                                qflags |= QUOTAS_DENY_DISK;
@@ -425,11 +481,24 @@ static int sys_get_xfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_
                                qflags |= QUOTAS_ENABLED;
                        }
 
-                       /* we use uid == 0 for default quotas */
-                       if ((ret=quotactl(QCMD(Q_XGETQUOTA,USRQUOTA), bdev, 0, (CADDR_T)&D)))
-                               return ret;
+                       ret = 0;
 
                        break;
+#ifdef HAVE_GROUP_QUOTA
+               case SMB_GROUP_FS_QUOTA_TYPE:   
+                       quotactl(QCMD(Q_XGETQSTAT,GRPQUOTA), bdev, -1, (CADDR_T)&F);
+
+                       if (F.qs_flags & XFS_QUOTA_UDQ_ENFD) {
+                               qflags |= QUOTAS_DENY_DISK;
+                       }
+                       else if (F.qs_flags & XFS_QUOTA_UDQ_ACCT) {
+                               qflags |= QUOTAS_ENABLED;
+                       }
+
+                       ret = 0;
+
+                       break;
+#endif /* HAVE_GROUP_QUOTA */
                default:
                        errno = ENOSYS;
                        return -1;
@@ -481,11 +550,8 @@ static int sys_set_xfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_
 
        switch (qtype) {
                case SMB_USER_QUOTA_TYPE:
-                       /* we use uid == 0 for default quotas */
-                       if (id.uid>0) {
-                               D.d_fieldmask |= FS_DQ_LIMIT_MASK;
-                               ret = quotactl(QCMD(Q_XSETQLIM,USRQUOTA), bdev, id.uid, (CADDR_T)&D);
-                       }
+                       D.d_fieldmask |= FS_DQ_LIMIT_MASK;
+                       ret = quotactl(QCMD(Q_XSETQLIM,USRQUOTA), bdev, id.uid, (CADDR_T)&D);
                        break;
 #ifdef HAVE_GROUP_QUOTA
                case SMB_GROUP_QUOTA_TYPE:
@@ -494,7 +560,6 @@ static int sys_set_xfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_
                        break;
 #endif /* HAVE_GROUP_QUOTA */
                case SMB_USER_FS_QUOTA_TYPE:
-                       /* TODO */
                        quotactl(QCMD(Q_XGETQSTAT,USRQUOTA), bdev, -1, (CADDR_T)&F);
                        
                        if (qflags & QUOTAS_DENY_DISK) {
@@ -505,6 +570,8 @@ static int sys_set_xfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_
                                
                                if (q_on != 0) {
                                        ret = quotactl(QCMD(Q_XQUOTAON,USRQUOTA),bdev, -1, (CADDR_T)&q_on);
+                               } else {
+                                       ret = 0;
                                }
 
                        } else if (qflags & QUOTAS_ENABLED) {
@@ -513,6 +580,8 @@ static int sys_set_xfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_
 
                                if (q_off != 0) {
                                        ret = quotactl(QCMD(Q_XQUOTAOFF,USRQUOTA),bdev, -1, (CADDR_T)&q_off);
+                               } else {
+                                       ret = 0;
                                }
 
                                if (!(F.qs_flags & XFS_QUOTA_UDQ_ACCT))
@@ -520,6 +589,8 @@ static int sys_set_xfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_
 
                                if (q_on != 0) {
                                        ret = quotactl(QCMD(Q_XQUOTAON,USRQUOTA),bdev, -1, (CADDR_T)&q_on);
+                               } else {
+                                       ret = 0;
                                }
                        } else {
 #if 0
@@ -533,14 +604,71 @@ static int sys_set_xfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_
 
                                if (q_off !=0) {
                                        ret = quotactl(QCMD(Q_XQUOTAOFF,USRQUOTA),bdev, -1, (CADDR_T)&q_off);
+                               } else {
+                                       ret = 0;
                                }
+#else
+                               ret = -1;
 #endif
                        }
+
+                       break;
+#ifdef HAVE_GROUP_QUOTA
+               case SMB_GROUP_FS_QUOTA_TYPE:
+                       quotactl(QCMD(Q_XGETQSTAT,GRPQUOTA), bdev, -1, (CADDR_T)&F);
                        
-                       /* we use uid == 0 for default quotas */
-                       D.d_fieldmask |= FS_DQ_LIMIT_MASK;
-                       ret = quotactl(QCMD(Q_XSETQLIM,USRQUOTA), bdev, 0, (CADDR_T)&D);
+                       if (qflags & QUOTAS_DENY_DISK) {
+                               if (!(F.qs_flags & XFS_QUOTA_UDQ_ENFD))
+                                       q_on |= XFS_QUOTA_UDQ_ENFD;
+                               if (!(F.qs_flags & XFS_QUOTA_UDQ_ACCT))
+                                       q_on |= XFS_QUOTA_UDQ_ACCT;
+                               
+                               if (q_on != 0) {
+                                       ret = quotactl(QCMD(Q_XQUOTAON,GRPQUOTA),bdev, -1, (CADDR_T)&q_on);
+                               } else {
+                                       ret = 0;
+                               }
+
+                       } else if (qflags & QUOTAS_ENABLED) {
+                               if (F.qs_flags & XFS_QUOTA_UDQ_ENFD)
+                                       q_off |= XFS_QUOTA_UDQ_ENFD;
+
+                               if (q_off != 0) {
+                                       ret = quotactl(QCMD(Q_XQUOTAOFF,GRPQUOTA),bdev, -1, (CADDR_T)&q_off);
+                               } else {
+                                       ret = 0;
+                               }
+
+                               if (!(F.qs_flags & XFS_QUOTA_UDQ_ACCT))
+                                       q_on |= XFS_QUOTA_UDQ_ACCT;
+
+                               if (q_on != 0) {
+                                       ret = quotactl(QCMD(Q_XQUOTAON,GRPQUOTA),bdev, -1, (CADDR_T)&q_on);
+                               } else {
+                                       ret = 0;
+                               }
+                       } else {
+#if 0
+                       /* Switch on XFS_QUOTA_UDQ_ACCT didn't work!
+                        * only swittching off XFS_QUOTA_UDQ_ACCT work
+                        */
+                               if (F.qs_flags & XFS_QUOTA_UDQ_ENFD)
+                                       q_off |= XFS_QUOTA_UDQ_ENFD;
+                               if (F.qs_flags & XFS_QUOTA_UDQ_ACCT)
+                                       q_off |= XFS_QUOTA_UDQ_ACCT;
+
+                               if (q_off !=0) {
+                                       ret = quotactl(QCMD(Q_XQUOTAOFF,GRPQUOTA),bdev, -1, (CADDR_T)&q_off);
+                               } else {
+                                       ret = 0;
+                               }
+#else
+                               ret = -1;
+#endif
+                       }
+
                        break;
+#endif /* HAVE_GROUP_QUOTA */
                default:
                        errno = ENOSYS;
                        return -1;
@@ -783,12 +911,17 @@ int sys_get_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DI
        }
 
        if ((ret=sys_path_to_bdev(path,&mntpath,&bdev,&fs))!=0) {
+               DEBUG(0,("sys_path_to_bdev() failed for path [%s]!\n",path));
                return ret;
        }
 
        for (i=0;(fs && sys_quota_backends[i].name && sys_quota_backends[i].get_quota);i++) {
                if (strcmp(fs,sys_quota_backends[i].name)==0) {
                        ret = sys_quota_backends[i].get_quota(mntpath, bdev, qtype, id, dp);
+                       if (ret!=0) {
+                               DEBUG(10,("sys_get_%s_quota() failed for mntpath[%s] bdev[%s] qtype[%d] id[%d] ret[%d].\n",
+                                       fs,mntpath,bdev,qtype,(qtype==SMB_GROUP_QUOTA_TYPE?id.gid:id.uid),ret));
+                       }
                        ready = True;
                        break;  
                }               
@@ -796,7 +929,11 @@ int sys_get_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DI
 
        if (!ready) {
                /* use the default vfs quota functions */
-               ret = sys_get_vfs_quota(mntpath, bdev, qtype, id, dp);
+               ret=sys_get_vfs_quota(mntpath, bdev, qtype, id, dp);
+               if (ret!=0) {
+                       DEBUG(10,("sys_get_%s_quota() failed for mntpath[%s] bdev[%s] qtype[%d] id[%d] ret[%d].\n",
+                               "vfs",mntpath,bdev,qtype,(qtype==SMB_GROUP_QUOTA_TYPE?id.gid:id.uid),ret));
+               }
        }
 
        SAFE_FREE(mntpath);
@@ -831,12 +968,17 @@ int sys_set_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DI
        }
 
        if ((ret=sys_path_to_bdev(path,&mntpath,&bdev,&fs))!=0) {
+               DEBUG(0,("sys_path_to_bdev() failed for path [%s]!\n",path));
                return ret;
        }
 
        for (i=0;(fs && sys_quota_backends[i].name && sys_quota_backends[i].set_quota);i++) {
                if (strcmp(fs,sys_quota_backends[i].name)==0) {
                        ret = sys_quota_backends[i].set_quota(mntpath, bdev, qtype, id, dp);
+                       if (ret!=0) {
+                               DEBUG(10,("sys_set_%s_quota() failed for mntpath[%s] bdev[%s] qtype[%d] id[%d] ret[%d].\n",
+                                       fs,mntpath,bdev,qtype,(qtype==SMB_GROUP_QUOTA_TYPE?id.gid:id.uid),ret));
+                       }
                        ready = True;
                        break;
                }               
@@ -845,6 +987,10 @@ int sys_set_quota(const char *path, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DI
        if (!ready) {
                /* use the default vfs quota functions */
                ret=sys_set_vfs_quota(mntpath, bdev, qtype, id, dp);
+               if (ret!=0) {
+                       DEBUG(10,("sys_set_%s_quota() failed for mntpath[%s] bdev[%s] qtype[%d] id[%d] ret[%d].\n",
+                               "vfs",mntpath,bdev,qtype,(qtype==SMB_GROUP_QUOTA_TYPE?id.gid:id.uid),ret));
+               }
        }
 
        SAFE_FREE(mntpath);
index 98b8f33aae30990e5b245febdec17903150b310d..6321d4702127b402cd1d8af5c5bfdf6c50e689a6 100644 (file)
@@ -386,7 +386,7 @@ static BOOL user_in_winbind_group_list(const char *user, const char *gname, BOOL
        if ( DEBUGLEVEL >= 10 ) {
                DEBUG(10,("user_in_winbind_group_list: using groups -- "));
                for ( i=0; i<num_groups; i++ )
-                       DEBUGADD(10,("%d ", groups[i]));
+                       DEBUGADD(10,("%lu ", (unsigned long)groups[i]));
                DEBUGADD(10,("\n"));    
        }
  
@@ -593,7 +593,7 @@ BOOL user_in_list(const char *user,const char **list, gid_t *groups, size_t n_gr
                                   will return domain local groups; while NT4 or mixed mode 2k DCs
                                   will not */
                        
-                               if ( winbind_lookup_name(NULL, *list, &g_sid, &name_type) 
+                               if ( winbind_lookup_name(domain, groupname, &g_sid, &name_type) 
                                        && ( name_type==SID_NAME_DOM_GRP || 
                                           (strequal(lp_workgroup(), domain) && name_type==SID_NAME_ALIAS) ) )
                                {
index a7c939fe5a08a1ff482e8bab472d2d391a88d3fe..eaa232a5494eb550ee012a6a0b233aa51486383e 100644 (file)
@@ -4,7 +4,7 @@
    Copyright (C) Andrew Tridgell 1992-1998
    Copyright (C) Jeremy Allison 2001-2002
    Copyright (C) Simo Sorce 2001
-   Copyright (C) Anthony Liguori 2003
+   Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2003
    
    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
@@ -2247,7 +2247,7 @@ char *pid_path(const char *name)
 char *lib_path(const char *name)
 {
        static pstring fname;
-       snprintf(fname, sizeof(fname), "%s/%s", dyn_LIBDIR, name);
+       fstr_sprintf(fname, "%s/%s", dyn_LIBDIR, name);
        return fname;
 }
 
index 02acbd4d7e1c2c1d569cb86631a557ae4df66a1a..638a6ca3429161115b61dcddcdc3b2fb3ff05637 100644 (file)
@@ -455,8 +455,8 @@ void *map_file(char *fname, size_t size)
                p = file_load(fname, &s2);
                if (!p) return NULL;
                if (s2 != size) {
-                       DEBUG(1,("incorrect size for %s - got %d expected %d\n",
-                                fname, s2, size));
+                       DEBUG(1,("incorrect size for %s - got %lu expected %lu\n",
+                                fname, (unsigned long)s2, (unsigned long)size));
                        if (p) free(p);
                        return NULL;
                }
index 1bd4c3a96beb45a261b9dbe99967f63e5f2493b9..b8b847170841c796705f9e6363954e73a35c4f84 100644 (file)
@@ -289,7 +289,7 @@ ssize_t read_socket_with_timeout(int fd,char *buf,size_t mincnt,size_t maxcnt,un
 }
 
 /****************************************************************************
 read data from the client, reading exactly N bytes. 
Read data from the client, reading exactly N bytes. 
 ****************************************************************************/
 
 ssize_t read_data(int fd,char *buffer,size_t N)
@@ -397,7 +397,7 @@ static ssize_t write_socket_data(int fd,char *buffer,size_t N)
 }
 
 /****************************************************************************
-write to a socket
+ Write to a socket.
 ****************************************************************************/
 
 ssize_t write_socket(int fd,char *buf,size_t len)
@@ -416,7 +416,7 @@ ssize_t write_socket(int fd,char *buf,size_t len)
 }
 
 /****************************************************************************
-send a keepalive packet (rfc1002)
+ Send a keepalive packet (rfc1002).
 ****************************************************************************/
 
 BOOL send_keepalive(int client)
@@ -431,11 +431,11 @@ BOOL send_keepalive(int client)
 
 
 /****************************************************************************
-read 4 bytes of a smb packet and return the smb length of the packet
-store the result in the buffer
-This version of the function will return a length of zero on receiving
-a keepalive packet.
-timeout is in milliseconds.
+ Read 4 bytes of a smb packet and return the smb length of the packet.
+ Store the result in the buffer.
+ This version of the function will return a length of zero on receiving
+ a keepalive packet.
+ Timeout is in milliseconds.
 ****************************************************************************/
 
 static ssize_t read_smb_length_return_keepalive(int fd,char *inbuf,unsigned int timeout)
@@ -466,10 +466,10 @@ static ssize_t read_smb_length_return_keepalive(int fd,char *inbuf,unsigned int
 }
 
 /****************************************************************************
-read 4 bytes of a smb packet and return the smb length of the packet
-store the result in the buffer. This version of the function will
-never return a session keepalive (length of zero).
-timeout is in milliseconds.
+ Read 4 bytes of a smb packet and return the smb length of the packet.
+ Store the result in the buffer. This version of the function will
+ never return a session keepalive (length of zero).
+ Timeout is in milliseconds.
 ****************************************************************************/
 
 ssize_t read_smb_length(int fd,char *inbuf,unsigned int timeout)
@@ -493,11 +493,10 @@ ssize_t read_smb_length(int fd,char *inbuf,unsigned int timeout)
 }
 
 /****************************************************************************
-  read an smb from a fd. Note that the buffer *MUST* be of size
-  BUFFER_SIZE+SAFETY_MARGIN.
-  The timeout is in milliseconds. 
-  This function will return on a
-  receipt of a session keepalive packet.
+ Read an smb from a fd. Note that the buffer *MUST* be of size
+ BUFFER_SIZE+SAFETY_MARGIN.
+ The timeout is in milliseconds. 
+ This function will return on receipt of a session keepalive packet.
 ****************************************************************************/
 
 BOOL receive_smb(int fd,char *buffer, unsigned int timeout)
@@ -553,11 +552,19 @@ BOOL receive_smb(int fd,char *buffer, unsigned int timeout)
                }
        }
 
+       /* Check the incoming SMB signature. */
+       if (!srv_check_sign_mac(buffer)) {
+               DEBUG(0, ("receive_smb: SMB Signature verification failed on incoming packet!\n"));
+               if (smb_read_error == 0)
+                       smb_read_error = READ_BAD_SIG;
+               return False;
+       };
+
        return(True);
 }
 
 /****************************************************************************
-  send an smb to a fd 
+ Send an smb to a fd.
 ****************************************************************************/
 
 BOOL send_smb(int fd,char *buffer)
@@ -565,6 +572,10 @@ BOOL send_smb(int fd,char *buffer)
        size_t len;
        size_t nwritten=0;
        ssize_t ret;
+
+       /* Sign the outgoing packet if required. */
+       srv_calculate_sign_mac(buffer);
+
        len = smb_len(buffer) + 4;
 
        while (nwritten < len) {
@@ -647,80 +658,86 @@ int open_socket_in( int type, int port, int dlevel, uint32 socket_addr, BOOL reb
  }
 
 /****************************************************************************
 create an outgoing socket. timeout is in milliseconds.
-  **************************************************************************/
Create an outgoing socket. timeout is in milliseconds.
+**************************************************************************/
 
 int open_socket_out(int type, struct in_addr *addr, int port ,int timeout)
 {
-  struct sockaddr_in sock_out;
-  int res,ret;
-  int connect_loop = 10;
-  int increment = 10;
+       struct sockaddr_in sock_out;
+       int res,ret;
+       int connect_loop = 10;
+       int increment = 10;
 
-  /* create a socket to write to */
-  res = socket(PF_INET, type, 0);
-  if (res == -1) 
-    { DEBUG(0,("socket error\n")); return -1; }
+       /* create a socket to write to */
+       res = socket(PF_INET, type, 0);
+       if (res == -1) {
+               DEBUG(0,("socket error\n"));
+               return -1;
+       }
 
-  if (type != SOCK_STREAM) return(res);
+       if (type != SOCK_STREAM)
+               return(res);
   
-  memset((char *)&sock_out,'\0',sizeof(sock_out));
-  putip((char *)&sock_out.sin_addr,(char *)addr);
+       memset((char *)&sock_out,'\0',sizeof(sock_out));
+       putip((char *)&sock_out.sin_addr,(char *)addr);
   
-  sock_out.sin_port = htons( port );
-  sock_out.sin_family = PF_INET;
+       sock_out.sin_port = htons( port );
+       sock_out.sin_family = PF_INET;
 
-  /* set it non-blocking */
-  set_blocking(res,False);
+       /* set it non-blocking */
+       set_blocking(res,False);
 
-  DEBUG(3,("Connecting to %s at port %d\n",inet_ntoa(*addr),port));
+       DEBUG(3,("Connecting to %s at port %d\n",inet_ntoa(*addr),port));
   
-  /* and connect it to the destination */
-connect_again:
-  ret = connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out));
-
-  /* Some systems return EAGAIN when they mean EINPROGRESS */
-  if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
-        errno == EAGAIN) && (connect_loop < timeout) ) {
-    msleep(connect_loop);
-    connect_loop += increment;
-    if (increment < 250) {
-           /* After 8 rounds we end up at a max of 255 msec */
-           increment *= 1.5;
-    }
-    goto connect_again;
-  }
-
-  if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
-         errno == EAGAIN)) {
-      DEBUG(1,("timeout connecting to %s:%d\n",inet_ntoa(*addr),port));
-      close(res);
-      return -1;
-  }
+       /* and connect it to the destination */
+  connect_again:
+
+       ret = connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out));
+
+       /* Some systems return EAGAIN when they mean EINPROGRESS */
+       if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
+                       errno == EAGAIN) && (connect_loop < timeout) ) {
+               msleep(connect_loop);
+               connect_loop += increment;
+               if (increment < 250) {
+                       /* After 8 rounds we end up at a max of 255 msec */
+                       increment *= 1.5;
+               }
+               goto connect_again;
+       }
+
+       if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
+                       errno == EAGAIN)) {
+               DEBUG(1,("timeout connecting to %s:%d\n",inet_ntoa(*addr),port));
+               close(res);
+               return -1;
+       }
 
 #ifdef EISCONN
-  if (ret < 0 && errno == EISCONN) {
-    errno = 0;
-    ret = 0;
-  }
+
+       if (ret < 0 && errno == EISCONN) {
+               errno = 0;
+               ret = 0;
+       }
 #endif
 
-  if (ret < 0) {
-    DEBUG(2,("error connecting to %s:%d (%s)\n",
-            inet_ntoa(*addr),port,strerror(errno)));
-    close(res);
-    return -1;
-  }
+       if (ret < 0) {
+               DEBUG(2,("error connecting to %s:%d (%s)\n",
+                               inet_ntoa(*addr),port,strerror(errno)));
+               close(res);
+               return -1;
+       }
 
-  /* set it blocking again */
-  set_blocking(res,True);
+       /* set it blocking again */
+       set_blocking(res,True);
 
-  return res;
+       return res;
 }
 
-/*
-  open a connected UDP socket to host on port
-*/
+/****************************************************************************
+ Open a connected UDP socket to host on port
+**************************************************************************/
+
 int open_udp_socket(const char *host, int port)
 {
        int type = SOCK_DGRAM;
@@ -783,9 +800,10 @@ struct in_addr *client_inaddr(struct sockaddr *sa)
 }
 
 /*******************************************************************
- matchname - determine if host name matches IP address. Used to
- confirm a hostname lookup to prevent spoof attacks
- ******************************************************************/
+ Matchname - determine if host name matches IP address. Used to
+ confirm a hostname lookup to prevent spoof attacks.
+******************************************************************/
+
 static BOOL matchname(char *remotehost,struct in_addr  addr)
 {
        struct hostent *hp;
@@ -828,10 +846,10 @@ static BOOL matchname(char *remotehost,struct in_addr  addr)
        return False;
 }
 
 /*******************************************************************
- return the DNS name of the remote end of a socket
- ******************************************************************/
+ Return the DNS name of the remote end of a socket.
+******************************************************************/
+
 char *get_socket_name(int fd, BOOL force_lookup)
 {
        static pstring name_buf;
@@ -881,8 +899,9 @@ char *get_socket_name(int fd, BOOL force_lookup)
 }
 
 /*******************************************************************
- return the IP addr of the remote end of a socket as a string 
+ Return the IP addr of the remote end of a socket as a string.
  ******************************************************************/
+
 char *get_socket_addr(int fd)
 {
        struct sockaddr sa;
@@ -906,7 +925,6 @@ char *get_socket_addr(int fd)
        return addr_buf;
 }
 
-
 /*******************************************************************
  Create protected unix domain socket.
 
@@ -968,7 +986,7 @@ int create_pipe_sock(const char *socket_dir,
                 goto out_umask;
        }
         
-       snprintf(path, sizeof(path), "%s/%s", socket_dir, socket_name);
+       pstr_sprintf(path, "%s/%s", socket_dir, socket_name);
         
        unlink(path);
        memset(&sunaddr, 0, sizeof(sunaddr));
index 96fbc3f1247d81a4d185d856bd09d532e5f73fdb..7569a39e6acf40b8911322886a70fec5f186546e 100644 (file)
@@ -181,7 +181,9 @@ int StrCaseCmp(const char *s, const char *t)
 {
 
        const char * ps, * pt;
-       pstring buf1, buf2;
+       size_t size;
+       smb_ucs2_t *buffer_s, *buffer_t;
+       int ret;
 
        for (ps = s, pt = t; ; ps++, pt++) {
                char us, ut;
@@ -206,16 +208,25 @@ int StrCaseCmp(const char *s, const char *t)
                        return +1;
        }
 
-       /* TODO: Don't do this with a fixed-length buffer.  This could
-        * still be much more efficient. */
-       /* TODO: Hardcode a char-by-char comparison for UTF-8, which
-        * can be much faster. */
-       /* TODO: Test case for this! */
-
-       unix_strupper(ps, strlen(ps)+1, buf1, sizeof(buf1));
-       unix_strupper(pt, strlen(pt)+1, buf2, sizeof(buf2));
-
-       return strcmp(buf1, buf2);
+       size = push_ucs2_allocate(&buffer_s, s);
+       if (size == (size_t)-1) {
+               return strcmp(s, t); 
+               /* Not quite the right answer, but finding the right one
+                  under this failure case is expensive, and it's pretty close */
+       }
+       
+       size = push_ucs2_allocate(&buffer_t, t);
+       if (size == (size_t)-1) {
+               SAFE_FREE(buffer_s);
+               return strcmp(s, t); 
+               /* Not quite the right answer, but finding the right one
+                  under this failure case is expensive, and it's pretty close */
+       }
+       
+       ret = strcasecmp_w(buffer_s, buffer_t);
+       SAFE_FREE(buffer_s);
+       SAFE_FREE(buffer_t);
+       return ret;
 }
 
 
@@ -351,7 +362,7 @@ BOOL strisnormal(const char *s)
  NOTE: oldc and newc must be 7 bit characters
 **/
 
-void string_replace(char *s,char oldc,char newc)
+void string_replace(pstring s,char oldc,char newc)
 {
        push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
        string_replace_w(tmpbuf, UCS2_CHAR(oldc), UCS2_CHAR(newc));
@@ -1155,21 +1166,6 @@ void strlower_m(char *s)
        unix_strlower(s,strlen(s)+1,s,strlen(s)+1);     
 }
 
-/**
- Duplicate convert a string to lower case.
-**/
-
-char *strdup_lower(const char *s)
-{
-       char *t = strdup(s);
-       if (t == NULL) {
-               DEBUG(0, ("strdup_lower: Out of memory!\n"));
-               return NULL;
-       }
-       strlower_m(t);
-       return t;
-}
-
 /**
  Convert a string to upper case.
 **/
@@ -1194,21 +1190,6 @@ void strupper_m(char *s)
        unix_strupper(s,strlen(s)+1,s,strlen(s)+1);     
 }
 
-/**
- Convert a string to upper case.
-**/
-
-char *strdup_upper(const char *s)
-{
-       char *t = strdup(s);
-       if (t == NULL) {
-               DEBUG(0, ("strdup_upper: Out of memory!\n"));
-               return NULL;
-       }
-       strupper_m(t);
-       return t;
-}
-
 /**
  Return a RFC2254 binary string representation of a buffer.
  Used in LDAP filters.
@@ -1575,7 +1556,7 @@ int ipstr_list_parse(const char* ipstr_list, struct ip_service **ip_list)
        
        count = count_chars(ipstr_list, IPSTR_LIST_CHAR) + 1;
        if ( (*ip_list = (struct ip_service*)malloc(count * sizeof(struct ip_service))) == NULL ) {
-               DEBUG(0,("ipstr_list_parse: malloc failed for %d entries\n", count));
+               DEBUG(0,("ipstr_list_parse: malloc failed for %lu entries\n", (unsigned long)count));
                return 0;
        }
        
index ae000fba02306a0cfaae5a8a2d0cf8d3c6b60054..fd51f3c57d998ac0060eaa0ed96f78782f66d231 100644 (file)
@@ -759,82 +759,6 @@ smb_ucs2_t *strstr_wa(const smb_ucs2_t *s, const char *ins)
        return NULL;
 }
 
-/*******************************************************************
-copy a string with max len
-********************************************************************/
-
-smb_ucs2_t *strncpy_wa(smb_ucs2_t *dest, const char *src, const size_t max)
-{
-       smb_ucs2_t *ucs2_src;
-
-       if (!dest || !src) return NULL;
-       if (!(ucs2_src = acnv_uxu2(src)))
-               return NULL;
-       
-       strncpy_w(dest, ucs2_src, max);
-       SAFE_FREE(ucs2_src);
-       return dest;
-}
-
-/*******************************************************************
-convert and duplicate an ascii string
-********************************************************************/
-smb_ucs2_t *strdup_wa(const char *src)
-{
-       return strndup_wa(src, 0);
-}
-
-/* if len == 0 then duplicate the whole string */
-smb_ucs2_t *strndup_wa(const char *src, size_t len)
-{
-       smb_ucs2_t *dest, *s;
-
-       s = acnv_dosu2(src);    
-       if (!len) len = strlen_w(s);
-       dest = (smb_ucs2_t *)malloc((len + 1) * sizeof(smb_ucs2_t));
-       if (!dest) {
-               DEBUG(0,("strdup_w: out of memory!\n"));
-               SAFE_FREE(s);
-               return NULL;
-       }
-
-       memcpy(dest, src, len * sizeof(smb_ucs2_t));
-       dest[len] = 0;
-
-       SAFE_FREE(s);
-       return dest;
-}
-
-/*******************************************************************
-append a string of len bytes and add a terminator
-********************************************************************/
-
-smb_ucs2_t *strncat_wa(smb_ucs2_t *dest, const char *src, const size_t max)
-{
-       smb_ucs2_t *ucs2_src;
-
-       if (!dest || !src) return NULL;
-       if (!(ucs2_src = acnv_uxu2(src)))
-               return NULL;
-       
-       strncat_w(dest, ucs2_src, max);
-       SAFE_FREE(ucs2_src);
-       return dest;
-}
-
-smb_ucs2_t *strcat_wa(smb_ucs2_t *dest, const char *src)
-{      
-       smb_ucs2_t *ucs2_src;
-       
-       if (!dest || !src) return NULL;
-       if (!(ucs2_src = acnv_uxu2(src)))
-               return NULL;
-       
-       strcat_w(dest, ucs2_src);
-       SAFE_FREE(ucs2_src);
-       return dest;
-}
-
 BOOL trim_string_wa(smb_ucs2_t *s, const char *front,
                                  const char *back)
 {
index 83553ec28ec71900f21fd2f980c86c5b80917058..56f0ecd85b94a6a8d3850ec1a30eb0fa8de58a9f 100644 (file)
@@ -2,7 +2,7 @@
  *  Unix SMB/CIFS implementation.
  *  UUID server routines
  *  Copyright (C) Theodore Ts'o               1996, 1997,
- *  Copyright (C) Jim McDonough                     2002.
+ *  Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2002.
  *
  *  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
index c554a02e90ee4d7cbf96ae04f31eacb27c8b0c97..50a9ef271893efdc7f6f50cd949e3c32801a610b 100644 (file)
@@ -1,7 +1,7 @@
 /* 
    Unix SMB/CIFS implementation.
    kerberos authorization data (PAC) utility library
-   Copyright (C) Jim McDonough 2003   
+   Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2003   
    
    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
index 25b7f9d948b66676ff8dd4c2345e2c68e8ff2782..48b61cd1f2d054e9f4e89b9a9a508d248cc29ff2 100644 (file)
@@ -60,13 +60,13 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket,
        ZERO_STRUCTP(ap_rep);
 
        if (!secrets_init()) {
-               DEBUG(1,("secrets_init failed\n"));
+               DEBUG(1,("ads_verify_ticket: secrets_init failed\n"));
                return NT_STATUS_LOGON_FAILURE;
        }
 
        password_s = secrets_fetch_machine_password(lp_workgroup(), NULL, NULL);
        if (!password_s) {
-               DEBUG(1,("failed to fetch machine password\n"));
+               DEBUG(1,("ads_verify_ticket: failed to fetch machine password\n"));
                return NT_STATUS_LOGON_FAILURE;
        }
 
@@ -75,13 +75,13 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket,
 
        ret = krb5_init_context(&context);
        if (ret) {
-               DEBUG(1,("krb5_init_context failed (%s)\n", error_message(ret)));
+               DEBUG(1,("ads_verify_ticket: krb5_init_context failed (%s)\n", error_message(ret)));
                return NT_STATUS_LOGON_FAILURE;
        }
 
        ret = krb5_set_default_realm(context, ads->auth.realm);
        if (ret) {
-               DEBUG(1,("krb5_set_default_realm failed (%s)\n", error_message(ret)));
+               DEBUG(1,("ads_verify_ticket: krb5_set_default_realm failed (%s)\n", error_message(ret)));
                sret = NT_STATUS_LOGON_FAILURE;
                goto out;
        }
@@ -92,7 +92,7 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket,
 
        ret = krb5_auth_con_init(context, &auth_context);
        if (ret) {
-               DEBUG(1,("krb5_auth_con_init failed (%s)\n", error_message(ret)));
+               DEBUG(1,("ads_verify_ticket: krb5_auth_con_init failed (%s)\n", error_message(ret)));
                sret = NT_STATUS_LOGON_FAILURE;
                goto out;
        }
@@ -102,32 +102,31 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket,
        asprintf(&host_princ_s, "HOST/%s@%s", myname, lp_realm());
        ret = krb5_parse_name(context, host_princ_s, &host_princ);
        if (ret) {
-               DEBUG(1,("krb5_parse_name(%s) failed (%s)\n", host_princ_s, error_message(ret)));
+               DEBUG(1,("ads_verify_ticket: krb5_parse_name(%s) failed (%s)\n",
+                                       host_princ_s, error_message(ret)));
                sret = NT_STATUS_LOGON_FAILURE;
                goto out;
        }
 
        /*
-        * JRA. We must set the rcache and the allowed addresses in the auth_context
-        * here. This will prevent replay attacks and ensure the client has got a key from
-        * the correct IP address.
+        * JRA. We must set the rcache here. This will prevent replay attacks.
         */
 
        ret = krb5_get_server_rcache(context, krb5_princ_component(context, host_princ, 0), &rcache);
        if (ret) {
-               DEBUG(1,("krb5_get_server_rcache failed (%s)\n", error_message(ret)));
+               DEBUG(1,("ads_verify_ticket: krb5_get_server_rcache failed (%s)\n", error_message(ret)));
                sret = NT_STATUS_LOGON_FAILURE;
                goto out;
        }
 
        ret = krb5_auth_con_setrcache(context, auth_context, rcache);
        if (ret) {
-               DEBUG(1,("krb5_auth_con_setrcache failed (%s)\n", error_message(ret)));
+               DEBUG(1,("ads_verify_ticket: krb5_auth_con_setrcache failed (%s)\n", error_message(ret)));
                sret = NT_STATUS_LOGON_FAILURE;
                goto out;
        }
 
-       /* Now we need to add the addresses.... JRA. */
+       /* CIFS doesn't use addresses in tickets. This would breat NAT. JRA */
 
        if (!(key = (krb5_keyblock *)malloc(sizeof(*key)))) {
                sret = NT_STATUS_NO_MEMORY;
@@ -135,13 +134,22 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket,
        }
        
        if ((ret = get_kerberos_allowed_etypes(context, &enctypes))) {
-               DEBUG(1,("krb5_get_permitted_enctypes failed (%s)\n", 
+               DEBUG(1,("ads_verify_ticket: krb5_get_permitted_enctypes failed (%s)\n", 
                         error_message(ret)));
                sret = NT_STATUS_LOGON_FAILURE;
                goto out;
        }
 
-       /* we need to setup a auth context with each possible encoding type in turn */
+       /* Lock a mutex surrounding the replay as there is no locking in the MIT krb5
+        * code surrounding the replay cache... */
+
+       if (!grab_server_mutex("replay cache mutex")) {
+               DEBUG(1,("ads_verify_ticket: unable to protect replay cache with mutex.\n"));
+               sret = NT_STATUS_LOGON_FAILURE;
+               goto out;
+       }
+
+       /* We need to setup a auth context with each possible encoding type in turn. */
        for (i=0;enctypes[i];i++) {
                if (create_kerberos_key_from_string(context, host_princ, &password, key, enctypes[i])) {
                        continue;
@@ -154,14 +162,22 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket,
 
                if (!(ret = krb5_rd_req(context, &auth_context, &packet, 
                                       NULL, keytab, NULL, &tkt))) {
+                       DEBUG(10,("ads_verify_ticket: enc type [%u] decrypted message !\n",
+                               (unsigned int)enctypes[i] ));
                        free_kerberos_etypes(context, enctypes);
                        auth_ok = True;
                        break;
                }
+       
+               DEBUG((ret != KRB5_BAD_ENCTYPE) ? 3 : 10,
+                               ("ads_verify_ticket: enc type [%u] failed to decrypt with error %s\n",
+                               (unsigned int)enctypes[i], error_message(ret)));
        }
 
+       release_server_mutex();
+
        if (!auth_ok) {
-               DEBUG(3,("krb5_rd_req with auth failed (%s)\n", 
+               DEBUG(3,("ads_verify_ticket: krb5_rd_req with auth failed (%s)\n", 
                         error_message(ret)));
                sret = NT_STATUS_LOGON_FAILURE;
                goto out;
@@ -169,7 +185,7 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket,
 
        ret = krb5_mk_rep(context, auth_context, &packet);
        if (ret) {
-               DEBUG(3,("Failed to generate mutual authentication reply (%s)\n",
+               DEBUG(3,("ads_verify_ticket: Failed to generate mutual authentication reply (%s)\n",
                        error_message(ret)));
                sret = NT_STATUS_LOGON_FAILURE;
                goto out;
@@ -178,7 +194,7 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket,
        *ap_rep = data_blob(packet.data, packet.length);
        free(packet.data);
 
-       get_krb5_smb_session_key(context, auth_context, session_key);
+       get_krb5_smb_session_key(context, auth_context, session_key, True);
 #ifdef DEBUG_PASSWORD
        DEBUG(10,("SMB session key (from ticket) follows:\n"));
        dump_data(10, session_key, 16);
@@ -205,7 +221,7 @@ NTSTATUS ads_verify_ticket(ADS_STRUCT *ads, const DATA_BLOB *ticket,
 
        if ((ret = krb5_unparse_name(context, get_principal_from_tkt(tkt),
                                     principal))) {
-               DEBUG(3,("krb5_unparse_name failed (%s)\n", 
+               DEBUG(3,("ads_verify_ticket: krb5_unparse_name failed (%s)\n", 
                         error_message(ret)));
                sret = NT_STATUS_LOGON_FAILURE;
                goto out;
index cf6f9375f8821f775a460e993cfe80897e9d20f7..5a12288b167308247d16f23397d5aee891f108d5 100644 (file)
@@ -3,7 +3,7 @@
    ads (active directory) utility library
    Copyright (C) Andrew Tridgell 2001
    Copyright (C) Remus Koos 2001
-   Copyright (C) Jim McDonough 2002
+   Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2002
    
    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
@@ -106,12 +106,24 @@ static BOOL ads_find_dc(ADS_STRUCT *ads)
        struct ip_service *ip_list;
        pstring realm;
        BOOL got_realm = False;
+       BOOL use_own_domain = False;
+
+       /* if the realm and workgroup are both empty, assume they are ours */
 
        /* realm */
        c_realm = ads->server.realm;
+       
+       if ( !c_realm || !*c_realm ) {
+               /* special case where no realm and no workgroup means our own */
+               if ( !ads->server.workgroup || !*ads->server.workgroup ) {
+                       use_own_domain = True;
+                       c_realm = lp_realm();
+               }
+       }
+       
        if (c_realm && *c_realm) 
                got_realm = True;
-          
+                  
 again:
        /* we need to try once with the realm name and fallback to the 
           netbios domain name if we fail (if netbios has not been disabled */
@@ -119,7 +131,12 @@ again:
        if ( !got_realm && !lp_disable_netbios() ) {
                c_realm = ads->server.workgroup;
                if (!c_realm || !*c_realm) {
-                       DEBUG(0,("ads_find_dc: no realm or workgroup!  Was the structure initialized?\n"));
+                       if ( use_own_domain )
+                               c_realm = lp_workgroup();
+               }
+               
+               if ( !c_realm || !*c_realm ) {
+                       DEBUG(0,("ads_find_dc: no realm or workgroup!  Don't know what to do\n"));
                        return False;
                }
        }
@@ -1871,77 +1888,6 @@ ADS_STATUS ads_server_info(ADS_STRUCT *ads)
        return ADS_SUCCESS;
 }
 
-
-/**
- * find the list of trusted domains
- * @param ads connection to ads server
- * @param mem_ctx TALLOC_CTX for allocating results
- * @param num_trusts pointer to number of trusts
- * @param names pointer to trusted domain name list
- * @param sids pointer to list of sids of trusted domains
- * @return the count of SIDs pulled
- **/
-ADS_STATUS ads_trusted_domains(ADS_STRUCT *ads, TALLOC_CTX *mem_ctx, 
-                              int *num_trusts, 
-                              char ***names, 
-                              char ***alt_names,
-                              DOM_SID **sids)
-{
-       const char *attrs[] = {"name", "flatname", "securityIdentifier", 
-                              "trustDirection", NULL};
-       ADS_STATUS status;
-       void *res, *msg;
-       int count, i;
-
-       *num_trusts = 0;
-
-       status = ads_search(ads, &res, "(objectcategory=trustedDomain)", attrs);
-       if (!ADS_ERR_OK(status)) return status;
-
-       count = ads_count_replies(ads, res);
-       if (count == 0) {
-               ads_msgfree(ads, res);
-               return ADS_ERROR(LDAP_NO_RESULTS_RETURNED);
-       }
-
-       (*names) = talloc(mem_ctx, sizeof(char *) * count);
-       (*alt_names) = talloc(mem_ctx, sizeof(char *) * count);
-       (*sids) = talloc(mem_ctx, sizeof(DOM_SID) * count);
-       if (! *names || ! *sids) return ADS_ERROR(LDAP_NO_MEMORY);
-
-       for (i=0, msg = ads_first_entry(ads, res); msg; msg = ads_next_entry(ads, msg)) {
-               uint32 direction;
-
-               /* direction is a 2 bit bitfield, 1 means they trust us 
-                  but we don't trust them, so we should not list them
-                  as users from that domain can't login */
-               if (ads_pull_uint32(ads, msg, "trustDirection", &direction) &&
-                   direction == 1) {
-                       continue;
-               }
-               
-               (*names)[i] = ads_pull_string(ads, mem_ctx, msg, "name");
-               (*alt_names)[i] = ads_pull_string(ads, mem_ctx, msg, "flatname");
-
-               if ((*alt_names)[i] && (*alt_names)[i][0]) {
-                       /* we prefer the flatname as the primary name
-                          for consistency with RPC */
-                       char *name = (*alt_names)[i];
-                       (*alt_names)[i] = (*names)[i];
-                       (*names)[i] = name;
-               }
-               if (ads_pull_sid(ads, msg, "securityIdentifier", &(*sids)[i])) {
-                       i++;
-               }
-       }
-
-       ads_msgfree(ads, res);
-
-       *num_trusts = i;
-
-       return ADS_SUCCESS;
-}
-
 /**
  * find the domain sid for our domain
  * @param ads connection to ads server
index b650a5eb38bbc58521cad0e485a5e91e26a837ce..1448074ea022d53333b38c42c2c215013b717866 100644 (file)
@@ -1,7 +1,7 @@
 /* 
    Unix SMB/CIFS implementation.
    ads (active directory) printer utility library
-   Copyright (C) Jim McDonough 2002
+   Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2002
    
    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
index e70249dd7840c591cfcb37de22e71740f331615d..56a0d8013b2b8ee6ddc32a0d37cc50dcf6907a8c 100644 (file)
@@ -1,7 +1,7 @@
 /* 
    Unix SMB/CIFS implementation.
    ads (active directory) utility library
-   Copyright (C) Jim McDonough 2002
+   Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2002
    
    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
index 598208b17f8e80c7691e171c2eb3d3389ddc5588..910ff3f4dc6682e1fcdcc619b43ec4796a859e5f 100644 (file)
@@ -124,9 +124,10 @@ static ADS_STATUS ads_sasl_spnego_krb5_bind(ADS_STRUCT *ads, const char *princip
 {
        DATA_BLOB blob;
        struct berval cred, *scred;
+       unsigned char sk[16];
        int rc;
 
-       blob = spnego_gen_negTokenTarg(principal, ads->auth.time_offset);
+       blob = spnego_gen_negTokenTarg(principal, ads->auth.time_offset, sk);
 
        if (!blob.data) {
                return ADS_ERROR(LDAP_OPERATIONS_ERROR);
index 09d4fbb6c9abc42aaaec10ec524651064ff42565..576491dd3bcda47ae649c6aadcf1310f3d6afbb1 100644 (file)
@@ -322,9 +322,9 @@ BOOL asn1_read_OID(ASN1_DATA *data, char **OID)
        asn1_read_uint8(data, &b);
 
        oid[0] = 0;
-       snprintf(el, sizeof(el), "%u",  b/40);
+       fstr_sprintf(el, "%u",  b/40);
        pstrcat(oid, el);
-       snprintf(el, sizeof(el), " %u",  b%40);
+       fstr_sprintf(el, " %u",  b%40);
        pstrcat(oid, el);
 
        while (asn1_tag_remaining(data) > 0) {
@@ -333,7 +333,7 @@ BOOL asn1_read_OID(ASN1_DATA *data, char **OID)
                        asn1_read_uint8(data, &b);
                        v = (v<<7) | (b&0x7f);
                } while (!data->has_error && b & 0x80);
-               snprintf(el, sizeof(el), " %u",  v);
+               fstr_sprintf(el, " %u",  v);
                pstrcat(oid, el);
        }
 
index fa9af19bf5064734aace6825a6137a0de52b7b08..94fe04a480d081db48e1e9b81bacaba275920cf1 100644 (file)
@@ -190,7 +190,7 @@ static BOOL cli_session_setup_plaintext(struct cli_state *cli, const char *user,
        char *p;
        fstring lanman;
        
-       snprintf( lanman, sizeof(lanman), "Samba %s", VERSION );
+       fstr_sprintf( lanman, "Samba %s", VERSION );
 
        set_message(cli->outbuf,13,0,True);
        SCVAL(cli->outbuf,smb_com,SMBsesssetupX);
@@ -301,7 +301,7 @@ static BOOL cli_session_setup_nt1(struct cli_state *cli, const char *user,
                                lm_response = data_blob(NULL, 24);
                                SMBencrypt(pass,cli->secblob.data, lm_response.data);
                        } else {
-                               /* LM disabled,&nb