Merge branch 'v4-0-test' of ssh://git.samba.org/data/git/samba into v4-0-gmake3
authorJelmer Vernooij <jelmer@samba.org>
Mon, 25 Feb 2008 11:58:09 +0000 (12:58 +0100)
committerJelmer Vernooij <jelmer@samba.org>
Mon, 25 Feb 2008 11:58:09 +0000 (12:58 +0100)
Conflicts:

source/build/smb_build/header.pm
source/build/smb_build/makefile.pm
source/lib/ldb/include/ldb_private.h
(This used to be commit 1a646af0647f021d99473a8991c35e616a423ea6)

198 files changed:
.gitignore
source4/Makefile
source4/auth/auth_anonymous.c
source4/auth/auth_developer.c
source4/auth/auth_sam.c
source4/auth/auth_unix.c
source4/auth/auth_util.c
source4/auth/auth_winbind.c
source4/auth/gensec/gensec_gssapi.c
source4/auth/gensec/gensec_krb5.c
source4/auth/gensec/schannel.c
source4/auth/gensec/spnego.c
source4/auth/kerberos/kerberos.h
source4/auth/kerberos/kerberos_pac.c
source4/auth/ntlmssp/ntlmssp.c
source4/build/m4/check_ld.m4
source4/build/m4/check_path.m4
source4/build/smb_build/input.pm
source4/build/smb_build/makefile.pm
source4/build/smb_build/output.pm
source4/build/smb_build/summary.pm
source4/cluster/ctdb/opendb_ctdb.c
source4/configure.ac
source4/dsdb/samdb/ldb_modules/anr.c
source4/dsdb/samdb/ldb_modules/config.mk
source4/dsdb/samdb/ldb_modules/dsdb_cache.c
source4/dsdb/samdb/ldb_modules/extended_dn.c
source4/dsdb/samdb/ldb_modules/instancetype.c
source4/dsdb/samdb/ldb_modules/kludge_acl.c
source4/dsdb/samdb/ldb_modules/linked_attributes.c
source4/dsdb/samdb/ldb_modules/local_password.c
source4/dsdb/samdb/ldb_modules/naming_fsmo.c
source4/dsdb/samdb/ldb_modules/normalise.c
source4/dsdb/samdb/ldb_modules/objectclass.c
source4/dsdb/samdb/ldb_modules/objectguid.c
source4/dsdb/samdb/ldb_modules/partition.c
source4/dsdb/samdb/ldb_modules/password_hash.c
source4/dsdb/samdb/ldb_modules/pdc_fsmo.c
source4/dsdb/samdb/ldb_modules/proxy.c
source4/dsdb/samdb/ldb_modules/ranged_results.c
source4/dsdb/samdb/ldb_modules/repl_meta_data.c
source4/dsdb/samdb/ldb_modules/rootdse.c
source4/dsdb/samdb/ldb_modules/samba3sam.c
source4/dsdb/samdb/ldb_modules/samldb.c
source4/dsdb/samdb/ldb_modules/schema.c
source4/dsdb/samdb/ldb_modules/schema_fsmo.c
source4/dsdb/samdb/ldb_modules/show_deleted.c
source4/dsdb/samdb/ldb_modules/simple_ldap_map.c
source4/dsdb/samdb/ldb_modules/subtree_delete.c
source4/dsdb/samdb/ldb_modules/subtree_rename.c
source4/dsdb/samdb/ldb_modules/update_keytab.c
source4/dsdb/schema/schema.h
source4/dsdb/schema/schema_init.c
source4/dsdb/schema/schema_syntax.c
source4/kdc/hdb-ldb.c
source4/kdc/kdc.h
source4/kdc/pac-glue.c
source4/lib/charset/charcnv.c
source4/lib/events/events_select.c
source4/lib/events/events_standard.c
source4/lib/ldb/Makefile.in
source4/lib/ldb/common/ldb.c
source4/lib/ldb/common/ldb_modules.c
source4/lib/ldb/config.mk
source4/lib/ldb/include/ldb_private.h
source4/lib/ldb/ldb.mk
source4/lib/ldb/ldb_ildap/config.mk
source4/lib/ldb/ldb_ildap/ldb_ildap.c
source4/lib/ldb/ldb_ldap/ldb_ldap.c
source4/lib/ldb/ldb_map/ldb_map.c
source4/lib/ldb/ldb_map/ldb_map.h
source4/lib/ldb/ldb_map/ldb_map_private.h
source4/lib/ldb/ldb_sqlite3/ldb_sqlite3.c
source4/lib/ldb/ldb_tdb/ldb_tdb.c
source4/lib/ldb/modules/asq.c
source4/lib/ldb/modules/operational.c
source4/lib/ldb/modules/paged_results.c
source4/lib/ldb/modules/paged_searches.c
source4/lib/ldb/modules/rdn_name.c
source4/lib/ldb/modules/skel.c
source4/lib/ldb/modules/sort.c
source4/lib/ldb/nssldb/ldb-nss.c
source4/lib/ldb/tests/sample_module.c
source4/lib/ldb/tools/ad2oLschema.c
source4/lib/ldb/tools/cmdline.c
source4/lib/ldb/tools/ldbadd.c
source4/lib/ldb/tools/ldbdel.c
source4/lib/ldb/tools/ldbedit.c
source4/lib/ldb/tools/ldbmodify.c
source4/lib/ldb/tools/ldbrename.c
source4/lib/ldb/tools/ldbsearch.c
source4/lib/ldb/tools/ldbtest.c
source4/lib/ldb/tools/oLschema2ldif.c
source4/lib/registry/patchfile.c
source4/lib/registry/patchfile_dotreg.c
source4/lib/registry/registry.h
source4/lib/registry/tests/generic.c
source4/lib/registry/tools/regshell.c
source4/lib/registry/tools/regtree.c
source4/lib/registry/util.c
source4/lib/replace/dlfcn.c
source4/lib/replace/getifaddrs.c
source4/lib/replace/getifaddrs.m4
source4/lib/replace/getpass.m4
source4/lib/replace/libreplace.m4
source4/lib/replace/libreplace_ld.m4
source4/lib/replace/system/config.m4
source4/lib/replace/system/network.h
source4/lib/socket/socket_ip.c
source4/lib/socket/socket_unix.c
source4/lib/socket_wrapper/config.m4
source4/lib/socket_wrapper/socket_wrapper.c
source4/lib/talloc/web/index.html
source4/lib/tdr/tdr.c
source4/lib/util/attr.h
source4/lib/util/ms_fnmatch.c
source4/lib/util/util.h
source4/libcli/auth/smbencrypt.c
source4/libcli/dgram/browse.c
source4/libcli/dgram/dgramsocket.c
source4/libcli/dgram/libdgram.h
source4/libcli/dgram/netlogon.c
source4/libcli/dgram/ntlogon.c
source4/libcli/nbt/nbtname.c
source4/libcli/raw/clitransport.c
source4/libcli/smb_composite/fetchfile.c
source4/libcli/smb_composite/sesssetup.c
source4/libcli/smb_composite/smb_composite.h
source4/librpc/idl/drsblobs.idl
source4/librpc/idl/initshutdown.idl
source4/librpc/idl/lsa.idl
source4/librpc/idl/samr.idl
source4/librpc/idl/srvsvc.idl
source4/librpc/idl/winreg.idl
source4/nbt_server/config.mk
source4/nbt_server/wins/wins_ldb.c
source4/nsswitch/wbinfo.c
source4/ntvfs/common/opendb.c
source4/ntvfs/common/opendb.h
source4/ntvfs/common/opendb_tdb.c
source4/ntvfs/posix/pvfs_lock.c
source4/ntvfs/posix/pvfs_notify.c
source4/ntvfs/posix/pvfs_open.c
source4/ntvfs/posix/pvfs_rename.c
source4/ntvfs/posix/pvfs_resolve.c
source4/ntvfs/posix/pvfs_setfileinfo.c
source4/ntvfs/posix/pvfs_shortname.c
source4/ntvfs/posix/pvfs_unlink.c
source4/ntvfs/posix/pvfs_wait.c
source4/ntvfs/posix/vfs_posix.h
source4/param/loadparm.c
source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
source4/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm
source4/pidl/tests/wireshark-conf.pl
source4/samba4-knownfail
source4/samba4-quick
source4/samba4-skip
source4/scripting/ejs/smbscript.c
source4/scripting/libjs/provision.js
source4/scripting/python/config.m4
source4/scripting/python/samba/provision.py
source4/selftest/config.mk
source4/selftest/samba4_tests.sh
source4/selftest/selftest.pl
source4/selftest/target/Kvm.pm [new file with mode: 0644]
source4/selftest/target/Samba4.pm
source4/setup/idmap_init.ldif [new file with mode: 0644]
source4/setup/provision
source4/setup/provision.js [new file with mode: 0755]
source4/setup/provision.py [deleted file]
source4/setup/tests/blackbox_provision.sh
source4/smbd/server.c
source4/torture/auth/pac.c
source4/torture/basic/base.c
source4/torture/basic/utable.c
source4/torture/config.mk
source4/torture/rap/rap.c
source4/torture/raw/composite.c
source4/torture/raw/oplock.c
source4/torture/rpc/initshutdown.c
source4/torture/rpc/netlogon.c
source4/torture/rpc/samba3rpc.c
source4/torture/rpc/samlogon.c
source4/torture/rpc/samsync.c
source4/torture/rpc/schannel.c
source4/torture/rpc/winreg.c
source4/torture/smbtorture.c
source4/utils/net/net.c
source4/winbind/config.mk
source4/winbind/idmap.c [new file with mode: 0644]
source4/winbind/idmap.h [new file with mode: 0644]
source4/winbind/wb_gid2sid.c
source4/winbind/wb_pam_auth.c
source4/winbind/wb_server.c
source4/winbind/wb_server.h
source4/winbind/wb_sid2gid.c
source4/winbind/wb_sid2uid.c
source4/winbind/wb_uid2sid.c

index b0786b66d65845679d4ad923e7641b28f583180d..f75f698c6565e05a39a721afcc5d8bb3bc062516 100644 (file)
@@ -115,7 +115,6 @@ source/smb_server/smb2/smb2_proto.h
 source/smbd/process_model_proto.h
 source/smbd/service_proto.h
 source/torture/proto.h
-source/torture/util.h
 source/torture/auth/proto.h
 source/torture/basic/proto.h
 source/torture/ldap/proto.h
@@ -130,6 +129,7 @@ source/utils/net/net_proto.h
 source/web_server/proto.h
 source/winbind/wb_helper.h
 source/winbind/wb_proto.h
+source/winbind/idmap_proto.h
 source/wrepl_server/wrepl_server_proto.h
 tags
 source/auth/credentials/credentials_krb5_proto.h
index ea98b5e469f522400a1a9fbb7e2da45629ed94b6..1fddfefce3b3fcb444165d5c1f3734a022a445ad 100644 (file)
@@ -14,10 +14,10 @@ SETUPDIR = $(datadir)/setup
 NCALRPCDIR = $(localstatedir)/ncalrpc
 
 BNLD = $(LD)
-BNLD_FLAGS = $(LDFLAGS)
+BNLD_FLAGS = $(LDFLAGS) $(SYS_LDFLAGS)
 
 HOSTCC_FLAGS = -D_SAMBA_HOSTCC_ $(CFLAGS)
-HOSTLD_FLAGS = $(LDFLAGS)
+HOSTLD_FLAGS = $(LDFLAGS) $(SYS_LDFLAGS)
 
 default: all
 
index bcab918347518956136e0caf60608f9b629f9c40..38c13d4b659a66c65b2b4b5d4ac5a1ecf71741c0 100644 (file)
@@ -63,7 +63,7 @@ static const struct auth_operations anonymous_auth_ops = {
        .check_password = anonymous_check_password
 };
 
-NTSTATUS auth_anonymous_init(void)
+_PUBLIC_ NTSTATUS auth_anonymous_init(void)
 {
        NTSTATUS ret;
 
index 57eb752ac8708d0cf11daf90f1dac253a169d5f9..0da947b68d9e8e23bd106aeed58aa099db650ce0 100644 (file)
@@ -186,7 +186,7 @@ static const struct auth_operations fixed_challenge_auth_ops = {
        .check_password = fixed_challenge_check_password
 };
 
-NTSTATUS auth_developer_init(void)
+_PUBLIC_ NTSTATUS auth_developer_init(void)
 {
        NTSTATUS ret;
 
index 0885d8265ad7a8f34d1832cf49eb0023ee54a46a..918964015039951f11f605e394f1bce25eec40d2 100644 (file)
@@ -425,7 +425,7 @@ static const struct auth_operations sam_ops = {
        .check_password = authsam_check_password
 };
 
-NTSTATUS auth_sam_init(void)
+_PUBLIC_ NTSTATUS auth_sam_init(void)
 {
        NTSTATUS ret;
 
index 62fb42935a415d3110fa6d00b03ccdf893d15d58..20e198701d67a4a549488b3d62090a8ea8c63dc0 100644 (file)
@@ -829,7 +829,7 @@ static const struct auth_operations unix_ops = {
        .check_password = authunix_check_password
 };
 
-NTSTATUS auth_unix_init(void)
+_PUBLIC_ NTSTATUS auth_unix_init(void)
 {
        NTSTATUS ret;
 
index b1f0e60507dab5a88b00278b0ac0ddcceae80323..5d2bc6bac0f46bb0fbcd372426c04a1a50cc9985 100644 (file)
@@ -144,7 +144,7 @@ NTSTATUS encrypt_user_info(TALLOC_CTX *mem_ctx, struct auth_context *auth_contex
                        
                        chall_blob = data_blob_talloc(mem_ctx, challenge, 8);
                        if (lp_client_ntlmv2_auth(auth_context->lp_ctx)) {
-                               DATA_BLOB names_blob = NTLMv2_generate_names_blob(mem_ctx, lp_netbios_name(auth_context->lp_ctx), lp_workgroup(auth_context->lp_ctx));
+                               DATA_BLOB names_blob = NTLMv2_generate_names_blob(mem_ctx, lp_iconv_convenience(auth_context->lp_ctx), lp_netbios_name(auth_context->lp_ctx), lp_workgroup(auth_context->lp_ctx));
                                DATA_BLOB lmv2_response, ntlmv2_response, lmv2_session_key, ntlmv2_session_key;
                                
                                if (!SMBNTLMv2encrypt_hash(user_info_temp,
index 89ae3195dfd95b84d8630b3ae06f5b31a807f471..2f8074d3cbb22a560cd33a7b832f3c0142b67b84 100644 (file)
@@ -260,7 +260,7 @@ static const struct auth_operations winbind_ops = {
        .check_password = winbind_check_password
 };
 
-NTSTATUS auth_winbind_init(void)
+_PUBLIC_ NTSTATUS auth_winbind_init(void)
 {
        NTSTATUS ret;
 
index 87fa47646bbfacf95f55d2b779cbd4ec597f451f..d8cdb90197579aa58ba9cae72686cd8680a4369e 100644 (file)
@@ -1298,7 +1298,7 @@ static NTSTATUS gensec_gssapi_session_info(struct gensec_security *gensec_securi
                }
                
                /* decode and verify the pac */
-               nt_status = kerberos_pac_logon_info(mem_ctx, &logon_info, pac_blob,
+               nt_status = kerberos_pac_logon_info(mem_ctx, lp_iconv_convenience(gensec_security->lp_ctx), &logon_info, pac_blob,
                                                    gensec_gssapi_state->smb_krb5_context->krb5_context,
                                                    NULL, keyblock, principal, authtime, NULL);
                krb5_free_principal(gensec_gssapi_state->smb_krb5_context->krb5_context, principal);
@@ -1463,7 +1463,7 @@ static const struct gensec_security_ops gensec_gssapi_sasl_krb5_security_ops = {
        .priority         = GENSEC_GSSAPI
 };
 
-NTSTATUS gensec_gssapi_init(void)
+_PUBLIC_ NTSTATUS gensec_gssapi_init(void)
 {
        NTSTATUS ret;
 
index 5cd0de1ceb764f6b9cc54ecadd0a5369e382d864..88432c7f89c5e782eb39c5ab268fe772d7c7ad21 100644 (file)
@@ -617,7 +617,9 @@ static NTSTATUS gensec_krb5_session_info(struct gensec_security *gensec_security
                }
 
                /* decode and verify the pac */
-               nt_status = kerberos_pac_logon_info(gensec_krb5_state, &logon_info, pac,
+               nt_status = kerberos_pac_logon_info(gensec_krb5_state, 
+                                                   lp_iconv_convenience(gensec_security->lp_ctx),
+                                                   &logon_info, pac,
                                                    gensec_krb5_state->smb_krb5_context->krb5_context,
                                                    NULL, gensec_krb5_state->keyblock,
                                                    client_principal,
@@ -775,7 +777,7 @@ static const struct gensec_security_ops gensec_krb5_security_ops = {
        .priority       = GENSEC_KRB5
 };
 
-NTSTATUS gensec_krb5_init(void)
+_PUBLIC_ NTSTATUS gensec_krb5_init(void)
 {
        NTSTATUS ret;
 
index 42db959380e71ae87dfeed1e0df7c738cfb0a420..96e347898234e8cccc36fdfa6bf5de9953038f47 100644 (file)
@@ -274,7 +274,7 @@ static const struct gensec_security_ops gensec_schannel_security_ops = {
        .priority       = GENSEC_SCHANNEL
 };
 
-NTSTATUS gensec_schannel_init(void)
+_PUBLIC_ NTSTATUS gensec_schannel_init(void)
 {
        NTSTATUS ret;
        ret = gensec_register(&gensec_schannel_security_ops);
index 782aa44c758d4f3cd1d7f5ff0f86e5ce5d5102c6..f593d17d4bdf110cca608baf608554af3882199e 100644 (file)
@@ -1042,7 +1042,7 @@ static const struct gensec_security_ops gensec_spnego_security_ops = {
        .priority         = GENSEC_SPNEGO
 };
 
-NTSTATUS gensec_spnego_init(void)
+_PUBLIC_ NTSTATUS gensec_spnego_init(void)
 {
        NTSTATUS ret;
        ret = gensec_register(&gensec_spnego_security_ops);
index bafd58a048db21ece77b1314957d7fdc3523042f..8585aa321b59d3f594077e21f864e9690a45e3f1 100644 (file)
@@ -111,6 +111,7 @@ krb5_error_code principal_from_credentials(TALLOC_CTX *parent_ctx,
                                           struct smb_krb5_context *smb_krb5_context,
                                           krb5_principal *princ);
 NTSTATUS kerberos_decode_pac(TALLOC_CTX *mem_ctx,
+                            struct smb_iconv_convenience *iconv_convenience,
                             struct PAC_DATA **pac_data_out,
                             DATA_BLOB blob,
                             krb5_context context,
@@ -120,6 +121,7 @@ NTSTATUS kerberos_decode_pac(TALLOC_CTX *mem_ctx,
                             time_t tgs_authtime,
                             krb5_error_code *k5ret);
  NTSTATUS kerberos_pac_logon_info(TALLOC_CTX *mem_ctx,
+                                 struct smb_iconv_convenience *iconv_convenience,
                                  struct PAC_LOGON_INFO **logon_info,
                                  DATA_BLOB blob,
                                  krb5_context context,
@@ -129,12 +131,14 @@ NTSTATUS kerberos_decode_pac(TALLOC_CTX *mem_ctx,
                                  time_t tgs_authtime, 
                                  krb5_error_code *k5ret);
  krb5_error_code kerberos_encode_pac(TALLOC_CTX *mem_ctx,
+                                    struct smb_iconv_convenience *iconv_convenience,
                                    struct PAC_DATA *pac_data,
                                    krb5_context context,
                                    const krb5_keyblock *krbtgt_keyblock,
                                    const krb5_keyblock *service_keyblock,
                                    DATA_BLOB *pac);
  krb5_error_code kerberos_create_pac(TALLOC_CTX *mem_ctx,
+                                    struct smb_iconv_convenience *iconv_convenience,
                                     struct auth_serversupplied_info *server_info,
                                     krb5_context context,
                                     const krb5_keyblock *krbtgt_keyblock,
index c46e06bc72aeb34a621d5e6909bb4b8b6b6ac76e..e485f75302bfb1576ca50c0feed34fc4249d0687 100644 (file)
@@ -66,6 +66,7 @@ static krb5_error_code check_pac_checksum(TALLOC_CTX *mem_ctx,
 }
 
  NTSTATUS kerberos_decode_pac(TALLOC_CTX *mem_ctx,
+                             struct smb_iconv_convenience *iconv_convenience,
                              struct PAC_DATA **pac_data_out,
                              DATA_BLOB blob,
                              krb5_context context,
@@ -86,7 +87,6 @@ static krb5_error_code check_pac_checksum(TALLOC_CTX *mem_ctx,
        struct PAC_LOGON_NAME *logon_name = NULL;
        struct PAC_DATA *pac_data;
        struct PAC_DATA_RAW *pac_data_raw;
-       struct smb_iconv_convenience *iconv_convenience = lp_iconv_convenience(global_loadparm);
 
        DATA_BLOB *srv_sig_blob = NULL;
        DATA_BLOB *kdc_sig_blob = NULL;
@@ -340,6 +340,7 @@ static krb5_error_code check_pac_checksum(TALLOC_CTX *mem_ctx,
 }
 
 _PUBLIC_  NTSTATUS kerberos_pac_logon_info(TALLOC_CTX *mem_ctx,
+                                 struct smb_iconv_convenience *iconv_convenience,
                                  struct PAC_LOGON_INFO **logon_info,
                                  DATA_BLOB blob,
                                  krb5_context context,
@@ -352,7 +353,9 @@ _PUBLIC_  NTSTATUS kerberos_pac_logon_info(TALLOC_CTX *mem_ctx,
        NTSTATUS nt_status;
        struct PAC_DATA *pac_data;
        int i;
-       nt_status = kerberos_decode_pac(mem_ctx, &pac_data,
+       nt_status = kerberos_decode_pac(mem_ctx, 
+                                       iconv_convenience,
+                                       &pac_data,
                                        blob,
                                        context,
                                        krbtgt_keyblock,
@@ -423,6 +426,7 @@ static krb5_error_code make_pac_checksum(TALLOC_CTX *mem_ctx,
 }
 
  krb5_error_code kerberos_encode_pac(TALLOC_CTX *mem_ctx,
+                                    struct smb_iconv_convenience *iconv_convenience,
                                    struct PAC_DATA *pac_data,
                                    krb5_context context,
                                    const krb5_keyblock *krbtgt_keyblock,
@@ -437,7 +441,6 @@ static krb5_error_code make_pac_checksum(TALLOC_CTX *mem_ctx,
        struct PAC_SIGNATURE_DATA *kdc_checksum = NULL;
        struct PAC_SIGNATURE_DATA *srv_checksum = NULL;
        int i;
-       struct smb_iconv_convenience *iconv_convenience = lp_iconv_convenience(global_loadparm);
 
        /* First, just get the keytypes filled in (and lengths right, eventually) */
        for (i=0; i < pac_data->num_buffers; i++) {
@@ -528,6 +531,7 @@ static krb5_error_code make_pac_checksum(TALLOC_CTX *mem_ctx,
 
 
  krb5_error_code kerberos_create_pac(TALLOC_CTX *mem_ctx,
+                                    struct smb_iconv_convenience *iconv_convenience,
                                     struct auth_serversupplied_info *server_info,
                                     krb5_context context,
                                     const krb5_keyblock *krbtgt_keyblock,
@@ -640,6 +644,7 @@ static krb5_error_code make_pac_checksum(TALLOC_CTX *mem_ctx,
        unix_to_nt_time(&LOGON_NAME->logon_time, tgs_authtime);
 
        ret = kerberos_encode_pac(mem_ctx, 
+                                 iconv_convenience,
                                  pac_data, 
                                  context,
                                  krbtgt_keyblock,
index 4f5822567ac3a3948170ffd4bb86378d07221b97..8901488004c5e46ff53515203cc61eb3697c0488 100644 (file)
@@ -425,7 +425,7 @@ static const struct gensec_security_ops gensec_ntlmssp_security_ops = {
 };
 
 
-NTSTATUS gensec_ntlmssp_init(void)
+_PUBLIC_ NTSTATUS gensec_ntlmssp_init(void)
 {
        NTSTATUS ret;
 
index 3b69057a69dd2d8d167afdd8a92bb830e0292095..0d0742e5d22a8bc99178c30b970e5905a5ea2b93 100644 (file)
@@ -13,6 +13,7 @@ LD=""
 
 AC_SUBST(BLDSHARED)
 AC_SUBST(LD)
+AC_SUBST(SYS_LDFLAGS)
 AC_SUBST(LDFLAGS)
 
 # Assume non-shared by default and override below
@@ -32,13 +33,13 @@ AC_MSG_CHECKING([whether to try to build shared libraries on $host_os])
 case "$host_os" in
        *linux*)
                BLDSHARED="true"
-               LDFLAGS="$LDFLAGS -Wl,--export-dynamic"
+               SYS_LDFLAGS="-Wl,--export-dynamic"
                ;;
        *solaris*)
                BLDSHARED="true"
                if test "${GCC}" = "yes"; then
                        if test "${ac_cv_prog_gnu_ld}" = "yes"; then
-                               LDFLAGS="$LDFLAGS -Wl,-E"
+                               SYS_LDFLAGS="-Wl,-E"
                        fi
                fi
                ;;
@@ -47,26 +48,26 @@ case "$host_os" in
                ;;
        *netbsd* | *freebsd* | *dragonfly* )  
                BLDSHARED="true"
-               LDFLAGS="$LDFLAGS -Wl,--export-dynamic"
+               SYS_LDFLAGS="-Wl,--export-dynamic"
                ;;
        *openbsd*)
                BLDSHARED="true"
-               LDFLAGS="$LDFLAGS -Wl,-Bdynamic"
+               SYS_LDFLAGS="-Wl,-Bdynamic"
                ;;
        *irix*)
                BLDSHARED="true"
                ;;
        *aix*)
                BLDSHARED="true"
-               LDFLAGS="$LDFLAGS -Wl,-brtl,-bexpall,-bbigtoc"
+               SYS_LDFLAGS="-Wl,-brtl,-bexpall,-bbigtoc"
                ;;
        *hpux*)
                # Use special PIC flags for the native HP-UX compiler.
                BLDSHARED="true" # I hope this is correct
                if test "$host_cpu" = "ia64"; then
-                       LDFLAGS="$LDFLAGS -Wl,-E,+b/usr/local/lib/hpux32:/usr/lib/hpux32"
+                       SYS_LDFLAGS="-Wl,-E,+b/usr/local/lib/hpux32:/usr/lib/hpux32"
                else
-                       LDFLAGS="$LDFLAGS -Wl,-E,+b/usr/local/lib:/usr/lib"
+                       SYS_LDFLAGS="-Wl,-E,+b/usr/local/lib:/usr/lib"
                fi
                ;;
        *osf*)
@@ -86,6 +87,8 @@ AC_MSG_CHECKING([LD])
 AC_MSG_RESULT([$LD])
 AC_MSG_CHECKING([LDFLAGS])
 AC_MSG_RESULT([$LDFLAGS])
+AC_MSG_CHECKING([SYS_LDFLAGS])
+AC_MSG_RESULT([$SYS_LDFLAGS])
 
 AC_SUBST(HOSTLD)
 
index 1dacd956ea3630935c38f707d44f6634492a3a49..08a858ebb2c4edcfc54265bcaf834b24eee778e9 100644 (file)
@@ -132,7 +132,7 @@ AC_SUBST(modulesdir)
 selftest_prefix="./st"
 AC_SUBST(selftest_prefix)
 AC_ARG_WITH(selftest-prefix,
-[  --with-selftest-prefix=DIR    The prefix where make test will be runned ($selftest_prefix)],
+[  --with-selftest-prefix=DIR    The prefix where make test will be run ($selftest_prefix)],
 [ case "$withval" in
   yes|no)
     AC_MSG_WARN([--with-selftest-prefix called without argument - will use default])
index 9aef1c10021fc0b09b4fe038e40d45c7f926b5f1..a8dd573744cc905deaae2bd11ac704511dd53898 100644 (file)
@@ -233,14 +233,6 @@ sub check($$$$$)
        my ($INPUT, $enabled, $subsys_ot, $lib_ot, $module_ot) = @_;
 
        foreach my $part (values %$INPUT) {
-               unless (defined($part->{STANDARD_VISIBILITY})) {
-                       if ($part->{TYPE} eq "MODULE" or $part->{TYPE} eq "BINARY") {
-                               $part->{STANDARD_VISIBILITY} = "hidden";
-                       } else {
-                               $part->{STANDARD_VISIBILITY} = "default";
-                       }
-               }
-
                unless (defined($part->{PUBLIC_HEADERS})) {
                        $part->{PUBLIC_HEADERS} = [];
                }
index 8a99848437063d3b22eaa8f618a47dd1372b28ec..23caec083fe5134a724c00996d76a75cd9edf0da 100644 (file)
@@ -145,7 +145,8 @@ sub SharedModule($$)
        $self->_prepare_list($ctx, "DEPEND_LIST");
        $self->_prepare_list($ctx, "LINK_FLAGS");
 
-       if (defined($ctx->{INIT_FUNCTION}) and $ctx->{TYPE} ne "PYTHON") {
+       if (defined($ctx->{INIT_FUNCTION}) and $ctx->{TYPE} ne "PYTHON" and
+               $ctx->{INIT_FUNCTION_TYPE} =~ /\(\*\)/) {
                $self->output("\$($ctx->{NAME}_OBJ_LIST): CFLAGS+=-D$ctx->{INIT_FUNCTION}=init_module\n");
        }
 
@@ -154,8 +155,8 @@ sub SharedModule($$)
 $ctx->{SHAREDDIR}/$ctx->{LIBRARY_REALNAME}: \$($ctx->{NAME}_DEPEND_LIST) \$($ctx->{NAME}_OBJ_LIST)
        \@echo Linking \$\@
        \@mkdir -p \$(\@D)
-       \@\$(MDLD) \$(MDLD_FLAGS) \$(INTERN_LDFLAGS) -o \$\@ \$(INSTALL_LINK_FLAGS) \\
-               \$($ctx->{NAME}\_OBJ_LIST) \\
+       \@\$(MDLD) \$(LDFLAGS) \$(MDLD_FLAGS) \$(INTERN_LDFLAGS) -o \$\@ \$(INSTALL_LINK_FLAGS) \\
+               \$($ctx->{NAME}\_FULL_OBJ_LIST) \\
                \$($ctx->{NAME}_LINK_FLAGS)
 __EOD__
 );
@@ -195,8 +196,8 @@ sub SharedLibrary($$)
 $ctx->{RESULT_SHARED_LIBRARY}: \$($ctx->{NAME}_DEPEND_LIST) \$($ctx->{NAME}_FULL_OBJ_LIST)
        \@echo Linking \$\@
        \@mkdir -p $ctx->{SHAREDDIR}
-       \@\$(SHLD) \$(SHLD_FLAGS) \$(INTERN_LDFLAGS) -o \$\@ \$(INSTALL_LINK_FLAGS) \\
-               \$($ctx->{NAME}\_OBJ_LIST) \\
+       \@\$(SHLD) \$(LDFLAGS) \$(SHLD_FLAGS) \$(INTERN_LDFLAGS) -o \$\@ \$(INSTALL_LINK_FLAGS) \\
+               \$($ctx->{NAME}\_FULL_OBJ_LIST) \\
                \$($ctx->{NAME}_LINK_FLAGS) \\
                \$(if \$(SONAMEFLAG), \$(SONAMEFLAG)$ctx->{LIBRARY_SONAME})
 __EOD__
index 83be28e740f9950d983f900feaf4d6e0084b312e..ff9afe8e8c9f09d459bd0c7e86160070ab3a1f91 100644 (file)
@@ -185,7 +185,7 @@ sub create_output($$)
                merge_array(\$part->{FINAL_CFLAGS}, $part->{CPPFLAGS});
                merge_array(\$part->{FINAL_CFLAGS}, $part->{CFLAGS});
 
-               foreach (@{$part->{UNIQUE_DEPENDENCIES_COMPILE}}) {
+               foreach (@{$part->{UNIQUE_DEPENDENCIES_ALL}}) {
                        my $elem = $depend->{$_};
                        next if $elem == $part;
 
index 4ea1ad525e3e0cec2f77ff8000e54db626b44edf..a6557fb1fed1e61d36c9f37a734bf08df924dbdc 100644 (file)
@@ -53,6 +53,9 @@ sub show($$)
        showitem($output, "using libblkid", ["BLKID"]);
        showitem($output, "using iconv", ["ICONV"]);
        showitem($output, "using pam", ["PAM"]);
+       if (enabled($config->{developer})) {
+               showitem($output, "using VDE", ["VDEPLUG"]);
+       }
        showitem($output, "python bindings", ["LIBPYTHON"]);
        showisexternal($output, "popt", "LIBPOPT");
        showisexternal($output, "talloc", "LIBTALLOC");
index aaab3aa55dc9b1e59777a833f20c16c0e7433b55..86dc1f50f11c6fd18d8aef6fd247c00a931adafd 100644 (file)
@@ -133,6 +133,16 @@ static struct odb_lock *odb_ctdb_lock(TALLOC_CTX *mem_ctx,
        return lck;
 }
 
+static DATA_BLOB odb_ctdb_get_key(TALLOC_CTX *mem_ctx, struct odb_lock *lck)
+{
+       /*
+        * as this file will went away and isn't used yet,
+        * copy the implementation from the tdb backend
+        * --metze
+        */
+       return data_blob_const(NULL, 0);
+}
+
 /*
   determine if two odb_entry structures conflict
 
@@ -440,6 +450,19 @@ static NTSTATUS odb_ctdb_close_file(struct odb_lock *lck, void *file_handle)
        return odb_push_record(lck, &file);
 }
 
+/*
+  update the oplock level of the client
+*/
+static NTSTATUS odb_ctdb_update_oplock(struct odb_lock *lck, void *file_handle,
+                                      uint32_t oplock_level)
+{
+       /*
+        * as this file will went away and isn't used yet,
+        * copy the implementation from the tdb backend
+        * --metze
+        */
+       return NT_STATUS_FOOBAR;
+}
 
 /*
   remove a pending opendb entry
@@ -610,6 +633,7 @@ static NTSTATUS odb_ctdb_can_open(struct odb_lock *lck,
 static const struct opendb_ops opendb_ctdb_ops = {
        .odb_init                = odb_ctdb_init,
        .odb_lock                = odb_ctdb_lock,
+       .odb_get_key             = odb_ctdb_get_key,
        .odb_open_file           = odb_ctdb_open_file,
        .odb_open_file_pending   = odb_ctdb_open_file_pending,
        .odb_close_file          = odb_ctdb_close_file,
@@ -617,7 +641,8 @@ static const struct opendb_ops opendb_ctdb_ops = {
        .odb_rename              = odb_ctdb_rename,
        .odb_set_delete_on_close = odb_ctdb_set_delete_on_close,
        .odb_get_delete_on_close = odb_ctdb_get_delete_on_close,
-       .odb_can_open            = odb_ctdb_can_open
+       .odb_can_open            = odb_ctdb_can_open,
+       .odb_update_oplock       = odb_ctdb_update_oplock
 };
 
 
index 1c17126f4a5198ebcb39e6debb518cff57e91cf4..b609b4f52c89b193ed400899ca27fc73cbc9b430 100644 (file)
@@ -35,7 +35,7 @@ AC_CONFIG_FILES(auth/gensec/gensec.pc)
 AC_CONFIG_FILES(param/samba-config.pc)
 AC_CONFIG_FILES(librpc/dcerpc_samr.pc)
 
-SMB_EXT_LIB_FROM_PKGCONFIG(LIBTALLOC, talloc >= 1.1.0,
+SMB_EXT_LIB_FROM_PKGCONFIG(LIBTALLOC, talloc >= 1.2.0,
        [],
        [
                m4_include(lib/talloc/libtalloc.m4)
index 908d9b088c8b3540b321dce6792e5737ce16f9e9..1252c9ee42f1ae2c65fbb82dd875baae34101850 100644 (file)
@@ -295,13 +295,7 @@ static int anr_search(struct ldb_module *module, struct ldb_request *req)
        return ldb_next_request(module, req);
 }
 
-static const struct ldb_module_ops anr_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_anr_module_ops = {
        .name              = "anr",
        .search = anr_search
 };
-
-int ldb_anr_init(void)
-{
-       return ldb_register_module(&anr_ops);
-}
-
index dc407fbd8a9a049b0c8618dc86941d6ff7547852..de93b5638df22801b951edb15967c7510a6895b5 100644 (file)
@@ -4,7 +4,7 @@
 SUBSYSTEM = LIBLDB
 OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = LIBTALLOC LIBNDR NDR_MISC
-INIT_FUNCTION = objectguid_module_init
+INIT_FUNCTION = objectguid_module_module_ops
 OBJ_FILES = \
                objectguid.o
 # End MODULE ldb_objectguid
@@ -17,7 +17,7 @@ SUBSYSTEM = LIBLDB
 OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = SAMDB LIBTALLOC LIBNDR NDR_MISC NDR_DRSUAPI \
                                           NDR_DRSBLOBS LIBNDR
-INIT_FUNCTION = repl_meta_data_module_init
+INIT_FUNCTION = repl_meta_data_module_module_ops
 OBJ_FILES = \
                repl_meta_data.o
 # End MODULE ldb_repl_meta_data
@@ -29,7 +29,7 @@ OBJ_FILES = \
 SUBSYSTEM = LIBLDB
 OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = SAMDB LIBTALLOC
-INIT_FUNCTION = dsdb_cache_module_init
+INIT_FUNCTION = dsdb_cache_module_module_ops
 OBJ_FILES = \
                dsdb_cache.o
 # End MODULE ldb_dsdb_cache
@@ -41,7 +41,7 @@ OBJ_FILES = \
 SUBSYSTEM = LIBLDB
 OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = SAMDB LIBTALLOC
-INIT_FUNCTION = schema_fsmo_module_init
+INIT_FUNCTION = schema_fsmo_module_module_ops
 OBJ_FILES = \
                schema_fsmo.o
 # End MODULE ldb_schema_fsmo
@@ -53,7 +53,7 @@ OBJ_FILES = \
 SUBSYSTEM = LIBLDB
 OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = SAMDB LIBTALLOC
-INIT_FUNCTION = naming_fsmo_module_init
+INIT_FUNCTION = naming_fsmo_module_module_ops
 OBJ_FILES = \
                naming_fsmo.o
 # End MODULE ldb_naming_fsmo
@@ -65,7 +65,7 @@ OBJ_FILES = \
 SUBSYSTEM = LIBLDB
 OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = SAMDB LIBTALLOC
-INIT_FUNCTION = pdc_fsmo_module_init
+INIT_FUNCTION = pdc_fsmo_module_module_ops
 OBJ_FILES = \
                pdc_fsmo.o
 # End MODULE ldb_pdc_fsmo
@@ -77,7 +77,7 @@ OBJ_FILES = \
 SUBSYSTEM = LIBLDB
 OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = LIBTALLOC LDAP_ENCODE NDR_MISC SAMDB
-INIT_FUNCTION = samldb_module_init
+INIT_FUNCTION = samldb_module_module_ops
 OBJ_FILES = \
                samldb.o
 #
@@ -89,7 +89,7 @@ OBJ_FILES = \
 [MODULE::ldb_samba3sam]
 SUBSYSTEM = LIBLDB
 OUTPUT_TYPE = SHARED_LIBRARY
-INIT_FUNCTION = ldb_samba3sam_module_init
+INIT_FUNCTION = &ldb_samba3sam_module_module_ops
 PRIVATE_DEPENDENCIES = LIBTALLOC ldb_map SMBPASSWD NSS_WRAPPER LIBSECURITY \
                                           NDR_SECURITY
 OBJ_FILES = \
@@ -103,7 +103,7 @@ OBJ_FILES = \
 [MODULE::ldb_simple_ldap_map]
 SUBSYSTEM = LIBLDB
 OUTPUT_TYPE = SHARED_LIBRARY
-INIT_FUNCTION = ldb_simple_ldap_map_module_init
+INIT_FUNCTION = &ldb_simple_ldap_map_module_module_ops
 PRIVATE_DEPENDENCIES = LIBTALLOC ldb_map LIBNDR NDR_MISC
 ENABLE = YES
 ALIASES = entryuuid nsuniqueid
@@ -117,7 +117,7 @@ OBJ_FILES = \
 # # Start MODULE ldb_proxy
 # [MODULE::ldb_proxy]
 # SUBSYSTEM = LIBLDB
-# INIT_FUNCTION = proxy_module_init
+# INIT_FUNCTION = proxy_module_module_ops
 # OBJ_FILES = \
 #              proxy.o
 # 
@@ -131,7 +131,7 @@ OBJ_FILES = \
 SUBSYSTEM = LIBLDB
 PRIVATE_DEPENDENCIES = LIBTALLOC SAMDB
 OUTPUT_TYPE = SHARED_LIBRARY
-INIT_FUNCTION = rootdse_module_init
+INIT_FUNCTION = rootdse_module_module_ops
 OBJ_FILES = \
                rootdse.o
 #
@@ -143,7 +143,7 @@ OBJ_FILES = \
 [MODULE::ldb_password_hash]
 SUBSYSTEM = LIBLDB
 OUTPUT_TYPE = SHARED_LIBRARY
-INIT_FUNCTION = password_hash_module_init
+INIT_FUNCTION = password_hash_module_module_ops
 OBJ_FILES = password_hash.o
 PRIVATE_DEPENDENCIES = HEIMDAL_HDB_KEYS LIBTALLOC HEIMDAL_KRB5 LDAP_ENCODE \
                                           LIBCLI_AUTH NDR_DRSBLOBS KERBEROS SAMDB
@@ -157,7 +157,7 @@ PRIVATE_DEPENDENCIES = HEIMDAL_HDB_KEYS LIBTALLOC HEIMDAL_KRB5 LDAP_ENCODE \
 PRIVATE_DEPENDENCIES = LIBTALLOC LIBNDR SAMDB
 OUTPUT_TYPE = SHARED_LIBRARY
 SUBSYSTEM = LIBLDB
-INIT_FUNCTION = local_password_module_init
+INIT_FUNCTION = local_password_module_module_ops
 OBJ_FILES = local_password.o
 #
 # End MODULE ldb_local_password
@@ -169,7 +169,7 @@ OBJ_FILES = local_password.o
 PRIVATE_DEPENDENCIES = LIBTALLOC LIBSECURITY SAMDB
 OUTPUT_TYPE = SHARED_LIBRARY
 SUBSYSTEM = LIBLDB
-INIT_FUNCTION = ldb_kludge_acl_init
+INIT_FUNCTION = &ldb_kludge_acl_module_ops
 OBJ_FILES = \
                kludge_acl.o
 #
@@ -182,7 +182,7 @@ OBJ_FILES = \
 SUBSYSTEM = LIBLDB
 OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = LIBTALLOC LIBNDR LIBSECURITY SAMDB
-INIT_FUNCTION = ldb_extended_dn_init
+INIT_FUNCTION = &ldb_extended_dn_module_ops
 OBJ_FILES = \
                extended_dn.o
 #
@@ -195,7 +195,7 @@ OBJ_FILES = \
 SUBSYSTEM = LIBLDB
 OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = LIBTALLOC
-INIT_FUNCTION = ldb_show_deleted_init
+INIT_FUNCTION = &ldb_show_deleted_module_ops
 OBJ_FILES = \
                show_deleted.o
 #
@@ -208,7 +208,7 @@ OBJ_FILES = \
 SUBSYSTEM = LIBLDB
 OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = LIBTALLOC SAMDB
-INIT_FUNCTION = ldb_partition_init
+INIT_FUNCTION = &ldb_partition_module_ops
 OBJ_FILES = \
                partition.o
 #
@@ -221,7 +221,7 @@ OBJ_FILES = \
 SUBSYSTEM = LIBLDB
 OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = LIBTALLOC LIBLDB
-INIT_FUNCTION = ldb_schema_init
+INIT_FUNCTION = &ldb_schema_module_ops
 OBJ_FILES = \
                schema.o schema_syntax.o
 #
@@ -235,7 +235,7 @@ SUBSYSTEM = LIBLDB
 OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = LIBTALLOC CREDENTIALS
 #Also depends on credentials, but that would loop
-INIT_FUNCTION = ldb_update_kt_init
+INIT_FUNCTION = &ldb_update_kt_module_ops
 OBJ_FILES = \
                update_keytab.o 
 #
@@ -245,7 +245,7 @@ OBJ_FILES = \
 ################################################
 # Start MODULE ldb_objectclass
 [MODULE::ldb_objectclass]
-INIT_FUNCTION = ldb_objectclass_init
+INIT_FUNCTION = &ldb_objectclass_module_ops
 OUTPUT_TYPE = SHARED_LIBRARY
 CFLAGS = -Ilib/ldb/include
 PRIVATE_DEPENDENCIES = LIBTALLOC LIBSECURITY NDR_SECURITY SAMDB
@@ -258,8 +258,7 @@ OBJ_FILES = \
 ################################################
 # Start MODULE ldb_subtree_rename
 [MODULE::ldb_subtree_rename]
-INIT_FUNCTION = ldb_subtree_rename_init
-OUTPUT_TYPE = SHARED_LIBRARY
+INIT_FUNCTION = &ldb_subtree_rename_module_ops
 CFLAGS = -Ilib/ldb/include
 PRIVATE_DEPENDENCIES = LIBTALLOC
 SUBSYSTEM = LIBLDB
@@ -271,8 +270,7 @@ OBJ_FILES = \
 ################################################
 # Start MODULE ldb_subtree_rename
 [MODULE::ldb_subtree_delete]
-INIT_FUNCTION = ldb_subtree_delete_init
-OUTPUT_TYPE = SHARED_LIBRARY
+INIT_FUNCTION = &ldb_subtree_delete_module_ops
 CFLAGS = -Ilib/ldb/include
 PRIVATE_DEPENDENCIES = LIBTALLOC
 SUBSYSTEM = LIBLDB
@@ -284,7 +282,7 @@ OBJ_FILES = \
 ################################################
 # Start MODULE ldb_linked_attributes
 [MODULE::ldb_linked_attributes]
-INIT_FUNCTION = ldb_linked_attributes_init
+INIT_FUNCTION = &ldb_linked_attributes_module_ops
 CFLAGS = -Ilib/ldb/include
 OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = LIBTALLOC SAMDB
@@ -297,9 +295,8 @@ OBJ_FILES = \
 ################################################
 # Start MODULE ldb_ranged_results
 [MODULE::ldb_ranged_results]
-INIT_FUNCTION = ldb_ranged_results_init
+INIT_FUNCTION = &ldb_ranged_results_module_ops
 CFLAGS = -Ilib/ldb/include
-OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = LIBTALLOC
 SUBSYSTEM = LIBLDB
 OBJ_FILES = \
@@ -310,7 +307,7 @@ OBJ_FILES = \
 ################################################
 # Start MODULE ldb_anr
 [MODULE::ldb_anr]
-INIT_FUNCTION = ldb_anr_init
+INIT_FUNCTION = &ldb_anr_module_ops
 CFLAGS = -Ilib/ldb/include
 OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = LIBTALLOC LIBSAMBA-UTIL SAMDB
@@ -323,7 +320,7 @@ OBJ_FILES = \
 ################################################
 # Start MODULE ldb_normalise
 [MODULE::ldb_normalise]
-INIT_FUNCTION = ldb_normalise_init
+INIT_FUNCTION = &ldb_normalise_module_ops
 CFLAGS = -Ilib/ldb/include
 OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = LIBTALLOC LIBSAMBA-UTIL SAMDB
@@ -336,7 +333,7 @@ OBJ_FILES = \
 ################################################
 # Start MODULE ldb_instancetype
 [MODULE::ldb_instancetype]
-INIT_FUNCTION = ldb_instancetype_init
+INIT_FUNCTION = &ldb_instancetype_module_ops
 CFLAGS = -Ilib/ldb/include
 OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = LIBTALLOC
index 4ca8bbf4637e22b4688aecf28b05e845eb5f6460..e60605dce1060bbad19ad41a6e0f5cbacb9aa976 100644 (file)
@@ -36,12 +36,7 @@ static int dsdb_cache_init(struct ldb_module *module)
        return ldb_next_init(module);
 }
 
-static const struct ldb_module_ops dsdb_cache_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_dsdb_cache_module_ops = {
        .name           = "dsdb_cache",
        .init_context   = dsdb_cache_init
 };
-
-int dsdb_cache_module_init(void)
-{
-       return ldb_register_module(&dsdb_cache_ops);
-}
index 802f86570bb34555e0ed7883852c056d851c2a93..84bf5e484352c635b9dd1791638e255128969eb6 100644 (file)
@@ -362,13 +362,8 @@ static int extended_init(struct ldb_module *module)
        return ldb_next_init(module);
 }
 
-static const struct ldb_module_ops extended_dn_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_extended_dn_module_ops = {
        .name              = "extended_dn",
        .search            = extended_search,
        .init_context      = extended_init
 };
-
-int ldb_extended_dn_init(void)
-{
-       return ldb_register_module(&extended_dn_ops);
-}
index 65df294e90e00f88f2b56a8b5c38b52ac79c19f7..fd5aa5e18aea56291ee9163c3b23de9fb9bb083d 100644 (file)
@@ -118,13 +118,7 @@ static int instancetype_add(struct ldb_module *module, struct ldb_request *req)
        return ret;
 }
 
-static const struct ldb_module_ops instancetype_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_instancetype_module_ops = {
        .name          = "instancetype",
        .add           = instancetype_add,
 };
-
-
-int ldb_instancetype_init(void)
-{
-       return ldb_register_module(&instancetype_ops);
-}
index ea33548b919bcfad154c08296129531d004a8da3..e3e1f7ac88b6e49e102698646983826a5560fe90 100644 (file)
@@ -471,7 +471,7 @@ done:
        return ldb_next_init(module);
 }
 
-static const struct ldb_module_ops kludge_acl_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_kludge_acl_module_ops = {
        .name              = "kludge_acl",
        .search            = kludge_acl_search,
        .add               = kludge_acl_change,
@@ -481,8 +481,3 @@ static const struct ldb_module_ops kludge_acl_ops = {
        .extended          = kludge_acl_change,
        .init_context      = kludge_acl_init
 };
-
-int ldb_kludge_acl_init(void)
-{
-       return ldb_register_module(&kludge_acl_ops);
-}
index b3fdffe5669f6c88cb02eb8f408bba2958ed947d..8685c722aad2b8b7b23b6d6e64d0a74c4325d5ef 100644 (file)
@@ -915,7 +915,7 @@ static int linked_attributes_wait(struct ldb_handle *handle, enum ldb_wait_type
        }
 }
 
-static const struct ldb_module_ops linked_attributes_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_linked_attributes_module_ops = {
        .name              = "linked_attributes",
        .add               = linked_attributes_add,
        .modify            = linked_attributes_modify,
@@ -923,8 +923,3 @@ static const struct ldb_module_ops linked_attributes_ops = {
        .rename            = linked_attributes_rename,
        .wait              = linked_attributes_wait,
 };
-
-int ldb_linked_attributes_init(void)
-{
-       return ldb_register_module(&linked_attributes_ops);
-}
index 350434df51733a768e8eebaec41a3eb95f18baa1..dfa98ef0af957bdb5ced6404ce6688d857846120 100644 (file)
@@ -843,16 +843,10 @@ static int local_password_wait(struct ldb_handle *handle, enum ldb_wait_type typ
        }
 }
 
-static const struct ldb_module_ops local_password_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_local_password_module_ops = {
        .name          = "local_password",
        .add           = local_password_add,
        .modify        = local_password_modify,
        .search        = local_password_search,
        .wait          = local_password_wait
 };
-
-
-int local_password_module_init(void)
-{
-       return ldb_register_module(&local_password_ops);
-}
index d6b6a242875681cf54f0fe26045c9c7352daf625..084540f68d0af060a0a0885a187de2ea4b7f6dd2 100644 (file)
@@ -117,12 +117,7 @@ static int naming_fsmo_init(struct ldb_module *module)
        return ldb_next_init(module);
 }
 
-static const struct ldb_module_ops naming_fsmo_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_naming_fsmo_module_ops = {
        .name           = "naming_fsmo",
        .init_context   = naming_fsmo_init
 };
-
-int naming_fsmo_module_init(void)
-{
-       return ldb_register_module(&naming_fsmo_ops);
-}
index efc9bb29e8b707c3b95cfc957510187e6d783615..695393d4e8a7f18f5f1f076203b38aa9dd9b5355 100644 (file)
@@ -105,6 +105,7 @@ static int normalise_search_callback(struct ldb_context *ldb, void *context, str
                if (!attribute) {
                        continue;
                }
+               /* Look to see if this attributeSyntax is a DN */
                if ((strcmp(attribute->attributeSyntax_oid, "2.5.5.1") != 0) &&
                    (strcmp(attribute->attributeSyntax_oid, "2.5.5.7") != 0)) {
                        continue;
@@ -155,12 +156,7 @@ static int normalise_search(struct ldb_module *module, struct ldb_request *req)
 }
 
 
-static const struct ldb_module_ops normalise_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_normalise_module_ops = {
        .name              = "normalise",
        .search            = normalise_search,
 };
-
-int ldb_normalise_init(void)
-{
-       return ldb_register_module(&normalise_ops);
-}
index 737475ca78b24693bcfb7fd82e6a01b5a7fd9e40..e63ad4de56b8e392a1bd9e5f1f88fc2d20f7d40a 100644 (file)
@@ -1153,16 +1153,10 @@ static int objectclass_wait(struct ldb_handle *handle, enum ldb_wait_type type)
        }
 }
 
-static const struct ldb_module_ops objectclass_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_objectclass_module_ops = {
        .name              = "objectclass",
        .add           = objectclass_add,
        .modify        = objectclass_modify,
        .rename        = objectclass_rename,
        .wait          = objectclass_wait
 };
-
-int ldb_objectclass_init(void)
-{
-       return ldb_register_module(&objectclass_ops);
-}
-
index bf57f5c21ba6194ba685244f06b0e1bc6c9c2f08..f62839389d2c6b70274da08e281dfb3af9ada880 100644 (file)
@@ -247,14 +247,8 @@ static int objectguid_modify(struct ldb_module *module, struct ldb_request *req)
        return ret;
 }
 
-static const struct ldb_module_ops objectguid_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_objectguid_module_ops = {
        .name          = "objectguid",
        .add           = objectguid_add,
        .modify        = objectguid_modify,
 };
-
-
-int objectguid_module_init(void)
-{
-       return ldb_register_module(&objectguid_ops);
-}
index 61b64441a749ac817d3e593719d9099b52341a94..78b5a09f78bc245c964bdeab44ab54e65e05e69a 100644 (file)
@@ -87,7 +87,7 @@ static struct ldb_module *make_module_for_next_request(TALLOC_CTX *mem_ctx,
                                                       struct ldb_module *module)
 {
        struct ldb_module *current;
-       static const struct ldb_module_ops ops; /* zero */
+_PUBLIC_       static const struct ldb_module_ops ops; /* zero */
        current = talloc_zero(mem_ctx, struct ldb_module);
        if (current == NULL) {
                return module;
@@ -1030,7 +1030,7 @@ static int partition_wait(struct ldb_handle *handle, enum ldb_wait_type type)
        }
 }
 
-static const struct ldb_module_ops partition_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_partition_module_ops = {
        .name              = "partition",
        .init_context      = partition_init,
        .search            = partition_search,
@@ -1045,8 +1045,3 @@ static const struct ldb_module_ops partition_ops = {
        .del_transaction   = partition_del_trans,
        .wait              = partition_wait
 };
-
-int ldb_partition_init(void)
-{
-       return ldb_register_module(&partition_ops);
-}
index 57c053d961829ce678d41a99e394f44e21e36211..aa64700f2f8d297be2f1f9280ec9f6ba76854573 100644 (file)
@@ -2044,15 +2044,9 @@ static int password_hash_wait(struct ldb_handle *handle, enum ldb_wait_type type
        }
 }
 
-static const struct ldb_module_ops password_hash_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_password_hash_module_ops = {
        .name          = "password_hash",
        .add           = password_hash_add,
        .modify        = password_hash_modify,
        .wait          = password_hash_wait
 };
-
-
-int password_hash_module_init(void)
-{
-       return ldb_register_module(&password_hash_ops);
-}
index 0f3293ed1db7a58309e2a436d27466e9b00562a4..09d56d77c93890f5bca149d6c2e0ad0ad9676390 100644 (file)
@@ -115,12 +115,7 @@ static int pdc_fsmo_init(struct ldb_module *module)
        return ldb_next_init(module);
 }
 
-static const struct ldb_module_ops pdc_fsmo_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_pdc_fsmo_module_ops = {
        .name           = "pdc_fsmo",
        .init_context   = pdc_fsmo_init
 };
-
-int pdc_fsmo_module_init(void)
-{
-       return ldb_register_module(&pdc_fsmo_ops);
-}
index 37ee7f9fce82cdb4b3ff21138c614f065e6dee22..0d065425ca7efdb4610d8e0e448b477fae44067c 100644 (file)
@@ -331,12 +331,7 @@ static int proxy_request(struct ldb_module *module, struct ldb_request *req)
        }
 }
 
-static const struct ldb_module_ops proxy_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_proxy_module_ops = {
        .name           = "proxy",
        .request        = proxy_request
 };
-
-int proxy_module_init(void)
-{
-       return ldb_register_module(&proxy_ops);
-}
index c527afc6db30a9e8094825ed19964d19d056d92d..c6ebea1044e8ecd5597837e38a85ecdafd5cd012 100644 (file)
@@ -201,12 +201,7 @@ static int rr_search(struct ldb_module *module, struct ldb_request *req)
        return ldb_next_request(module, req);
 }
 
-static const struct ldb_module_ops rr_ops = {
+const struct ldb_module_ops ldb_ranged_results_module_ops = {
        .name              = "ranged_results",
        .search            = rr_search,
 };
-
-int ldb_ranged_results_init(void)
-{
-       return ldb_register_module(&rr_ops);
-}
index 441dbc95983a9167079140c2949352ecc552a3ba..dd5faf837aba3b01db50879c9b7636d5b5aad177 100644 (file)
@@ -1579,15 +1579,10 @@ static int replmd_wait(struct ldb_handle *handle, enum ldb_wait_type type)
        }
 }
 
-static const struct ldb_module_ops replmd_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_repl_meta_data_module_ops = {
        .name          = "repl_meta_data",
        .add           = replmd_add,
        .modify        = replmd_modify,
        .extended      = replmd_extended,
        .wait          = replmd_wait
 };
-
-int repl_meta_data_module_init(void)
-{
-       return ldb_register_module(&replmd_ops);
-}
index 02f43d7076ac15e7c3806583d2d31dfd73a4f71c..3235b24ef90a4ce71dc4f0de67b1f1c0f2dc14c5 100644 (file)
@@ -386,15 +386,9 @@ static int rootdse_init(struct ldb_module *module)
        return ldb_next_init(module);
 }
 
-static const struct ldb_module_ops rootdse_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_rootdse_module_ops = {
        .name                   = "rootdse",
        .init_context           = rootdse_init,
        .search                 = rootdse_search,
        .request                = rootdse_request
 };
-
-int rootdse_module_init(void)
-{
-       return ldb_register_module(&rootdse_ops);
-}
-
index 3a666b5380fd1be42f35043a6fecc65a3cdc8035..88b04b1bb6e63de6eefc1df604cb8e844e4b4694 100644 (file)
@@ -925,21 +925,8 @@ static int samba3sam_init(struct ldb_module *module)
        return ldb_next_init(module);
 }
 
-static struct ldb_module_ops samba3sam_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_samba3sam_module_ops = {
+       LDB_MAP_OPS
        .name              = "samba3sam",
        .init_context      = samba3sam_init,
 };
-
-/* the init function */
-int ldb_samba3sam_module_init(void)
-{
-       struct ldb_module_ops ops = ldb_map_get_ops();
-       samba3sam_ops.add       = ops.add;
-       samba3sam_ops.modify    = ops.modify;
-       samba3sam_ops.del       = ops.del;
-       samba3sam_ops.rename    = ops.rename;
-       samba3sam_ops.search    = ops.search;
-       samba3sam_ops.wait      = ops.wait;
-
-       return ldb_register_module(&samba3sam_ops);
-}
index baf419c750def7db6486ab1c11c45a2ad819a7cc..178149a8865d335db6252c9f2344519e73590ca8 100644 (file)
@@ -750,14 +750,8 @@ static int samldb_init(struct ldb_module *module)
        return ldb_next_init(module);
 }
 
-static const struct ldb_module_ops samldb_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_samldb_module_ops = {
        .name          = "samldb",
        .init_context  = samldb_init,
        .add           = samldb_add,
 };
-
-
-int samldb_module_init(void)
-{
-       return ldb_register_module(&samldb_ops);
-}
index 525193ac8c05e45d9ccd50efdc7903b7d296112d..ff9530ca92b0bfd69390f32c2b1919f937c3a7c8 100644 (file)
@@ -1221,7 +1221,7 @@ static int schema_init(struct ldb_module *module)
        return LDB_SUCCESS;
 }
 
-static const struct ldb_module_ops schema_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_schema_module_ops = {
        .name          = "schema",
        .init_context  = schema_init,
        .add           = schema_add,
@@ -1230,8 +1230,3 @@ static const struct ldb_module_ops schema_ops = {
        .rename        = schema_rename,
        .wait          = schema_wait
 };
-
-int ldb_schema_init(void)
-{
-       return ldb_register_module(&schema_ops);
-}
index f9dd131fd4f8327ab323aa0f2c57fb22913a0c12..729fd15202ccea5ef9c9d306f68b77d302730c0a 100644 (file)
@@ -255,12 +255,7 @@ static int schema_fsmo_init(struct ldb_module *module)
        return ldb_next_init(module);
 }
 
-static const struct ldb_module_ops schema_fsmo_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_schema_fsmo_module_ops = {
        .name           = "schema_fsmo",
        .init_context   = schema_fsmo_init
 };
-
-int schema_fsmo_module_init(void)
-{
-       return ldb_register_module(&schema_fsmo_ops);
-}
index 19fa63fb6e92bbfc100fb7e460deab8eba7efd79..361cf226dc331b1a8a46059213c512552983fb81 100644 (file)
@@ -194,13 +194,8 @@ static int show_deleted_init(struct ldb_module *module)
        return ldb_next_init(module);
 }
 
-static const struct ldb_module_ops show_deleted_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_show_deleted_module_ops = {
        .name              = "show_deleted",
        .search            = show_deleted_search,
        .init_context      = show_deleted_init
 };
-
-int ldb_show_deleted_init(void)
-{
-       return ldb_register_module(&show_deleted_ops);
-}
index acf2fd622cc29ddb04134ec055d5dba6e5d53b99..3f4c19d28521f6bf2c462842ab524afdbd0c84ee 100644 (file)
@@ -793,42 +793,16 @@ static int entryuuid_sequence_number(struct ldb_module *module, struct ldb_reque
        return LDB_SUCCESS;
 }
 
-static struct ldb_module_ops entryuuid_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_entryuuid_module_ops = {
        .name              = "entryuuid",
        .init_context      = entryuuid_init,
-       .sequence_number   = entryuuid_sequence_number
+       .sequence_number   = entryuuid_sequence_number,
+       LDB_MAP_OPS
 };
 
-static struct ldb_module_ops nsuniqueid_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_nsuniqueid_module_ops = {
        .name              = "nsuniqueid",
        .init_context      = nsuniqueid_init,
-       .sequence_number   = entryuuid_sequence_number
+       .sequence_number   = entryuuid_sequence_number,
+       LDB_MAP_OPS
 };
-
-/* the init function */
-int ldb_simple_ldap_map_module_init(void)
-{
-       int ret;
-       struct ldb_module_ops ops = ldb_map_get_ops();
-       entryuuid_ops.add       = ops.add;
-       entryuuid_ops.modify    = ops.modify;
-       entryuuid_ops.del       = ops.del;
-       entryuuid_ops.rename    = ops.rename;
-       entryuuid_ops.search    = ops.search;
-       entryuuid_ops.wait      = ops.wait;
-       ret = ldb_register_module(&entryuuid_ops);
-
-       if (ret) {
-               return ret;
-       }
-
-       nsuniqueid_ops.add      = ops.add;
-       nsuniqueid_ops.modify   = ops.modify;
-       nsuniqueid_ops.del      = ops.del;
-       nsuniqueid_ops.rename   = ops.rename;
-       nsuniqueid_ops.search   = ops.search;
-       nsuniqueid_ops.wait     = ops.wait;
-       ret = ldb_register_module(&nsuniqueid_ops);
-
-       return ret;
-}
index e84bf60b328074e9c27327e48849d842eb2caa58..56ae7b239a2feef296815df152f03b5da6940a56 100644 (file)
@@ -247,13 +247,8 @@ static int subtree_delete_wait(struct ldb_handle *handle, enum ldb_wait_type typ
        }
 }
 
-static const struct ldb_module_ops subtree_delete_ops = {
+const struct ldb_module_ops ldb_subtree_delete_module_ops = {
        .name              = "subtree_delete",
        .del               = subtree_delete,
        .wait              = subtree_delete_wait,
 };
-
-int ldb_subtree_delete_init(void)
-{
-       return ldb_register_module(&subtree_delete_ops);
-}
index 0964c3fdcd6567bb3ff2112367488c2bdb338944..bf8124e253acf51f5eda11e22566fbbc5dc2d8b8 100644 (file)
@@ -264,13 +264,8 @@ static int subtree_rename_wait(struct ldb_handle *handle, enum ldb_wait_type typ
        }
 }
 
-static const struct ldb_module_ops subtree_rename_ops = {
+const struct ldb_module_ops ldb_subtree_rename_module_ops = {
        .name              = "subtree_rename",
        .rename            = subtree_rename,
        .wait              = subtree_rename_wait,
 };
-
-int ldb_subtree_rename_init(void)
-{
-       return ldb_register_module(&subtree_rename_ops);
-}
index a18efd757aa6803a657e5e1176aa26a1c722f368..54362dcfd47157b4fac33f57cddd4de6969e5cf1 100644 (file)
@@ -199,7 +199,7 @@ static int update_kt_init(struct ldb_module *module)
        return ldb_next_init(module);
 }
 
-static const struct ldb_module_ops update_kt_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_update_keytab_module_ops = {
        .name              = "update_keytab",
        .init_context      = update_kt_init,
        .add               = update_kt_add,
@@ -209,8 +209,3 @@ static const struct ldb_module_ops update_kt_ops = {
        .end_transaction   = update_kt_end_trans,
        .del_transaction   = update_kt_del_trans,
 };
-
-int ldb_update_kt_init(void)
-{
-       return ldb_register_module(&update_kt_ops);
-}
index 1379ddee9fbb6331692b011d5cb640609c5eb8fb..bb3423546508ba686eda88b4d3af99693650fb2a 100644 (file)
@@ -149,6 +149,8 @@ struct dsdb_schema {
 
        struct dsdb_attribute *attributes;
        struct dsdb_class *classes;
+
+       struct smb_iconv_convenience *iconv_convenience;
 };
 
 #include "dsdb/schema/proto.h"
index 6a7463951e57a03ff658e73f0950693d14bfbca1..30d0adeda73b6319f7b40d7daf68b59d829c9689 100644 (file)
@@ -88,8 +88,7 @@ WERROR dsdb_load_oid_mappings_ldb(struct dsdb_schema *schema,
        TALLOC_CTX *mem_ctx = talloc_new(schema);
        W_ERROR_HAVE_NO_MEMORY(mem_ctx);
        
-       ndr_err = ndr_pull_struct_blob(prefixMap, mem_ctx, lp_iconv_convenience(global_loadparm), &pfm,
-                                      (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob);
+       ndr_err = ndr_pull_struct_blob(prefixMap, mem_ctx, schema->iconv_convenience, &pfm, (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                NTSTATUS nt_status = ndr_map_error2ntstatus(ndr_err);
                talloc_free(mem_ctx);
@@ -181,8 +180,7 @@ WERROR dsdb_get_oid_mappings_ldb(const struct dsdb_schema *schema,
        pfm.reserved    = 0;
        pfm.ctr.dsdb    = *ctr;
 
-       ndr_err = ndr_push_struct_blob(prefixMap, mem_ctx, lp_iconv_convenience(global_loadparm), &pfm,
-                                      (ndr_push_flags_fn_t)ndr_push_prefixMapBlob);
+       ndr_err = ndr_push_struct_blob(prefixMap, mem_ctx, schema->iconv_convenience, &pfm, (ndr_push_flags_fn_t)ndr_push_prefixMapBlob);
        talloc_free(ctr);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                NTSTATUS nt_status = ndr_map_error2ntstatus(ndr_err);
@@ -628,7 +626,7 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb
        } \
        if (_a && _a->value_ctr.num_values >= 1) { \
                ssize_t _ret; \
-               _ret = convert_string_talloc(mem_ctx, lp_iconv_convenience(global_loadparm), CH_UTF16, CH_UNIX, \
+               _ret = convert_string_talloc(mem_ctx, s->iconv_convenience, CH_UTF16, CH_UNIX, \
                                             _a->value_ctr.values[0].blob->data, \
                                             _a->value_ctr.values[0].blob->length, \
                                             (void **)discard_const(&(p)->elem)); \
@@ -665,7 +663,7 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb
                struct drsuapi_DsReplicaObjectIdentifier3 _id3; \
                enum ndr_err_code _ndr_err; \
                _ndr_err = ndr_pull_struct_blob_all(_a->value_ctr.values[0].blob, \
-                                                     mem_ctx, lp_iconv_convenience(global_loadparm), &_id3,\
+                                                     mem_ctx, s->iconv_convenience, &_id3,\
                                                      (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3);\
                if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \
                        NTSTATUS _nt_status = ndr_map_error2ntstatus(_ndr_err); \
@@ -727,7 +725,7 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb
            && _a->value_ctr.values[0].blob->length == 16) { \
                enum ndr_err_code _ndr_err; \
                _ndr_err = ndr_pull_struct_blob_all(_a->value_ctr.values[0].blob, \
-                                                     mem_ctx, lp_iconv_convenience(global_loadparm), &(p)->elem, \
+                                                     mem_ctx, s->iconv_convenience, &(p)->elem, \
                                                      (ndr_pull_flags_fn_t)ndr_pull_GUID); \
                if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \
                        NTSTATUS _nt_status = ndr_map_error2ntstatus(_ndr_err); \
@@ -1157,6 +1155,8 @@ WERROR dsdb_attach_schema_from_ldif_file(struct ldb_context *ldb, const char *pf
                goto nomem;
        }
 
+       schema->iconv_convenience = lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm"));
+
        /*
         * load the prefixMap attribute from pf
         */
index 2c133b64242185ddd9fe125e816d304b7115ba6f..beacfc49c2621694a8c7a073da8c8a52d3848665 100644 (file)
@@ -767,7 +767,8 @@ static WERROR dsdb_syntax_UNICODE_drsuapi_to_ldb(const struct dsdb_schema *schem
                        return WERR_FOOBAR;
                }
 
-               ret = convert_string_talloc(out->values, lp_iconv_convenience(global_loadparm), CH_UTF16, CH_UNIX,
+               ret = convert_string_talloc(out->values, schema->iconv_convenience, 
+                                                                       CH_UTF16, CH_UNIX,
                                            in->value_ctr.values[i].blob->data,
                                            in->value_ctr.values[i].blob->length,
                                            (void **)&str);
@@ -809,7 +810,7 @@ static WERROR dsdb_syntax_UNICODE_ldb_to_drsuapi(const struct dsdb_schema *schem
 
                out->value_ctr.values[i].blob   = &blobs[i];
 
-               ret = convert_string_talloc(blobs, lp_iconv_convenience(global_loadparm), CH_UNIX, CH_UTF16,
+               ret = convert_string_talloc(blobs, schema->iconv_convenience, CH_UNIX, CH_UTF16,
                                            in->values[i].data,
                                            in->values[i].length,
                                            (void **)&blobs[i].data);
@@ -851,7 +852,7 @@ static WERROR dsdb_syntax_DN_drsuapi_to_ldb(const struct dsdb_schema *schema,
                }
 
                ndr_err = ndr_pull_struct_blob_all(in->value_ctr.values[i].blob,
-                                                  out->values, lp_iconv_convenience(global_loadparm), &id3,
+                                                  out->values, schema->iconv_convenience, &id3,
                                                   (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3);
                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                        NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
@@ -898,7 +899,7 @@ static WERROR dsdb_syntax_DN_ldb_to_drsuapi(const struct dsdb_schema *schema,
                ZERO_STRUCT(id3);
                id3.dn = (const char *)in->values[i].data;
 
-               ndr_err = ndr_push_struct_blob(&blobs[i], blobs, lp_iconv_convenience(global_loadparm), &id3, (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
+               ndr_err = ndr_push_struct_blob(&blobs[i], blobs, schema->iconv_convenience, &id3, (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                        NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
                        return ntstatus_to_werror(status);
@@ -939,7 +940,7 @@ static WERROR dsdb_syntax_DN_BINARY_drsuapi_to_ldb(const struct dsdb_schema *sch
                }
 
                ndr_err = ndr_pull_struct_blob_all(in->value_ctr.values[i].blob,
-                                                  out->values, lp_iconv_convenience(global_loadparm), &id3b,
+                                                  out->values, schema->iconv_convenience, &id3b,
                                                   (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3Binary);
                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                        NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
@@ -997,7 +998,7 @@ static WERROR dsdb_syntax_DN_BINARY_ldb_to_drsuapi(const struct dsdb_schema *sch
                id3b.dn         = (const char *)in->values[i].data;
                id3b.binary     = data_blob(NULL, 0);
 
-               ndr_err = ndr_push_struct_blob(&blobs[i], blobs, lp_iconv_convenience(global_loadparm), &id3b,
+               ndr_err = ndr_push_struct_blob(&blobs[i], blobs, schema->iconv_convenience, &id3b,
                                               (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3Binary);
                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                        NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
@@ -1043,7 +1044,7 @@ static WERROR dsdb_syntax_PRESENTATION_ADDRESS_drsuapi_to_ldb(const struct dsdb_
                        return WERR_FOOBAR;
                }
 
-               ret = convert_string_talloc(out->values, lp_iconv_convenience(global_loadparm), CH_UTF16, CH_UNIX,
+               ret = convert_string_talloc(out->values, schema->iconv_convenience, CH_UTF16, CH_UNIX,
                                            in->value_ctr.values[i].blob->data+4,
                                            in->value_ctr.values[i].blob->length-4,
                                            (void **)&str);
@@ -1086,7 +1087,7 @@ static WERROR dsdb_syntax_PRESENTATION_ADDRESS_ldb_to_drsuapi(const struct dsdb_
 
                out->value_ctr.values[i].blob   = &blobs[i];
 
-               ret = convert_string_talloc(blobs, lp_iconv_convenience(global_loadparm), CH_UNIX, CH_UTF16,
+               ret = convert_string_talloc(blobs, schema->iconv_convenience, CH_UNIX, CH_UTF16,
                                            in->values[i].data,
                                            in->values[i].length,
                                            (void **)&data);
index 51726a03c31a8244185849f222843087f4d011e2..ff226e5b46c0d05463ae79c7a858ed0a97be5e38 100644 (file)
@@ -180,6 +180,7 @@ static void hdb_ldb_free_entry(krb5_context context, hdb_entry_ex *entry_ex)
 }
 
 static krb5_error_code LDB_message2entry_keys(krb5_context context,
+                                             struct smb_iconv_convenience *iconv_convenience,
                                              TALLOC_CTX *mem_ctx,
                                              struct ldb_message *msg,
                                              unsigned int userAccountControl,
@@ -213,7 +214,7 @@ static krb5_error_code LDB_message2entry_keys(krb5_context context,
 
        /* supplementalCredentials if present */
        if (sc_val) {
-               ndr_err = ndr_pull_struct_blob_all(sc_val, mem_ctx, lp_iconv_convenience(global_loadparm), &scb,
+               ndr_err = ndr_pull_struct_blob_all(sc_val, mem_ctx, iconv_convenience, &scb,
                                                   (ndr_pull_flags_fn_t)ndr_pull_supplementalCredentialsBlob);
                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                        dump_data(0, sc_val->data, sc_val->length);
@@ -250,7 +251,7 @@ static krb5_error_code LDB_message2entry_keys(krb5_context context,
                talloc_steal(mem_ctx, blob.data);
 
                /* TODO: use ndr_pull_struct_blob_all(), when the ndr layer handles it correct with relative pointers */
-               ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, lp_iconv_convenience(global_loadparm), &_pkb,
+               ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, iconv_convenience, &_pkb,
                                               (ndr_pull_flags_fn_t)ndr_pull_package_PrimaryKerberosBlob);
                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                        krb5_set_error_string(context, "LDB_message2entry_keys: could not parse package_PrimaryKerberosBlob");
@@ -393,6 +394,7 @@ static krb5_error_code LDB_message2entry(krb5_context context, HDB *db,
        krb5_boolean is_computer = FALSE;
        const char *dnsdomain = ldb_msg_find_attr_as_string(realm_ref_msg, "dnsRoot", NULL);
        char *realm = strupper_talloc(mem_ctx, dnsdomain);
+       struct loadparm_context *lp_ctx = ldb_get_opaque((struct ldb_context *)db->hdb_db, "loadparm");
        struct ldb_dn *domain_dn = samdb_result_dn((struct ldb_context *)db->hdb_db,
                                                        mem_ctx,
                                                        realm_ref_msg,
@@ -428,6 +430,8 @@ static krb5_error_code LDB_message2entry(krb5_context context, HDB *db,
        }
 
        private->entry_ex = entry_ex;
+       private->iconv_convenience = lp_iconv_convenience(lp_ctx);
+       private->netbios_name = lp_netbios_name(lp_ctx);
 
        talloc_set_destructor(private, hdb_ldb_destrutor);
 
@@ -481,7 +485,7 @@ static krb5_error_code LDB_message2entry(krb5_context context, HDB *db,
                entry_ex->entry.flags.ok_as_delegate = 1;
        }
 
-       if (lp_parm_bool(global_loadparm, NULL, "kdc", "require spn for service", true)) {
+       if (lp_parm_bool(lp_ctx, NULL, "kdc", "require spn for service", true)) {
                if (!is_computer && !ldb_msg_find_attr_as_string(msg, "servicePrincipalName", NULL)) {
                        entry_ex->entry.flags.server = 0;
                }
@@ -544,7 +548,7 @@ static krb5_error_code LDB_message2entry(krb5_context context, HDB *db,
        entry_ex->entry.generation = NULL;
 
        /* Get keys from the db */
-       ret = LDB_message2entry_keys(context, private, msg, userAccountControl, entry_ex);
+       ret = LDB_message2entry_keys(context, private->iconv_convenience, private, msg, userAccountControl, entry_ex);
        if (ret) {
                /* Could be bougus data in the entry, or out of memory */
                goto out;
index 9d031b8f7dc5769a1a0aa053b448d4cbc9158148..3a1f9bd34efab3632df3f2694eb482e41d73501a 100644 (file)
@@ -51,7 +51,9 @@ struct kdc_server {
 
 struct hdb_ldb_private {
        struct ldb_context *samdb;
+       struct smb_iconv_convenience *iconv_convenience;
        struct ldb_message *msg;
        struct ldb_message *realm_ref_msg;
        hdb_entry_ex *entry_ex;
+       const char *netbios_name;
 };
index 5f3a718abd35c8905f03b4e733f86583a21b1542..a99cf6ded8514b8217d2e9f07deadd2d0a366761 100644 (file)
@@ -47,6 +47,7 @@ void  samba_kdc_plugin_fini(void *ptr)
 
 static krb5_error_code make_pac(krb5_context context,
                                TALLOC_CTX *mem_ctx, 
+                               struct smb_iconv_convenience *iconv_convenience,
                                struct auth_serversupplied_info *server_info,
                                krb5_pac *pac) 
 {
@@ -73,7 +74,7 @@ static krb5_error_code make_pac(krb5_context context,
 
        logon_info.info->info3 = *info3;
 
-       ndr_err = ndr_push_struct_blob(&pac_out, mem_ctx, lp_iconv_convenience(global_loadparm), &logon_info,
+       ndr_err = ndr_push_struct_blob(&pac_out, mem_ctx, iconv_convenience, &logon_info,
                                       (ndr_push_flags_fn_t)ndr_push_PAC_LOGON_INFO_CTR);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                nt_status = ndr_map_error2ntstatus(ndr_err);
@@ -126,7 +127,7 @@ krb5_error_code samba_kdc_get_pac(void *priv,
        }
 
        nt_status = authsam_make_server_info(mem_ctx, private->samdb, 
-                                            lp_netbios_name(global_loadparm),
+                                            private->netbios_name,
                                             private->msg, 
                                             private->realm_ref_msg,
                                             data_blob(NULL, 0),
@@ -138,7 +139,7 @@ krb5_error_code samba_kdc_get_pac(void *priv,
                return ENOMEM;
        }
 
-       ret = make_pac(context, mem_ctx, server_info, pac);
+       ret = make_pac(context, mem_ctx, private->iconv_convenience, server_info, pac);
 
        talloc_free(mem_ctx);
        return ret;
@@ -190,7 +191,7 @@ krb5_error_code samba_kdc_reget_pac(void *priv, krb5_context context,
                return ENOMEM;
        }
                
-       ndr_err = ndr_pull_struct_blob(&pac_in, mem_ctx, lp_iconv_convenience(global_loadparm), &logon_info,
+       ndr_err = ndr_pull_struct_blob(&pac_in, mem_ctx, private->iconv_convenience, &logon_info,
                                       (ndr_pull_flags_fn_t)ndr_pull_PAC_LOGON_INFO_CTR);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err) || !logon_info.info) {
                nt_status = ndr_map_error2ntstatus(ndr_err);
@@ -213,7 +214,7 @@ krb5_error_code samba_kdc_reget_pac(void *priv, krb5_context context,
        /* We will compleatly regenerate this pac */
        krb5_pac_free(context, *pac);
 
-       ret = make_pac(context, mem_ctx, server_info_out, pac);
+       ret = make_pac(context, mem_ctx, private->iconv_convenience, server_info_out, pac);
 
        talloc_free(mem_ctx);
        return ret;
index 54a0676599fba6430f23c347f80415e0908f7de4..0465be689eb32984ab5ff43e44a2f6647357cdd4 100644 (file)
@@ -677,7 +677,7 @@ _PUBLIC_ codepoint_t next_codepoint(struct smb_iconv_convenience *ic,
           with codepoints above 64k */
        olen = 2;
        outbuf = (char *)buf;
-       smb_iconv(descriptor,  &str, &ilen, &outbuf, &olen);
+       smb_iconv(descriptor, &str, &ilen, &outbuf, &olen);
        if (olen == 2) {
                olen = 4;
                outbuf = (char *)buf;
index 3f9eeb5617cdef24bd68bfb23ed54c255ca78040..f4b7e4e5ebd1f67735a8c35b365dbcf55652a679 100644 (file)
@@ -300,7 +300,7 @@ bool events_select_init(void)
 }
 
 #if _SAMBA_BUILD_
-NTSTATUS s4_events_select_init(void)
+_PUBLIC_ NTSTATUS s4_events_select_init(void)
 {
        if (!events_select_init()) {
                return NT_STATUS_INTERNAL_ERROR;
index 5e529d66ab483bb0f2d1984a22b7ce9690958f3c..7b945b154d96780d1ff9a113b7f49afaa070991a 100644 (file)
@@ -602,7 +602,7 @@ bool events_standard_init(void)
 }
 
 #if _SAMBA_BUILD_
-NTSTATUS s4_events_standard_init(void)
+_PUBLIC_ NTSTATUS s4_events_standard_init(void)
 {
        if (!events_standard_init()) {
                return NT_STATUS_INTERNAL_ERROR;
index 756beb1fed63290f385861d2f3443050310a061c..d88f82b726fe738dd2d50cd1e3ee16c62cdd49b2 100644 (file)
@@ -125,7 +125,7 @@ realdistclean:: distclean
 
 check:: test @PYTHON_CHECK_TARGET@
 
-check-soloading: sample_module.$(SHLIBEXT)
+check-soloading: sample.$(SHLIBEXT)
        LDB_MODULES_PATH=$(builddir) $(srcdir)/tests/test-soloading.sh
 
 test:: all check-soloading
index 87f791cb38795879f9283a03502083476b33e79f..3c9ef3ff6939f8095952e48766318be9bb52500c 100644 (file)
@@ -56,20 +56,51 @@ struct ldb_context *ldb_init(void *mem_ctx)
        return ldb;
 }
 
-struct ldb_backend {
-       const char *name;
-       ldb_connect_fn connect_fn;
-       struct ldb_backend *prev, *next;
+static struct backends_list_entry {
+       struct ldb_backend_ops *ops;
+       struct backends_list_entry *prev, *next;
 } *ldb_backends = NULL;
 
+#ifndef STATIC_LIBLDB_BACKENDS 
+
+#ifdef HAVE_LDB_LDAP
+#define LDAP_INIT &ldb_ldap_backend_ops, \
+                                 &ldb_ildap_backend_ops, \
+                                 &ldb_ldaps_backend_ops,
+#else
+#define LDAP_INIT
+#endif
+
+#ifdef HAVE_LDB_SQLITE3
+#define SQLITE3_INIT &ldb_sqlite3_backend_ops,
+#else
+#define SQLITE3_INIT
+#endif
+
+#define STATIC_LIBLDB_BACKENDS \
+       LDAP_INIT \
+       SQLITE3_INIT \
+       &ldb_tdb_backend_ops,   \
+       NULL
+#endif
+
+const static struct ldb_backend_ops *builtin_backends[] = {
+       STATIC_LIBLDB_BACKENDS
+};
 
 static ldb_connect_fn ldb_find_backend(const char *url)
 {
-       struct ldb_backend *backend;
+       struct backends_list_entry *backend;
+       int i;
+
+       for (i = 0; builtin_backends[i]; i++) {
+               if (strncmp(builtin_backends[i]->name, url, strlen(builtin_backends[i]->name)) == 0)
+                       return builtin_backends[i]->connect_fn;
+       }
 
        for (backend = ldb_backends; backend; backend = backend->next) {
-               if (strncmp(backend->name, url, strlen(backend->name)) == 0) {
-                       return backend->connect_fn;
+               if (strncmp(backend->ops->name, url, strlen(backend->ops->name)) == 0) {
+                       return backend->ops->connect_fn;
                }
        }
 
@@ -81,7 +112,8 @@ static ldb_connect_fn ldb_find_backend(const char *url)
 */
 int ldb_register_backend(const char *url_prefix, ldb_connect_fn connectfn)
 {
-       struct ldb_backend *backend = talloc(talloc_autofree_context(), struct ldb_backend);
+       struct ldb_backend_ops *backend = talloc(talloc_autofree_context(), struct ldb_backend_ops);
+       struct backends_list_entry *entry = talloc(talloc_autofree_context(), struct backends_list_entry);
 
        if (ldb_find_backend(url_prefix)) {
                return LDB_SUCCESS;
@@ -91,7 +123,8 @@ int ldb_register_backend(const char *url_prefix, ldb_connect_fn connectfn)
 
        backend->name = talloc_strdup(backend, url_prefix);
        backend->connect_fn = connectfn;
-       DLIST_ADD(ldb_backends, backend);
+       entry->ops = backend;
+       DLIST_ADD(ldb_backends, entry);
 
        return LDB_SUCCESS;
 }
@@ -135,6 +168,19 @@ int ldb_connect_backend(struct ldb_context *ldb, const char *url, const char *op
                }
        }
 
+       if (fn == NULL) {
+               struct ldb_backend_ops *ops;
+               char *symbol_name = talloc_asprintf(ldb, "ldb_%s_backend_ops", backend);
+               if (symbol_name == NULL) {
+                       return LDB_ERR_OPERATIONS_ERROR;
+               }
+               ops = ldb_dso_load_symbol(ldb, backend, symbol_name);
+               if (ops != NULL) {
+                       fn = ops->connect_fn;
+               }
+               talloc_free(symbol_name);
+       }
+
        talloc_free(backend);
 
        if (fn == NULL) {
@@ -236,7 +282,6 @@ int ldb_connect(struct ldb_context *ldb, const char *url, unsigned int flags, co
        int ret;
        const char *url2;
        /* We seem to need to do this here, or else some utilities don't get ldb backends */
-       ldb_global_init();
 
        ldb->flags = flags;
 
@@ -463,11 +508,17 @@ static int ldb_autotransaction_request(struct ldb_context *ldb, struct ldb_reque
 
 int ldb_wait(struct ldb_handle *handle, enum ldb_wait_type type)
 {
+       int ret;
        if (!handle) {
                return LDB_SUCCESS;
        }
 
-       return handle->module->ops->wait(handle, type);
+       ret = handle->module->ops->wait(handle, type);
+       if (!ldb_errstring(handle->module->ldb)) {
+               /* Set a default error string, to place the blame somewhere */
+               ldb_asprintf_errstring(handle->module->ldb, "error waiting on module %s: %s (%d)", handle->module->ops->name, ldb_strerror(ret), ret);
+       }
+       return ret;
 }
 
 /* set the specified timeout or, if timeout is 0 set the default timeout */
index a3bf71d0d8ab881400276292e1465aab8e668d6e..a4e0b9418856440300b19d71122dbd6201db61e3 100644 (file)
@@ -125,9 +125,30 @@ static struct ops_list_entry {
        struct ops_list_entry *next;    
 } *registered_modules = NULL;
 
+#ifndef STATIC_LIBLDB_MODULES
+
+#define STATIC_LIBLDB_MODULES \
+       ldb_operational_module_ops,     \
+       ldb_rdn_name_module_ops,        \
+       ldb_paged_results_module_ops,   \
+       ldb_sort_module_ops,            \
+       ldb_asq_module_ops, \
+       NULL
+#endif
+
+const static struct ldb_module_ops *builtin_modules[] = {
+       STATIC_LIBLDB_MODULES
+};
+
 static const struct ldb_module_ops *ldb_find_module_ops(const char *name)
 {
        struct ops_list_entry *e;
+       int i;
+
+       for (i = 0; builtin_modules[i]; i++) {
+               if (strcmp(builtin_modules[i]->name, name) == 0)
+                       return builtin_modules[i];
+       }
  
        for (e = registered_modules; e; e = e->next) {
                if (strcmp(e->ops->name, name) == 0) 
@@ -137,51 +158,6 @@ static const struct ldb_module_ops *ldb_find_module_ops(const char *name)
        return NULL;
 }
 
-#ifndef STATIC_LIBLDB_MODULES
-
-#ifdef HAVE_LDB_LDAP
-#define LDAP_INIT ldb_ldap_init,
-#else
-#define LDAP_INIT
-#endif
-
-#ifdef HAVE_LDB_SQLITE3
-#define SQLITE3_INIT ldb_sqlite3_init,
-#else
-#define SQLITE3_INIT
-#endif
-
-#define STATIC_LIBLDB_MODULES \
-       LDAP_INIT \
-       SQLITE3_INIT \
-       ldb_tdb_init,   \
-       ldb_operational_init,   \
-       ldb_rdn_name_init,      \
-       ldb_paged_results_init, \
-       ldb_sort_init,          \
-       ldb_asq_init, \
-       NULL
-#endif
-
-int ldb_global_init(void)
-{
-       int (*static_init_fns[])(void) = { STATIC_LIBLDB_MODULES };
-
-       static int initialized = 0;
-       int ret = 0, i;
-
-       if (initialized) 
-               return 0;
-
-       initialized = 1;
-       
-       for (i = 0; static_init_fns[i]; i++) {
-               if (static_init_fns[i]() == -1)
-                       ret = -1;
-       }
-
-       return ret;
-}
 
 int ldb_register_module(const struct ldb_module_ops *ops)
 {
@@ -256,8 +232,13 @@ int ldb_load_modules_list(struct ldb_context *ldb, const char **module_list, str
                }
 
                if (ops == NULL) {
-                       ops = ldb_dso_load_symbol(ldb, module_list[i], 
-                                                     "ldb_module_ops");
+                       char *symbol_name = talloc_asprintf(ldb, "ldb_%s_module_ops", 
+                                                                                               module_list[i]);
+                       if (symbol_name == NULL) {
+                               return LDB_ERR_OPERATIONS_ERROR;
+                       }
+                       ops = ldb_dso_load_symbol(ldb, module_list[i], symbol_name);
+                       talloc_free(symbol_name);
                }
                
                if (ops == NULL) {
index 0e7caa381f9a768e270ba30e50aa7e6b34ba4683..d6980f341a6fde3db3de5d2ae89ede36207ee66a 100644 (file)
@@ -3,7 +3,7 @@
 [MODULE::ldb_asq]
 PRIVATE_DEPENDENCIES = LIBTALLOC
 CFLAGS = -Ilib/ldb/include
-INIT_FUNCTION = ldb_asq_init
+INIT_FUNCTION = &ldb_asq_module_ops
 SUBSYSTEM = LIBLDB
 OBJ_FILES = \
                modules/asq.o
@@ -15,7 +15,7 @@ OBJ_FILES = \
 [MODULE::ldb_server_sort]
 PRIVATE_DEPENDENCIES = LIBTALLOC
 CFLAGS = -Ilib/ldb/include
-INIT_FUNCTION = ldb_sort_init
+INIT_FUNCTION = &ldb_server_sort_module_ops
 SUBSYSTEM = LIBLDB
 OBJ_FILES = \
                modules/sort.o
@@ -25,7 +25,7 @@ OBJ_FILES = \
 ################################################
 # Start MODULE ldb_paged_results
 [MODULE::ldb_paged_results]
-INIT_FUNCTION = ldb_paged_results_init
+INIT_FUNCTION = &ldb_paged_results_module_ops
 CFLAGS = -Ilib/ldb/include
 PRIVATE_DEPENDENCIES = LIBTALLOC
 SUBSYSTEM = LIBLDB
@@ -37,7 +37,7 @@ OBJ_FILES = \
 ################################################
 # Start MODULE ldb_paged_results
 [MODULE::ldb_paged_searches]
-INIT_FUNCTION = ldb_paged_searches_init
+INIT_FUNCTION = &ldb_paged_searches_module_ops
 CFLAGS = -Ilib/ldb/include
 PRIVATE_DEPENDENCIES = LIBTALLOC
 SUBSYSTEM = LIBLDB
@@ -52,7 +52,7 @@ OBJ_FILES = \
 SUBSYSTEM = LIBLDB
 CFLAGS = -Ilib/ldb/include
 PRIVATE_DEPENDENCIES = LIBTALLOC
-INIT_FUNCTION = ldb_operational_init
+INIT_FUNCTION = &ldb_operational_module_ops
 OBJ_FILES = \
                modules/operational.o
 # End MODULE ldb_operational
@@ -64,7 +64,7 @@ OBJ_FILES = \
 SUBSYSTEM = LIBLDB
 CFLAGS = -Ilib/ldb/include
 PRIVATE_DEPENDENCIES = LIBTALLOC
-INIT_FUNCTION = ldb_rdn_name_init
+INIT_FUNCTION = &ldb_rdn_name_module_ops
 OBJ_FILES = \
                modules/rdn_name.o
 # End MODULE ldb_rdn_name
@@ -88,7 +88,7 @@ OBJ_FILES = \
 SUBSYSTEM = LIBLDB
 CFLAGS = -Ilib/ldb/include
 PRIVATE_DEPENDENCIES = LIBTALLOC
-INIT_FUNCTION = ldb_skel_init
+INIT_FUNCTION = &ldb_skel_module_ops
 OBJ_FILES = modules/skel.o
 # End MODULE ldb_skel
 ################################################
@@ -99,7 +99,6 @@ OBJ_FILES = modules/skel.o
 SUBSYSTEM = LIBLDB
 CFLAGS = -Ilib/ldb/include
 PRIVATE_DEPENDENCIES = LIBTALLOC SQLITE3 LIBTALLOC
-INIT_FUNCTION = ldb_sqlite3_init
 OBJ_FILES = \
                ldb_sqlite3/ldb_sqlite3.o
 # End MODULE ldb_sqlite3
@@ -110,7 +109,6 @@ OBJ_FILES = \
 [MODULE::ldb_tdb]
 SUBSYSTEM = LIBLDB
 CFLAGS = -Ilib/ldb/include -Ilib/ldb/ldb_tdb
-INIT_FUNCTION = ldb_tdb_init
 OBJ_FILES = \
                ldb_tdb/ldb_tdb.o \
                ldb_tdb/ldb_search.o \
@@ -128,10 +126,9 @@ PRIVATE_DEPENDENCIES = \
 [LIBRARY::LIBLDB]
 VERSION = 0.0.1
 SO_VERSION = 0
-OUTPUT_TYPE = SHARED_LIBRARY
 CFLAGS = -Ilib/ldb/include
 PC_FILE = ldb.pc
-INIT_FUNCTION_TYPE = int (*) (void)
+INIT_FUNCTION_TYPE = extern const struct ldb_module_ops
 OBJ_FILES = \
                common/ldb.o \
                common/ldb_ldif.o \
index 61d5f5148a9c4e77df7c51779d9b4c1dbaffe957..d2dcc675a58a6b380992c2f3ab26feef7feabe86 100644 (file)
@@ -41,6 +41,8 @@ struct ldb_context;
 
 struct ldb_module_ops;
 
+struct ldb_backend_ops;
+
 /* basic module structure */
 struct ldb_module {
        struct ldb_module *prev, *next;
@@ -70,9 +72,16 @@ struct ldb_module_ops {
        int (*sequence_number)(struct ldb_module *, struct ldb_request *);
 };
 
+
 typedef int (*ldb_connect_fn) (struct ldb_context *ldb, const char *url, unsigned int flags, const char *options[],
                               struct ldb_module **module);
 
+
+struct ldb_backend_ops {
+       const char *name;
+       ldb_connect_fn connect_fn;
+};
+
 const char *ldb_default_modules_dir(void);
 
 /*
@@ -170,19 +179,23 @@ void ldb_debug_set(struct ldb_context *ldb, enum ldb_debug_level level,
 /* The following definitions come from lib/ldb/common/ldb_ldif.c  */
 int ldb_should_b64_encode(const struct ldb_val *val);
 
-int ldb_objectclass_init(void);
-int ldb_operational_init(void);
-int ldb_paged_results_init(void);
-int ldb_paged_searches_init(void);
-int ldb_rdn_name_init(void);
-int ldb_schema_init(void);
-int ldb_asq_init(void);
-int ldb_sort_init(void);
-int ldb_ldap_init(void);
-int ldb_ildap_init(void);
-int ldb_tdb_init(void);
-int ldb_skel_init(void);
-int ldb_sqlite3_init(void);
+extern const struct ldb_module_ops ldb_objectclass_module_ops;
+extern const struct ldb_module_ops ldb_operational_module_ops;
+extern const struct ldb_module_ops ldb_paged_results_module_ops;
+extern const struct ldb_module_ops ldb_rdn_name_module_ops;
+extern const struct ldb_module_ops ldb_schema_module_ops;
+extern const struct ldb_module_ops ldb_asq_module_ops;
+extern const struct ldb_module_ops ldb_sort_module_ops;
+extern const struct ldb_module_ops ldb_ldap_module_ops;
+extern const struct ldb_module_ops ldb_ildap_module_ops;
+extern const struct ldb_module_ops ldb_tdb_module_ops;
+extern const struct ldb_module_ops ldb_sqlite3_module_ops;
+
+extern const struct ldb_backend_ops ldb_tdb_backend_ops;
+extern const struct ldb_backend_ops ldb_sqlite3_backend_ops;
+extern const struct ldb_backend_ops ldb_ldap_backend_ops;
+extern const struct ldb_backend_ops ldb_ildap_backend_ops;
+extern const struct ldb_backend_ops ldb_ldaps_backend_ops;
 
 int ldb_match_msg(struct ldb_context *ldb,
                  const struct ldb_message *msg,
index 6119f085d8515c0a63c8b6813911bdec6d83b919..cc920178bcfcf2e0501f9ec9fd3e578fed1a0b12 100644 (file)
@@ -31,7 +31,7 @@ lib/libldb.a: $(OBJS)
        ar -rv $@ $(OBJS)
        @-ranlib $@
 
-sample_module.$(SHLIBEXT): tests/sample_module.o
+sample.$(SHLIBEXT): tests/sample_module.o
        $(MDLD) $(MDLD_FLAGS) -o $@ tests/sample_module.o
 
 bin/ldbadd: tools/ldbadd.o tools/cmdline.o $(LIBS)
index 01d9ec88ffb12f6c02e3d17f5f1ca4b7f5da5d4e..3062dc886f8f609beb11d7890aa598c51f7f5bfe 100644 (file)
@@ -5,7 +5,6 @@ SUBSYSTEM = LIBLDB
 CFLAGS = -Ilib/ldb/include
 OUTPUT_TYPE = SHARED_LIBRARY
 PRIVATE_DEPENDENCIES = LIBTALLOC LIBCLI_LDAP CREDENTIALS
-INIT_FUNCTION = ldb_ildap_init
 ALIASES = ldapi ldaps ldap
 OBJ_FILES = \
                ldb_ildap.o
index a834e912d44a2c4078d00315ba427934a9aaaafa..995b584f51f97b8a0e5fd093db1731f926922b61 100644 (file)
@@ -811,9 +811,18 @@ failed:
        return -1;
 }
 
-int ldb_ildap_init(void)
-{
-       return ldb_register_backend("ldap", ildb_connect) + 
-                  ldb_register_backend("ldapi", ildb_connect) + 
-                  ldb_register_backend("ldaps", ildb_connect);
-}
+_PUBLIC_ const struct ldb_backend_ops ldb_ldap_backend_ops = {
+       .name = "ldap",
+       .connect_fn = ildb_connect
+};
+
+_PUBLIC_ const struct ldb_backend_ops ldb_ildap_backend_ops = {
+       .name = "ildap",
+       .connect_fn = ildb_connect
+};
+
+_PUBLIC_ const struct ldb_backend_ops ldb_ldaps_backend_ops = {
+       .name = "ldaps",
+       .connect_fn = ildb_connect
+};
+
index d897350c2f02e25f4be18f94566adbb92b1067bf..3f6ff3fd5b8edadec611adb65f8119e6d0a674c3 100644 (file)
@@ -826,9 +826,17 @@ failed:
        return -1;
 }
 
-int ldb_ldap_init(void)
-{
-       return ldb_register_backend("ldap", lldb_connect) +
-                  ldb_register_backend("ldapi", lldb_connect) + 
-                  ldb_register_backend("ldaps", lldb_connect);
-}
+_PUBLIC_ struct ldb_backend_ops ldb_ldap_backend_ops = {
+       .name = "ldap",
+       .connect_fn = lldb_connect
+};
+
+_PUBLIC_ struct ldb_backend_ops ldb_ldapi_backend_ops = {
+       .name = "ldapi",
+       .connect_fn = lldb_connect
+};
+
+_PUBLIC_ struct ldb_backend_ops ldb_ldaps_backend_ops = {
+       .name = "ldaps",
+       .connect_fn = lldb_connect
+};
index 9582f3613098bf6d5f02926d2841f16316480c90..9c189feb11dc4e2e69d74ee2322fe373bdd49fad 100644 (file)
@@ -1186,7 +1186,7 @@ static int map_wait_all(struct ldb_handle *handle)
 }
 
 /* Wait for pending requests to finish. */
-static int map_wait(struct ldb_handle *handle, enum ldb_wait_type type)
+int map_wait(struct ldb_handle *handle, enum ldb_wait_type type)
 {
        if (type == LDB_WAIT_ALL) {
                return map_wait_all(handle);
@@ -1199,16 +1199,6 @@ static int map_wait(struct ldb_handle *handle, enum ldb_wait_type type)
 /* Module initialization
  * ===================== */
 
-/* Provided module operations */
-static const struct ldb_module_ops map_ops = {
-       .name           = "ldb_map",
-       .add            = map_add,
-       .modify         = map_modify,
-       .del            = map_delete,
-       .rename         = map_rename,
-       .search         = map_search,
-       .wait           = map_wait,
-};
 
 /* Builtin mappings for DNs and objectClasses */
 static const struct ldb_map_attribute builtin_attribute_maps[] = {
@@ -1344,12 +1334,6 @@ static int map_init_maps(struct ldb_module *module, struct ldb_map_context *data
        return LDB_SUCCESS;
 }
 
-/* Copy the list of provided module operations. */
-_PUBLIC_ struct ldb_module_ops ldb_map_get_ops(void)
-{
-       return map_ops;
-}
-
 /* Initialize global private data. */
 _PUBLIC_ int ldb_map_init(struct ldb_module *module, const struct ldb_map_attribute *attrs, 
                          const struct ldb_map_objectclass *ocls,
@@ -1393,23 +1377,3 @@ _PUBLIC_ int ldb_map_init(struct ldb_module *module, const struct ldb_map_attrib
 
        return LDB_SUCCESS;
 }
-
-/* Usage note for initialization of this module:
- *
- * ldb_map is meant to be used from a different module that sets up
- * the mappings and gets registered in ldb.
- *
- * 'ldb_map_init' initializes the private data of this module and
- * stores the attribute and objectClass maps in there. It also looks
- * up the '@MAP' special DN so requests can be redirected to the
- * remote partition.
- *
- * This function should be called from the 'init_context' op of the
- * module using ldb_map.
- *
- * 'ldb_map_get_ops' returns a copy of ldb_maps module operations.
- *
- * It should be called from the initialize function of the using
- * module, which should then override the 'init_context' op with a
- * function making the appropriate calls to 'ldb_map_init'.
- */
index ef4da4e6546e4e5eb71ad1b2640f87928b60b36b..e40bb9cd7e3aadb5a9d02eb204fbf7c085ded130 100644 (file)
@@ -155,8 +155,19 @@ int ldb_map_init(struct ldb_module *module, const struct ldb_map_attribute *attr
                 const char *add_objectclass,
                 const char *name);
 
-/* get copy of map_ops */
-struct ldb_module_ops
-ldb_map_get_ops(void);
+int map_add(struct ldb_module *module, struct ldb_request *req);
+int map_search(struct ldb_module *module, struct ldb_request *req);
+int map_rename(struct ldb_module *module, struct ldb_request *req);
+int map_delete(struct ldb_module *module, struct ldb_request *req);
+int map_modify(struct ldb_module *module, struct ldb_request *req);
+int map_wait(struct ldb_handle *handle, enum ldb_wait_type type);
+
+#define LDB_MAP_OPS \
+       .add            = map_add, \
+       .modify         = map_modify, \
+       .del            = map_delete, \
+       .rename         = map_rename, \
+       .search         = map_search, \
+       .wait           = map_wait,
 
 #endif /* __LDB_MAP_H__ */
index 2c35097069877b679d096f778e99a9a916b35caa..58a9f2704ef8eafd65457cb339304e1b57637cff 100644 (file)
@@ -98,20 +98,13 @@ int map_subtree_collect_remote_simple(struct ldb_module *module, void *mem_ctx,
 /* The following definitions come from lib/ldb/modules/ldb_map_inbound.c */
 int map_add_do_remote(struct ldb_handle *handle);
 int map_add_do_local(struct ldb_handle *handle);
-int map_add(struct ldb_module *module, struct ldb_request *req);
 
 int map_modify_do_remote(struct ldb_handle *handle);
 int map_modify_do_local(struct ldb_handle *handle);
-int map_modify(struct ldb_module *module, struct ldb_request *req);
 
 int map_delete_do_remote(struct ldb_handle *handle);
 int map_delete_do_local(struct ldb_handle *handle);
-int map_delete(struct ldb_module *module, struct ldb_request *req);
 
 int map_rename_do_remote(struct ldb_handle *handle);
 int map_rename_do_fixup(struct ldb_handle *handle);
 int map_rename_do_local(struct ldb_handle *handle);
-int map_rename(struct ldb_module *module, struct ldb_request *req);
-
-/* The following definitions come from lib/ldb/modules/ldb_map_outbound.c */
-int map_search(struct ldb_module *module, struct ldb_request *req);
index 1ec3b1aabdf9355deaad024891da4c3ad7c11b67..8742e257f3058abb96a321b81f90e7a93d5c0f70 100644 (file)
@@ -1903,7 +1903,7 @@ failed:
        return -1;
 }
 
-int ldb_sqlite3_init(void)
-{
-       return ldb_register_backend("sqlite3", lsqlite3_connect);
-}
+const struct ldb_backend_ops ldb_sqlite3_backend_ops = {
+       .name = "sqlite3",
+       .connect_fn = lsqlite3_connect
+};
index 45a810958459d9e3e2e74be6a5ea79f84f4d4ea0..11d6c30710d7d91b6984ad12af20a93e8d4ab4a8 100644 (file)
@@ -1107,7 +1107,7 @@ static int ltdb_connect(struct ldb_context *ldb, const char *url,
        return 0;
 }
 
-int ldb_tdb_init(void)
-{
-       return ldb_register_backend("tdb", ltdb_connect);
-}
+const struct ldb_backend_ops ldb_tdb_backend_ops = {
+       .name = "tdb",
+       .connect_fn = ltdb_connect
+};
index b6a85941664044e4e5e65f046a0da85dbcfc0e32..eb27263b16ffe2a0fc13f241665b4061bec36bc0 100644 (file)
@@ -473,15 +473,9 @@ static int asq_init(struct ldb_module *module)
        return ldb_next_init(module);
 }
 
-
-static const struct ldb_module_ops asq_ops = {
+const struct ldb_module_ops ldb_asq_module_ops = {
        .name              = "asq",
        .search            = asq_search,
        .wait              = asq_wait,
        .init_context      = asq_init
 };
-
-int ldb_asq_init(void)
-{
-       return ldb_register_module(&asq_ops);
-}
index 45f23aa0c16c491353c2a2a40f023a85bb7c3a87..7dc4ae08c380eee8947643e5afc7bb8394728ac8 100644 (file)
@@ -304,13 +304,8 @@ static int operational_init(struct ldb_module *ctx)
        return ldb_next_init(ctx);
 }
 
-static const struct ldb_module_ops operational_ops = {
+const struct ldb_module_ops ldb_operational_module_ops = {
        .name              = "operational",
        .search            = operational_search,
        .init_context      = operational_init
 };
-
-int ldb_operational_init(void)
-{
-       return ldb_register_module(&operational_ops);
-}
index ee1bbe03353799cf4c6dd593c1342dabdda04ee1..b62b1f92cbd7d0271fffbbef452664bfb89662fe 100644 (file)
@@ -549,15 +549,9 @@ static int paged_request_init(struct ldb_module *module)
        return ldb_next_init(module);
 }
 
-static const struct ldb_module_ops paged_ops = {
+const struct ldb_module_ops ldb_paged_results_module_ops = {
        .name           = "paged_results",
        .search         = paged_search,
        .wait           = paged_wait,
        .init_context   = paged_request_init
 };
-
-int ldb_paged_results_init(void)
-{
-       return ldb_register_module(&paged_ops);
-}
-
index fd580a3c4ac2ed038484791dbb5dba0fd579589a..40e87f70d60c83e124a5e7ae0877d941c6102c67 100644 (file)
@@ -455,15 +455,9 @@ static int ps_init(struct ldb_module *module)
        return ldb_next_init(module);
 }
 
-static const struct ldb_module_ops ps_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_paged_searches_module_ops = {
        .name           = "paged_searches",
        .search         = ps_search,
        .wait           = ps_wait,
        .init_context   = ps_init
 };
-
-int ldb_paged_searches_init(void)
-{
-       return ldb_register_module(&ps_ops);
-}
-
index 1a0ddbb3c462515b9571c829793935407dadcce1..c4de8e8da8b376ee5dd4f1127c3962d76e543db6 100644 (file)
@@ -326,15 +326,9 @@ static int rdn_name_wait(struct ldb_handle *handle, enum ldb_wait_type type)
        return rdn_name_wait_once(handle);
 }
 
-static const struct ldb_module_ops rdn_name_ops = {
+const struct ldb_module_ops ldb_rdn_name_module_ops = {
        .name              = "rdn_name",
        .add               = rdn_name_add,
        .rename            = rdn_name_rename,
        .wait              = rdn_name_wait
 };
-
-
-int ldb_rdn_name_init(void)
-{
-       return ldb_register_module(&rdn_name_ops);
-}
index 5400c502f13340149517a45bd774ab991c3dd9f1..0cd29ac4b7e0fc8839944481daf60fb908a3b805 100644 (file)
@@ -116,7 +116,7 @@ static int skel_init(struct ldb_module *module)
        return ldb_next_init(module);
 }
 
-static const struct ldb_module_ops skel_ops = {
+const struct ldb_module_ops ldb_skel_module_ops = {
        .name              = "skel",
        .init_context      = skel_init,
        .search            = skel_search,
@@ -129,8 +129,3 @@ static const struct ldb_module_ops skel_ops = {
        .end_transaction   = skel_end_trans,
        .del_transaction   = skel_del_trans,
 };
-
-int ldb_skel_init(void)
-{
-       return ldb_register_module(&skel_ops);
-}
index 89b9a4fb19c69ae96dda928e356f57099c4ecee0..746befa559208bb368a0a4bf875d5eb46b617da8 100644 (file)
@@ -450,14 +450,9 @@ static int server_sort_init(struct ldb_module *module)
        return ldb_next_init(module);
 }
 
-static const struct ldb_module_ops server_sort_ops = {
+const struct ldb_module_ops ldb_server_sort_module_ops = {
        .name              = "server_sort",
        .search            = server_sort_search,
        .wait              = server_sort_wait,
        .init_context      = server_sort_init
 };
-
-int ldb_sort_init(void)
-{
-       return ldb_register_module(&server_sort_ops);
-}
index 199212dbbf1cd4b05702d867cc98daee73bc7b49..e256f41a4db7b93eb77718de65bbbb12fc4cd9e5 100644 (file)
@@ -45,11 +45,6 @@ NSS_STATUS _ldb_nss_init(void)
 
        _ldb_nss_ctx->pid = mypid;
 
-       ret = ldb_global_init();
-       if (ret != 0) {
-               goto failed;
-       }
-
        _ldb_nss_ctx->ldb = ldb_init(_ldb_nss_ctx);
        if (_ldb_nss_ctx->ldb == NULL) {
                goto failed;
index 8ab1d33146dbca59b92edfa2bcece9ce341406cd..98d8e865dd07813eb0d3b6c4be194a710d023c63 100644 (file)
@@ -32,12 +32,7 @@ int sample_add(struct ldb_module *mod, struct ldb_request *req)
        return ldb_next_request(mod, req);
 }
 
-static const struct ldb_module_ops sample_ops = {
-       .name              = "sample_module",
+_PUBLIC_ const struct ldb_module_ops ldb_sample_module_ops = {
+       .name              = "sample",
        .add               = sample_add,
 };
-
-int init_module(void)
-{
-       return ldb_register_module(&sample_ops);
-}
index dec8a5f9726056cf90c5c40d4fbd5d59ae3e9c6e..67b16dd06ed0e11a7b283e264a848cb973b5608d 100644 (file)
@@ -656,8 +656,6 @@ static struct schema_conv process_convert(struct ldb_context *ldb, enum convert_
        const char *target_str;
        enum convert_target target;
 
-       ldb_global_init();
-
        ctx = talloc_new(NULL);
        ldb = ldb_init(ctx);
 
index 8ee19946158c2b15eb36021baa939493fc49b4d4..c9c77c4e474059a0ad6dba659852744121ef7017 100644 (file)
@@ -80,8 +80,6 @@ struct ldb_cmdline *ldb_cmdline_process(struct ldb_context *ldb,
                { NULL }
        };
 
-       ldb_global_init();
-
 #if (_SAMBA_BUILD_ >= 4)
        r = ldb_register_samba_handlers(ldb);
        if (r != 0) {
index d34193b86cb485dfe9b8269e9812c7d2108913bd..4ee66c4fc088b490e55f8d5560a24bab117d7c60 100644 (file)
@@ -88,8 +88,6 @@ int main(int argc, const char **argv)
        int i, ret=0, count=0;
        struct ldb_cmdline *options;
 
-       ldb_global_init();
-
        ldb = ldb_init(NULL);
 
        options = ldb_cmdline_process(ldb, argc, argv, usage);
index fcd0978779c95ae24037b5c4d158fdb7a5fbbee3..184172b22bf554a496450da36e05008dfc087e9d 100644 (file)
@@ -77,8 +77,6 @@ int main(int argc, const char **argv)
        int ret = 0, i;
        struct ldb_cmdline *options;
 
-       ldb_global_init();
-
        ldb = ldb_init(NULL);
 
        options = ldb_cmdline_process(ldb, argc, argv, usage);
index ed98a6d6158fc568b0d4b535ea3013a5a6d45c3a..a9fd064bf8871bc6b97c9346e6b7b88a0f79ac85 100644 (file)
@@ -279,8 +279,6 @@ int main(int argc, const char **argv)
        const char *expression = "(|(objectClass=*)(distinguishedName=*))";
        const char * const * attrs = NULL;
 
-       ldb_global_init();
-
        ldb = ldb_init(NULL);
 
        options = ldb_cmdline_process(ldb, argc, argv, usage);
index ed12380095295d8566c5a2bf8a4dd3b7f81dd719..dd6206b8241aa87c86183e057b616005dffac56f 100644 (file)
@@ -89,8 +89,6 @@ int main(int argc, const char **argv)
        int i, ret=LDB_SUCCESS;
        struct ldb_cmdline *options;
 
-       ldb_global_init();
-
        ldb = ldb_init(NULL);
 
        options = ldb_cmdline_process(ldb, argc, argv, usage);
index c160e87ee4c2c52bf0fa0a69b36a99d7dae9f0b7..b36310a50063c6cc2cfdde44e2674aa73d8ee401 100644 (file)
@@ -56,8 +56,6 @@ int main(int argc, const char **argv)
        struct ldb_cmdline *options;
        struct ldb_dn *dn1, *dn2;
 
-       ldb_global_init();
-
        ldb = ldb_init(NULL);
 
        options = ldb_cmdline_process(ldb, argc, argv, usage);
index 24ceb309639d6b81dc7c29f1cd113d4418aa2e12..e25bd19965b4e265a9bb24d5a770f366a84bd847 100644 (file)
@@ -276,8 +276,6 @@ int main(int argc, const char **argv)
        int ret = -1;
        const char *expression = "(|(objectClass=*)(distinguishedName=*))";
 
-       ldb_global_init();
-
        ldb = ldb_init(NULL);
 
        options = ldb_cmdline_process(ldb, argc, argv, usage);
index 5c21dd3830c37dc2eb111e02ff4af692518b58f2..57a7848733e3c0953adcd692cfd58945ae9229ec 100644 (file)
@@ -393,8 +393,6 @@ int main(int argc, const char **argv)
        TALLOC_CTX *mem_ctx = talloc_new(NULL);
        struct ldb_context *ldb;
 
-       ldb_global_init();
-
        ldb = ldb_init(mem_ctx);
 
        options = ldb_cmdline_process(ldb, argc, argv, usage);
index 7b5f1b835c5033c483f26092ffab4853c3c59825..1846a2c8523e8794fc62ba65475624b1082c91f0 100644 (file)
@@ -560,8 +560,6 @@ static void usage(void)
        struct ldb_cmdline *options;
        FILE *in = stdin;
        FILE *out = stdout;
-       ldb_global_init();
-
        ctx = talloc_new(NULL);
        ldb_ctx = ldb_init(ctx);
 
index fa1367bbd2cd38f37a8c359e254ec6e84d747269..a4579010cd0a5189d510c1f024c9f53e6024b3f2 100644 (file)
@@ -23,6 +23,7 @@
 #include "lib/registry/patchfile.h"
 #include "lib/registry/registry.h"
 #include "system/filesys.h"
+#include "param/param.h"
 
 
 _PUBLIC_ WERROR reg_preg_diff_load(int fd,
@@ -30,6 +31,7 @@ _PUBLIC_ WERROR reg_preg_diff_load(int fd,
                                   void *callback_data);
 
 _PUBLIC_ WERROR reg_dotreg_diff_load(int fd,
+                                    struct smb_iconv_convenience *iconv_convenience,
                                     const struct reg_diff_callbacks *callbacks,
                                     void *callback_data);
 
@@ -306,7 +308,7 @@ _PUBLIC_ WERROR reg_diff_load(const char *filename,
                return reg_preg_diff_load(fd, callbacks, callback_data);
        } else {
                /* Must be a normal .REG file */
-               return reg_dotreg_diff_load(fd, callbacks, callback_data);
+               return reg_dotreg_diff_load(fd, lp_iconv_convenience(global_loadparm), callbacks, callback_data);
        }
 }
 
index ebcafc92af4b9f1f2a0fb379644a687d08f41132..46ea7c0008bce1f2be05449c0e8968e19317bd6f 100644 (file)
@@ -26,6 +26,7 @@
 #include "lib/registry/patchfile.h"
 #include "lib/registry/registry.h"
 #include "system/filesys.h"
+#include "param/param.h"
 
 /**
  * @file
@@ -36,6 +37,7 @@
 
 struct dotreg_data {
        int fd;
+       struct smb_iconv_convenience *iconv_convenience;
 };
 
 static WERROR reg_dotreg_diff_add_key(void *_data, const char *key_name)
@@ -64,7 +66,7 @@ static WERROR reg_dotreg_diff_set_value(void *_data, const char *path,
 
        fdprintf(data->fd, "\"%s\"=%s:%s\n",
                        value_name, str_regtype(value_type),
-                       reg_val_data_string(NULL, value_type, value));
+                       reg_val_data_string(NULL, data->iconv_convenience, value_type, value));
 
        return WERR_OK;
 }
@@ -107,6 +109,8 @@ _PUBLIC_ WERROR reg_dotreg_diff_save(TALLOC_CTX *ctx, const char *filename,
        data = talloc_zero(ctx, struct dotreg_data);
        *callback_data = data;
 
+       data->iconv_convenience = lp_iconv_convenience(global_loadparm);
+
        if (filename) {
                data->fd = open(filename, O_CREAT, 0755);
                if (data->fd == -1) {
@@ -135,6 +139,7 @@ _PUBLIC_ WERROR reg_dotreg_diff_save(TALLOC_CTX *ctx, const char *filename,
  * Load diff file
  */
 _PUBLIC_ WERROR reg_dotreg_diff_load(int fd,
+                                    struct smb_iconv_convenience *iconv_convenience,
                                     const struct reg_diff_callbacks *callbacks,
                                     void *callback_data)
 {
@@ -239,7 +244,8 @@ _PUBLIC_ WERROR reg_dotreg_diff_load(int fd,
                        q++;
                }
 
-               reg_string_to_val(line, q?p:"REG_SZ", q?q:p,
+               reg_string_to_val(line, iconv_convenience, 
+                                 q?p:"REG_SZ", q?q:p,
                                  &value_type, &value);
 
                error = callbacks->set_value(callback_data, curkey, line,
index fac9180378340ffc92b347632226a2bc52fae994..5e0b971a1d717db02640643f8091d995c3727f0b 100644 (file)
@@ -254,11 +254,10 @@ WERROR reg_create_key(TALLOC_CTX *mem_ctx,
 
 /* Utility functions */
 const char *str_regtype(int type);
-char *reg_val_data_string(TALLOC_CTX *mem_ctx, uint32_t type,
-                         const DATA_BLOB data);
-char *reg_val_description(TALLOC_CTX *mem_ctx, const char *name,
+char *reg_val_data_string(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, uint32_t type, const DATA_BLOB data);
+char *reg_val_description(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, const char *name,
                          uint32_t type, const DATA_BLOB data);
-bool reg_string_to_val(TALLOC_CTX *mem_ctx, const char *type_str,
+bool reg_string_to_val(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, const char *type_str,
                       const char *data_str, uint32_t *type, DATA_BLOB *data);
 WERROR reg_open_key_abs(TALLOC_CTX *mem_ctx, struct registry_context *handle,
                        const char *name, struct registry_key **result);
index 25a89793bd4cc4f7301d084ac17bd498c4146db2..145e59950427fed1d2b31dbf774048fff10b4d73 100644 (file)
@@ -45,7 +45,7 @@ static bool test_reg_val_data_string_dword(struct torture_context *ctx)
        uint32_t d = 0x20;
        DATA_BLOB db = { (uint8_t *)&d, sizeof(d) };
        torture_assert_str_equal(ctx, "0x20",
-                                reg_val_data_string(ctx, REG_DWORD, db),
+                                reg_val_data_string(ctx, lp_iconv_convenience(ctx->lp_ctx), REG_DWORD, db),
                                 "dword failed");
        return true;
 }
@@ -56,11 +56,11 @@ static bool test_reg_val_data_string_sz(struct torture_context *ctx)
        db.length = convert_string_talloc(ctx, lp_iconv_convenience(ctx->lp_ctx), CH_UNIX, CH_UTF16,
                                          "bla", 3, (void **)&db.data);
        torture_assert_str_equal(ctx, "bla",
-                                reg_val_data_string(ctx, REG_SZ, db),
+                                reg_val_data_string(ctx, lp_iconv_convenience(ctx->lp_ctx), REG_SZ, db),
                                 "sz failed");
        db.length = 4;
        torture_assert_str_equal(ctx, "bl",
-                                reg_val_data_string(ctx, REG_SZ, db),
+                                reg_val_data_string(ctx, lp_iconv_convenience(ctx->lp_ctx), REG_SZ, db),
                                 "sz failed");
        return true;
 }
@@ -70,7 +70,7 @@ static bool test_reg_val_data_string_binary(struct torture_context *ctx)
        uint8_t x[] = { 0x1, 0x2, 0x3, 0x4 };
        DATA_BLOB db = { x, 4 };
        torture_assert_str_equal(ctx, "01020304",
-                                reg_val_data_string(ctx, REG_BINARY, db),
+                                reg_val_data_string(ctx, lp_iconv_convenience(ctx->lp_ctx), REG_BINARY, db),
                                 "binary failed");
        return true;
 }
@@ -80,7 +80,7 @@ static bool test_reg_val_data_string_empty(struct torture_context *ctx)
 {
        DATA_BLOB db = { NULL, 0 };
        torture_assert_str_equal(ctx, "",
-                                reg_val_data_string(ctx, REG_BINARY, db),
+                                reg_val_data_string(ctx, lp_iconv_convenience(ctx->lp_ctx), REG_BINARY, db),
                                 "empty failed");
        return true;
 }
@@ -93,7 +93,7 @@ static bool test_reg_val_description(struct torture_context *ctx)
                                            strlen("stationary traveller"),
                                            (void **)&data.data);
        torture_assert_str_equal(ctx, "camel = REG_SZ : stationary traveller",
-                                reg_val_description(ctx, "camel", REG_SZ, data),
+                                reg_val_description(ctx, lp_iconv_convenience(ctx->lp_ctx), "camel", REG_SZ, data),
                                 "reg_val_description failed");
        return true;
 }
@@ -107,7 +107,7 @@ static bool test_reg_val_description_nullname(struct torture_context *ctx)
                                            strlen("west berlin"),
                                            (void **)&data.data);
        torture_assert_str_equal(ctx, "<No Name> = REG_SZ : west berlin",
-                                reg_val_description(ctx, NULL, REG_SZ, data),
+                                reg_val_description(ctx, lp_iconv_convenience(ctx->lp_ctx), NULL, REG_SZ, data),
                                 "description with null name failed");
        return true;
 }
index d5c506ab31d915655d29205d2a44d9252040522d..58f64cb049b2f292d64ac81e0aa9f586800db6c0 100644 (file)
@@ -141,7 +141,8 @@ static WERROR cmd_set(struct regshell_context *ctx, int argc, char **argv)
                return WERR_INVALID_PARAM;
        }
 
-       if (!reg_string_to_val(ctx, argv[2], argv[3], &val.data_type,
+       if (!reg_string_to_val(ctx, lp_iconv_convenience(cmdline_lp_ctx), 
+                              argv[2], argv[3], &val.data_type,
                               &val.data)) {
                fprintf(stderr, "Unable to interpret data\n");
                return WERR_INVALID_PARAM;
@@ -199,7 +200,7 @@ static WERROR cmd_print(struct regshell_context *ctx, int argc, char **argv)
        }
 
        printf("%s\n%s\n", str_regtype(value_type),
-                  reg_val_data_string(ctx, value_type, value_data));
+                  reg_val_data_string(ctx, lp_iconv_convenience(cmdline_lp_ctx), value_type, value_data));
 
        return WERR_OK;
 }
@@ -233,7 +234,7 @@ static WERROR cmd_ls(struct regshell_context *ctx, int argc, char **argv)
                                                                     &data_type,
                                                                     &data)); i++) {
                printf("V \"%s\" %s %s\n", name, str_regtype(data_type),
-                          reg_val_data_string(ctx, data_type, data));
+                          reg_val_data_string(ctx, lp_iconv_convenience(cmdline_lp_ctx), data_type, data));
        }
 
        return WERR_OK;
index 0f47d8f8ddb0969eec1592646fdcfd2b581ec6b4..424d3515e0cd2d5f0315977a2f234014887b738c 100644 (file)
@@ -82,7 +82,7 @@ static void print_tree(int level, struct registry_key *p,
                        int j;
                        char *desc;
                        for(j = 0; j < level+1; j++) putchar(' ');
-                       desc = reg_val_description(mem_ctx, valuename,
+                       desc = reg_val_description(mem_ctx, lp_iconv_convenience(cmdline_lp_ctx), valuename,
                                                   value_type, value_data);
                        printf("%s\n", desc);
                }
index a251ae49a59177f98e08aada8c69de464d1e85fb..68efd56a86271f8dfdaaa4464d31f895ddc535cc 100644 (file)
@@ -51,7 +51,9 @@ _PUBLIC_ const char *str_regtype(int type)
        return "Unknown";
 }
 
-_PUBLIC_ char *reg_val_data_string(TALLOC_CTX *mem_ctx, uint32_t type,
+_PUBLIC_ char *reg_val_data_string(TALLOC_CTX *mem_ctx, 
+                                  struct smb_iconv_convenience *iconv_convenience,
+                                  uint32_t type,
                                   const DATA_BLOB data)
 {
        char *ret = NULL;
@@ -62,7 +64,7 @@ _PUBLIC_ char *reg_val_data_string(TALLOC_CTX *mem_ctx, uint32_t type,
        switch (type) {
                case REG_EXPAND_SZ:
                case REG_SZ:
-                       convert_string_talloc(mem_ctx, lp_iconv_convenience(global_loadparm), CH_UTF16, CH_UNIX,
+                       convert_string_talloc(mem_ctx, iconv_convenience, CH_UTF16, CH_UNIX,
                                              data.data, data.length,
                                              (void **)&ret);
                        return ret;
@@ -85,16 +87,20 @@ _PUBLIC_ char *reg_val_data_string(TALLOC_CTX *mem_ctx, uint32_t type,
 }
 
 /** Generate a string that describes a registry value */
-_PUBLIC_ char *reg_val_description(TALLOC_CTX *mem_ctx, const char *name,
+_PUBLIC_ char *reg_val_description(TALLOC_CTX *mem_ctx, 
+                                  struct smb_iconv_convenience *iconv_convenience, 
+                                  const char *name,
                                   uint32_t data_type,
                                   const DATA_BLOB data)
 {
        return talloc_asprintf(mem_ctx, "%s = %s : %s", name?name:"<No Name>",
                               str_regtype(data_type),
-                              reg_val_data_string(mem_ctx, data_type, data));
+                              reg_val_data_string(mem_ctx, iconv_convenience, data_type, data));
 }
 
-_PUBLIC_ bool reg_string_to_val(TALLOC_CTX *mem_ctx, const char *type_str,
+_PUBLIC_ bool reg_string_to_val(TALLOC_CTX *mem_ctx, 
+                               struct smb_iconv_convenience *iconv_convenience,
+                               const char *type_str,
                                const char *data_str, uint32_t *type,
                                DATA_BLOB *data)
 {
@@ -118,7 +124,7 @@ _PUBLIC_ bool reg_string_to_val(TALLOC_CTX *mem_ctx, const char *type_str,
        {
                case REG_SZ:
                case REG_EXPAND_SZ:
-               data->length = convert_string_talloc(mem_ctx, lp_iconv_convenience(global_loadparm), CH_UNIX, CH_UTF16,
+               data->length = convert_string_talloc(mem_ctx, iconv_convenience, CH_UNIX, CH_UTF16,
                                                     data_str, strlen(data_str),
                                                     (void **)&data->data);
                        break;
index 42848848e8703dc488765213ca579065b758cc2a..3b109d7e404695fedc102f91dfb23ab40e56ed9d 100644 (file)
@@ -35,6 +35,8 @@ void *rep_dlopen(const char *name, int flags)
 #endif
 {
 #ifdef HAVE_SHL_LOAD
+       if (name == NULL)
+               return PROG_HANDLE;
        return (void *)shl_load(name, flags, 0);
 #else
        return NULL;
index 4037d647d7e2477d325d9f1d3eaa3f583801fcca..053657475d8fa0214bedecabc773a19d116f7e7a 100644 (file)
@@ -19,6 +19,8 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+#define SOCKET_WRAPPER_NOT_REPLACE
+
 #include "replace.h"
 #include "system/network.h"
 
@@ -81,11 +83,11 @@ int rep_getifaddrs(struct ifaddrs **ifap)
        char buff[8192];
        int fd, i, n;
        struct ifreq *ifr=NULL;
-       int total = 0;
        struct in_addr ipaddr;
        struct in_addr nmask;
        char *iname;
-       struct ifaddrs *curif, *lastif;
+       struct ifaddrs *curif;
+       struct ifaddrs *lastif = NULL;
 
        *ifap = NULL;
 
@@ -106,7 +108,7 @@ int rep_getifaddrs(struct ifaddrs **ifap)
        n = ifc.ifc_len / sizeof(struct ifreq);
 
        /* Loop through interfaces, looking for given IP address */
-       for (i=n-1;i>=0 && total < max_interfaces;i--) {
+       for (i=n-1; i>=0; i--) {
                if (ioctl(fd, SIOCGIFADDR, &ifr[i]) != 0) {
                        freeifaddrs(*ifap);
                }
@@ -115,7 +117,7 @@ int rep_getifaddrs(struct ifaddrs **ifap)
                if (lastif == NULL) {
                        *ifap = curif;
                } else {
-                       lastif->ifa_next = (*ifap);
+                       lastif->ifa_next = curif;
                }
 
                curif->ifa_name = strdup(ifr[i].ifr_name);
@@ -166,11 +168,11 @@ int rep_getifaddrs(struct ifaddrs **ifap)
        char buff[8192];
        int fd, i, n;
        struct ifreq *ifr=NULL;
-       int total = 0;
        struct in_addr ipaddr;
        struct in_addr nmask;
        char *iname;
        struct ifaddrs *curif;
+       struct ifaddrs *lastif = NULL;
 
        *ifap = NULL;
 
@@ -201,14 +203,14 @@ int rep_getifaddrs(struct ifaddrs **ifap)
 
        /* Loop through interfaces */
 
-       for (i = 0; i<n && total < max_interfaces; i++) {
+       for (i = 0; i<n; i++) {
                ifreq = ifr[i];
   
                curif = calloc(1, sizeof(struct ifaddrs));
                if (lastif == NULL) {
                        *ifap = curif;
                } else {
-                       lastif->ifa_next = (*ifap);
+                       lastif->ifa_next = curif;
                }
 
                strioctl.ic_cmd = SIOCGIFFLAGS;
@@ -270,8 +272,8 @@ int rep_getifaddrs(struct ifaddrs **ifap)
        struct in_addr ipaddr;
        struct in_addr nmask;
        char *iname;
-       int total = 0;
-       struct ifaddrs *curif, *lastif;
+       struct ifaddrs *curif;
+       struct ifaddrs *lastif = NULL;
 
        *ifap = NULL;
 
@@ -306,7 +308,7 @@ int rep_getifaddrs(struct ifaddrs **ifap)
                if (lastif == NULL) {
                        *ifap = curif;
                } else {
-                       lastif->ifa_next = (*ifap);
+                       lastif->ifa_next = curif;
                }
 
                curif->ifa_name = strdup(ifr->ifr_name);
@@ -363,7 +365,7 @@ int rep_getifaddrs(struct ifaddrs **ifap)
 #endif
 
 #ifdef AUTOCONF_TEST
-/* this is the autoconf driver to test get_interfaces() */
+/* this is the autoconf driver to test getifaddrs() */
 
  int main()
 {
index 297a82d0c315b8667acce46d16214644436663b0..dd2a95cb815b1ba13006c9df8659d00644566603 100644 (file)
@@ -7,7 +7,7 @@ AC_CHECK_MEMBERS([struct sockaddr.sa_len],
         [#include <sys/socket.h>])
 
 dnl test for getifaddrs and freeifaddrs
-AC_CACHE_CHECK([for getifaddrs and freeifaddrs],samba_cv_HAVE_GETIFADDRS,[
+AC_CACHE_CHECK([for getifaddrs and freeifaddrs],libreplace_cv_HAVE_GETIFADDRS,[
 AC_TRY_COMPILE([
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -24,8 +24,8 @@ struct ifaddrs *ifp = NULL;
 int ret = getifaddrs (&ifp);
 freeifaddrs(ifp);
 ],
-samba_cv_HAVE_GETIFADDRS=yes,samba_cv_HAVE_GETIFADDRS=no)])
-if test x"$samba_cv_HAVE_GETIFADDRS" = x"yes"; then
+libreplace_cv_HAVE_GETIFADDRS=yes,libreplace_cv_HAVE_GETIFADDRS=no)])
+if test x"$libreplace_cv_HAVE_GETIFADDRS" = x"yes"; then
     AC_DEFINE(HAVE_GETIFADDRS,1,[Whether the system has getifaddrs])
     AC_DEFINE(HAVE_FREEIFADDRS,1,[Whether the system has freeifaddrs])
        AC_DEFINE(HAVE_STRUCT_IFADDRS,1,[Whether struct ifaddrs is available])
@@ -42,18 +42,16 @@ iface=no;
 ##################
 # look for a method of finding the list of network interfaces
 iface=no;
-AC_CACHE_CHECK([for iface getifaddrs],samba_cv_HAVE_IFACE_GETIFADDRS,[
-SAVE_CPPFLAGS="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS ${SAMBA_CONFIGURE_CPPFLAGS}"
+AC_CACHE_CHECK([for iface getifaddrs],libreplace_cv_HAVE_IFACE_GETIFADDRS,[
 AC_TRY_RUN([
-#define NO_CONFIG_H 1
 #define HAVE_IFACE_GETIFADDRS 1
+#define NO_CONFIG_H 1
 #define AUTOCONF_TEST 1
+#define SOCKET_WRAPPER_NOT_REPLACE
 #include "$libreplacedir/replace.c"
 #include "$libreplacedir/getifaddrs.c"],
-           samba_cv_HAVE_IFACE_GETIFADDRS=yes,samba_cv_HAVE_IFACE_GETIFADDRS=no,samba_cv_HAVE_IFACE_GETIFADDRS=cross)])
-CPPFLAGS="$SAVE_CPPFLAGS"
-if test x"$samba_cv_HAVE_IFACE_GETIFADDRS" = x"yes"; then
+           libreplace_cv_HAVE_IFACE_GETIFADDRS=yes,libreplace_cv_HAVE_IFACE_GETIFADDRS=no,libreplace_cv_HAVE_IFACE_GETIFADDRS=cross)])
+if test x"$libreplace_cv_HAVE_IFACE_GETIFADDRS" = x"yes"; then
     iface=yes;AC_DEFINE(HAVE_IFACE_GETIFADDRS,1,[Whether iface getifaddrs is available])
 else
        LIBREPLACEOBJ="${LIBREPLACEOBJ} getifaddrs.o"
@@ -61,39 +59,48 @@ fi
 
 
 if test $iface = no; then
-AC_CACHE_CHECK([for iface AIX],samba_cv_HAVE_IFACE_AIX,[
+AC_CACHE_CHECK([for iface AIX],libreplace_cv_HAVE_IFACE_AIX,[
 AC_TRY_RUN([
 #define HAVE_IFACE_AIX 1
+#define NO_CONFIG_H 1
 #define AUTOCONF_TEST 1
 #undef _XOPEN_SOURCE_EXTENDED
+#define SOCKET_WRAPPER_NOT_REPLACE
+#include "$libreplacedir/replace.c"
 #include "$libreplacedir/getifaddrs.c"],
-           samba_cv_HAVE_IFACE_AIX=yes,samba_cv_HAVE_IFACE_AIX=no,samba_cv_HAVE_IFACE_AIX=cross)])
-if test x"$samba_cv_HAVE_IFACE_AIX" = x"yes"; then
+           libreplace_cv_HAVE_IFACE_AIX=yes,libreplace_cv_HAVE_IFACE_AIX=no,libreplace_cv_HAVE_IFACE_AIX=cross)])
+if test x"$libreplace_cv_HAVE_IFACE_AIX" = x"yes"; then
     iface=yes;AC_DEFINE(HAVE_IFACE_AIX,1,[Whether iface AIX is available])
 fi
 fi
 
 
 if test $iface = no; then
-AC_CACHE_CHECK([for iface ifconf],samba_cv_HAVE_IFACE_IFCONF,[
+AC_CACHE_CHECK([for iface ifconf],libreplace_cv_HAVE_IFACE_IFCONF,[
 AC_TRY_RUN([
 #define HAVE_IFACE_IFCONF 1
+#define NO_CONFIG_H 1
 #define AUTOCONF_TEST 1
+#define SOCKET_WRAPPER_NOT_REPLACE
+#include "$libreplacedir/replace.c"
 #include "$libreplacedir/getifaddrs.c"],
-           samba_cv_HAVE_IFACE_IFCONF=yes,samba_cv_HAVE_IFACE_IFCONF=no,samba_cv_HAVE_IFACE_IFCONF=cross)])
-if test x"$samba_cv_HAVE_IFACE_IFCONF" = x"yes"; then
+           libreplace_cv_HAVE_IFACE_IFCONF=yes,libreplace_cv_HAVE_IFACE_IFCONF=no,libreplace_cv_HAVE_IFACE_IFCONF=cross)])
+if test x"$libreplace_cv_HAVE_IFACE_IFCONF" = x"yes"; then
     iface=yes;AC_DEFINE(HAVE_IFACE_IFCONF,1,[Whether iface ifconf is available])
 fi
 fi
 
 if test $iface = no; then
-AC_CACHE_CHECK([for iface ifreq],samba_cv_HAVE_IFACE_IFREQ,[
+AC_CACHE_CHECK([for iface ifreq],libreplace_cv_HAVE_IFACE_IFREQ,[
 AC_TRY_RUN([
 #define HAVE_IFACE_IFREQ 1
+#define NO_CONFIG_H 1
 #define AUTOCONF_TEST 1
+#define SOCKET_WRAPPER_NOT_REPLACE
+#include "$libreplacedir/replace.c"
 #include "$libreplacedir/getifaddrs.c"],
-           samba_cv_HAVE_IFACE_IFREQ=yes,samba_cv_HAVE_IFACE_IFREQ=no,samba_cv_HAVE_IFACE_IFREQ=cross)])
-if test x"$samba_cv_HAVE_IFACE_IFREQ" = x"yes"; then
+           libreplace_cv_HAVE_IFACE_IFREQ=yes,libreplace_cv_HAVE_IFACE_IFREQ=no,libreplace_cv_HAVE_IFACE_IFREQ=cross)])
+if test x"$libreplace_cv_HAVE_IFACE_IFREQ" = x"yes"; then
     iface=yes;AC_DEFINE(HAVE_IFACE_IFREQ,1,[Whether iface ifreq is available])
 fi
 fi
index c4da9aae593112aea4d2141b45692db0715a3ddb..b93817f9d35d730c470a7d6a9a2a38c9ae102e56 100644 (file)
@@ -1,22 +1,22 @@
-AC_CHECK_FUNC(getpass, samba_cv_HAVE_GETPASS=yes)
-AC_CHECK_FUNC(getpassphrase, samba_cv_HAVE_GETPASSPHRASE=yes)
-if test x"$samba_cv_HAVE_GETPASS" = x"yes" -a x"$samba_cv_HAVE_GETPASSPHRASE" = x"yes"; then
+AC_CHECK_FUNC(getpass, libreplace_cv_HAVE_GETPASS=yes)
+AC_CHECK_FUNC(getpassphrase, libreplace_cv_HAVE_GETPASSPHRASE=yes)
+if test x"$libreplace_cv_HAVE_GETPASS" = x"yes" -a x"$libreplace_cv_HAVE_GETPASSPHRASE" = x"yes"; then
         AC_DEFINE(REPLACE_GETPASS_BY_GETPASSPHRASE, 1, [getpass returns <9 chars where getpassphrase returns <265 chars])
        AC_DEFINE(REPLACE_GETPASS,1,[Whether getpass should be replaced])
        LIBREPLACEOBJ="${LIBREPLACEOBJ} getpass.o"
 else
 
-AC_CACHE_CHECK([whether getpass should be replaced],samba_cv_REPLACE_GETPASS,[
+AC_CACHE_CHECK([whether getpass should be replaced],libreplace_cv_REPLACE_GETPASS,[
 SAVE_CPPFLAGS="$CPPFLAGS"
 CPPFLAGS="$CPPFLAGS -I$libreplacedir/"
 AC_TRY_COMPILE([
 #include "confdefs.h"
 #define NO_CONFIG_H
 #include "$libreplacedir/getpass.c"
-],[],samba_cv_REPLACE_GETPASS=yes,samba_cv_REPLACE_GETPASS=no)
+],[],libreplace_cv_REPLACE_GETPASS=yes,libreplace_cv_REPLACE_GETPASS=no)
 CPPFLAGS="$SAVE_CPPFLAGS"
 ])
-if test x"$samba_cv_REPLACE_GETPASS" = x"yes"; then
+if test x"$libreplace_cv_REPLACE_GETPASS" = x"yes"; then
        AC_DEFINE(REPLACE_GETPASS,1,[Whether getpass should be replaced])
        LIBREPLACEOBJ="${LIBREPLACEOBJ} getpass.o"
 fi
index 6d1d6b8afc23e15194e71468b723d3393714ad77..2e0cd34f4ac6d5ac0d917713289c66c29ed30038 100644 (file)
@@ -85,10 +85,10 @@ AC_INCLUDES_DEFAULT
 #endif]
 )
 
-AC_CACHE_CHECK([for working mmap],samba_cv_HAVE_MMAP,[
+AC_CACHE_CHECK([for working mmap],libreplace_cv_HAVE_MMAP,[
 AC_TRY_RUN([#include "$libreplacedir/test/shared_mmap.c"],
-           samba_cv_HAVE_MMAP=yes,samba_cv_HAVE_MMAP=no,samba_cv_HAVE_MMAP=cross)])
-if test x"$samba_cv_HAVE_MMAP" = x"yes"; then
+           libreplace_cv_HAVE_MMAP=yes,libreplace_cv_HAVE_MMAP=no,libreplace_cv_HAVE_MMAP=cross)])
+if test x"$libreplace_cv_HAVE_MMAP" = x"yes"; then
     AC_DEFINE(HAVE_MMAP,1,[Whether mmap works])
 fi
 
@@ -120,7 +120,7 @@ if test x"$libreplace_cv_USABLE_NET_IF_H" = x"yes";then
        AC_DEFINE(HAVE_NET_IF_H, 1, usability of net/if.h)
 fi
 
-AC_CACHE_CHECK([for broken inet_ntoa],samba_cv_REPLACE_INET_NTOA,[
+AC_CACHE_CHECK([for broken inet_ntoa],libreplace_cv_REPLACE_INET_NTOA,[
 AC_TRY_RUN([
 #include <stdio.h>
 #include <unistd.h>
@@ -133,8 +133,8 @@ main() { struct in_addr ip; ip.s_addr = 0x12345678;
 if (strcmp(inet_ntoa(ip),"18.52.86.120") &&
     strcmp(inet_ntoa(ip),"120.86.52.18")) { exit(0); } 
 exit(1);}],
-           samba_cv_REPLACE_INET_NTOA=yes,samba_cv_REPLACE_INET_NTOA=no,samba_cv_REPLACE_INET_NTOA=cross)])
-if test x"$samba_cv_REPLACE_INET_NTOA" = x"yes"; then
+           libreplace_cv_REPLACE_INET_NTOA=yes,libreplace_cv_REPLACE_INET_NTOA=no,libreplace_cv_REPLACE_INET_NTOA=cross)])
+if test x"$libreplace_cv_REPLACE_INET_NTOA" = x"yes"; then
     AC_DEFINE(REPLACE_INET_NTOA,1,[Whether inet_ntoa should be replaced])
 fi
 
@@ -182,7 +182,7 @@ AC_HAVE_DECL(setresuid, [#include <unistd.h>])
 AC_HAVE_DECL(setresgid, [#include <unistd.h>])
 AC_HAVE_DECL(errno, [#include <errno.h>])
 
-AC_CACHE_CHECK([for secure mkstemp],samba_cv_HAVE_SECURE_MKSTEMP,[
+AC_CACHE_CHECK([for secure mkstemp],libreplace_cv_HAVE_SECURE_MKSTEMP,[
 AC_TRY_RUN([#include <stdlib.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -197,10 +197,10 @@ main() {
   if ((st.st_mode & 0777) != 0600) exit(1);
   exit(0);
 }],
-samba_cv_HAVE_SECURE_MKSTEMP=yes,
-samba_cv_HAVE_SECURE_MKSTEMP=no,
-samba_cv_HAVE_SECURE_MKSTEMP=cross)])
-if test x"$samba_cv_HAVE_SECURE_MKSTEMP" = x"yes"; then
+libreplace_cv_HAVE_SECURE_MKSTEMP=yes,
+libreplace_cv_HAVE_SECURE_MKSTEMP=no,
+libreplace_cv_HAVE_SECURE_MKSTEMP=cross)])
+if test x"$libreplace_cv_HAVE_SECURE_MKSTEMP" = x"yes"; then
     AC_DEFINE(HAVE_SECURE_MKSTEMP,1,[Whether mkstemp is secure])
 fi
 
@@ -209,7 +209,7 @@ AC_CHECK_HEADERS(stdio.h strings.h)
 AC_CHECK_DECLS([snprintf, vsnprintf, asprintf, vasprintf])
 AC_CHECK_FUNCS(snprintf vsnprintf asprintf vasprintf)
 
-AC_CACHE_CHECK([for C99 vsnprintf],samba_cv_HAVE_C99_VSNPRINTF,[
+AC_CACHE_CHECK([for C99 vsnprintf],libreplace_cv_HAVE_C99_VSNPRINTF,[
 AC_TRY_RUN([
 #include <sys/types.h>
 #include <stdio.h>
@@ -243,43 +243,43 @@ void foo(const char *format, ...) {
 }
 main() { foo("hello"); }
 ],
-samba_cv_HAVE_C99_VSNPRINTF=yes,samba_cv_HAVE_C99_VSNPRINTF=no,samba_cv_HAVE_C99_VSNPRINTF=cross)])
-if test x"$samba_cv_HAVE_C99_VSNPRINTF" = x"yes"; then
+libreplace_cv_HAVE_C99_VSNPRINTF=yes,libreplace_cv_HAVE_C99_VSNPRINTF=no,libreplace_cv_HAVE_C99_VSNPRINTF=cross)])
+if test x"$libreplace_cv_HAVE_C99_VSNPRINTF" = x"yes"; then
     AC_DEFINE(HAVE_C99_VSNPRINTF,1,[Whether there is a C99 compliant vsnprintf])
 fi
 
 
 dnl VA_COPY
-AC_CACHE_CHECK([for va_copy],samba_cv_HAVE_VA_COPY,[
+AC_CACHE_CHECK([for va_copy],libreplace_cv_HAVE_VA_COPY,[
 AC_TRY_LINK([#include <stdarg.h>
 va_list ap1,ap2;], [va_copy(ap1,ap2);],
-samba_cv_HAVE_VA_COPY=yes,samba_cv_HAVE_VA_COPY=no)])
-if test x"$samba_cv_HAVE_VA_COPY" = x"yes"; then
+libreplace_cv_HAVE_VA_COPY=yes,libreplace_cv_HAVE_VA_COPY=no)])
+if test x"$libreplace_cv_HAVE_VA_COPY" = x"yes"; then
     AC_DEFINE(HAVE_VA_COPY,1,[Whether va_copy() is available])
 fi
 
-if test x"$samba_cv_HAVE_VA_COPY" != x"yes"; then
-AC_CACHE_CHECK([for __va_copy],samba_cv_HAVE___VA_COPY,[
+if test x"$libreplace_cv_HAVE_VA_COPY" != x"yes"; then
+AC_CACHE_CHECK([for __va_copy],libreplace_cv_HAVE___VA_COPY,[
 AC_TRY_LINK([#include <stdarg.h>
 va_list ap1,ap2;], [__va_copy(ap1,ap2);],
-samba_cv_HAVE___VA_COPY=yes,samba_cv_HAVE___VA_COPY=no)])
-if test x"$samba_cv_HAVE___VA_COPY" = x"yes"; then
+libreplace_cv_HAVE___VA_COPY=yes,libreplace_cv_HAVE___VA_COPY=no)])
+if test x"$libreplace_cv_HAVE___VA_COPY" = x"yes"; then
     AC_DEFINE(HAVE___VA_COPY,1,[Whether __va_copy() is available])
 fi
 fi
 
 dnl __FUNCTION__ macro
-AC_CACHE_CHECK([for __FUNCTION__ macro],samba_cv_HAVE_FUNCTION_MACRO,[
+AC_CACHE_CHECK([for __FUNCTION__ macro],libreplace_cv_HAVE_FUNCTION_MACRO,[
 AC_TRY_COMPILE([#include <stdio.h>], [printf("%s\n", __FUNCTION__);],
-samba_cv_HAVE_FUNCTION_MACRO=yes,samba_cv_HAVE_FUNCTION_MACRO=no)])
-if test x"$samba_cv_HAVE_FUNCTION_MACRO" = x"yes"; then
+libreplace_cv_HAVE_FUNCTION_MACRO=yes,libreplace_cv_HAVE_FUNCTION_MACRO=no)])
+if test x"$libreplace_cv_HAVE_FUNCTION_MACRO" = x"yes"; then
     AC_DEFINE(HAVE_FUNCTION_MACRO,1,[Whether there is a __FUNCTION__ macro])
 else
     dnl __func__ macro
-    AC_CACHE_CHECK([for __func__ macro],samba_cv_HAVE_func_MACRO,[
+    AC_CACHE_CHECK([for __func__ macro],libreplace_cv_HAVE_func_MACRO,[
     AC_TRY_COMPILE([#include <stdio.h>], [printf("%s\n", __func__);],
-    samba_cv_HAVE_func_MACRO=yes,samba_cv_HAVE_func_MACRO=no)])
-    if test x"$samba_cv_HAVE_func_MACRO" = x"yes"; then
+    libreplace_cv_HAVE_func_MACRO=yes,libreplace_cv_HAVE_func_MACRO=no)])
+    if test x"$libreplace_cv_HAVE_func_MACRO" = x"yes"; then
        AC_DEFINE(HAVE_func_MACRO,1,[Whether there is a __func__ macro])
     fi
 fi
@@ -302,7 +302,7 @@ eprintf("bla", "bar");
 ], AC_DEFINE(HAVE__VA_ARGS__MACRO, 1, [Whether the __VA_ARGS__ macro is available]))
 
 
-AC_CACHE_CHECK([for sig_atomic_t type],samba_cv_sig_atomic_t, [
+AC_CACHE_CHECK([for sig_atomic_t type],libreplace_cv_sig_atomic_t, [
     AC_TRY_COMPILE([
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -310,30 +310,30 @@ AC_CACHE_CHECK([for sig_atomic_t type],samba_cv_sig_atomic_t, [
 #include <stddef.h>
 #endif
 #include <signal.h>],[sig_atomic_t i = 0],
-       samba_cv_sig_atomic_t=yes,samba_cv_sig_atomic_t=no)])
-if test x"$samba_cv_sig_atomic_t" = x"yes"; then
+       libreplace_cv_sig_atomic_t=yes,libreplace_cv_sig_atomic_t=no)])
+if test x"$libreplace_cv_sig_atomic_t" = x"yes"; then
    AC_DEFINE(HAVE_SIG_ATOMIC_T_TYPE,1,[Whether we have the atomic_t variable type])
 fi
 
 
-AC_CACHE_CHECK([for O_DIRECT flag to open(2)],samba_cv_HAVE_OPEN_O_DIRECT,[
+AC_CACHE_CHECK([for O_DIRECT flag to open(2)],libreplace_cv_HAVE_OPEN_O_DIRECT,[
 AC_TRY_COMPILE([
 #include <unistd.h>
 #ifdef HAVE_FCNTL_H
 #include <fcntl.h>
 #endif],
 [int fd = open("/dev/null", O_DIRECT);],
-samba_cv_HAVE_OPEN_O_DIRECT=yes,samba_cv_HAVE_OPEN_O_DIRECT=no)])
-if test x"$samba_cv_HAVE_OPEN_O_DIRECT" = x"yes"; then
+libreplace_cv_HAVE_OPEN_O_DIRECT=yes,libreplace_cv_HAVE_OPEN_O_DIRECT=no)])
+if test x"$libreplace_cv_HAVE_OPEN_O_DIRECT" = x"yes"; then
     AC_DEFINE(HAVE_OPEN_O_DIRECT,1,[Whether the open(2) accepts O_DIRECT])
 fi
 
 
 dnl Check if the C compiler understands volatile (it should, being ANSI).
-AC_CACHE_CHECK([that the C compiler understands volatile],samba_cv_volatile, [
+AC_CACHE_CHECK([that the C compiler understands volatile],libreplace_cv_volatile, [
        AC_TRY_COMPILE([#include <sys/types.h>],[volatile int i = 0],
-               samba_cv_volatile=yes,samba_cv_volatile=no)])
-if test x"$samba_cv_volatile" = x"yes"; then
+               libreplace_cv_volatile=yes,libreplace_cv_volatile=no)])
+if test x"$libreplace_cv_volatile" = x"yes"; then
        AC_DEFINE(HAVE_VOLATILE, 1, [Whether the C compiler understands volatile])
 fi
 
index 2aec69896702500a159b858de2dcca4863a045e8..f0d10c1e3e334b9feef3b1680052a7599edc7212 100644 (file)
@@ -289,6 +289,9 @@ AC_DEFUN([AC_LIBREPLACE_RUNTIME_LIB_PATH_VAR],
                *linux*)
                        LIB_PATH_VAR=LD_LIBRARY_PATH
                ;;
+               *netbsd*)
+                       LIB_PATH_VAR=LD_LIBRARY_PATH
+               ;;
                *solaris*)
                        LIB_PATH_VAR=LD_LIBRARY_PATH
                ;;
index 1c05733126d81c208b30435ce04c3ed6e77f8b89..66c2bd652a06f550a463d39b0b097f6ae9fa0b78 100644 (file)
@@ -18,7 +18,7 @@ AC_CHECK_HEADERS(sys/capability.h)
 
 case "$host_os" in
 *linux*)
-AC_CACHE_CHECK([for broken RedHat 7.2 system header files],samba_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS,[
+AC_CACHE_CHECK([for broken RedHat 7.2 system header files],libreplace_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS,[
 AC_TRY_COMPILE([
        #ifdef HAVE_SYS_VFS_H
        #include <sys/vfs.h>
@@ -29,14 +29,14 @@ AC_TRY_COMPILE([
        ],[
        int i;
        ],
-       samba_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS=no,
-       samba_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS=yes
+       libreplace_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS=no,
+       libreplace_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS=yes
 )])
-if test x"$samba_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS" = x"yes"; then
+if test x"$libreplace_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS" = x"yes"; then
        AC_DEFINE(BROKEN_REDHAT_7_SYSTEM_HEADERS,1,[Broken RedHat 7.2 system header files])
 fi
 
-AC_CACHE_CHECK([for broken RHEL5 sys/capability.h],samba_cv_BROKEN_RHEL5_SYS_CAP_HEADER,[
+AC_CACHE_CHECK([for broken RHEL5 sys/capability.h],libreplace_cv_BROKEN_RHEL5_SYS_CAP_HEADER,[
 AC_TRY_COMPILE([
        #ifdef HAVE_SYS_CAPABILITY_H
        #include <sys/capability.h>
@@ -45,10 +45,10 @@ AC_TRY_COMPILE([
        ],[
        __s8 i;
        ],
-       samba_cv_BROKEN_RHEL5_SYS_CAP_HEADER=no,
-       samba_cv_BROKEN_RHEL5_SYS_CAP_HEADER=yes
+       libreplace_cv_BROKEN_RHEL5_SYS_CAP_HEADER=no,
+       libreplace_cv_BROKEN_RHEL5_SYS_CAP_HEADER=yes
 )])
-if test x"$samba_cv_BROKEN_RHEL5_SYS_CAP_HEADER" = x"yes"; then
+if test x"$libreplace_cv_BROKEN_RHEL5_SYS_CAP_HEADER" = x"yes"; then
        AC_DEFINE(BROKEN_RHEL5_SYS_CAP_HEADER,1,[Broken RHEL5 sys/capability.h])
 fi
 ;;
index 53bef66d482a8e756076c502e6d481b96a486dc2..d09e3f71f8d5b3511484edbb3fbbcde546cb0133 100644 (file)
@@ -163,8 +163,15 @@ void rep_freeifaddrs(struct ifaddrs *);
 #endif
 
 #ifndef AI_ADDRCONFIG
+/*
+ * logic copied from AI_NUMERICHOST
+ */
+#if defined(HAVE_STRUCT_ADDRINFO) && defined(HAVE_GETADDRINFO)
+#define AI_ADDRCONFIG  0
+#else
 #define AI_ADDRCONFIG  0x0020
 #endif
+#endif
 
 #ifndef AI_NUMERICSERV
 /*
index e61b6d82fccd3a0ad3bd625ed5b00c42ca439384..bca0aab9249d253de0804cc1eb9909f86663f593 100644 (file)
@@ -540,7 +540,7 @@ static const struct socket_ops ipv4_ops = {
        .fn_get_fd              = ip_get_fd
 };
 
-const struct socket_ops *socket_ipv4_ops(enum socket_type type)
+_PUBLIC_ const struct socket_ops *socket_ipv4_ops(enum socket_type type)
 {
        return &ipv4_ops;
 }
@@ -977,7 +977,7 @@ static const struct socket_ops ipv6_tcp_ops = {
        .fn_get_fd              = ip_get_fd
 };
 
-const struct socket_ops *socket_ipv6_ops(enum socket_type type)
+_PUBLIC_ const struct socket_ops *socket_ipv6_ops(enum socket_type type)
 {
        return &ipv6_tcp_ops;
 }
index cac4b8e913663c1e183b7db996ced7d0dba00907..af7d2bb79ff66da79d18d96f3b0ebccfae05c5be 100644 (file)
@@ -414,7 +414,7 @@ static const struct socket_ops unixdom_ops = {
        .fn_get_fd              = unixdom_get_fd
 };
 
-const struct socket_ops *socket_unixdom_ops(enum socket_type type)
+_PUBLIC_ const struct socket_ops *socket_unixdom_ops(enum socket_type type)
 {
        return &unixdom_ops;
 }
index f3ffb895a90600a1dd58956c417c405316aab2e9..8ff91075bb5ecbaafefb6726e1123c4269e65168 100644 (file)
@@ -20,3 +20,10 @@ fi
 AC_SUBST(DEFAULT_TEST_OPTIONS)
 AC_SUBST(HAVE_SOCKET_WRAPPER)
 AC_SUBST(SOCKET_WRAPPER_OBJS)
+
+# Look for the vdeplug library
+AC_CHECK_HEADERS(libvdeplug.h)
+if test x"$ac_cv_header_libvdeplug_h" = xyes; then
+       AC_DEFINE(HAVE_VDEPLUG, 1, [Whether the VDE plug library is available])
+       SMB_EXT_LIB(VDEPLUG,[-lvdeplug],[],[],[])
+fi
index 574d8ec5e4ffdacd2fe05e808879f5144647824c..644365a66599d77362f6c6f7c2eb2783772a4bdf 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) Jelmer Vernooij 2005 <jelmer@samba.org>
+ * Copyright (C) Jelmer Vernooij 2005,2008 <jelmer@samba.org>
  * Copyright (C) Stefan Metzmacher 2006 <metze@samba.org>
  *
  * All rights reserved.
@@ -212,7 +212,6 @@ struct socket_info
 
 static struct socket_info *sockets;
 
-
 const char *socket_wrapper_dir(void)
 {
        const char *s = getenv("SOCKET_WRAPPER_DIR");
@@ -908,40 +907,31 @@ static int swrap_get_pcap_fd(const char *fname)
        return fd;
 }
 
-static void swrap_dump_packet(struct socket_info *si, const struct sockaddr *addr,
-                             enum swrap_packet_type type,
-                             const void *buf, size_t len)
+static struct swrap_packet *swrap_marshall_packet(struct socket_info *si,
+                                                                 const struct sockaddr *addr,
+                                                                 enum swrap_packet_type type,
+                                                                 const void *buf, size_t len,
+                                                                 size_t *packet_len)
 {
        const struct sockaddr_in *src_addr;
        const struct sockaddr_in *dest_addr;
-       const char *file_name;
        unsigned long tcp_seq = 0;
        unsigned long tcp_ack = 0;
        unsigned char tcp_ctl = 0;
        int unreachable = 0;
-       struct timeval tv;
-       struct swrap_packet *packet;
-       size_t packet_len = 0;
-       int fd;
 
-       file_name = socket_wrapper_pcap_file();
-       if (!file_name) {
-               return;
-       }
+       struct timeval tv;
 
        switch (si->family) {
        case AF_INET:
-#ifdef HAVE_IPV6
-       case AF_INET6:
-#endif
                break;
        default:
-               return;
+               return NULL;
        }
 
        switch (type) {
        case SWRAP_CONNECT_SEND:
-               if (si->type != SOCK_STREAM) return;
+               if (si->type != SOCK_STREAM) return NULL;
 
                src_addr = (const struct sockaddr_in *)si->myname;
                dest_addr = (const struct sockaddr_in *)addr;
@@ -955,7 +945,7 @@ static void swrap_dump_packet(struct socket_info *si, const struct sockaddr *add
                break;
 
        case SWRAP_CONNECT_RECV:
-               if (si->type != SOCK_STREAM) return;
+               if (si->type != SOCK_STREAM) return NULL;
 
                dest_addr = (const struct sockaddr_in *)si->myname;
                src_addr = (const struct sockaddr_in *)addr;
@@ -969,7 +959,7 @@ static void swrap_dump_packet(struct socket_info *si, const struct sockaddr *add
                break;
 
        case SWRAP_CONNECT_UNREACH:
-               if (si->type != SOCK_STREAM) return;
+               if (si->type != SOCK_STREAM) return NULL;
 
                dest_addr = (const struct sockaddr_in *)si->myname;
                src_addr = (const struct sockaddr_in *)addr;
@@ -983,7 +973,7 @@ static void swrap_dump_packet(struct socket_info *si, const struct sockaddr *add
                break;
 
        case SWRAP_CONNECT_ACK:
-               if (si->type != SOCK_STREAM) return;
+               if (si->type != SOCK_STREAM) return NULL;
 
                src_addr = (const struct sockaddr_in *)si->myname;
                dest_addr = (const struct sockaddr_in *)addr;
@@ -995,7 +985,7 @@ static void swrap_dump_packet(struct socket_info *si, const struct sockaddr *add
                break;
 
        case SWRAP_ACCEPT_SEND:
-               if (si->type != SOCK_STREAM) return;
+               if (si->type != SOCK_STREAM) return NULL;
 
                dest_addr = (const struct sockaddr_in *)si->myname;
                src_addr = (const struct sockaddr_in *)addr;
@@ -1009,7 +999,7 @@ static void swrap_dump_packet(struct socket_info *si, const struct sockaddr *add
                break;
 
        case SWRAP_ACCEPT_RECV:
-               if (si->type != SOCK_STREAM) return;
+               if (si->type != SOCK_STREAM) return NULL;
 
                src_addr = (const struct sockaddr_in *)si->myname;
                dest_addr = (const struct sockaddr_in *)addr;
@@ -1023,7 +1013,7 @@ static void swrap_dump_packet(struct socket_info *si, const struct sockaddr *add
                break;
 
        case SWRAP_ACCEPT_ACK:
-               if (si->type != SOCK_STREAM) return;
+               if (si->type != SOCK_STREAM) return NULL;
 
                dest_addr = (const struct sockaddr_in *)si->myname;
                src_addr = (const struct sockaddr_in *)addr;
@@ -1051,10 +1041,9 @@ static void swrap_dump_packet(struct socket_info *si, const struct sockaddr *add
                src_addr = (const struct sockaddr_in *)si->peername;
 
                if (si->type == SOCK_DGRAM) {
-                       swrap_dump_packet(si, si->peername,
+                       return swrap_marshall_packet(si, si->peername,
                                          SWRAP_SENDTO_UNREACH,
-                                         buf, len);
-                       return;
+                                         buf, len, packet_len);
                }
 
                tcp_seq = si->io.pck_rcv;
@@ -1068,7 +1057,7 @@ static void swrap_dump_packet(struct socket_info *si, const struct sockaddr *add
                src_addr = (const struct sockaddr_in *)si->peername;
 
                if (si->type == SOCK_DGRAM) {
-                       return;
+                       return NULL;
                }
 
                tcp_seq = si->io.pck_rcv;
@@ -1094,7 +1083,7 @@ static void swrap_dump_packet(struct socket_info *si, const struct sockaddr *add
                src_addr = (const struct sockaddr_in *)si->peername;
 
                if (si->type == SOCK_DGRAM) {
-                       return;
+                       return NULL;
                }
 
                tcp_seq = si->io.pck_rcv;
@@ -1128,7 +1117,7 @@ static void swrap_dump_packet(struct socket_info *si, const struct sockaddr *add
                break;
 
        case SWRAP_CLOSE_SEND:
-               if (si->type != SOCK_STREAM) return;
+               if (si->type != SOCK_STREAM) return NULL;
 
                src_addr = (const struct sockaddr_in *)si->myname;
                dest_addr = (const struct sockaddr_in *)si->peername;
@@ -1142,7 +1131,7 @@ static void swrap_dump_packet(struct socket_info *si, const struct sockaddr *add
                break;
 
        case SWRAP_CLOSE_RECV:
-               if (si->type != SOCK_STREAM) return;
+               if (si->type != SOCK_STREAM) return NULL;
 
                dest_addr = (const struct sockaddr_in *)si->myname;
                src_addr = (const struct sockaddr_in *)si->peername;
@@ -1156,7 +1145,7 @@ static void swrap_dump_packet(struct socket_info *si, const struct sockaddr *add
                break;
 
        case SWRAP_CLOSE_ACK:
-               if (si->type != SOCK_STREAM) return;
+               if (si->type != SOCK_STREAM) return NULL;
 
                src_addr = (const struct sockaddr_in *)si->myname;
                dest_addr = (const struct sockaddr_in *)si->peername;
@@ -1167,15 +1156,33 @@ static void swrap_dump_packet(struct socket_info *si, const struct sockaddr *add
 
                break;
        default:
-               return;
+               return NULL;
        }
 
        swrapGetTimeOfDay(&tv);
 
-       packet = swrap_packet_init(&tv, src_addr, dest_addr, si->type,
+       return swrap_packet_init(&tv, src_addr, dest_addr, si->type,
                                   (const unsigned char *)buf, len,
                                   tcp_seq, tcp_ack, tcp_ctl, unreachable,
-                                  &packet_len);
+                                  packet_len);
+}
+
+static void swrap_dump_packet(struct socket_info *si, 
+                                                         const struct sockaddr *addr,
+                                                         enum swrap_packet_type type,
+                                                         const void *buf, size_t len)
+{
+       const char *file_name;
+       struct swrap_packet *packet;
+       size_t packet_len = 0;
+       int fd;
+
+       file_name = socket_wrapper_pcap_file();
+       if (!file_name) {
+               return;
+       }
+
+       packet = swrap_marshall_packet(si, addr, type, buf, len, &packet_len);
        if (!packet) {
                return;
        }
index e53e8960a86e0f44596783e22632a3c111f8bc79..628030ad4cd5f72b62314d5341e6a0be4c2ee9c6 100644 (file)
@@ -24,19 +24,20 @@ bugzilla</a> bug tracking system.
 
 <h2>Download</h2>
 
-You can download the latest release either via rsync or anonymous
-svn. To fetch via svn use the following command:
+You can download the latest release either via rsync or git.
+To fetch via git use the following command:
 
 <pre>
-  svn co svn://svnanon.samba.org/samba/branches/SAMBA_4_0/source/lib/talloc talloc
-  svn co svn://svnanon.samba.org/samba/branches/SAMBA_4_0/source/lib/replace libreplace
+  git-clone git://git.samba.org/samba.git samba
+  cd samba
+  git checkout -b samba4 origin/v4-0-test
 </pre>
 
 To fetch via rsync use this command:
 
 <pre>
-  rsync -Pavz samba.org::ftp/unpacked/samba4/source/lib/talloc .
-  rsync -Pavz samba.org::ftp/unpacked/samba4/source/lib/libreplace .
+  rsync -Pavz samba.org::ftp/unpacked/samba_4_0_test/source/lib/talloc .
+  rsync -Pavz samba.org::ftp/unpacked/samba_4_0_test/source/lib/libreplace .
 </pre>
 
 <hr>
index f75cac9810ced35160bab17f03e6a6d3808bcb08..2ad099174d82a6fa623e0295be39a7aea6a283d7 100644 (file)
@@ -154,7 +154,7 @@ NTSTATUS tdr_pull_charset(struct tdr_pull *tdr, TALLOC_CTX *ctx, const char **v,
 
        TDR_PULL_NEED_BYTES(tdr, el_size*length);
        
-       ret = convert_string_talloc(ctx, lp_iconv_convenience(global_loadparm), chset, CH_UNIX, tdr->data.data+tdr->offset, el_size*length, discard_const_p(void *, v));
+       ret = convert_string_talloc(ctx, tdr->iconv_convenience, chset, CH_UNIX, tdr->data.data+tdr->offset, el_size*length, discard_const_p(void *, v));
 
        if (ret == -1) {
                return NT_STATUS_INVALID_PARAMETER;
index 8f6c4f5d8acce1f0537647129c7696dcc1177602..f64b272a674e12b44916b5eda69df06238cd5a99 100644 (file)
 /** Feel free to add definitions for other compilers here. */
 #endif
 
-#ifndef _PUBLIC_
 #ifdef HAVE_VISIBILITY_ATTR
 #  define _PUBLIC_ __attribute__((visibility("default")))
 #else
 #  define _PUBLIC_
 #endif
-#endif
 
 #ifndef _DEPRECATED_
 #if (__GNUC__ >= 3) && (__GNUC_MINOR__ >= 1 )
index 1fb57b07a49be9ab5fcbb6c504c6cd0ae4acdc37..5e04ec1f4bb2c749ed9e91c941cad33001f1183c 100644 (file)
@@ -64,8 +64,9 @@ static int ms_fnmatch_core(const char *p, const char *n,
        codepoint_t c, c2;
        int i;
        size_t size, size_n;
+       struct smb_iconv_convenience *iconv_convenience = lp_iconv_convenience(global_loadparm);
 
-       while ((c = next_codepoint(lp_iconv_convenience(global_loadparm), p, &size))) {
+       while ((c = next_codepoint(iconv_convenience, p, &size))) {
                p += size;
 
                switch (c) {
@@ -75,7 +76,7 @@ static int ms_fnmatch_core(const char *p, const char *n,
                                return null_match(p);
                        }
                        for (i=0; n[i]; i += size_n) {
-                               next_codepoint(lp_iconv_convenience(global_loadparm), n+i, &size_n);
+                               next_codepoint(iconv_convenience, n+i, &size_n);
                                if (ms_fnmatch_core(p, n+i, max_n+1, ldot) == 0) {
                                        return 0;
                                }
@@ -94,7 +95,7 @@ static int ms_fnmatch_core(const char *p, const char *n,
                                return -1;
                        }
                        for (i=0; n[i]; i += size_n) {
-                               next_codepoint(lp_iconv_convenience(global_loadparm), n+i, &size_n);
+                               next_codepoint(iconv_convenience, n+i, &size_n);
                                if (ms_fnmatch_core(p, n+i, max_n+1, ldot) == 0) return 0;
                                if (n+i == ldot) {
                                        if (ms_fnmatch_core(p, n+i+size_n, max_n+1, ldot) == 0) return 0;
@@ -110,7 +111,7 @@ static int ms_fnmatch_core(const char *p, const char *n,
                        if (! *n) {
                                return -1;
                        }
-                       next_codepoint(lp_iconv_convenience(global_loadparm), n, &size_n);
+                       next_codepoint(iconv_convenience, n, &size_n);
                        n += size_n;
                        break;
 
@@ -124,7 +125,7 @@ static int ms_fnmatch_core(const char *p, const char *n,
                                break;
                        }
                        if (! *n) return null_match(p);
-                       next_codepoint(lp_iconv_convenience(global_loadparm), n, &size_n);
+                       next_codepoint(iconv_convenience, n, &size_n);
                        n += size_n;
                        break;
 
@@ -134,12 +135,12 @@ static int ms_fnmatch_core(const char *p, const char *n,
                                return 0;
                        }
                        if (*n != '.') return -1;
-                       next_codepoint(lp_iconv_convenience(global_loadparm), n, &size_n);
+                       next_codepoint(iconv_convenience, n, &size_n);
                        n += size_n;
                        break;
 
                default:
-                       c2 = next_codepoint(lp_iconv_convenience(global_loadparm), n, &size_n);
+                       c2 = next_codepoint(iconv_convenience, n, &size_n);
                        if (c != c2 && codepoint_cmpi(c, c2) != 0) {
                                return -1;
                        }
index 9e106052f24f3b8eb493f094dd20c0c214945920..550b60c625c35f8adc9d2d0c22ace91b4f060115 100644 (file)
@@ -21,6 +21,8 @@
 #ifndef _SAMBA_UTIL_H_
 #define _SAMBA_UTIL_H_
 
+#include "util/attr.h"
+
 #include "charset/charset.h"
 
 /* for TALLOC_CTX */
@@ -36,7 +38,6 @@ struct smbsrv_tcon;
 extern const char *logfile;
 extern const char *panic_action;
 
-#include "util/attr.h"
 #include "util/time.h"
 #include "util/data_blob.h"
 #include "util/xfile.h"
index 4ccf568d8c0220248ac87d4104ee27e754468942..cefb55e20503b0956679076f7dcf2f8a6c30f1f5 100644 (file)
@@ -100,7 +100,7 @@ _PUBLIC_ bool E_deshash(const char *passwd, uint8_t p16[16])
        /* Password must be converted to DOS charset - null terminated, uppercase. */
        push_string(lp_iconv_convenience(global_loadparm), dospwd, passwd, sizeof(dospwd), STR_ASCII|STR_UPPER|STR_TERMINATE);
 
-       /* Only the fisrt 14 chars are considered, password need not be null terminated. */
+       /* Only the first 14 chars are considered, password need not be null terminated. */
        E_P16((const uint8_t *)dospwd, p16);
 
        if (strlen(dospwd) > 14) {
@@ -125,6 +125,8 @@ bool ntv2_owf_gen(const uint8_t owf[16],
 
        HMACMD5Context ctx;
        TALLOC_CTX *mem_ctx = talloc_init("ntv2_owf_gen for %s\\%s", domain_in, user_in); 
+       struct smb_iconv_convenience *iconv_convenience = lp_iconv_convenience(global_loadparm);
+
        if (!mem_ctx) {
                return false;
        }
@@ -151,14 +153,14 @@ bool ntv2_owf_gen(const uint8_t owf[16],
                }
        }
 
-       user_byte_len = push_ucs2_talloc(mem_ctx, lp_iconv_convenience(global_loadparm), &user, user_in);
+       user_byte_len = push_ucs2_talloc(mem_ctx, iconv_convenience, &user, user_in);
        if (user_byte_len == (ssize_t)-1) {
                DEBUG(0, ("push_uss2_talloc() for user returned -1 (probably talloc() failure)\n"));
                talloc_free(mem_ctx);
                return false;
        }
 
-       domain_byte_len = push_ucs2_talloc(mem_ctx, lp_iconv_convenience(global_loadparm), &domain, domain_in);
+       domain_byte_len = push_ucs2_talloc(mem_ctx, iconv_convenience, &domain, domain_in);
        if (domain_byte_len == (ssize_t)-1) {
                DEBUG(0, ("push_ucs2_talloc() for domain returned -1 (probably talloc() failure)\n"));
                talloc_free(mem_ctx);
@@ -294,12 +296,13 @@ void SMBsesskeygen_lm_sess_key(const uint8_t lm_hash[16],
 }
 
 DATA_BLOB NTLMv2_generate_names_blob(TALLOC_CTX *mem_ctx, 
+                                    struct smb_iconv_convenience *iconv_convenience,
                                     const char *hostname, 
                                     const char *domain)
 {
        DATA_BLOB names_blob = data_blob_talloc(mem_ctx, NULL, 0);
        
-       msrpc_gen(mem_ctx, lp_iconv_convenience(global_loadparm), &names_blob, 
+       msrpc_gen(mem_ctx, iconv_convenience, &names_blob, 
                  "aaa", 
                  NTLMSSP_NAME_TYPE_DOMAIN, domain,
                  NTLMSSP_NAME_TYPE_SERVER, hostname,
index eb19555d152e2b8d3de3254a141bbe74393a807d..14d82786359cac4f2787f98efec120dceb8a23d3 100644 (file)
@@ -38,7 +38,7 @@ NTSTATUS dgram_mailslot_browse_send(struct nbt_dgram_socket *dgmsock,
        DATA_BLOB blob;
        TALLOC_CTX *tmp_ctx = talloc_new(dgmsock);
 
-       ndr_err = ndr_push_struct_blob(&blob, tmp_ctx, lp_iconv_convenience(global_loadparm), request,
+       ndr_err = ndr_push_struct_blob(&blob, tmp_ctx, dgmsock->iconv_convenience, request,
                                      (ndr_push_flags_fn_t)ndr_push_nbt_browse_packet);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                talloc_free(tmp_ctx);
@@ -66,7 +66,7 @@ NTSTATUS dgram_mailslot_browse_reply(struct nbt_dgram_socket *dgmsock,
        struct nbt_name myname;
        struct socket_address *dest;
 
-       ndr_err = ndr_push_struct_blob(&blob, tmp_ctx, lp_iconv_convenience(global_loadparm), reply,
+       ndr_err = ndr_push_struct_blob(&blob, tmp_ctx, dgmsock->iconv_convenience, reply,
                                      (ndr_push_flags_fn_t)ndr_push_nbt_browse_packet);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                talloc_free(tmp_ctx);
@@ -99,7 +99,7 @@ NTSTATUS dgram_mailslot_browse_parse(struct dgram_mailslot_handler *dgmslot,
        DATA_BLOB data = dgram_mailslot_data(dgram);
        enum ndr_err_code ndr_err;
 
-       ndr_err = ndr_pull_struct_blob(&data, mem_ctx, lp_iconv_convenience(global_loadparm), pkt,
+       ndr_err = ndr_pull_struct_blob(&data, mem_ctx, dgmslot->dgmsock->iconv_convenience, pkt,
                                      (ndr_pull_flags_fn_t)ndr_pull_nbt_browse_packet);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
index 032d9de67bc05a6d6a94b0dd9eedd320d2be2d25..7d6f5627c518343ad748a466ff885d15cd023ffb 100644 (file)
@@ -72,7 +72,7 @@ static void dgm_socket_recv(struct nbt_dgram_socket *dgmsock)
        }
 
        /* parse the request */
-       ndr_err = ndr_pull_struct_blob(&blob, packet, lp_iconv_convenience(global_loadparm), packet,
+       ndr_err = ndr_pull_struct_blob(&blob, packet, dgmsock->iconv_convenience, packet,
                                      (ndr_pull_flags_fn_t)ndr_pull_nbt_dgram_packet);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                status = ndr_map_error2ntstatus(ndr_err);
@@ -187,6 +187,7 @@ struct nbt_dgram_socket *nbt_dgram_socket_init(TALLOC_CTX *mem_ctx,
        dgmsock->send_queue = NULL;
        dgmsock->incoming.handler = NULL;
        dgmsock->mailslot_handlers = NULL;
+       dgmsock->iconv_convenience = lp_iconv_convenience(global_loadparm);
        
        return dgmsock;
 
@@ -229,7 +230,7 @@ NTSTATUS nbt_dgram_send(struct nbt_dgram_socket *dgmsock,
        req->dest = dest;
        if (talloc_reference(req, dest) == NULL) goto failed;
 
-       ndr_err = ndr_push_struct_blob(&req->encoded, req, lp_iconv_convenience(global_loadparm), packet,
+       ndr_err = ndr_push_struct_blob(&req->encoded, req, dgmsock->iconv_convenience, packet,
                                      (ndr_push_flags_fn_t)ndr_push_nbt_dgram_packet);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                status = ndr_map_error2ntstatus(ndr_err);
index 6d4cdb2bdfa77808e3ca84a582d7e3e3a9c4e93d..4645840971c3e36f9db776cb17d791d332097e80 100644 (file)
@@ -40,6 +40,7 @@ struct nbt_dgram_request {
 struct nbt_dgram_socket {
        struct socket_context *sock;
        struct event_context *event_ctx;
+       struct smb_iconv_convenience *iconv_convenience;
 
        /* the fd event */
        struct fd_event *fde;
index 670af4ea636ae6c5055bdcf69061e9e3de646522..5c7dedc7bb657202e234b5957b83d71520e2815a 100644 (file)
@@ -41,7 +41,7 @@ NTSTATUS dgram_mailslot_netlogon_send(struct nbt_dgram_socket *dgmsock,
        TALLOC_CTX *tmp_ctx = talloc_new(dgmsock);
 
        ndr_err = ndr_push_struct_blob(&blob, tmp_ctx, 
-                                      lp_iconv_convenience(global_loadparm),
+                                      dgmsock->iconv_convenience,
                                       request,
                                      (ndr_push_flags_fn_t)ndr_push_nbt_netlogon_packet);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
@@ -76,7 +76,7 @@ NTSTATUS dgram_mailslot_netlogon_reply(struct nbt_dgram_socket *dgmsock,
        struct socket_address *dest;
 
        ndr_err = ndr_push_struct_blob(&blob, tmp_ctx, 
-                                      lp_iconv_convenience(global_loadparm),
+                                      dgmsock->iconv_convenience,
                                       reply,
                                      (ndr_push_flags_fn_t)ndr_push_nbt_netlogon_packet);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
@@ -114,7 +114,7 @@ NTSTATUS dgram_mailslot_netlogon_parse(struct dgram_mailslot_handler *dgmslot,
        DATA_BLOB data = dgram_mailslot_data(dgram);
        enum ndr_err_code ndr_err;
 
-       ndr_err = ndr_pull_struct_blob(&data, mem_ctx, lp_iconv_convenience(global_loadparm), netlogon,
+       ndr_err = ndr_pull_struct_blob(&data, mem_ctx, dgmslot->dgmsock->iconv_convenience, netlogon,
                                      (ndr_pull_flags_fn_t)ndr_pull_nbt_netlogon_packet);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
index 98aad1af8c6c2dde0d37b55052eea1f5aae51eb2..7b26ed7c003073a44e563e81b97b5b73fe8d1120 100644 (file)
@@ -41,7 +41,7 @@ NTSTATUS dgram_mailslot_ntlogon_send(struct nbt_dgram_socket *dgmsock,
        DATA_BLOB blob;
        TALLOC_CTX *tmp_ctx = talloc_new(dgmsock);
 
-       ndr_err = ndr_push_struct_blob(&blob, tmp_ctx, lp_iconv_convenience(global_loadparm)
+       ndr_err = ndr_push_struct_blob(&blob, tmp_ctx, dgmsock->iconv_convenience
                                       request,
                                      (ndr_push_flags_fn_t)ndr_push_nbt_ntlogon_packet);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
@@ -75,7 +75,7 @@ NTSTATUS dgram_mailslot_ntlogon_reply(struct nbt_dgram_socket *dgmsock,
        struct nbt_name myname;
        struct socket_address *dest;
 
-       ndr_err = ndr_push_struct_blob(&blob, tmp_ctx, lp_iconv_convenience(global_loadparm), reply,
+       ndr_err = ndr_push_struct_blob(&blob, tmp_ctx, dgmsock->iconv_convenience, reply,
                                      (ndr_push_flags_fn_t)ndr_push_nbt_ntlogon_packet);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                talloc_free(tmp_ctx);
@@ -113,7 +113,7 @@ NTSTATUS dgram_mailslot_ntlogon_parse(struct dgram_mailslot_handler *dgmslot,
        DATA_BLOB data = dgram_mailslot_data(dgram);
        enum ndr_err_code ndr_err;
 
-       ndr_err = ndr_pull_struct_blob(&data, mem_ctx, lp_iconv_convenience(global_loadparm), ntlogon,
+       ndr_err = ndr_pull_struct_blob(&data, mem_ctx, dgmslot->dgmsock->iconv_convenience, ntlogon,
                                      (ndr_pull_flags_fn_t)ndr_pull_nbt_ntlogon_packet);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
index 142dad02961228a7846a949f3168f8b016aa159f..ae9f3f6b050fb156a82c2e47a40abc8a83d66c48 100644 (file)
@@ -381,11 +381,11 @@ _PUBLIC_ NTSTATUS nbt_name_dup(TALLOC_CTX *mem_ctx, struct nbt_name *name, struc
 /**
   push a nbt name into a blob
 */
-_PUBLIC_ NTSTATUS nbt_name_to_blob(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, struct nbt_name *name)
+_PUBLIC_ NTSTATUS nbt_name_to_blob(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, DATA_BLOB *blob, struct nbt_name *name)
 {
        enum ndr_err_code ndr_err;
 
-       ndr_err = ndr_push_struct_blob(blob, mem_ctx, lp_iconv_convenience(global_loadparm), name, (ndr_push_flags_fn_t)ndr_push_nbt_name);
+       ndr_err = ndr_push_struct_blob(blob, mem_ctx, iconv_convenience, name, (ndr_push_flags_fn_t)ndr_push_nbt_name);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                return ndr_map_error2ntstatus(ndr_err);
        }
index 288f0612de61f66103ed6445f26c6b8d8c061e9b..5c14e9f9b8d1f819eed9ff3afcf7ba43f15b0d15 100644 (file)
@@ -164,14 +164,15 @@ struct smbcli_request *smbcli_transport_connect_send(struct smbcli_transport *tr
        DATA_BLOB calling_blob, called_blob;
        TALLOC_CTX *tmp_ctx = talloc_new(transport);
        NTSTATUS status;
+       struct smb_iconv_convenience *iconv_convenience = lp_iconv_convenience(global_loadparm);
 
        status = nbt_name_dup(transport, called, &transport->called);
        if (!NT_STATUS_IS_OK(status)) goto failed;
        
-       status = nbt_name_to_blob(tmp_ctx, &calling_blob, calling);
+       status = nbt_name_to_blob(tmp_ctx, iconv_convenience, &calling_blob, calling);
        if (!NT_STATUS_IS_OK(status)) goto failed;
 
-       status = nbt_name_to_blob(tmp_ctx, &called_blob, called);
+       status = nbt_name_to_blob(tmp_ctx, iconv_convenience, &called_blob, called);
        if (!NT_STATUS_IS_OK(status)) goto failed;
 
        /* allocate output buffer */
index c7d02e323c21dc1ce826a2919230af5387cf2e01..e4312794c9236eddfc9935d898c55831970526c3 100644 (file)
@@ -147,8 +147,8 @@ struct composite_context *smb_composite_fetchfile_send(struct smb_composite_fetc
        state->connect->in.fallback_to_anonymous = false;
        state->connect->in.workgroup    = io->in.workgroup;
 
-       lp_smbcli_options(global_loadparm, &state->connect->in.options);
-       
+       state->connect->in.options      = io->in.options;
+
        state->creq = smb_composite_connect_send(state->connect, state, 
                                                 lp_resolve_context(global_loadparm), event_ctx);
        if (state->creq == NULL) goto failed;
index ce7bcc143ed44d745d96a18c4955757405e3b88c..f5a976958d3a8cd304f75439def05b8478c67f64 100644 (file)
@@ -223,7 +223,7 @@ static NTSTATUS session_setup_nt1(struct composite_context *c,
        NTSTATUS nt_status;
        struct sesssetup_state *state = talloc_get_type(c->private_data, struct sesssetup_state);
        const char *password = cli_credentials_get_password(io->in.credentials);
-       DATA_BLOB names_blob = NTLMv2_generate_names_blob(state, session->transport->socket->hostname, lp_workgroup(global_loadparm));
+       DATA_BLOB names_blob = NTLMv2_generate_names_blob(state, lp_iconv_convenience(global_loadparm), session->transport->socket->hostname, lp_workgroup(global_loadparm));
        DATA_BLOB session_key;
        int flags = CLI_CRED_NTLM_AUTH;
        if (lp_client_lanman_auth(global_loadparm)) {
@@ -290,7 +290,7 @@ static NTSTATUS session_setup_old(struct composite_context *c,
        NTSTATUS nt_status;
        struct sesssetup_state *state = talloc_get_type(c->private_data, struct sesssetup_state);
        const char *password = cli_credentials_get_password(io->in.credentials);
-       DATA_BLOB names_blob = NTLMv2_generate_names_blob(state, session->transport->socket->hostname, lp_workgroup(global_loadparm));
+       DATA_BLOB names_blob = NTLMv2_generate_names_blob(state, lp_iconv_convenience(global_loadparm), session->transport->socket->hostname, lp_workgroup(global_loadparm));
        DATA_BLOB session_key;
        int flags = 0;
        if (lp_client_lanman_auth(global_loadparm)) {
index a732617f80808b02b39d0bf45f6efc0308c5f2cb..964ffb09367be293fd48edac651fd9c7f541dc8c 100644 (file)
@@ -55,6 +55,7 @@ struct smb_composite_fetchfile {
                struct cli_credentials *credentials;
                const char *workgroup;
                const char *filename;
+               struct smbcli_options options;
        } in;
        struct {
                uint8_t *data;
index 1e80597f4ad477d01ed444b5158fb5c7f5dd2a74..eaea6aa30e45600aef2999a444eb127c5131f771 100644 (file)
@@ -85,12 +85,13 @@ interface drsblobs {
         * w2k3 uses version 1
         */
        typedef [public,gensize] struct {
-               asclstr dns_name;
+               [value(strlen(dns_name)+1)] uint32 __dns_name_size;
+               [charset(DOS)] uint8 dns_name[__dns_name_size];
        } repsFromTo1OtherInfo;
 
        typedef [public,gensize,flag(NDR_PAHEX)] struct {
                /* this includes the 8 bytes of the repsFromToBlob header */
-               [value(ndr_size_repsFromTo1(r, ndr->flags)+8)] uint32 blobsize;
+               [value(ndr_size_repsFromTo1(this, ndr->flags)+8)] uint32 blobsize;
                uint32 consecutive_sync_failures;
                NTTIME_1sec last_success;
                NTTIME_1sec last_attempt;
index 868e48e28a9efcce4683d10e92c8d54b94d4ea90..ac30be70ddb1c90bc95c72a58ffce06a84a284bd 100644 (file)
@@ -4,6 +4,8 @@
   initshutdown interface definition
 */
 
+import "lsa.idl";
+
 [ 
   uuid("894de0c0-0d55-11d3-a322-00c04fa321a1"),
   version(1.0),
   helpstring("Init shutdown service")
 ] interface initshutdown
 {
-       typedef struct {
-               [value(strlen_m_term(name))] uint32 name_size;
-               [flag(STR_LEN4|STR_NOTERM)] string name;
-       } initshutdown_String_sub;
-
-       typedef [public] struct {
-               [value(strlen_m(name->name)*2)] uint16 name_len;
-               [value(strlen_m_term(name->name)*2)] uint16 name_size;
-               initshutdown_String_sub *name;
-       } initshutdown_String;
-
        WERROR initshutdown_Init(
                [in,unique] uint16 *hostname,
-               [in,unique] initshutdown_String *message,
+               /*
+                * Note: lsa_String and winreg_String both result
+                *       in WERR_INVALID_PARAM
+                */
+               [in,unique] lsa_StringLarge *message,
                [in] uint32 timeout,
                [in] uint8 force_apps,
                [in] uint8 reboot
 
        WERROR initshutdown_InitEx(
                [in,unique] uint16 *hostname,
-               [in,unique] initshutdown_String *message,
+               /*
+                * Note: lsa_String and winreg_String both result
+                *       in WERR_INVALID_PARAM
+                */
+               [in,unique] lsa_StringLarge *message,
                [in] uint32 timeout,
                [in] uint8 force_apps,
                [in] uint8 reboot,
index bc5ccaa78af824005d1a1572617883aed3267ecd..3159a7d16d30601cc912b140f423e8fe6eae6cef 100644 (file)
@@ -23,7 +23,7 @@ import "security.idl";
 
        typedef [public] struct {
                [value(2*strlen_m(string))] uint16 length;
-               [value(2*(strlen_m(string)+1))] uint16 size;
+               [value(2*strlen_m_term(string))] uint16 size;
                [charset(UTF16),size_is(size/2),length_is(length/2)] uint16 *string;
        } lsa_StringLarge;
 
@@ -33,14 +33,14 @@ import "security.idl";
        } lsa_Strings;
 
        typedef [public] struct {
-               [value(strlen(string))] uint16 length;
-               [value(strlen(string))] uint16 size;
+               [value(strlen_m(string))] uint16 length;
+               [value(strlen_m(string))] uint16 size;
                [charset(DOS),size_is(size),length_is(length)] uint8 *string;
        } lsa_AsciiString;
 
        typedef [public] struct {
-               [value(strlen(string))] uint16 length;
-               [value(strlen(string)+1)] uint16 size;
+               [value(strlen_m(string))] uint16 length;
+               [value(strlen_m_term(string))] uint16 size;
                [charset(DOS),size_is(size),length_is(length)] uint8 *string;
        } lsa_AsciiStringLarge;
 
index 2dc33fa9b90ac8151aa9519eddcda4df86c98ec5..3a11ab752ce52b95792425bcc7c4d74603870a9e 100644 (file)
@@ -960,7 +960,7 @@ import "misc.idl", "lsa.idl", "security.idl";
 
        typedef struct {
                uint32    idx;
-               lsa_AsciiString account_name;
+               lsa_AsciiStringLarge account_name;
        } samr_DispEntryAscii;
 
        typedef struct {
index 66c52fa43f3a653417899f4bcb2b5b50c105d5a0..8ef49413bc369bc40241197532665412ebd0ba00 100644 (file)
@@ -1127,7 +1127,16 @@ import "security.idl", "svcctl.idl";
 /* srvsvc_NetDisk         */
 /**************************/
        typedef struct {
-               [flag(STR_LEN4)] string disk;
+               /*
+                * In theory this should be:
+                *      [charset(UTF16),string] uint16 annotation[3]
+                * But midl treats this as:
+                *      [charset(UTF16),string] uint16 annotation[]
+                * and pidl doesn't support this yet
+                */
+               [value(0)] uint32 __disk_offset;
+               [value(strlen(disk)+1)] uint32 __disk_length;
+               [charset(UTF16)] uint16 disk[__disk_length];
        } srvsvc_NetDiskInfo0;
 
        typedef struct {
index b489e86c38694e501513d870c5f17baa72f87daf..5e5d5542b646c4e1c028d38bfa7a7af8fce9e412 100644 (file)
@@ -2,7 +2,7 @@
   winreg interface definition
 */
 
-import "lsa.idl", "initshutdown.idl", "security.idl";
+import "lsa.idl", "security.idl";
 
 [ 
   uuid("338cd001-2244-31f1-aaaa-900038001003"),
@@ -302,7 +302,11 @@ import "lsa.idl", "initshutdown.idl", "security.idl";
        /* Function: 0x18 */
        WERROR winreg_InitiateSystemShutdown(
                [in,unique] uint16 *hostname,
-               [in,unique] initshutdown_String *message,
+               /*
+                * Note: lsa_String and winreg_String both result
+                *       in WERR_INVALID_PARAM
+                */
+               [in,unique] lsa_StringLarge *message,
                [in]    uint32 timeout,
                [in]    uint8 force_apps,
                [in]    uint8 reboot
@@ -358,7 +362,11 @@ import "lsa.idl", "initshutdown.idl", "security.idl";
        /* Function: 0x1e */
        WERROR winreg_InitiateSystemShutdownEx(
                [in,unique] uint16 *hostname,
-               [in,unique] initshutdown_String *message,
+               /*
+                * Note: lsa_String and winreg_String both result
+                *       in WERR_INVALID_PARAM
+                */
+               [in,unique] lsa_StringLarge *message,
                [in] uint32 timeout,
                [in] uint8 force_apps,
                [in] uint8 reboot,
index 68ef56c11ec0f4a9578aa1605fe4fc68408db4cb..928504476885999bce7e9b6c60c1ffcdc364aa24 100644 (file)
@@ -17,7 +17,7 @@ PUBLIC_DEPENDENCIES = \
 [MODULE::ldb_wins_ldb]
 SUBSYSTEM = LIBLDB
 OUTPUT_TYPE = SHARED_LIBRARY
-INIT_FUNCTION = wins_ldb_module_init
+INIT_FUNCTION = &ldb_wins_ldb_module_ops
 OBJ_FILES = \
                wins/wins_ldb.o
 PRIVATE_DEPENDENCIES = \
index 47aa4156675f9d8408c1651830c06c279c1de964..02ea30624309bd3f848d5922d3e1675cd793a37b 100644 (file)
@@ -112,16 +112,9 @@ failed:
        return LDB_ERR_OTHER;
 }
 
-static const struct ldb_module_ops wins_ldb_ops = {
+_PUBLIC_ const struct ldb_module_ops ldb_wins_ldb_module_ops = {
        .name          = "wins_ldb",
        .add           = wins_ldb_verify,
        .modify        = wins_ldb_verify,
        .init_context  = wins_ldb_init
 };
-
-
-/* the init function */
-int wins_ldb_module_init(void)
-{
-       return ldb_register_module(&wins_ldb_ops);
-}
index b2748833e6f700e282d5a742d42098377203d95f..7ead27939ec9a26fd93284a625240917c4bbc4a2 100644 (file)
@@ -837,7 +837,7 @@ static bool wbinfo_auth_crap(struct loadparm_context *lp_ctx, char *username)
                server_chal = data_blob(request.data.auth_crap.chal, 8); 
                
                /* Pretend this is a login to 'us', for blob purposes */
-               names_blob = NTLMv2_generate_names_blob(mem_ctx, lp_netbios_name(lp_ctx), lp_workgroup(lp_ctx));
+               names_blob = NTLMv2_generate_names_blob(mem_ctx, lp_iconv_convenience(lp_ctx), lp_netbios_name(lp_ctx), lp_workgroup(lp_ctx));
                
                if (!SMBNTLMv2encrypt(mem_ctx, name_user, name_domain, pass, &server_chal, 
                                      &names_blob,
index 4826ca5c267a25ada8e02d2fcb5917f542b4ce21..4ac10806e13255cf0d45fe1985f8c8fd6155d6d7 100644 (file)
@@ -81,6 +81,10 @@ _PUBLIC_ struct odb_lock *odb_lock(TALLOC_CTX *mem_ctx,
        return ops->odb_lock(mem_ctx, odb, file_key);
 }
 
+_PUBLIC_ DATA_BLOB odb_get_key(TALLOC_CTX *mem_ctx, struct odb_lock *lck)
+{
+       return ops->odb_get_key(mem_ctx, lck);
+}
 
 /*
   register an open file in the open files database. This implements the share_access
@@ -166,3 +170,9 @@ _PUBLIC_ NTSTATUS odb_can_open(struct odb_lock *lck,
 {
        return ops->odb_can_open(lck, share_access, create_options, access_mask);
 }
+
+_PUBLIC_ NTSTATUS odb_update_oplock(struct odb_lock *lck, void *file_handle,
+                                   uint32_t oplock_level)
+{
+       return ops->odb_update_oplock(lck, file_handle, oplock_level);
+}
index 231ae3d7deb05417d42181a86190c8455ff6cdbc..c34a07d6facf31d1e40114bf59af86ec967aa65d 100644 (file)
@@ -24,6 +24,7 @@ struct opendb_ops {
                                        struct ntvfs_context *ntvfs_ctx);
        struct odb_lock *(*odb_lock)(TALLOC_CTX *mem_ctx,
                                     struct odb_context *odb, DATA_BLOB *file_key);
+       DATA_BLOB (*odb_get_key)(TALLOC_CTX *mem_ctx, struct odb_lock *lck);
        NTSTATUS (*odb_open_file)(struct odb_lock *lck, void *file_handle,
                                  uint32_t stream_id, uint32_t share_access, 
                                  uint32_t access_mask, bool delete_on_close,
@@ -40,8 +41,14 @@ struct opendb_ops {
        NTSTATUS (*odb_can_open)(struct odb_lock *lck,
                                 uint32_t share_access, uint32_t create_options, 
                                 uint32_t access_mask);
+       NTSTATUS (*odb_update_oplock)(struct odb_lock *lck, void *file_handle,
+                                     uint32_t oplock_level);
 };
 
+struct opendb_oplock_break {
+       void *file_handle;
+       uint8_t level;
+};
 
 void odb_set_ops(const struct opendb_ops *new_ops);
 void odb_tdb_init_ops(void);
index abd9ca708b145e4cfc93c3ab62382be9287f59a5..3d4a760e2e4adcb8d8e9aaa35e52d3571f586f07 100644 (file)
@@ -2,7 +2,8 @@
    Unix SMB/CIFS implementation.
 
    Copyright (C) Andrew Tridgell 2004
-   
+   Copyright (C) Stefan Metzmacher 2008
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
@@ -134,6 +135,12 @@ static struct odb_lock *odb_tdb_lock(TALLOC_CTX *mem_ctx,
        return lck;
 }
 
+static DATA_BLOB odb_tdb_get_key(TALLOC_CTX *mem_ctx, struct odb_lock *lck)
+{
+       return data_blob_talloc(mem_ctx, lck->key.dptr, lck->key.dsize);
+}
+
+
 /*
   determine if two odb_entry structures conflict
 
@@ -253,12 +260,28 @@ static NTSTATUS odb_push_record(struct odb_lock *lck, struct opendb_file *file)
 /*
   send an oplock break to a client
 */
-static NTSTATUS odb_oplock_break_send(struct odb_context *odb, struct opendb_entry *e)
+static NTSTATUS odb_oplock_break_send(struct odb_context *odb,
+                                     struct opendb_entry *e,
+                                     uint8_t level)
 {
+       NTSTATUS status;
+       struct opendb_oplock_break op_break;
+       DATA_BLOB blob;
+
+       ZERO_STRUCT(op_break);
+
        /* tell the server handling this open file about the need to send the client
           a break */
-       return messaging_send_ptr(odb->ntvfs_ctx->msg_ctx, e->server, 
-                                 MSG_NTVFS_OPLOCK_BREAK, e->file_handle);
+       op_break.file_handle    = e->file_handle;
+       op_break.level          = level;
+
+       blob = data_blob_const(&op_break, sizeof(op_break));
+
+       status = messaging_send(odb->ntvfs_ctx->msg_ctx, e->server,
+                               MSG_NTVFS_OPLOCK_BREAK, &blob);
+       NT_STATUS_NOT_OK_RETURN(status);
+
+       return NT_STATUS_OK;
 }
 
 /*
@@ -312,7 +335,8 @@ static NTSTATUS odb_tdb_open_file(struct odb_lock *lck, void *file_handle,
                           break request and suspending this call
                           until the break is acknowledged or the file
                           is closed */
-                       odb_oplock_break_send(odb, &file.entries[i]);
+                       odb_oplock_break_send(odb, &file.entries[i],
+                                             OPLOCK_BREAK_TO_LEVEL_II/*TODO*/);
                        return NT_STATUS_OPLOCK_NOT_GRANTED;
                }
        }
@@ -336,7 +360,8 @@ static NTSTATUS odb_tdb_open_file(struct odb_lock *lck, void *file_handle,
           exclusive oplocks afterwards. */
        for (i=0;i<file.num_entries;i++) {
                if (file.entries[i].oplock_level == OPLOCK_EXCLUSIVE) {
-                       odb_oplock_break_send(odb, &file.entries[i]);
+                       odb_oplock_break_send(odb, &file.entries[i],
+                                             OPLOCK_BREAK_TO_NONE/*TODO*/);
                        return NT_STATUS_OPLOCK_NOT_GRANTED;
                }
        }
@@ -439,6 +464,45 @@ static NTSTATUS odb_tdb_close_file(struct odb_lock *lck, void *file_handle)
        return odb_push_record(lck, &file);
 }
 
+/*
+  update the oplock level of the client
+*/
+static NTSTATUS odb_tdb_update_oplock(struct odb_lock *lck, void *file_handle,
+                                     uint32_t oplock_level)
+{
+       struct odb_context *odb = lck->odb;
+       struct opendb_file file;
+       int i;
+       NTSTATUS status;
+
+       status = odb_pull_record(lck, &file);
+       NT_STATUS_NOT_OK_RETURN(status);
+
+       /* find the entry, and update it */
+       for (i=0;i<file.num_entries;i++) {
+               if (file_handle == file.entries[i].file_handle &&
+                   cluster_id_equal(&odb->ntvfs_ctx->server_id, &file.entries[i].server)) {
+                       file.entries[i].oplock_level = oplock_level;
+                       break;
+               }
+       }
+
+       if (i == file.num_entries) {
+               return NT_STATUS_UNSUCCESSFUL;
+       }
+
+       /* send any pending notifications, removing them once sent */
+       for (i=0;i<file.num_pending;i++) {
+               messaging_send_ptr(odb->ntvfs_ctx->msg_ctx,
+                                  file.pending[i].server,
+                                  MSG_PVFS_RETRY_OPEN,
+                                  file.pending[i].notify_ptr);
+       }
+       file.num_pending = 0;
+
+       return odb_push_record(lck, &file);
+}
+
 
 /*
   remove a pending opendb entry
@@ -609,6 +673,7 @@ static NTSTATUS odb_tdb_can_open(struct odb_lock *lck,
 static const struct opendb_ops opendb_tdb_ops = {
        .odb_init                = odb_tdb_init,
        .odb_lock                = odb_tdb_lock,
+       .odb_get_key             = odb_tdb_get_key,
        .odb_open_file           = odb_tdb_open_file,
        .odb_open_file_pending   = odb_tdb_open_file_pending,
        .odb_close_file          = odb_tdb_close_file,
@@ -616,7 +681,8 @@ static const struct opendb_ops opendb_tdb_ops = {
        .odb_rename              = odb_tdb_rename,
        .odb_set_delete_on_close = odb_tdb_set_delete_on_close,
        .odb_get_delete_on_close = odb_tdb_get_delete_on_close,
-       .odb_can_open            = odb_tdb_can_open
+       .odb_can_open            = odb_tdb_can_open,
+       .odb_update_oplock       = odb_tdb_update_oplock
 };
 
 
index b9bb58c71dee8c7019132c987529252f71a69ecd..df85b2b77526d960b94f9baf5046033129a37091 100644 (file)
@@ -53,7 +53,7 @@ struct pvfs_pending_lock {
        struct pvfs_file *f;
        struct ntvfs_request *req;
        int pending_lock;
-       void *wait_handle;
+       struct pvfs_wait *wait_handle;
        struct timeval end_time;
 };
 
index 210f94939569ee97a1ab4ac6697e91af596b5228..06d2bc8e0c65b16b08a4a4e0e87725f03435ea6b 100644 (file)
@@ -268,9 +268,11 @@ NTSTATUS pvfs_notify(struct ntvfs_module_context *ntvfs,
 
        /* if the buffer is empty then start waiting */
        if (f->notify_buffer->num_changes == 0) {
-               void *wait_handle =
-                       pvfs_wait_message(pvfs, req, -1, timeval_zero(), 
-                                         pvfs_notify_end, f->notify_buffer);
+               struct pvfs_wait *wait_handle;
+               wait_handle = pvfs_wait_message(pvfs, req, -1,
+                                               timeval_zero(),
+                                               pvfs_notify_end,
+                                               f->notify_buffer);
                NT_STATUS_HAVE_NO_MEMORY(wait_handle);
                talloc_steal(req, wait_handle);
                return NT_STATUS_OK;
index 8558f0476a9991632c8d3a8964b79a976e36c802..3a8b17ab16ddb371a50688d3a29618c024cda4d7 100644 (file)
@@ -756,7 +756,7 @@ struct pvfs_open_retry {
        struct ntvfs_module_context *ntvfs;
        struct ntvfs_request *req;
        union smb_open *io;
-       void *wait_handle;
+       struct pvfs_wait *wait_handle;
        DATA_BLOB odb_locking_key;
 };
 
@@ -1447,10 +1447,24 @@ NTSTATUS pvfs_can_delete(struct pvfs_state *pvfs,
                status = pvfs_access_check_simple(pvfs, req, name, SEC_STD_DELETE);
        }
 
-       if (!NT_STATUS_IS_OK(status)) {
+       /*
+        * if it's a sharing violation or we got no oplock
+        * only keep the lock if the caller requested access
+        * to the lock
+        */
+       if (NT_STATUS_EQUAL(status, NT_STATUS_SHARING_VIOLATION) ||
+           NT_STATUS_EQUAL(status, NT_STATUS_OPLOCK_NOT_GRANTED)) {
+               if (lckp) {
+                       *lckp = lck;
+               } else {
+                       talloc_free(lck);
+               }
+       } else if (!NT_STATUS_IS_OK(status)) {
                talloc_free(lck);
-               *lckp = lck;
-       } else if (lckp != NULL) {
+               if (lckp) {
+                       *lckp = NULL;
+               }
+       } else if (lckp) {
                *lckp = lck;
        }
 
@@ -1487,10 +1501,24 @@ NTSTATUS pvfs_can_rename(struct pvfs_state *pvfs,
                              0,
                              SEC_STD_DELETE);
 
-       if (!NT_STATUS_IS_OK(status)) {
+       /*
+        * if it's a sharing violation or we got no oplock
+        * only keep the lock if the caller requested access
+        * to the lock
+        */
+       if (NT_STATUS_EQUAL(status, NT_STATUS_SHARING_VIOLATION) ||
+           NT_STATUS_EQUAL(status, NT_STATUS_OPLOCK_NOT_GRANTED)) {
+               if (lckp) {
+                       *lckp = lck;
+               } else {
+                       talloc_free(lck);
+               }
+       } else if (!NT_STATUS_IS_OK(status)) {
                talloc_free(lck);
-               *lckp = lck;
-       } else if (lckp != NULL) {
+               if (lckp) {
+                       *lckp = NULL;
+               }
+       } else if (lckp) {
                *lckp = lck;
        }
 
@@ -1525,6 +1553,10 @@ NTSTATUS pvfs_can_stat(struct pvfs_state *pvfs,
                              NTCREATEX_SHARE_ACCESS_WRITE,
                              0, 0);
 
+       if (!NT_STATUS_IS_OK(status)) {
+               talloc_free(lck);
+       }
+
        return status;
 }
 
index 3b9842db7f22a54d67779447eaae27700237b021..5693e793141c7e51854092e5085eb34037bb66ab 100644 (file)
@@ -89,6 +89,7 @@ NTSTATUS pvfs_do_rename(struct pvfs_state *pvfs, const struct pvfs_filename *nam
   resolve a wildcard rename pattern. This works on one component of the name
 */
 static const char *pvfs_resolve_wildcard_component(TALLOC_CTX *mem_ctx, 
+                                                  struct smb_iconv_convenience *iconv_convenience,
                                                   const char *fname, 
                                                   const char *pattern)
 {
@@ -108,16 +109,16 @@ static const char *pvfs_resolve_wildcard_component(TALLOC_CTX *mem_ctx,
        while (*p2) {
                codepoint_t c1, c2;
                size_t c_size1, c_size2;
-               c1 = next_codepoint(lp_iconv_convenience(global_loadparm), p1, &c_size1);
-               c2 = next_codepoint(lp_iconv_convenience(global_loadparm), p2, &c_size2);
+               c1 = next_codepoint(iconv_convenience, p1, &c_size1);
+               c2 = next_codepoint(iconv_convenience, p2, &c_size2);
                if (c2 == '?') {
-                       d += push_codepoint(lp_iconv_convenience(global_loadparm), d, c1);
+                       d += push_codepoint(iconv_convenience, d, c1);
                } else if (c2 == '*') {
                        memcpy(d, p1, strlen(p1));
                        d += strlen(p1);
                        break;
                } else {
-                       d += push_codepoint(lp_iconv_convenience(global_loadparm), d, c2);
+                       d += push_codepoint(iconv_convenience, d, c2);
                }
 
                p1 += c_size1;
@@ -138,6 +139,7 @@ static const char *pvfs_resolve_wildcard(TALLOC_CTX *mem_ctx,
 {
        const char *base1, *base2;
        const char *ext1, *ext2;
+       struct smb_iconv_convenience *iconv_convenience = lp_iconv_convenience(global_loadparm);
        char *p;
 
        /* break into base part plus extension */
@@ -165,8 +167,8 @@ static const char *pvfs_resolve_wildcard(TALLOC_CTX *mem_ctx,
                return NULL;
        }
 
-       base1 = pvfs_resolve_wildcard_component(mem_ctx, base1, base2);
-       ext1 = pvfs_resolve_wildcard_component(mem_ctx, ext1, ext2);
+       base1 = pvfs_resolve_wildcard_component(mem_ctx, iconv_convenience, base1, base2);
+       ext1 = pvfs_resolve_wildcard_component(mem_ctx, iconv_convenience, ext1, ext2);
        if (base1 == NULL || ext1 == NULL) {
                return NULL;
        }
@@ -190,8 +192,8 @@ static NTSTATUS pvfs_rename_one(struct pvfs_state *pvfs,
 {
        struct pvfs_filename *name1, *name2;
        TALLOC_CTX *mem_ctx = talloc_new(req);
+       struct odb_lock *lck = NULL;
        NTSTATUS status;
-       struct odb_lock *lck, *lck2;
 
        /* resolve the wildcard pattern for this name */
        fname2 = pvfs_resolve_wildcard(mem_ctx, fname1, fname2);
@@ -214,6 +216,7 @@ static NTSTATUS pvfs_rename_one(struct pvfs_state *pvfs,
 
        status = pvfs_can_rename(pvfs, req, name1, &lck);
        if (!NT_STATUS_IS_OK(status)) {
+               talloc_free(lck);
                goto failed;
        }
 
@@ -221,7 +224,7 @@ static NTSTATUS pvfs_rename_one(struct pvfs_state *pvfs,
        status = pvfs_resolve_partial(pvfs, mem_ctx, 
                                      dir_path, fname2, &name2);
        if (NT_STATUS_IS_OK(status)) {
-               status = pvfs_can_delete(pvfs, req, name2, &lck2);
+               status = pvfs_can_delete(pvfs, req, name2, NULL);
                if (!NT_STATUS_IS_OK(status)) {
                        goto failed;
                }
@@ -309,7 +312,7 @@ static NTSTATUS pvfs_rename_mv(struct ntvfs_module_context *ntvfs,
        struct pvfs_state *pvfs = ntvfs->private_data;
        NTSTATUS status;
        struct pvfs_filename *name1, *name2;
-       struct odb_lock *lck;
+       struct odb_lock *lck = NULL;
 
        /* resolve the cifs name to a posix name */
        status = pvfs_resolve_name(pvfs, req, ren->rename.in.pattern1, 
@@ -352,6 +355,7 @@ static NTSTATUS pvfs_rename_mv(struct ntvfs_module_context *ntvfs,
 
        status = pvfs_can_rename(pvfs, req, name1, &lck);
        if (!NT_STATUS_IS_OK(status)) {
+               talloc_free(lck);
                return status;
        }
 
@@ -373,7 +377,6 @@ static NTSTATUS pvfs_rename_nt(struct ntvfs_module_context *ntvfs,
        struct pvfs_state *pvfs = ntvfs->private_data;
        NTSTATUS status;
        struct pvfs_filename *name1, *name2;
-       struct odb_lock *lck;
 
        switch (ren->ntrename.in.flags) {
        case RENAME_FLAG_RENAME:
@@ -419,7 +422,7 @@ static NTSTATUS pvfs_rename_nt(struct ntvfs_module_context *ntvfs,
                return status;
        }
 
-       status = pvfs_can_rename(pvfs, req, name1, &lck);
+       status = pvfs_can_rename(pvfs, req, name1, NULL);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
index 949fa131a4a0d115bb740b036eade12bff457e9c..cf74816391ebeebbe7abb08682448cf82807a804 100644 (file)
@@ -336,12 +336,13 @@ static NTSTATUS pvfs_reduce_name(TALLOC_CTX *mem_ctx, const char **fname, uint_t
        int i, num_components, err_count;
        char **components;
        char *p, *s, *ret;
+       struct smb_iconv_convenience *iconv_convenience = lp_iconv_convenience(global_loadparm);
 
        s = talloc_strdup(mem_ctx, *fname);
        if (s == NULL) return NT_STATUS_NO_MEMORY;
 
        for (num_components=1, p=s; *p; p += c_size) {
-               c = next_codepoint(lp_iconv_convenience(global_loadparm), p, &c_size);
+               c = next_codepoint(iconv_convenience, p, &c_size);
                if (c == '\\') num_components++;
        }
 
@@ -353,7 +354,7 @@ static NTSTATUS pvfs_reduce_name(TALLOC_CTX *mem_ctx, const char **fname, uint_t
 
        components[0] = s;
        for (i=0, p=s; *p; p += c_size) {
-               c = next_codepoint(lp_iconv_convenience(global_loadparm), p, &c_size);
+               c = next_codepoint(iconv_convenience, p, &c_size);
                if (c == '\\') {
                        *p = 0;
                        components[++i] = p+1;
index 9c78699edb71d4626cebfa73efe44a9dc3627749..fbbb8c2d4baeb3b1ab85a5c5171377d7add6ddee 100644 (file)
@@ -142,8 +142,6 @@ static NTSTATUS pvfs_setfileinfo_rename(struct pvfs_state *pvfs,
 
        /* if the destination exists, then check the rename is allowed */
        if (name2->exists) {
-               struct odb_lock *lck;
-
                if (strcmp(name2->full_name, name->full_name) == 0) {
                        /* rename to same name is null-op */
                        return NT_STATUS_OK;
@@ -153,7 +151,7 @@ static NTSTATUS pvfs_setfileinfo_rename(struct pvfs_state *pvfs,
                        return NT_STATUS_OBJECT_NAME_COLLISION;
                }
 
-               status = pvfs_can_delete(pvfs, req, name2, &lck);
+               status = pvfs_can_delete(pvfs, req, name2, NULL);
                if (NT_STATUS_EQUAL(status, NT_STATUS_SHARING_VIOLATION)) {
                        return NT_STATUS_ACCESS_DENIED;
                }
index 083a2818193bae0b2301b240d6ef1eb48c1ea396..923887debd28e0e0271ac03eb0292cb640272f90 100644 (file)
@@ -104,6 +104,8 @@ struct pvfs_mangle_context {
 
        /* this is used to reverse the base 36 mapping */
        unsigned char base_reverse[256];
+
+       struct smb_iconv_convenience *iconv_convenience;
 };
 
 
@@ -388,7 +390,7 @@ static bool is_legal_name(struct pvfs_mangle_context *ctx, const char *name)
 {
        while (*name) {
                size_t c_size;
-               codepoint_t c = next_codepoint(lp_iconv_convenience(global_loadparm), name, &c_size);
+               codepoint_t c = next_codepoint(ctx->iconv_convenience, name, &c_size);
                if (c == INVALID_CODEPOINT) {
                        return false;
                }
@@ -613,6 +615,8 @@ NTSTATUS pvfs_mangle_init(struct pvfs_state *pvfs)
                return NT_STATUS_NO_MEMORY;
        }
 
+       ctx->iconv_convenience = lp_iconv_convenience(pvfs->ntvfs->ctx->lp_ctx);
+
        /* by default have a max of 512 entries in the cache. */
        ctx->cache_size = lp_parm_int(pvfs->ntvfs->ctx->lp_ctx, NULL, "mangle", "cachesize", 512);
 
index ef56d99fb559a2bca73cd0c477b4df8643389d9d..bda4014beec16c8a701347d0e6d8a36188350627 100644 (file)
 
 
 /*
-  unlink a stream
- */
-static NTSTATUS pvfs_unlink_stream(struct pvfs_state *pvfs, 
-                                  struct ntvfs_request *req,
-                                  struct pvfs_filename *name, 
-                                  uint16_t attrib)
+  unlink a file
+*/
+static NTSTATUS pvfs_unlink_file(struct pvfs_state *pvfs,
+                                struct pvfs_filename *name)
 {
        NTSTATUS status;
-       struct odb_lock *lck;
 
-       if (!name->stream_exists) {
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
+       if (name->dos.attrib & FILE_ATTRIBUTE_DIRECTORY) {
+               return NT_STATUS_FILE_IS_A_DIRECTORY;
        }
 
-       /* make sure its matches the given attributes */
-       status = pvfs_match_attrib(pvfs, name, attrib, 0);
-       if (!NT_STATUS_IS_OK(status)) {
-               return status;
+       if (name->st.st_nlink == 1) {
+               status = pvfs_xattr_unlink_hook(pvfs, name->full_name);
+               if (!NT_STATUS_IS_OK(status)) {
+                       return status;
+               }
        }
 
-       status = pvfs_can_delete(pvfs, req, name, &lck);
-       if (!NT_STATUS_IS_OK(status)) {
-               return status;
+       /* finally try the actual unlink */
+       if (unlink(name->full_name) == -1) {
+               status = pvfs_map_errno(pvfs, errno);
        }
 
-       return pvfs_stream_delete(pvfs, name, -1);
-}
+       if (NT_STATUS_IS_OK(status)) {
+               notify_trigger(pvfs->notify_context, 
+                              NOTIFY_ACTION_REMOVED, 
+                              FILE_NOTIFY_CHANGE_FILE_NAME,
+                              name->full_name);
+       }
 
+       return status;
+}
 
 /*
   unlink one file
 */
-static NTSTATUS pvfs_unlink_one(struct pvfs_state *pvfs, 
+static NTSTATUS pvfs_unlink_one(struct pvfs_state *pvfs,
                                struct ntvfs_request *req,
-                               const char *unix_path, 
-                               const char *fname, uint32_t attrib)
+                               union smb_unlink *unl,
+                               struct pvfs_filename *name)
 {
-       struct pvfs_filename *name;
        NTSTATUS status;
-       struct odb_lock *lck;
-
-       /* get a pvfs_filename object */
-       status = pvfs_resolve_partial(pvfs, req, 
-                                     unix_path, fname, &name);
-       if (!NT_STATUS_IS_OK(status)) {
-               return status;
-       }
 
        /* make sure its matches the given attributes */
-       status = pvfs_match_attrib(pvfs, name, attrib, 0);
+       status = pvfs_match_attrib(pvfs, name,
+                                  unl->unlink.in.attrib, 0);
        if (!NT_STATUS_IS_OK(status)) {
-               talloc_free(name);
                return status;
        }
 
-       status = pvfs_can_delete(pvfs, req, name, &lck);
+       status = pvfs_can_delete(pvfs, req, name, NULL);
        if (!NT_STATUS_IS_OK(status)) {
-               talloc_free(name);
                return status;
        }
 
-       if (name->dos.attrib & FILE_ATTRIBUTE_DIRECTORY) {
-               talloc_free(name);
-               return NT_STATUS_FILE_IS_A_DIRECTORY;
-       }
-
-       if (name->st.st_nlink == 1) {
-               status = pvfs_xattr_unlink_hook(pvfs, name->full_name);
-               if (!NT_STATUS_IS_OK(status)) {
-                       return status;
+       if (name->stream_name) {
+               if (!name->stream_exists) {
+                       return NT_STATUS_OBJECT_NAME_NOT_FOUND;
                }
-       }
-
-       /* finally try the actual unlink */
-       if (unlink(name->full_name) == -1) {
-               status = pvfs_map_errno(pvfs, errno);
-       }
 
-       if (NT_STATUS_IS_OK(status)) {
-               notify_trigger(pvfs->notify_context, 
-                              NOTIFY_ACTION_REMOVED, 
-                              FILE_NOTIFY_CHANGE_FILE_NAME,
-                              name->full_name);
+               return pvfs_stream_delete(pvfs, name, -1);
        }
 
-       talloc_free(name);
-
-       return status;
+       return pvfs_unlink_file(pvfs, name);
 }
 
 /*
@@ -147,8 +123,8 @@ NTSTATUS pvfs_unlink(struct ntvfs_module_context *ntvfs,
                return NT_STATUS_FILE_IS_A_DIRECTORY;
        }
 
-       if (name->stream_name) {
-               return pvfs_unlink_stream(pvfs, req, name, unl->unlink.in.attrib);
+       if (!name->has_wildcard) {
+               return pvfs_unlink_one(pvfs, req, unl, name);
        }
 
        /* get list of matching files */
@@ -158,6 +134,7 @@ NTSTATUS pvfs_unlink(struct ntvfs_module_context *ntvfs,
        }
 
        status = NT_STATUS_NO_SUCH_FILE;
+       talloc_free(name);
 
        ofs = 0;
 
@@ -168,10 +145,20 @@ NTSTATUS pvfs_unlink(struct ntvfs_module_context *ntvfs,
                        return NT_STATUS_OBJECT_NAME_INVALID;
                }
 
-               status = pvfs_unlink_one(pvfs, req, pvfs_list_unix_path(dir), fname, unl->unlink.in.attrib);
+               /* get a pvfs_filename object */
+               status = pvfs_resolve_partial(pvfs, req,
+                                             pvfs_list_unix_path(dir),
+                                             fname, &name);
+               if (!NT_STATUS_IS_OK(status)) {
+                       return status;
+               }
+
+               status = pvfs_unlink_one(pvfs, req, unl, name);
                if (NT_STATUS_IS_OK(status)) {
                        total_deleted++;
                }
+
+               talloc_free(name);
        }
 
        if (total_deleted > 0) {
index 989985a0334ff10ce71f950868e40a66f5d4f533..291250befd2eaf986fec2574674a5f1a1f22ffb6 100644 (file)
@@ -31,7 +31,7 @@ struct pvfs_wait {
        struct pvfs_wait *next, *prev;
        struct pvfs_state *pvfs;
        void (*handler)(void *, enum pvfs_wait_notice);
-       void *private;
+       void *private_data;
        int msg_type;
        struct messaging_context *msg_ctx;
        struct event_context *ev;
@@ -45,20 +45,23 @@ struct pvfs_wait {
   previous ntvfs handlers in the chain (such as security context)
 */
 NTSTATUS pvfs_async_setup(struct ntvfs_module_context *ntvfs,
-                         struct ntvfs_request *req, void *private)
+                         struct ntvfs_request *req, void *private_data)
 {
-       struct pvfs_wait *pwait = private;
-       pwait->handler(pwait->private, pwait->reason);
+       struct pvfs_wait *pwait = talloc_get_type(private_data,
+                                                 struct pvfs_wait);
+       pwait->handler(pwait->private_data, pwait->reason);
        return NT_STATUS_OK;
 }
 
 /*
   receive a completion message for a wait
 */
-static void pvfs_wait_dispatch(struct messaging_context *msg, void *private, uint32_t msg_type, 
+static void pvfs_wait_dispatch(struct messaging_context *msg,
+                              void *private_data, uint32_t msg_type,
                               struct server_id src, DATA_BLOB *data)
 {
-       struct pvfs_wait *pwait = private;
+       struct pvfs_wait *pwait = talloc_get_type(private_data,
+                                                 struct pvfs_wait);
        struct ntvfs_request *req;
        void *p = NULL;
 
@@ -70,7 +73,7 @@ static void pvfs_wait_dispatch(struct messaging_context *msg, void *private, uin
                pp = (void **)data->data;
                p = *pp;
        }
-       if (p == NULL || p != pwait->private) {
+       if (p == NULL || p != pwait->private_data) {
                return;
        }
 
@@ -91,9 +94,11 @@ static void pvfs_wait_dispatch(struct messaging_context *msg, void *private, uin
   receive a timeout on a message wait
 */
 static void pvfs_wait_timeout(struct event_context *ev, 
-                             struct timed_event *te, struct timeval t, void *private)
+                             struct timed_event *te, struct timeval t,
+                             void *private_data)
 {
-       struct pvfs_wait *pwait = talloc_get_type(private, struct pvfs_wait);
+       struct pvfs_wait *pwait = talloc_get_type(private_data,
+                                                 struct pvfs_wait);
        struct ntvfs_request *req = pwait->req;
 
        pwait->reason = PVFS_WAIT_TIMEOUT;
@@ -126,12 +131,12 @@ static int pvfs_wait_destructor(struct pvfs_wait *pwait)
   if msg_type == -1 then no message is registered, and it is assumed
   that the caller handles any messaging setup needed
 */
-void *pvfs_wait_message(struct pvfs_state *pvfs, 
-                       struct ntvfs_request *req, 
-                       int msg_type, 
-                       struct timeval end_time,
-                       void (*fn)(void *, enum pvfs_wait_notice),
-                       void *private)
+struct pvfs_wait *pvfs_wait_message(struct pvfs_state *pvfs,
+                                   struct ntvfs_request *req,
+                                   int msg_type,
+                                   struct timeval end_time,
+                                   void (*fn)(void *, enum pvfs_wait_notice),
+                                   void *private_data)
 {
        struct pvfs_wait *pwait;
 
@@ -140,7 +145,7 @@ void *pvfs_wait_message(struct pvfs_state *pvfs,
                return NULL;
        }
 
-       pwait->private = private;
+       pwait->private_data = private_data;
        pwait->handler = fn;
        pwait->msg_ctx = pvfs->ntvfs->ctx->msg_ctx;
        pwait->ev = pvfs->ntvfs->ctx->event_ctx;
index a660da329a98ec2401dffc047fc802ca2d438959..84c456dcfee48f644ed74a6022db7498087d37f0 100644 (file)
@@ -28,6 +28,8 @@
 #include "ntvfs/common/ntvfs_common.h"
 #include "dsdb/samdb/samdb.h"
 
+struct pvfs_wait;
+
 /* this is the private structure for the posix vfs backend. It is used
    to hold per-connection (per tree connect) state information */
 struct pvfs_state {
index e850d82193971674d0a8675401e8a6d4682462e1..bad90fc74a975abfa162757f02700fc91b9c27f9 100644 (file)
@@ -91,6 +91,7 @@ struct loadparm_global
        char *szPasswdChat;
        char *szShareBackend;
        char *szSAM_URL;
+       char *szIDMAP_URL;
        char *szSECRETS_URL;
        char *szSPOOLSS_URL;
        char *szWINS_CONFIG_URL;
@@ -119,6 +120,7 @@ struct loadparm_global
        char *szTemplateShell;
        char *szTemplateHomedir;
        int bWinbindSealedPipes;
+       int bIdmapTrustedOnly;
        char *swat_directory;
        int tls_enabled;
        char *tls_keyfile;
@@ -384,6 +386,7 @@ static struct parm_struct parm_table[] = {
        {"obey pam restrictions", P_BOOL, P_GLOBAL, GLOBAL_VAR(bObeyPamRestrictions), NULL, NULL},
        {"password server", P_LIST, P_GLOBAL, GLOBAL_VAR(szPasswordServers), NULL, NULL},
        {"sam database", P_STRING, P_GLOBAL, GLOBAL_VAR(szSAM_URL), NULL, NULL},
+       {"idmap database", P_STRING, P_GLOBAL, GLOBAL_VAR(szIDMAP_URL), NULL, NULL},
        {"secrets database", P_STRING, P_GLOBAL, GLOBAL_VAR(szSECRETS_URL), NULL, NULL},
        {"spoolss database", P_STRING, P_GLOBAL, GLOBAL_VAR(szSPOOLSS_URL), NULL, NULL},
        {"wins config database", P_STRING, P_GLOBAL, GLOBAL_VAR(szWINS_CONFIG_URL), NULL, NULL},
@@ -513,6 +516,7 @@ static struct parm_struct parm_table[] = {
        {"winbind sealed pipes", P_BOOL, P_GLOBAL, GLOBAL_VAR(bWinbindSealedPipes), NULL, NULL },
        {"template shell", P_STRING, P_GLOBAL, GLOBAL_VAR(szTemplateShell), NULL, NULL },
        {"template homedir", P_STRING, P_GLOBAL, GLOBAL_VAR(szTemplateHomedir), NULL, NULL },
+       {"idmap trusted only", P_BOOL, P_GLOBAL, GLOBAL_VAR(bIdmapTrustedOnly), NULL, NULL},
 
        {NULL, P_BOOL, P_NONE, 0, NULL, NULL}
 };
@@ -642,6 +646,7 @@ _PUBLIC_ FN_GLOBAL_STRING(lp_tls_crlfile, tls_crlfile)
 _PUBLIC_ FN_GLOBAL_STRING(lp_tls_dhpfile, tls_dhpfile)
 _PUBLIC_ FN_GLOBAL_STRING(lp_share_backend, szShareBackend)
 _PUBLIC_ FN_GLOBAL_STRING(lp_sam_url, szSAM_URL)
+_PUBLIC_ FN_GLOBAL_STRING(lp_idmap_url, szIDMAP_URL)
 _PUBLIC_ FN_GLOBAL_STRING(lp_secrets_url, szSECRETS_URL)
 _PUBLIC_ FN_GLOBAL_STRING(lp_spoolss_url, szSPOOLSS_URL)
 _PUBLIC_ FN_GLOBAL_STRING(lp_wins_config_url, szWINS_CONFIG_URL)
@@ -651,6 +656,7 @@ _PUBLIC_ FN_GLOBAL_CONST_STRING(lp_winbindd_socket_directory, szWinbinddSocketDi
 _PUBLIC_ FN_GLOBAL_CONST_STRING(lp_template_shell, szTemplateShell)
 _PUBLIC_ FN_GLOBAL_CONST_STRING(lp_template_homedir, szTemplateHomedir)
 _PUBLIC_ FN_GLOBAL_BOOL(lp_winbind_sealed_pipes, bWinbindSealedPipes)
+_PUBLIC_ FN_GLOBAL_BOOL(lp_idmap_trusted_only, bIdmapTrustedOnly)
 _PUBLIC_ FN_GLOBAL_STRING(lp_private_dir, szPrivateDir)
 _PUBLIC_ FN_GLOBAL_STRING(lp_serverstring, szServerString)
 _PUBLIC_ FN_GLOBAL_STRING(lp_lockdir, szLockDir)
@@ -2305,6 +2311,7 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx)
        lp_do_global_parameter(lp_ctx, "auth methods:standalone", "anonymous sam_ignoredomain");
        lp_do_global_parameter(lp_ctx, "private dir", dyn_PRIVATE_DIR);
        lp_do_global_parameter(lp_ctx, "sam database", "sam.ldb");
+       lp_do_global_parameter(lp_ctx, "idmap database", "idmap.ldb");
        lp_do_global_parameter(lp_ctx, "secrets database", "secrets.ldb");
        lp_do_global_parameter(lp_ctx, "spoolss database", "spoolss.ldb");
        lp_do_global_parameter(lp_ctx, "wins config database", "wins_config.ldb");
@@ -2380,6 +2387,7 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx)
        lp_do_global_parameter(lp_ctx, "winbindd socket directory", dyn_WINBINDD_SOCKET_DIR);
        lp_do_global_parameter(lp_ctx, "template shell", "/bin/false");
        lp_do_global_parameter(lp_ctx, "template homedir", "/home/%WORKGROUP%/%ACCOUNTNAME%");
+       lp_do_global_parameter(lp_ctx, "idmap trusted only", "False");
 
        lp_do_global_parameter(lp_ctx, "client signing", "Yes");
        lp_do_global_parameter(lp_ctx, "server signing", "auto");
index ef3eb3dbcf6fab773305ac6535eb2777685b3a14..a959dc84f60780782fd83581e543f586ad12a40b 100644 (file)
@@ -775,8 +775,7 @@ sub ParseElementPrint($$$$)
                                $self->pidl("for ($counter=0;$counter<$length;$counter++) {");
                                $self->indent;
                                $self->pidl("char *idx_$l->{LEVEL_INDEX}=NULL;");
-                               $self->pidl("asprintf(&idx_$l->{LEVEL_INDEX}, \"[\%d]\", $counter);");
-                               $self->pidl("if (idx_$l->{LEVEL_INDEX}) {");
+                               $self->pidl("if (asprintf(&idx_$l->{LEVEL_INDEX}, \"[\%d]\", $counter) != -1) {");
                                $self->indent;
 
                                $var_name = get_array_element($var_name, $counter);
index a240bbf9cdaef833cd4d7b888c1918ae93449563..5c37b4a0c4f8eab2f02851e896d85c7f86ab0c92 100644 (file)
@@ -74,6 +74,10 @@ Change description for the specified header field. `field' is the hf name of the
 Code to insert when generating the specified dissector. @HF@ and 
 @PARAM@ will be substituted.
 
+=item I<INCLUDE> filename
+
+Include conformance data from the specified filename in the dissector.
+
 =item I<TFS> hf_name "true string" "false string"
 
 Override the text shown when a bitmap boolean value is enabled or disabled.
@@ -326,11 +330,25 @@ sub handle_ett_field
        unless(defined($ett)) {
                error($pos, "incomplete ETT_FIELD command");
                return;
-       };
+       }
 
        push (@{$data->{ett}}, $ett);
 }
 
+sub handle_include
+{
+       my $pos = shift @_;
+       my $data = shift @_;
+       my $fn = shift @_;
+
+       unless(defined($fn)) {
+               error($pos, "incomplete INCLUDE command");
+               return;
+       }
+
+       ReadConformance($fn, $data);
+}
+
 my %field_handlers = (
        TYPE => \&handle_type,
        NOEMIT => \&handle_noemit, 
@@ -343,7 +361,8 @@ my %field_handlers = (
        STRIP_PREFIX => \&handle_strip_prefix,
        PROTOCOL => \&handle_protocol,
        FIELD_DESCRIPTION => \&handle_fielddescription,
-       IMPORT => \&handle_import
+       IMPORT => \&handle_import,
+       INCLUDE => \&handle_include
 );
 
 sub ReadConformance($$)
index c06ac16de4418e13d057258144ec79fe0c46f281..9da5c7d1ed901a3320fe70de5e8eb4f0ac51c129 100755 (executable)
@@ -5,7 +5,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 48;
+use Test::More tests => 49;
 use FindBin qw($RealBin);
 use lib "$RealBin";
 use Util;
@@ -35,7 +35,6 @@ test_warnings("nofile:1: Unknown command `foobar'\n",
 test_warnings("nofile:1: incomplete HF_RENAME command\n",
        sub { parse_conf("HF_RENAME\n"); });
 
-
 is_deeply(parse_conf("HF_RENAME foo bar\n")->{hf_renames}->{foo}, 
        { OLDNAME => "foo", NEWNAME => "bar", POS => {FILE => "nofile", LINE => 1}, USED => 0});
 
@@ -47,6 +46,9 @@ test_warnings("nofile:1: incomplete MANUAL command\n",
 
 is_deeply(parse_conf("MANUAL foo\n"), { manual => {foo => 1}});
 
+test_errors("nofile:1: incomplete INCLUDE command\n",
+       sub { parse_conf("INCLUDE\n"); } );
+
 test_warnings("nofile:1: incomplete FIELD_DESCRIPTION command\n",
        sub { parse_conf("FIELD_DESCRIPTION foo\n"); });
 
index 651111221f2b7bbc4b40ac6d4d4cf871b0ceb1d4..18fb4b914bbfaef1c12888496ea4d1c0ac901519 100644 (file)
@@ -34,6 +34,5 @@ rpc.netlogon.*.GetTrustPasswords
 base.charset.*.Testing partial surrogate
 .*net.api.delshare.*                           # DelShare isn't implemented yet
 rap.*netservergetinfo
-kinit with pkinit # fails with: salt type 3 not supported
 samba4.blackbox.provision.py.reprovision # Fails with entry already exists
 local.torture.provision
index 796435ee16445ad019be9dd6df2c6db5be49cbe9..aec90988547799d5e5e756ef2174983a64660452 100644 (file)
@@ -1,32 +1,32 @@
-BASE-UNLINK
-BASE-ATTR
-BASE-DELETE
-BASE-TCON
-BASE-OPEN
-BASE-CHKPATH
-RAW-QFSINFO
-RAW-QFILEINFO
-RAW-SFILEINFO
-RAW-MKDIR
-RAW-SEEK
-RAW-OPEN
-RAW-WRITE
-RAW-UNLINK
-RAW-READ
-RAW-CLOSE
-RAW-IOCTL
-RAW-RENAME
-RAW-EAS
-RAW-STREAMS
-BASE-OPEN 
-RPC-ALTERCONTEXT
-RPC-JOIN
-RPC-ECHO
-RPC-SCHANNEL
-RPC-NETLOGON
-RPC-UNIXINFO
-RPC-HANDLES
-RPC-ALTERCONTEXT
-RPC-JOIN
-RPC-HANDLES
-RPC-ECHO
+base.unlink
+base.attr
+base.delete
+base.tcon
+base.open
+base.chkpath
+raw.qfsinfo
+raw.qfileinfo
+raw.sfileinfo
+raw.mkdir
+raw.seek
+raw.open
+raw.write
+raw.unlink
+raw.read
+raw.close
+raw.ioctl
+raw.rename
+raw.eas
+raw.streams
+base.open 
+rpc.altercontext
+rpc.join
+rpc.echo
+rpc.schannel
+rpc.netlogon
+rpc.unixinfo
+rpc.handles
+rpc.altercontext
+rpc.join
+rpc.handles
+rpc.echo
index e3d2b182d17cbf906ec42f841482c3853306709a..541738ecc4e444aa05de43a09aa322de0ab665d5 100644 (file)
@@ -1,4 +1,3 @@
-base.defer_open
 base.delaywrite
 raw.composite
 raw.oplock
@@ -18,7 +17,6 @@ base.smb
 smb2.notify
 smb2.scan
 ntvfs.cifs.base.charset
-ntvfs.cifs.base.defer_open
 ntvfs.cifs.base.delaywrite
 ntvfs.cifs.base.iometer
 ntvfs.cifs.base.casetable
index a4f2e1cd431ddc03fc4a36c35167165a997e507d..9ed4aa490f3b78eea0793ffc5fa128a6e33dcbec 100644 (file)
@@ -61,8 +61,6 @@ int main(int argc, const char **argv)
                lp_load(lp_ctx, dyn_CONFIGFILE);
        }
 
-       ldb_global_init();
-
        gensec_init(lp_ctx);
        mprSetCtx(mem_ctx);
 
index dc9eae8e7286ddf1de24fe8de2dfa5af8c40c12e..3ba93debf98100da234e425fbdd84025c5ba80b4 100644 (file)
@@ -389,6 +389,7 @@ function provision_default_paths(subobj)
        paths.smbconf = lp.filename()
        paths.shareconf = lp.get("private dir") + "/" + "share.ldb";
        paths.samdb = lp.get("sam database");
+       paths.idmapdb = lp.get("idmap database");
        paths.secrets = lp.get("secrets database");
        paths.templates = lp.get("private dir") + "/" + "templates.ldb";
        paths.keytab = "secrets.keytab";
@@ -679,6 +680,9 @@ function provision(subobj, message, blank, paths, session_info, credentials, lda
        message("Setting up templates into " + paths.templates + "\n");
        setup_ldb("provision_templates.ldif", info, paths.templates);
 
+       message("Setting up " + paths.idmapdb +"\n");
+       setup_ldb("idmap_init.ldif", info, paths.idmapdb);
+
        message("Setting up sam.ldb partitions\n");
        /* Also wipes the database */
        setup_ldb("provision_partitions.ldif", info, paths.samdb);
index 908efd1588e880a77860328b33a28ee6df749cb2..2142cd9abd13c3cf1a5476fccf4521bf7579050d 100644 (file)
@@ -54,7 +54,7 @@ fi
 
 if test x$PYTHON != x
 then
-       DISTUTILS_CFLAGS=`$PYTHON -c "from distutils import sysconfig; print '-I%s -I%s %s' % (sysconfig.get_python_inc(), sysconfig.get_python_inc(plat_specific=True), sysconfig.get_config_var('CFLAGS'))"`
+       DISTUTILS_CFLAGS=`$PYTHON -c "from distutils import sysconfig; print '-I%s -I%s %s' % (sysconfig.get_python_inc(), sysconfig.get_python_inc(plat_specific=1), sysconfig.get_config_var('CFLAGS'))"`
        DISTUTILS_LDFLAGS=`$PYTHON -c "from distutils import sysconfig; print '%s %s -lpython%s -L%s' % (sysconfig.get_config_var('LIBS'), sysconfig.get_config_var('SYSLIBS'), sysconfig.get_config_var('VERSION'), sysconfig.get_config_var('LIBPL'))"`
        TRY_LINK_PYTHON($DISTUTILS_LDFLAGS, $DISTUTILS_CFLAGS)
 fi
index 3e88b68509c9370d04da52b411a6c75fcb62f9f2..e3c47ff4a2c902e07be025047d56e96bbab7c075 100644 (file)
@@ -59,6 +59,7 @@ class ProvisionPaths:
         self.hkpd = None
         self.hkpt = None
         self.samdb = None
+        self.idmapdb = None
         self.secrets = None
         self.keytab = None
         self.dns_keytab = None
@@ -202,6 +203,7 @@ def provision_paths_from_lp(lp, dnsdomain):
 
     paths.shareconf = os.path.join(private_dir, "share.ldb")
     paths.samdb = os.path.join(private_dir, lp.get("sam database") or "samdb.ldb")
+    paths.idmapdb = os.path.join(private_dir, lp.get("idmap database") or "idmap.ldb")
     paths.secrets = os.path.join(private_dir, lp.get("secrets database") or "secrets.ldb")
     paths.templates = os.path.join(private_dir, "templates.ldb")
     paths.dns = os.path.join(private_dir, dnsdomain + ".zone")
@@ -471,6 +473,24 @@ def setup_registry(path, setup_path, session_info, credentials, lp):
     assert os.path.exists(provision_reg)
     reg.diff_apply(provision_reg)
 
+def setup_idmapdb(path, setup_path, session_info, credentials, lp):
+    """Setup the idmap database.
+
+    :param path: path to the idmap database
+    :param setup_path: Function that returns a path to a setup file
+    :param session_info: Session information
+    :param credentials: Credentials
+    :param lp: Loadparm context
+    """
+    if os.path.exists(path):
+        os.unlink(path)
+
+    idmap_ldb = Ldb(path, session_info=session_info, credentials=credentials,
+                    lp=lp)
+
+    idmap_ldb.erase()
+    idmap_ldb.load_ldif_file_add(setup_path("idmap_init.ldif"))
+    return idmap_ldb
 
 def setup_samdb_rootdse(samdb, setup_path, schemadn, domaindn, hostname, 
                         dnsdomain, realm, rootdn, configdn, netbiosname,
@@ -844,6 +864,10 @@ def provision(lp, setup_dir, message, paths, session_info,
     setup_templatesdb(paths.templates, setup_path, session_info=session_info, 
                       credentials=credentials, lp=lp)
 
+    message("Setting up idmap db")
+    setup_idmapdb(paths.idmapdb, setup_path, session_info=session_info,
+                  credentials=credentials, lp=lp)
+
     samdb = setup_samdb(paths.samdb, setup_path, session_info=session_info, 
                         credentials=credentials, lp=lp, schemadn=schemadn, 
                         configdn=configdn, domaindn=domaindn,
index 7f8f211588ca3489b1f8684f6877d18700178ef8..4e9d31b684ecec553ced4f700c200a519999c09a 100644 (file)
@@ -10,6 +10,12 @@ SELFTEST = $(LD_LIBPATH_OVERRIDE) $(PERL) $(srcdir)/selftest/selftest.pl --prefi
 test:: everything
        $(SELFTEST) $(DEFAULT_TEST_OPTIONS) --immediate $(TESTS)
 
+kvmtest:: everything
+       $(SELFTEST) $(DEFAULT_TEST_OPTIONS) --immediate --target=kvm --image=$(KVM_IMAGE)
+
+kvmquicktest:: everything
+       $(SELFTEST) $(DEFAULT_TEST_OPTIONS) --immediate --quick --target=kvm --image=$(KVM_IMAGE)
+
 testone:: everything
        $(SELFTEST) $(DEFAULT_TEST_OPTIONS) --one $(TESTS)
 
index d86c46432ec61a8f60eec6211bf59aea08c4dcb0..32386e5b9ef0754a237665f266d5fed53818047c 100755 (executable)
@@ -50,8 +50,9 @@ plansmbtorturetest() {
        name=$1
        env=$2
        shift 2
+       other_args="$*"
        modname=`normalize_testname $name`
-       cmdline="$VALGRIND $smb4torture $* $name"
+       cmdline="$VALGRIND $smb4torture $other_args $name"
        plantest "$modname" "$env" $cmdline
 }
 
@@ -215,12 +216,13 @@ done
 plantest "rpc.echo on ncacn_np over smb2" dc $smb4torture ncacn_np:"\$SERVER[smb2]" -U"\$USERNAME"%"\$PASSWORD" -W \$DOMAIN RPC-ECHO "$*"
 
 # Tests against the NTVFS POSIX backend
+NTVFSARGS="--option=torture:sharedelay=100000"
 smb2=`$smb4torture --list | grep "^SMB2-" | xargs`
 raw=`$smb4torture --list | grep "^RAW-" | xargs`
 base=`$smb4torture --list | grep "^BASE-" | xargs`
 
 for t in $base $raw $smb2; do
-    plansmbtorturetest "$t" dc $ADDARGS //\$SERVER/tmp -U"\$USERNAME"%"\$PASSWORD"
+    plansmbtorturetest "$t" dc $ADDARGS //\$SERVER/tmp -U"\$USERNAME"%"\$PASSWORD" $NTVFSARGS
 done
 
 rap=`$smb4torture --list | grep "^RAP-" | xargs`
@@ -230,13 +232,13 @@ done
 
 # Tests against the NTVFS CIFS backend
 for t in $base $raw; do
-    plantest "ntvfs.cifs.`normalize_testname $t`" dc $VALGRIND $smb4torture //\$NETBIOSNAME/cifs -U"\$USERNAME"%"\$PASSWORD" $t
+    plantest "ntvfs.cifs.`normalize_testname $t`" dc $VALGRIND $smb4torture //\$NETBIOSNAME/cifs -U"\$USERNAME"%"\$PASSWORD" $NTVFSARGS $t
 done
 
 # Local tests
 
 for t in `$smb4torture --list | grep "^LOCAL-" | xargs`; do
-       plansmbtorturetest "$t" none $VALGRIND $smb4torture ncalrpc: "$*"
+       plansmbtorturetest "$t" none ncalrpc: "$*"
 done
 
 if test -f $samba4bindir/tdbtorture
@@ -293,7 +295,7 @@ plantest "wbinfo -a against member server with domain creds" member $VALGRIND $s
 NBT_TESTS=`$smb4torture --list | grep "^NBT-" | xargs`
 
 for t in $NBT_TESTS; do
-       plansmbtorturetest "$t" dc //\$SERVER/_none_ $f -U\$USERNAME%\$PASSWORD 
+       plansmbtorturetest "$t" dc //\$SERVER/_none_ -U\$USERNAME%\$PASSWORD 
 done
 
 WB_OPTS="--option=\"torture:strict mode=yes\""
index aab2ca8f07f0422ccb8f45f653cd797b25bb80b3..73d03f3d4ca57e0e9d05c76d8b7bcaf80c23ef86 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/perl
 # Bootstrap Samba and run a number of tests against it.
-# Copyright (C) 2005-2007 Jelmer Vernooij <jelmer@samba.org>
+# Copyright (C) 2005-2008 Jelmer Vernooij <jelmer@samba.org>
 # Published under the GNU GPL, v3 or later.
 
 =pod
@@ -13,7 +13,7 @@ selftest - Samba test runner
 
 selftest --help
 
-selftest [--srcdir=DIR] [--builddir=DIR] [--target=samba4|samba3|win] [--socket-wrapper] [--quick] [--exclude=FILE] [--include=FILE] [--one] [--prefix=prefix] [--immediate] [--testlist=FILE] [TESTS]
+selftest [--srcdir=DIR] [--builddir=DIR] [--target=samba4|samba3|win|kvm] [--socket-wrapper] [--quick] [--exclude=FILE] [--include=FILE] [--one] [--prefix=prefix] [--immediate] [--testlist=FILE] [TESTS]
 
 =head1 DESCRIPTION
 
@@ -43,7 +43,7 @@ Change directory to run tests in. Default is 'st'.
 
 Show errors as soon as they happen rather than at the end of the test run.
                
-=item I<--target samba4|samba3|win>
+=item I<--target samba4|samba3|win|kvm>
 
 Specify test target against which to run. Default is 'samba4'.
 
@@ -144,6 +144,7 @@ my $opt_expected_failures = undef;
 my @opt_exclude = ();
 my @opt_include = ();
 my $opt_verbose = 0;
+my $opt_image = undef;
 my $opt_testenv = 0;
 my $ldap = undef;
 my $opt_analyse_cmd = undef;
@@ -203,7 +204,7 @@ sub getlog_env($);
 
 sub setup_pcap($)
 {
-       my ($state, $name) = @_;
+       my ($name) = @_;
 
        return unless ($opt_socket_wrapper_pcap);
        return unless defined($ENV{SOCKET_WRAPPER_PCAP_DIR});
@@ -280,7 +281,7 @@ Usage: $Script [OPTIONS] PREFIX
 
 Generic options:
  --help                     this help page
- --target=samba4|samba3|win Samba version to target
+ --target=samba[34]|win|kvm Samba version to target
  --testlist=FILE                       file to read available tests from
 
 Paths:
@@ -301,6 +302,9 @@ Samba4 Specific:
 Samba3 Specific:
  --bindir=PATH              path to binaries
 
+Kvm Specific:
+ --image=PATH               path to KVM image
+
 Behaviour:
  --quick                    run quick overall test
  --one                      abort when the first test fails
@@ -334,6 +338,7 @@ my $result = GetOptions (
                'resetup-environment' => \$opt_resetup_env,
                'bindir:s' => \$opt_bindir,
                'format=s' => \$opt_format,
+               'image=s' => \$opt_image,
                'testlist=s' => \@testlists
            );
 
@@ -442,6 +447,37 @@ if ($opt_target eq "samba4") {
        $testenv_default = "dc";
        require target::Windows;
        $target = new Windows();
+} elsif ($opt_target eq "kvm") {
+       die("Kvm tests will not run with socket wrapper enabled.") 
+               if ($opt_socket_wrapper);
+       require target::Kvm;
+       die("No image specified") unless ($opt_image);
+       $target = new Kvm($opt_image, undef);
+}
+
+#
+# Start a Virtual Distributed Ethernet Switch
+# Returns the pid of the switch.
+#
+sub start_vde_switch($)
+{
+       my ($path) = @_;
+
+       system("vde_switch --pidfile $path/vde.pid --sock $path/vde.sock --daemon");
+
+       open(PID, "$path/vde.pid");
+       <PID> =~ /([0-9]+)/;
+       my $pid = $1;
+       close(PID);
+
+       return $pid;
+}
+
+# Stop a Virtual Distributed Ethernet Switch
+sub stop_vde_switch($)
+{
+       my ($pid) = @_;
+       kill 9, $pid;
 }
 
 sub read_test_regexes($)
@@ -522,11 +558,13 @@ sub write_clientconf($$)
        if (defined($vars->{WINBINDD_SOCKET_DIR})) {
                print CF "\twinbindd socket directory = $vars->{WINBINDD_SOCKET_DIR}\n";
        }
+       if ($opt_socket_wrapper) {
+               print CF "\tinterfaces = $interfaces\n";
+       }
        print CF "
        private dir = $prefix_abs/client/private
        js include = $srcdir_abs/scripting/libjs
        name resolve order = bcast
-       interfaces = $interfaces
        panic action = $srcdir_abs/script/gdb_backtrace \%PID\% \%PROG\%
        max xmit = 32K
        notify:inotify = false
diff --git a/source4/selftest/target/Kvm.pm b/source4/selftest/target/Kvm.pm
new file mode 100644 (file)
index 0000000..3b17a29
--- /dev/null
@@ -0,0 +1,167 @@
+#!/usr/bin/perl
+# Start a KVM machine and run a number of tests against it.
+# Copyright (C) 2005-2008 Jelmer Vernooij <jelmer@samba.org>
+# Published under the GNU GPL, v3 or later.
+
+package Kvm;
+
+use strict;
+use Cwd qw(abs_path);
+use FindBin qw($RealBin);
+use POSIX;
+
+sub new($$$$) {
+       my ($classname, $dc_image, $vdesocket) = @_;
+       my $self = { 
+               dc_image => $dc_image,
+               vdesocket => $vdesocket,
+       };
+       bless $self;
+       return $self;
+}
+
+sub write_kvm_ifup($$$)
+{
+       my ($self, $path, $ip_prefix) = @_;
+       open(SCRIPT, ">$path/kvm-ifup");
+
+       print SCRIPT <<__EOF__;
+#!/bin/sh
+
+PREFIX=$ip_prefix
+
+/sbin/ifconfig \$1 \$PREFIX.1 up
+
+cat <<EOF>$path/udhcpd.conf
+interface \$1
+start          \$PREFIX.20
+end            \$PREFIX.20
+max_leases 1
+lease_file     $path/udhcpd.leases
+pidfile        $path/udhcpd.pid
+EOF
+
+touch $path/udhcpd.leases
+
+/usr/sbin/udhcpd $path/udhcpd.conf
+
+exit 0
+__EOF__
+       close(SCRIPT);
+       chmod(0755, "$path/kvm-ifup");
+
+       return ("$path/kvm-ifup", "$path/udhcpd.pid", "$ip_prefix.20");
+}
+
+sub teardown_env($$)
+{
+       my ($self, $envvars) = @_;
+
+       print "Killing kvm instance $envvars->{KVM_PID}\n";
+
+       kill 9, $envvars->{KVM_PID};
+
+       if (defined($envvars->{DHCPD_PID})) {
+               print "Killing dhcpd instance $envvars->{DHCPD_PID}\n";
+               kill 9, $envvars->{DHCPD_PID};
+       }
+
+       return 0;
+}
+
+sub getlog_env($$)
+{
+       my ($self, $envvars) = @_;
+
+       return "";
+}
+
+sub check_env($$)
+{
+       my ($self, $envvars) = @_;
+
+       # FIXME: Check whether $self->{pid} is still running
+
+       return 1;
+}
+
+sub read_pidfile($)
+{
+       my ($path) = @_;
+
+       open(PID, $path);
+       <PID> =~ /([0-9]+)/;
+       my ($pid) = $1;
+       close(PID);
+       return $pid;
+}
+
+sub start($$$)
+{
+       my ($self, $path, $image) = @_;
+
+       my $pidfile = "$path/kvm.pid";
+
+       my $opts = (defined($ENV{KVM_OPTIONS})?$ENV{KVM_OPTIONS}:"-nographic");
+
+       if (defined($ENV{KVM_SNAPSHOT})) {
+               $opts .= " -loadvm $ENV{KVM_SNAPSHOT}";
+       }
+
+       my $netopts;
+       my $dhcp_pid;
+       my $ip_address;
+
+       if ($self->{vdesocket}) {
+               $netopts = "vde,socket=$self->{vdesocket}";
+       } else {
+               my $ifup_script, $dhcpd_pidfile;
+               ($ifup_script, $dhcpd_pidfile, $ip_address) = $self->write_kvm_ifup($path, "192.168.9");
+               $netopts = "tap,script=$ifup_script";
+               $dhcp_pid = read_pidfile($dhcpd_pidfile);
+       }
+
+       system("kvm -name \"Samba 4 Test Subject\" $opts -monitor unix:$path/kvm.monitor,server,nowait -daemonize -pidfile $pidfile -snapshot $image -net nic -net $netopts");
+
+       return (read_pidfile($pidfile), $dhcp_pid, $ip_address);
+}
+
+sub setup_env($$$)
+{
+       my ($self, $envname, $path) = @_;
+
+       if ($envname eq "dc") {
+               ($self->{dc_pid}, $self->{dc_dhcpd_pid}, $self->{dc_ip}) = $self->start($path, $self->{dc_image});
+
+               sub choose_var($$) { 
+                       my ($name, $default) = @_; 
+                       return defined($ENV{"KVM_DC_$name"})?$ENV{"KVM_DC_$name"}:$default; 
+               }
+
+               if ($envname eq "dc") {
+                       return {
+                               KVM_PID => $self->{dc_pid},
+                               DHCPD_PID => $self->{dc_dhcpd_pid},
+                               USERNAME => choose_var("USERNAME", "Administrator"),
+                               PASSWORD => choose_var("PASSWORD", "penguin"),
+                               DOMAIN => choose_var("DOMAIN", "SAMBA"), 
+                               REALM => choose_var("REALM", "SAMBA"), 
+                               SERVER => choose_var("SERVER", "DC"), 
+                               SERVER_IP => $self->{dc_ip},
+                               NETBIOSNAME => choose_var("NETBIOSNAME", "DC"), 
+                               NETBIOSALIAS => choose_var("NETBIOSALIAS", "DC"), 
+                       };
+               } else {
+                       return undef;
+               }
+       } else {
+               return undef;
+       }
+}
+
+sub stop($)
+{
+       my ($self) = @_;
+}
+
+1;
index 563aca876e0fa5c75e87129850ebcda904cf9f2e..37e3cbe3549f09561dac353b0952b8161e551fc1 100644 (file)
@@ -676,10 +676,10 @@ nogroup:x:65534:nobody
        push (@provision_options, "NSS_WRAPPER_GROUP=\"$nsswrap_group\"");
        if (defined($ENV{PROVISION_EJS})) {
                push (@provision_options, "$self->{bindir}/smbscript");
-               push (@provision_options, "$self->{setupdir}/provision");
+               push (@provision_options, "$self->{setupdir}/provision.js");
        } else {
                push (@provision_options, "$self->{bindir}/smbpython");
-               push (@provision_options, "$self->{setupdir}/provision.py");
+               push (@provision_options, "$self->{setupdir}/provision");
        }
        push (@provision_options, split(' ', $configuration));
        push (@provision_options, "--host-name=$netbiosname");
@@ -729,9 +729,10 @@ nogroup:x:65534:nobody
 
                if ($self->{ldap} eq "openldap") {
                       ($ret->{SLAPD_CONF}, $ret->{OPENLDAP_PIDFILE}) = $self->mk_openldap($ldapdir, $configuration) or die("Unable to create openldap directories");
+                      push (@provision_options, "--ldap-backend-type=openldap");
                } elsif ($self->{ldap} eq "fedora-ds") {
                       ($ret->{FEDORA_DS_DIR}, $ret->{FEDORA_DS_PIDFILE}) = $self->mk_fedora_ds($ldapdir, $configuration) or die("Unable to create fedora ds directories");
-                      push (@provision_options, "--ldap-module=nsuniqueid");
+                      push (@provision_options, "--ldap-backend-type=fedora-ds");
                       push (@provision_options, "'--aci=aci:: KHRhcmdldGF0dHIgPSAiKiIpICh2ZXJzaW9uIDMuMDthY2wgImZ1bGwgYWNjZXNzIHRvIGFsbCBieSBhbGwiO2FsbG93IChhbGwpKHVzZXJkbiA9ICJsZGFwOi8vL2FueW9uZSIpOykK'");
                  }
 
diff --git a/source4/setup/idmap_init.ldif b/source4/setup/idmap_init.ldif
new file mode 100644 (file)
index 0000000..a397cfd
--- /dev/null
@@ -0,0 +1,5 @@
+dn: CN=CONFIG
+cn: CONFIG
+lowerBound: 10000
+upperBound: 20000
+
index 9e135cddbb49207356041849b1fa89b681ae7009..033d2491f2152ab4ddbd5af79cd70a33b690f36f 100755 (executable)
-#!/bin/sh
-exec smbscript "$0" ${1+"$@"}
-/*
-       provision a Samba4 server
-       Copyright Andrew Tridgell 2005
-       Released under the GNU GPL v2 or later
-*/
-
-options = GetOptions(ARGV,
-               "POPT_AUTOHELP",
-               "POPT_COMMON_SAMBA",
-               "POPT_COMMON_VERSION",
-               "POPT_COMMON_CREDENTIALS",
-               'realm=s',
-               'domain=s',
-               'domain-guid=s',
-               'domain-sid=s',
-               'policy-guid=s',
-               'host-name=s',
-               'host-ip=s',
-               'host-guid=s',
-               'invocationid=s',
-               'adminpass=s',
-               'krbtgtpass=s',
-               'machinepass=s',
-               'dnspass=s',
-               'root=s',
-               'nobody=s',
-               'nogroup=s',
-               'wheel=s',
-               'users=s',
-               'quiet',
-               'blank',
-               'server-role=s',
-               'partitions-only',
-               'ldap-base',
-               'ldap-backend=s',
-                'ldap-module=s',
-                'aci=s');
-
-if (options == undefined) {
-   println("Failed to parse options");
-   return -1;
-}
-
-libinclude("base.js");
-libinclude("provision.js");
-
-/*
-  print a message if quiet is not set
-*/
-function message()
-{
-       if (options["quiet"] == undefined) {
-               print(vsprintf(arguments));
-       }
-}
-
-/*
- show some help
-*/
-function ShowHelp()
-{
-       print("
-Samba4 provisioning
-
-provision [options]
- --realm       REALM           set realm
- --domain      DOMAIN          set domain
- --domain-guid GUID            set domainguid (otherwise random)
- --domain-sid  SID             set domainsid (otherwise random)
- --host-name   HOSTNAME        set hostname
- --host-ip     IPADDRESS       set ipaddress
- --host-guid   GUID            set hostguid (otherwise random)
- --policy-guid  GUID            set group policy guid (otherwise random)
- --invocationid        GUID            set invocationid (otherwise random)
- --adminpass   PASSWORD        choose admin password (otherwise random)
- --krbtgtpass  PASSWORD        choose krbtgt password (otherwise random)
- --machinepass PASSWORD        choose machine password (otherwise random)
- --root         USERNAME       choose 'root' unix username
- --nobody      USERNAME        choose 'nobody' user
- --nogroup     GROUPNAME       choose 'nogroup' group
- --wheel       GROUPNAME       choose 'wheel' privileged group
- --users       GROUPNAME       choose 'users' group
- --quiet                       Be quiet
- --blank                       do not add users or groups, just the structure
- --server-role  ROLE            Set server role to provision for (default standalone)
- --partitions-only              Configure Samba's partitions, but do not modify them (ie, join a BDC)
- --ldap-base                   output only an LDIF file, suitable for creating an LDAP baseDN
- --ldap-backend LDAPSERVER      LDAP server to use for this provision
- --ldap-module  MODULE          LDB mapping module to use for the LDAP backend
- --aci          ACI             An arbitary LDIF fragment, particularly useful to loading a backend ACI value into a target LDAP server
-You must provide at least a realm and domain
-
-");
-       exit(1);
-}
-
-if (options['host-name'] == undefined) {
-       options['host-name'] = hostname();
-}
-
-/*
-   main program
-*/
-if (options["realm"] == undefined ||
-    options["domain"] == undefined ||
-    options["host-name"] == undefined) {
-       ShowHelp();
-}
-
-/* cope with an initially blank smb.conf */
-var lp = loadparm_init();
-lp.set("realm", options.realm);
-lp.set("workgroup", options.domain);
-lp.set("server role", options["server-role"]);
-lp.reload();
-
-var subobj = provision_guess();
-for (r in options) {
-       var key = strupper(join("", split("-", r)));
-       subobj[key] = options[r];
-}
-
-var blank = (options["blank"] != undefined);
-var ldapbackend = (options["ldap-backend"] != undefined);
-var ldapmodule = (options["ldap-module"] != undefined);
-var partitions_only = (options["partitions-only"] != undefined);
-var paths = provision_default_paths(subobj);
-if (options["aci"] != undefined) {
-       message("set ACI: %s\n", subobj["ACI"]);
-}
-
-message("set DOMAIN SID: %s\n", subobj["DOMAINSID"]);
-
-provision_fix_subobj(subobj, paths);
-
-if (ldapbackend) {
-       if (options["ldap-backend"] == "ldapi") {
-               subobj.LDAPBACKEND = subobj.LDAPI_URI;
-       }
-       if (!ldapmodule) {
-               subobj.LDAPMODULE = "normalise,entryuuid";
-               subobj.TDB_MODULES_LIST = "";
-       }
-       subobj.BACKEND_MOD = subobj.LDAPMODULE + ",paged_searches";
-       subobj.DOMAINDN_LDB = subobj.LDAPBACKEND;
-       subobj.CONFIGDN_LDB = subobj.LDAPBACKEND;
-       subobj.SCHEMADN_LDB = subobj.LDAPBACKEND;
-       message("LDAP module: %s on backend: %s\n", subobj.LDAPMODULE, subobj.LDAPBACKEND);
-}
-
-if (!provision_validate(subobj, message)) {
-       return -1;
-}
-
-var system_session = system_session();
-var creds = options.get_credentials();
-message("Provisioning for %s in realm %s\n", subobj.DOMAIN, subobj.REALM);
-message("Using administrator password: %s\n", subobj.ADMINPASS);
-if (partitions_only) {
-       provision_become_dc(subobj, message, false, paths, system_session);
-} else {
-       provision(subobj, message, blank, paths, system_session, creds, ldapbackend);
-       provision_dns(subobj, message, paths, system_session, creds);
-       message("To reproduce this provision, run with:\n");
-/*     There has to be a better way than this... */
-       message("--realm='%s' --domain='%s' \\\n", subobj.REALM_CONF, subobj.DOMAIN_CONF);
-       if (subobj.DOMAINGUID != undefined) {
-                message("--domain-guid='%s' \\\n", subobj.DOMAINGUID);
-       }
-       if (subobj.HOSTGUID != undefined) {
-                message("--host-guid='%s' \\\n", subobj.HOSTGUID);
-       }
-       message("--policy-guid='%s' --host-name='%s' --host-ip='%s' \\\n", subobj.POLICYGUID, subobj.HOSTNAME, subobj.HOSTIP);
-       if (subobj.INVOCATIONID != undefined) {
-               message("--invocationid='%s' \\\n", subobj.INVOCATIONID);
-       }
-       message("--adminpass='%s' --krbtgtpass='%s' \\\n", subobj.ADMINPASS, subobj.KRBTGTPASS);
-       message("--machinepass='%s' --dnspass='%s' \\\n", subobj.MACHINEPASS, subobj.DNSPASS);
-       message("--root='%s' --nobody='%s' --nogroup='%s' \\\n", subobj.ROOT, subobj.NOBODY, subobj.NOGROUP);
-       message("--wheel='%s' --users='%s' --server-role='%s' \\\n", subobj.WHEEL, subobj.USERS, subobj.SERVERROLE);
-       if (ldapbackend) {
-               message("--ldap-backend='%s' \\\n", subobj.LDAPBACKEND);
-       }
-       if (ldapmodule) {
-               message("--ldap-module='%s' \\\n", + subobj.LDAPMODULE);
-       }
-       message("--aci='" + subobj.ACI + "' \\\n")
-}
-
-
-message("All OK\n");
-return 0;
+#!/usr/bin/python
+#
+# Unix SMB/CIFS implementation.
+# provision a Samba4 server
+# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007-2008
+# Copyright (C) Andrew Bartlett <abartlet@samba.org> 2008
+#
+# Based on the original in EJS:
+# Copyright (C) Andrew Tridgell 2005
+#   
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#   
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#   
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+import getopt
+import optparse
+import os, sys
+
+import samba
+
+from auth import system_session
+import samba.getopt as options
+import param
+from samba.provision import (provision, 
+                             provision_paths_from_lp,
+                             FILL_FULL, FILL_NT4SYNC,
+                             FILL_DRS)
+
+parser = optparse.OptionParser("provision [options]")
+sambaopts = options.SambaOptions(parser)
+parser.add_option_group(sambaopts)
+parser.add_option_group(options.VersionOptions(parser))
+credopts = options.CredentialsOptions(parser)
+parser.add_option_group(credopts)
+parser.add_option("--setupdir", type="string", metavar="DIR", 
+               help="directory with setup files")
+parser.add_option("--realm", type="string", metavar="REALM", help="set realm")
+parser.add_option("--domain", type="string", metavar="DOMAIN",
+                                 help="set domain")
+parser.add_option("--domain-guid", type="string", metavar="GUID", 
+               help="set domainguid (otherwise random)")
+parser.add_option("--domain-sid", type="string", metavar="SID", 
+               help="set domainsid (otherwise random)")
+parser.add_option("--policy-guid", type="string", metavar="GUID",
+                                 help="set policy guid")
+parser.add_option("--host-name", type="string", metavar="HOSTNAME", 
+               help="set hostname")
+parser.add_option("--host-ip", type="string", metavar="IPADDRESS", 
+               help="set ipaddress")
+parser.add_option("--host-guid", type="string", metavar="GUID", 
+               help="set hostguid (otherwise random)")
+parser.add_option("--invocationid", type="string", metavar="GUID", 
+               help="set invocationid (otherwise random)")
+parser.add_option("--adminpass", type="string", metavar="PASSWORD", 
+               help="choose admin password (otherwise random)")
+parser.add_option("--krbtgtpass", type="string", metavar="PASSWORD", 
+               help="choose krbtgt password (otherwise random)")
+parser.add_option("--machinepass", type="string", metavar="PASSWORD", 
+               help="choose machine password (otherwise random)")
+parser.add_option("--dnspass", type="string", metavar="PASSWORD", 
+               help="choose dns password (otherwise random)")
+parser.add_option("--root", type="string", metavar="USERNAME", 
+               help="choose 'root' unix username")
+parser.add_option("--nobody", type="string", metavar="USERNAME", 
+               help="choose 'nobody' user")
+parser.add_option("--nogroup", type="string", metavar="GROUPNAME", 
+               help="choose 'nogroup' group")
+parser.add_option("--wheel", type="string", metavar="GROUPNAME", 
+               help="choose 'wheel' privileged group")
+parser.add_option("--users", type="string", metavar="GROUPNAME", 
+               help="choose 'users' group")
+parser.add_option("--quiet", help="Be quiet", action="store_true")
+parser.add_option("--blank", action="store_true",
+               help="do not add users or groups, just the structure")
+parser.add_option("--ldap-backend", type="string", metavar="LDAPSERVER", 
+               help="LDAP server to use for this provision")
+parser.add_option("--ldap-backend-type", type="choice", metavar="LDAP-BACKEND-TYPE", 
+               help="LDB mapping module to use for the LDAP backend",
+               choices=["fedora-ds", "openldap"])
+parser.add_option("--aci", type="string", metavar="ACI", 
+               help="An arbitary LDIF fragment, particularly useful to loading a backend ACI value into a target LDAP server. You must provide at least a realm and domain")
+parser.add_option("--server-role", type="choice", metavar="ROLE",
+                         choices=["domain controller", "member server"],
+               help="Set server role to provision for (default standalone)")
+parser.add_option("--partitions-only", 
+               help="Configure Samba's partitions, but do not modify them (ie, join a BDC)", action="store_true")
+parser.add_option("--targetdir", type="string", metavar="DIR", 
+                         help="Set target directory")
+
+opts = parser.parse_args()[0]
+
+def message(text):
+       """print a message if quiet is not set."""
+       if not opts.quiet:
+               print text
+
+if opts.realm is None or opts.domain is None:
+       if opts.realm is None:
+               print >>sys.stderr, "No realm set"
+       if opts.domain is None:
+               print >>sys.stderr, "No domain set"
+       parser.print_usage()
+       sys.exit(1)
+
+# cope with an initially blank smb.conf 
+private_dir = None
+lp = sambaopts.get_loadparm()
+if opts.targetdir is not None:
+    if not os.path.exists(opts.targetdir):
+        os.mkdir(opts.targetdir)
+    private_dir = os.path.join(opts.targetdir, "private")
+    if not os.path.exists(private_dir):
+        os.mkdir(private_dir)
+    lp.set("private dir", os.path.abspath(private_dir))
+    lp.set("lock dir", os.path.abspath(opts.targetdir))
+lp.set("realm", opts.realm)
+lp.set("workgroup", opts.domain)
+lp.set("server role", opts.server_role or "domain controller")
+
+if opts.aci is not None:
+       print "set ACI: %s" % opts.aci
+
+paths = provision_paths_from_lp(lp, opts.realm.lower())
+if sambaopts.get_loadparm_path() is not None:
+    paths.smbconf = sambaopts.get_loadparm_path()
+
+creds = credopts.get_credentials()
+
+setup_dir = opts.setupdir
+if setup_dir is None:
+       setup_dir = "setup"
+
+samdb_fill = FILL_FULL
+if opts.blank:
+    samdb_fill = FILL_NT4SYNC
+elif opts.partitions_only:
+    samdb_fill = FILL_DRS
+
+provision(lp, setup_dir, message, paths, 
+          system_session(), creds, 
+          samdb_fill=samdb_fill, realm=opts.realm,
+          domainguid=opts.domain_guid, domainsid=opts.domain_sid,
+          policyguid=opts.policy_guid, hostname=opts.host_name,
+          hostip=opts.host_ip, hostguid=opts.host_guid, 
+          invocationid=opts.invocationid, adminpass=opts.adminpass,
+          krbtgtpass=opts.krbtgtpass, machinepass=opts.machinepass,
+          dnspass=opts.dnspass, root=opts.root, nobody=opts.nobody,
+          nogroup=opts.nogroup, wheel=opts.wheel, users=opts.users,
+          aci=opts.aci, serverrole=opts.server_role, 
+          ldap_backend=opts.ldap_backend, 
+          ldap_backend_type=opts.ldap_backend_type)
+
+message("To reproduce this provision, run with:")
+def shell_escape(arg):
+    if " " in arg:
+        return '"%s"' % arg
+    return arg
+message(" ".join([shell_escape(arg) for arg in sys.argv]))
+
+message("All OK")
diff --git a/source4/setup/provision.js b/source4/setup/provision.js
new file mode 100755 (executable)
index 0000000..328754f
--- /dev/null
@@ -0,0 +1,198 @@
+#!/bin/sh
+exec smbscript "$0" ${1+"$@"}
+/*
+       provision a Samba4 server
+       Copyright Andrew Tridgell 2005
+       Released under the GNU GPL v2 or later
+*/
+
+options = GetOptions(ARGV,
+               "POPT_AUTOHELP",
+               "POPT_COMMON_SAMBA",
+               "POPT_COMMON_VERSION",
+               "POPT_COMMON_CREDENTIALS",
+               'realm=s',
+               'domain=s',
+               'domain-guid=s',
+               'domain-sid=s',
+               'policy-guid=s',
+               'host-name=s',
+               'host-ip=s',
+               'host-guid=s',
+               'invocationid=s',
+               'adminpass=s',
+               'krbtgtpass=s',
+               'machinepass=s',
+               'dnspass=s',
+               'root=s',
+               'nobody=s',
+               'nogroup=s',
+               'wheel=s',
+               'users=s',
+               'quiet',
+               'blank',
+               'server-role=s',
+               'partitions-only',
+               'ldap-base',
+               'ldap-backend=s',
+                'ldap-backend-type=s',
+                'aci=s');
+
+if (options == undefined) {
+   println("Failed to parse options");
+   return -1;
+}
+
+libinclude("base.js");
+libinclude("provision.js");
+
+/*
+  print a message if quiet is not set
+*/
+function message()
+{
+       if (options["quiet"] == undefined) {
+               print(vsprintf(arguments));
+       }
+}
+
+/*
+ show some help
+*/
+function ShowHelp()
+{
+       print("
+Samba4 provisioning
+
+provision [options]
+ --realm       REALM           set realm
+ --domain      DOMAIN          set domain
+ --domain-guid GUID            set domainguid (otherwise random)
+ --domain-sid  SID             set domainsid (otherwise random)
+ --host-name   HOSTNAME        set hostname
+ --host-ip     IPADDRESS       set ipaddress
+ --host-guid   GUID            set hostguid (otherwise random)
+ --policy-guid  GUID            set group policy guid (otherwise random)
+ --invocationid        GUID            set invocationid (otherwise random)
+ --adminpass   PASSWORD        choose admin password (otherwise random)
+ --krbtgtpass  PASSWORD        choose krbtgt password (otherwise random)
+ --machinepass PASSWORD        choose machine password (otherwise random)
+ --root         USERNAME       choose 'root' unix username
+ --nobody      USERNAME        choose 'nobody' user
+ --nogroup     GROUPNAME       choose 'nogroup' group
+ --wheel       GROUPNAME       choose 'wheel' privileged group
+ --users       GROUPNAME       choose 'users' group
+ --quiet                       Be quiet
+ --blank                       do not add users or groups, just the structure
+ --server-role  ROLE            Set server role to provision for (default standalone)
+ --partitions-only              Configure Samba's partitions, but do not modify them (ie, join a BDC)
+ --ldap-base                   output only an LDIF file, suitable for creating an LDAP baseDN
+ --ldap-backend LDAPSERVER      LDAP server to use for this provision
+ --ldap-backend-type  TYPE      OpenLDAP or Fedora DS
+ --aci          ACI             An arbitary LDIF fragment, particularly useful to loading a backend ACI value into a target LDAP server
+You must provide at least a realm and domain
+
+");
+       exit(1);
+}
+
+if (options['host-name'] == undefined) {
+       options['host-name'] = hostname();
+}
+
+/*
+   main program
+*/
+if (options["realm"] == undefined ||
+    options["domain"] == undefined ||
+    options["host-name"] == undefined) {
+       ShowHelp();
+}
+
+/* cope with an initially blank smb.conf */
+var lp = loadparm_init();
+lp.set("realm", options.realm);
+lp.set("workgroup", options.domain);
+lp.set("server role", options["server-role"]);
+lp.reload();
+
+var subobj = provision_guess();
+for (r in options) {
+       var key = strupper(join("", split("-", r)));
+       subobj[key] = options[r];
+}
+
+var blank = (options["blank"] != undefined);
+var ldapbackend = (options["ldap-backend"] != undefined);
+var ldapbackendtype = options["ldap-backend-type"];
+var partitions_only = (options["partitions-only"] != undefined);
+var paths = provision_default_paths(subobj);
+if (options["aci"] != undefined) {
+       message("set ACI: %s\n", subobj["ACI"]);
+}
+
+message("set DOMAIN SID: %s\n", subobj["DOMAINSID"]);
+
+provision_fix_subobj(subobj, paths);
+
+if (ldapbackend) {
+       if (options["ldap-backend"] == "ldapi") {
+               subobj.LDAPBACKEND = subobj.LDAPI_URI;
+       }
+       if (ldapbackendtype == undefined) {
+              
+       } else if (ldapbackendtype == "openldap") {
+               subobj.LDAPMODULE = "normalise,entryuuid";
+               subobj.TDB_MODULES_LIST = "";
+       } else if (ldapbackendtype == "fedora-ds") {
+               subobj.LDAPMODULE = "nsuniqueid";
+       }
+       subobj.BACKEND_MOD = subobj.LDAPMODULE + ",paged_searches";
+       subobj.DOMAINDN_LDB = subobj.LDAPBACKEND;
+       subobj.CONFIGDN_LDB = subobj.LDAPBACKEND;
+       subobj.SCHEMADN_LDB = subobj.LDAPBACKEND;
+       message("LDAP module: %s on backend: %s\n", subobj.LDAPMODULE, subobj.LDAPBACKEND);
+}
+
+if (!provision_validate(subobj, message)) {
+       return -1;
+}
+
+var system_session = system_session();
+var creds = options.get_credentials();
+message("Provisioning for %s in realm %s\n", subobj.DOMAIN, subobj.REALM);
+message("Using administrator password: %s\n", subobj.ADMINPASS);
+if (partitions_only) {
+       provision_become_dc(subobj, message, false, paths, system_session);
+} else {
+       provision(subobj, message, blank, paths, system_session, creds, ldapbackend);
+       provision_dns(subobj, message, paths, system_session, creds);
+       message("To reproduce this provision, run with:\n");
+/*     There has to be a better way than this... */
+       message("--realm='%s' --domain='%s' \\\n", subobj.REALM_CONF, subobj.DOMAIN_CONF);
+       if (subobj.DOMAINGUID != undefined) {
+                message("--domain-guid='%s' \\\n", subobj.DOMAINGUID);
+       }
+       if (subobj.HOSTGUID != undefined) {
+                message("--host-guid='%s' \\\n", subobj.HOSTGUID);
+       }
+       message("--policy-guid='%s' --host-name='%s' --host-ip='%s' \\\n", subobj.POLICYGUID, subobj.HOSTNAME, subobj.HOSTIP);
+       if (subobj.INVOCATIONID != undefined) {
+               message("--invocationid='%s' \\\n", subobj.INVOCATIONID);
+       }
+       message("--adminpass='%s' --krbtgtpass='%s' \\\n", subobj.ADMINPASS, subobj.KRBTGTPASS);
+       message("--machinepass='%s' --dnspass='%s' \\\n", subobj.MACHINEPASS, subobj.DNSPASS);
+       message("--root='%s' --nobody='%s' --nogroup='%s' \\\n", subobj.ROOT, subobj.NOBODY, subobj.NOGROUP);
+       message("--wheel='%s' --users='%s' --server-role='%s' \\\n", subobj.WHEEL, subobj.USERS, subobj.SERVERROLE);
+       if (ldapbackend) {
+               message("--ldap-backend='%s' \\\n", subobj.LDAPBACKEND);
+       }
+       if (ldapbackendtype != undefined) {
+               message("--ldap-backend-type='%s' \\\n", + ldapbackendtype);
+       }
+       message("--aci='" + subobj.ACI + "' \\\n")
+}
+
+
+message("All OK\n");
+return 0;
diff --git a/source4/setup/provision.py b/source4/setup/provision.py
deleted file mode 100755 (executable)
index 033d249..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-#!/usr/bin/python
-#
-# Unix SMB/CIFS implementation.
-# provision a Samba4 server
-# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007-2008
-# Copyright (C) Andrew Bartlett <abartlet@samba.org> 2008
-#
-# Based on the original in EJS:
-# Copyright (C) Andrew Tridgell 2005
-#   
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#   
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#   
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-import getopt
-import optparse
-import os, sys
-
-import samba
-
-from auth import system_session
-import samba.getopt as options
-import param
-from samba.provision import (provision, 
-                             provision_paths_from_lp,
-                             FILL_FULL, FILL_NT4SYNC,
-                             FILL_DRS)
-
-parser = optparse.OptionParser("provision [options]")
-sambaopts = options.SambaOptions(parser)
-parser.add_option_group(sambaopts)
-parser.add_option_group(options.VersionOptions(parser))
-credopts = options.CredentialsOptions(parser)
-parser.add_option_group(credopts)
-parser.add_option("--setupdir", type="string", metavar="DIR", 
-               help="directory with setup files")
-parser.add_option("--realm", type="string", metavar="REALM", help="set realm")
-parser.add_option("--domain", type="string", metavar="DOMAIN",
-                                 help="set domain")
-parser.add_option("--domain-guid", type="string", metavar="GUID", 
-               help="set domainguid (otherwise random)")
-parser.add_option("--domain-sid", type="string", metavar="SID", 
-               help="set domainsid (otherwise random)")
-parser.add_option("--policy-guid", type="string", metavar="GUID",
-                                 help="set policy guid")
-parser.add_option("--host-name", type="string", metavar="HOSTNAME", 
-               help="set hostname")
-parser.add_option("--host-ip", type="string", metavar="IPADDRESS", 
-               help="set ipaddress")
-parser.add_option("--host-guid", type="string", metavar="GUID", 
-               help="set hostguid (otherwise random)")
-parser.add_option("--invocationid", type="string", metavar="GUID", 
-               help="set invocationid (otherwise random)")
-parser.add_option("--adminpass", type="string", metavar="PASSWORD", 
-               help="choose admin password (otherwise random)")
-parser.add_option("--krbtgtpass", type="string", metavar="PASSWORD", 
-               help="choose krbtgt password (otherwise random)")
-parser.add_option("--machinepass", type="string", metavar="PASSWORD", 
-               help="choose machine password (otherwise random)")
-parser.add_option("--dnspass", type="string", metavar="PASSWORD", 
-               help="choose dns password (otherwise random)")
-parser.add_option("--root", type="string", metavar="USERNAME", 
-               help="choose 'root' unix username")
-parser.add_option("--nobody", type="string", metavar="USERNAME", 
-               help="choose 'nobody' user")
-parser.add_option("--nogroup", type="string", metavar="GROUPNAME", 
-               help="choose 'nogroup' group")
-parser.add_option("--wheel", type="string", metavar="GROUPNAME", 
-               help="choose 'wheel' privileged group")
-parser.add_option("--users", type="string", metavar="GROUPNAME", 
-               help="choose 'users' group")
-parser.add_option("--quiet", help="Be quiet", action="store_true")
-parser.add_option("--blank", action="store_true",
-               help="do not add users or groups, just the structure")
-parser.add_option("--ldap-backend", type="string", metavar="LDAPSERVER", 
-               help="LDAP server to use for this provision")
-parser.add_option("--ldap-backend-type", type="choice", metavar="LDAP-BACKEND-TYPE", 
-               help="LDB mapping module to use for the LDAP backend",
-               choices=["fedora-ds", "openldap"])
-parser.add_option("--aci", type="string", metavar="ACI", 
-               help="An arbitary LDIF fragment, particularly useful to loading a backend ACI value into a target LDAP server. You must provide at least a realm and domain")
-parser.add_option("--server-role", type="choice", metavar="ROLE",
-                         choices=["domain controller", "member server"],
-               help="Set server role to provision for (default standalone)")
-parser.add_option("--partitions-only", 
-               help="Configure Samba's partitions, but do not modify them (ie, join a BDC)", action="store_true")
-parser.add_option("--targetdir", type="string", metavar="DIR", 
-                         help="Set target directory")
-
-opts = parser.parse_args()[0]
-
-def message(text):
-       """print a message if quiet is not set."""
-       if not opts.quiet:
-               print text
-
-if opts.realm is None or opts.domain is None:
-       if opts.realm is None:
-               print >>sys.stderr, "No realm set"
-       if opts.domain is None:
-               print >>sys.stderr, "No domain set"
-       parser.print_usage()
-       sys.exit(1)
-
-# cope with an initially blank smb.conf 
-private_dir = None
-lp = sambaopts.get_loadparm()
-if opts.targetdir is not None:
-    if not os.path.exists(opts.targetdir):
-        os.mkdir(opts.targetdir)
-    private_dir = os.path.join(opts.targetdir, "private")
-    if not os.path.exists(private_dir):
-        os.mkdir(private_dir)
-    lp.set("private dir", os.path.abspath(private_dir))
-    lp.set("lock dir", os.path.abspath(opts.targetdir))
-lp.set("realm", opts.realm)
-lp.set("workgroup", opts.domain)
-lp.set("server role", opts.server_role or "domain controller")
-
-if opts.aci is not None:
-       print "set ACI: %s" % opts.aci
-
-paths = provision_paths_from_lp(lp, opts.realm.lower())
-if sambaopts.get_loadparm_path() is not None:
-    paths.smbconf = sambaopts.get_loadparm_path()
-
-creds = credopts.get_credentials()
-
-setup_dir = opts.setupdir
-if setup_dir is None:
-       setup_dir = "setup"
-
-samdb_fill = FILL_FULL
-if opts.blank:
-    samdb_fill = FILL_NT4SYNC
-elif opts.partitions_only:
-    samdb_fill = FILL_DRS
-
-provision(lp, setup_dir, message, paths, 
-          system_session(), creds, 
-          samdb_fill=samdb_fill, realm=opts.realm,
-          domainguid=opts.domain_guid, domainsid=opts.domain_sid,
-          policyguid=opts.policy_guid, hostname=opts.host_name,
-          hostip=opts.host_ip, hostguid=opts.host_guid, 
-          invocationid=opts.invocationid, adminpass=opts.adminpass,
-          krbtgtpass=opts.krbtgtpass, machinepass=opts.machinepass,
-          dnspass=opts.dnspass, root=opts.root, nobody=opts.nobody,
-          nogroup=opts.nogroup, wheel=opts.wheel, users=opts.users,
-          aci=opts.aci, serverrole=opts.server_role, 
-          ldap_backend=opts.ldap_backend, 
-          ldap_backend_type=opts.ldap_backend_type)
-
-message("To reproduce this provision, run with:")
-def shell_escape(arg):
-    if " " in arg:
-        return '"%s"' % arg
-    return arg
-message(" ".join([shell_escape(arg) for arg in sys.argv]))
-
-message("All OK")
index 57b11eae5f9355640a6e7dee6727e71340803521..0aed7bb8b79fe88a6b9f8954b5429ecb7acd49e8 100755 (executable)
@@ -27,11 +27,11 @@ testit() {
        return $status
 }
 
-testit "simple" $PYTHON ./setup/provision.py $CONFIGURATION --domain=FOO --realm=foo.example.com --targetdir=$PREFIX/simple
+testit "simple" $PYTHON ./setup/provision $CONFIGURATION --domain=FOO --realm=foo.example.com --targetdir=$PREFIX/simple
 
 reprovision() {
-       $PYTHON ./setup/provision.py $CONFIGURATION --domain=FOO --realm=foo.example.com --targetdir="$PREFIX/reprovision"
-       $PYTHON ./setup/provision.py $CONFIGURATION --domain=FOO --realm=foo.example.com --targetdir="$PREFIX/reprovision"
+       $PYTHON ./setup/provision $CONFIGURATION --domain=FOO --realm=foo.example.com --targetdir="$PREFIX/reprovision"
+       $PYTHON ./setup/provision $CONFIGURATION --domain=FOO --realm=foo.example.com --targetdir="$PREFIX/reprovision"
 }
 
 testit "reprovision" reprovision
index c256eed96cde60383e4332fdfaac9a89a9abc4cd..fdeb5415761fd523f9260d62eaf37cea5eedd20a 100644 (file)
@@ -253,7 +253,7 @@ static int binary_smbd_main(const char *binary_name, int argc, const char *argv[
        umask(0);
 
        DEBUG(0,("%s version %s started.\n", binary_name, SAMBA_VERSION_STRING));
-       DEBUGADD(0,("Copyright Andrew Tridgell and the Samba Team 1992-2007\n"));
+       DEBUGADD(0,("Copyright Andrew Tridgell and the Samba Team 1992-2008\n"));
 
        if (sizeof(uint16_t) < 2 || sizeof(uint32_t) < 4 || sizeof(uint64_t) < 8) {
                DEBUG(0,("ERROR: Samba is not configured correctly for the word size on your machine\n"));
@@ -282,8 +282,6 @@ static int binary_smbd_main(const char *binary_name, int argc, const char *argv[
                exit(1);
        }
 
-       ldb_global_init(); /* FIXME: */
-
        share_init();
 
        gensec_init(cmdline_lp_ctx); /* FIXME: */
index efb36e3ef8464a2be1cc27da8f30c5c305672603..68bbd3483a20627091f5931f331e90112e58d866 100644 (file)
@@ -112,7 +112,9 @@ static bool torture_pac_self_check(struct torture_context *tctx)
        }
 
        /* OK, go ahead and make a PAC */
-       ret = kerberos_create_pac(mem_ctx, server_info, 
+       ret = kerberos_create_pac(mem_ctx, 
+                                 lp_iconv_convenience(tctx->lp_ctx),
+                                 server_info, 
                                  smb_krb5_context->krb5_context,  
                                  &krbtgt_keyblock,
                                  &server_keyblock,
@@ -137,7 +139,9 @@ static bool torture_pac_self_check(struct torture_context *tctx)
        dump_data(10,tmp_blob.data,tmp_blob.length);
 
        /* Now check that we can read it back */
-       nt_status = kerberos_decode_pac(mem_ctx, &pac_data,
+       nt_status = kerberos_decode_pac(mem_ctx, 
+                                       lp_iconv_convenience(tctx->lp_ctx),
+                                       &pac_data,
                                        tmp_blob,
                                        smb_krb5_context->krb5_context,
                                        &krbtgt_keyblock,
@@ -159,7 +163,9 @@ static bool torture_pac_self_check(struct torture_context *tctx)
        }
 
        /* Now check that we can read it back */
-       nt_status = kerberos_pac_logon_info(mem_ctx, &logon_info,
+       nt_status = kerberos_pac_logon_info(mem_ctx, 
+                                           lp_iconv_convenience(tctx->lp_ctx),
+                                           &logon_info,
                                            tmp_blob,
                                            smb_krb5_context->krb5_context,
                                            &krbtgt_keyblock,
@@ -367,7 +373,9 @@ static bool torture_pac_saved_check(struct torture_context *tctx)
        }
 
        /* Decode and verify the signaure on the PAC */
-       nt_status = kerberos_decode_pac(mem_ctx, &pac_data,
+       nt_status = kerberos_decode_pac(mem_ctx, 
+                                       lp_iconv_convenience(tctx->lp_ctx),
+                                       &pac_data,
                                        tmp_blob,
                                        smb_krb5_context->krb5_context,
                                        &krbtgt_keyblock,
@@ -386,7 +394,9 @@ static bool torture_pac_saved_check(struct torture_context *tctx)
        }
 
        /* Parse the PAC again, for the logon info this time */
-       nt_status = kerberos_pac_logon_info(mem_ctx, &logon_info,
+       nt_status = kerberos_pac_logon_info(mem_ctx, 
+                                           lp_iconv_convenience(tctx->lp_ctx),
+                                           &logon_info,
                                            tmp_blob,
                                            smb_krb5_context->krb5_context,
                                            &krbtgt_keyblock,
@@ -442,6 +452,7 @@ static bool torture_pac_saved_check(struct torture_context *tctx)
        }
 
        ret = kerberos_encode_pac(mem_ctx, 
+                                 lp_iconv_convenience(tctx->lp_ctx),
                                  pac_data,
                                  smb_krb5_context->krb5_context,
                                  &krbtgt_keyblock,
@@ -493,6 +504,7 @@ static bool torture_pac_saved_check(struct torture_context *tctx)
        }
 
        ret = kerberos_create_pac(mem_ctx, 
+                                 lp_iconv_convenience(tctx->lp_ctx),
                                  server_info_out,
                                  smb_krb5_context->krb5_context,
                                  &krbtgt_keyblock,
@@ -565,7 +577,9 @@ static bool torture_pac_saved_check(struct torture_context *tctx)
        }
 
        /* Break the auth time, to ensure we check this vital detail (not setting this caused all the pain in the first place... */
-       nt_status = kerberos_decode_pac(mem_ctx, &pac_data,
+       nt_status = kerberos_decode_pac(mem_ctx, 
+                                       lp_iconv_convenience(tctx->lp_ctx),
+                                       &pac_data,
                                        tmp_blob,
                                        smb_krb5_context->krb5_context,
                                        &krbtgt_keyblock,
@@ -601,7 +615,9 @@ static bool torture_pac_saved_check(struct torture_context *tctx)
                                                   smb_get_krb5_error_message(smb_krb5_context->krb5_context, ret, mem_ctx)));
        }
 
-       nt_status = kerberos_decode_pac(mem_ctx, &pac_data,
+       nt_status = kerberos_decode_pac(mem_ctx, 
+                                       lp_iconv_convenience(tctx->lp_ctx),
+                                       &pac_data,
                                        tmp_blob,
                                        smb_krb5_context->krb5_context,
                                        &krbtgt_keyblock,
@@ -619,7 +635,9 @@ static bool torture_pac_saved_check(struct torture_context *tctx)
        /* Finally...  Bugger up the signature, and check we fail the checksum */
        tmp_blob.data[tmp_blob.length - 2]++;
 
-       nt_status = kerberos_decode_pac(mem_ctx, &pac_data,
+       nt_status = kerberos_decode_pac(mem_ctx, 
+                                       lp_iconv_convenience(tctx->lp_ctx),
+                                       &pac_data,
                                        tmp_blob,
                                        smb_krb5_context->krb5_context,
                                        &krbtgt_keyblock,
index aa729ec0dff6617f19e7ce32312bd3be0fec1e1f..42d7ddaaa12e4c60c7a6a4c181e227eb51434b0b 100644 (file)
@@ -633,6 +633,13 @@ static bool run_deferopen(struct torture_context *tctx, struct smbcli_state *cli
        int retries=4;
        int i = 0;
        bool correct = true;
+       int nsec;
+       int msec;
+       double sec;
+
+       nsec = torture_setting_int(tctx, "sharedelay", 1000000);
+       msec = nsec / 1000;
+       sec = ((double)nsec) / ((double) 1000000);
 
        if (retries <= 0) {
                torture_comment(tctx, "failed to connect\n");
@@ -657,9 +664,10 @@ static bool run_deferopen(struct torture_context *tctx, struct smbcli_state *cli
                        }
                        if (NT_STATUS_EQUAL(smbcli_nt_error(cli->tree),NT_STATUS_SHARING_VIOLATION)) {
                                double e = timeval_elapsed(&tv);
-                               if (e < 0.5 || e > 1.5) {
-                                       torture_comment(tctx,"Timing incorrect %.2f violation\n",
-                                               e);
+                               if (e < (0.5 * sec) || e > (1.5 * sec)) {
+                                       torture_comment(tctx,"Timing incorrect %.2f violation 1 sec == %.2f\n",
+                                               e, sec);
+                                       return false;
                                }
                        }
                } while (NT_STATUS_EQUAL(smbcli_nt_error(cli->tree),NT_STATUS_SHARING_VIOLATION));
@@ -671,13 +679,13 @@ static bool run_deferopen(struct torture_context *tctx, struct smbcli_state *cli
 
                torture_comment(tctx, "pid %u open %d\n", (unsigned)getpid(), i);
 
-               sleep(10);
+               msleep(10 * msec);
                i++;
                if (NT_STATUS_IS_ERR(smbcli_close(cli->tree, fnum))) {
                        torture_comment(tctx,"Failed to close %s, error=%s\n", fname, smbcli_errstr(cli->tree));
                        return false;
                }
-               sleep(2);
+               msleep(2 * msec);
        }
 
        if (NT_STATUS_IS_ERR(smbcli_unlink(cli->tree, fname))) {
index 112cf323a11e8d2c01dda05a13eeb69c71f5816b..2b222d7c6ed39dfbd7d1017da836e4f9f3aa74ad 100644 (file)
@@ -98,7 +98,7 @@ bool torture_utable(struct torture_context *tctx,
 }
 
 
-static char *form_name(int c)
+static char *form_name(struct smb_iconv_convenience *iconv_convenience, int c)
 {
        static fstring fname;
        uint8_t c2[4];
@@ -109,7 +109,7 @@ static char *form_name(int c)
        p = fname+strlen(fname);
        SSVAL(c2, 0, c);
 
-       len = convert_string(lp_iconv_convenience(global_loadparm), CH_UTF16, CH_UNIX, 
+       len = convert_string(iconv_convenience, CH_UTF16, CH_UNIX, 
                             c2, 2, 
                             p, sizeof(fname)-strlen(fname));
        p[len] = 0;
@@ -139,7 +139,7 @@ bool torture_casetable(struct torture_context *tctx,
 
                torture_comment(tctx, "%04x (%c)\n", c, isprint(c)?c:'.');
 
-               fname = form_name(c);
+               fname = form_name(lp_iconv_convenience(tctx->lp_ctx), c);
                fnum = smbcli_nt_create_full(cli->tree, fname, 0,
 #if 0
                                             SEC_RIGHT_MAXIMUM_ALLOWED, 
index a1975a6caf86c1fed60cbf1bb325df32fee4f071..626349a45d37840d51fa344b597b7bab3a079212 100644 (file)
@@ -11,7 +11,8 @@ OBJ_FILES = \
 PUBLIC_DEPENDENCIES = \
                LIBSAMBA-CONFIG \
                LIBSAMBA-UTIL \
-               LIBTALLOC 
+               LIBTALLOC \
+               LIBPOPT
 
 [SUBSYSTEM::TORTURE_UTIL]
 OBJ_FILES = util_smb.o util_provision.o
@@ -369,21 +370,14 @@ MANPAGE = man/locktest.1
 # End BINARY locktest
 #################################
 
-GCOV_CFLAGS = -ftest-coverage -fprofile-arcs
-GCOV_LDFLAGS = $(GCOV_CFLAGS) -lgcov
-
 COV_TARGET = test
 
 COV_VARS = \
-       CFLAGS="$(CFLAGS) $(GCOV_CFLAGS)" \
-       BNLD_FLAGS="$(BNLD_FLAGS) $(GCOV_LDFLAGS)" \
-       SHLD_FLAGS="$(SHLD_FLAGS) $(GCOV_LDFLAGS)" \
-       MDLD_FLAGS="$(MDLD_FLAGS) $(GCOV_LDFLAGS)" \
-       HOSTCC_FLAGS="$(HOSTCC_FLAGS) $(GCOV_CFLAGS)" \
-       HOSTLD_FLAGS="$(HOSTLD_FLAGS) $(GCOV_LDFLAGS)"
+       CFLAGS="$(CFLAGS) --coverage" \
+       LDFLAGS="$(LDFLAGS) --coverage"
 
 test_cov:
-       @$(MAKE) $(COV_TARGET) $(COV_VARS)
+       -$(MAKE) $(COV_TARGET) $(COV_VARS)
 
 gcov: test_cov
        for I in $(sort $(dir $(ALL_OBJS))); \
@@ -395,10 +389,12 @@ lcov-split:
        @$(MAKE) $(COV_TARGET) $(COV_VARS) \
                TEST_OPTIONS="--analyse-cmd=\"lcov --base-directory `pwd` --directory . --capture --output-file samba.info -t\""
        -rm heimdal/lib/*/{lex,parse}.{gcda,gcno}
+       -rm lib/policy/*/{lex,parse}.{gcda,gcno}
        genhtml -o coverage samba.info
 
 lcov: test_cov
        -rm heimdal/lib/*/{lex,parse}.{gcda,gcno}
+       -rm lib/policy/*/{lex,parse}.{gcda,gcno}
        lcov --base-directory `pwd` --directory . --capture --output-file samba.info
        genhtml -o coverage samba.info
 
index 71689786e8265ef355a78ad61e37435a47878ee5..edc74ee23e6c2fe349be1ef7ea535a652f5aa6d8 100644 (file)
@@ -73,7 +73,7 @@ struct rap_call {
 
 #define RAPNDR_FLAGS (LIBNDR_FLAG_NOALIGN|LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_NULLTERM);
 
-static struct rap_call *new_rap_cli_call(TALLOC_CTX *mem_ctx, uint16_t callno)
+static struct rap_call *new_rap_cli_call(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, uint16_t callno)
 {
        struct rap_call *call;
 
@@ -88,10 +88,10 @@ static struct rap_call *new_rap_cli_call(TALLOC_CTX *mem_ctx, uint16_t callno)
        call->paramdesc = NULL;
        call->datadesc = NULL;
 
-       call->ndr_push_param = ndr_push_init_ctx(mem_ctx, lp_iconv_convenience(global_loadparm));
+       call->ndr_push_param = ndr_push_init_ctx(mem_ctx, iconv_convenience);
        call->ndr_push_param->flags = RAPNDR_FLAGS;
 
-       call->ndr_push_data = ndr_push_init_ctx(mem_ctx, lp_iconv_convenience(global_loadparm));
+       call->ndr_push_data = ndr_push_init_ctx(mem_ctx, iconv_convenience);
        call->ndr_push_data->flags = RAPNDR_FLAGS;
 
        return call;
@@ -189,14 +189,16 @@ static NTSTATUS rap_pull_string(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr,
        return NT_STATUS_OK;
 }
 
-static NTSTATUS rap_cli_do_call(struct smbcli_tree *tree, struct rap_call *call)
+static NTSTATUS rap_cli_do_call(struct smbcli_tree *tree, 
+                               struct smb_iconv_convenience *iconv_convenience,
+                               struct rap_call *call)
 {
        NTSTATUS result;
        DATA_BLOB param_blob;
        struct ndr_push *params;
        struct smb_trans2 trans;
 
-       params = ndr_push_init_ctx(call, lp_iconv_convenience(global_loadparm));
+       params = ndr_push_init_ctx(call, iconv_convenience);
 
        if (params == NULL)
                return NT_STATUS_NO_MEMORY;
@@ -231,11 +233,11 @@ static NTSTATUS rap_cli_do_call(struct smbcli_tree *tree, struct rap_call *call)
                return result;
 
        call->ndr_pull_param = ndr_pull_init_blob(&trans.out.params, call,
-                                                 lp_iconv_convenience(global_loadparm));
+                                                 iconv_convenience);
        call->ndr_pull_param->flags = RAPNDR_FLAGS;
 
        call->ndr_pull_data = ndr_pull_init_blob(&trans.out.data, call,
-                                                lp_iconv_convenience(global_loadparm));
+                                                iconv_convenience);
        call->ndr_pull_data->flags = RAPNDR_FLAGS;
 
        return result;
@@ -243,6 +245,7 @@ static NTSTATUS rap_cli_do_call(struct smbcli_tree *tree, struct rap_call *call)
 
 
 static NTSTATUS smbcli_rap_netshareenum(struct smbcli_tree *tree,
+                                       struct smb_iconv_convenience *iconv_convenience,
                                        TALLOC_CTX *mem_ctx,
                                        struct rap_NetShareEnum *r)
 {
@@ -250,7 +253,7 @@ static NTSTATUS smbcli_rap_netshareenum(struct smbcli_tree *tree,
        NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
        int i;
 
-       call = new_rap_cli_call(tree, RAP_WshareEnum);
+       call = new_rap_cli_call(tree, iconv_convenience, RAP_WshareEnum);
 
        if (call == NULL)
                return NT_STATUS_NO_MEMORY;
@@ -268,7 +271,7 @@ static NTSTATUS smbcli_rap_netshareenum(struct smbcli_tree *tree,
                break;
        }
 
-       result = rap_cli_do_call(tree, call);
+       result = rap_cli_do_call(tree, iconv_convenience, call);
 
        if (!NT_STATUS_IS_OK(result))
                goto done;
@@ -322,7 +325,7 @@ static bool test_netshareenum(struct torture_context *tctx,
        r.in.bufsize = 8192;
 
        torture_assert_ntstatus_ok(tctx, 
-               smbcli_rap_netshareenum(cli->tree, tctx, &r), "");
+               smbcli_rap_netshareenum(cli->tree, lp_iconv_convenience(tctx->lp_ctx), tctx, &r), "");
 
        for (i=0; i<r.out.count; i++) {
                printf("%s %d %s\n", r.out.info[i].info1.name,
@@ -334,6 +337,7 @@ static bool test_netshareenum(struct torture_context *tctx,
 }
 
 static NTSTATUS smbcli_rap_netserverenum2(struct smbcli_tree *tree,
+                                         struct smb_iconv_convenience *iconv_convenience, 
                                          TALLOC_CTX *mem_ctx,
                                          struct rap_NetServerEnum2 *r)
 {
@@ -341,7 +345,7 @@ static NTSTATUS smbcli_rap_netserverenum2(struct smbcli_tree *tree,
        NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
        int i;
 
-       call = new_rap_cli_call(mem_ctx, RAP_NetServerEnum2);
+       call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_NetServerEnum2);
 
        if (call == NULL)
                return NT_STATUS_NO_MEMORY;
@@ -361,7 +365,7 @@ static NTSTATUS smbcli_rap_netserverenum2(struct smbcli_tree *tree,
                break;
        }
 
-       result = rap_cli_do_call(tree, call);
+       result = rap_cli_do_call(tree, iconv_convenience, call);
 
        if (!NT_STATUS_IS_OK(result))
                goto done;
@@ -421,7 +425,7 @@ static bool test_netserverenum(struct torture_context *tctx,
        r.in.domain = NULL;
 
        torture_assert_ntstatus_ok(tctx, 
-                  smbcli_rap_netserverenum2(cli->tree, tctx, &r), "");
+                  smbcli_rap_netserverenum2(cli->tree, lp_iconv_convenience(tctx->lp_ctx), tctx, &r), "");
 
        for (i=0; i<r.out.count; i++) {
                switch (r.in.level) {
@@ -440,13 +444,14 @@ static bool test_netserverenum(struct torture_context *tctx,
 }
 
 _PUBLIC_ NTSTATUS smbcli_rap_netservergetinfo(struct smbcli_tree *tree,
+                                             struct smb_iconv_convenience *iconv_convenience, 
                                     TALLOC_CTX *mem_ctx,
                                     struct rap_WserverGetInfo *r)
 {
        struct rap_call *call;
        NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
 
-       if (!(call = new_rap_cli_call(mem_ctx, RAP_WserverGetInfo))) {
+       if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_WserverGetInfo))) {
                return NT_STATUS_NO_MEMORY;
        }
 
@@ -466,7 +471,7 @@ _PUBLIC_ NTSTATUS smbcli_rap_netservergetinfo(struct smbcli_tree *tree,
                goto done;
        }
 
-       result = rap_cli_do_call(tree, call);
+       result = rap_cli_do_call(tree, iconv_convenience, call);
 
        if (!NT_STATUS_IS_OK(result))
                goto done;
@@ -507,9 +512,9 @@ static bool test_netservergetinfo(struct torture_context *tctx,
        r.in.bufsize = 0xffff;
 
        r.in.level = 0;
-       torture_assert_ntstatus_ok(tctx, smbcli_rap_netservergetinfo(cli->tree, tctx, &r), "");
+       torture_assert_ntstatus_ok(tctx, smbcli_rap_netservergetinfo(cli->tree, lp_iconv_convenience(tctx->lp_ctx), tctx, &r), "");
        r.in.level = 1;
-       torture_assert_ntstatus_ok(tctx, smbcli_rap_netservergetinfo(cli->tree, tctx, &r), "");
+       torture_assert_ntstatus_ok(tctx, smbcli_rap_netservergetinfo(cli->tree, lp_iconv_convenience(tctx->lp_ctx), tctx, &r), "");
 
        return res;
 }
@@ -519,10 +524,10 @@ bool torture_rap_scan(struct torture_context *torture, struct smbcli_state *cli)
        int callno;
 
        for (callno = 0; callno < 0xffff; callno++) {
-               struct rap_call *call = new_rap_cli_call(torture, callno);
+               struct rap_call *call = new_rap_cli_call(torture, lp_iconv_convenience(torture->lp_ctx), callno);
                NTSTATUS result;
 
-               result = rap_cli_do_call(cli->tree, call);
+               result = rap_cli_do_call(cli->tree, lp_iconv_convenience(torture->lp_ctx), call);
 
                if (!NT_STATUS_EQUAL(result, NT_STATUS_INVALID_PARAMETER))
                        continue;
index 0367110ddc41d6123a6ad6aeec25c65e04313be9..7238a2fd465062fe82c1aaf8e8ac66e0fe1f84e7 100644 (file)
@@ -161,6 +161,7 @@ static bool test_fetchfile(struct smbcli_state *cli, struct torture_context *tct
        io2.in.credentials = cmdline_credentials;
        io2.in.workgroup  = lp_workgroup(tctx->lp_ctx);
        io2.in.filename = fname;
+       lp_smbcli_options(tctx->lp_ctx, &io2.in.options);
 
        printf("testing parallel fetchfile with %d ops\n", torture_numops);
 
index 952088e46c8bdbe28134dfad13daf7ad2f496f5d..3edd0c68205f19e24b3f0fdb6ca19f947214d856 100644 (file)
@@ -914,7 +914,7 @@ static bool test_raw_oplock_batch10(struct torture_context *tctx, struct smbcli_
        CHECK_VAL(break_info.failures, 0);
        CHECK_VAL(io.ntcreatex.out.oplock_level, 0);
 
-       smbcli_oplock_handler(cli2->transport, oplock_handler_ack_to_levelII, cli1->tree);
+       smbcli_oplock_handler(cli2->transport, oplock_handler_ack_to_levelII, cli2->tree);
 
        io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED |
                NTCREATEX_FLAGS_REQUEST_OPLOCK | 
@@ -1058,7 +1058,7 @@ static bool test_raw_oplock_batch12(struct torture_context *tctx, struct smbcli_
        bool ret = true;
        union smb_open io;
        union smb_setfileinfo sfi;
-       uint16_t fnum=0, fnum2=0;
+       uint16_t fnum=0;
 
        if (!torture_setup_dir(cli1, BASEDIR)) {
                return false;
@@ -1118,7 +1118,6 @@ static bool test_raw_oplock_batch12(struct torture_context *tctx, struct smbcli_
        CHECK_VAL(break_info.level, 0);
 
        smbcli_close(cli1->tree, fnum);
-       smbcli_close(cli2->tree, fnum2);
 
 done:
        smb_raw_exit(cli1->session);
index 9f6f1735ee8aad7ae84f67ee7cb127f763bc0808..92fec5be0c32ca8bd42467897e0e9751cba5bb83 100644 (file)
 #include "librpc/gen_ndr/ndr_initshutdown_c.h"
 #include "torture/rpc/rpc.h"
 
-static void init_initshutdown_String(TALLOC_CTX *mem_ctx, struct initshutdown_String *name, const char *s)
+static void init_lsa_StringLarge(struct lsa_StringLarge *name, const char *s)
 {
-       name->name = talloc(mem_ctx, struct initshutdown_String_sub);
-       name->name->name = s;
+       name->string = s;
 }
 
 
@@ -58,8 +57,8 @@ static bool test_Init(struct torture_context *tctx,
        uint16_t hostname = 0x0;
 
        r.in.hostname = &hostname;
-       r.in.message = talloc(tctx, struct initshutdown_String);
-       init_initshutdown_String(tctx, r.in.message, "spottyfood");
+       r.in.message = talloc(tctx, struct lsa_StringLarge);
+       init_lsa_StringLarge(r.in.message, "spottyfood");
        r.in.force_apps = 1;
        r.in.timeout = 30;
        r.in.reboot = 1;
@@ -80,8 +79,8 @@ static bool test_InitEx(struct torture_context *tctx,
        uint16_t hostname = 0x0;
 
        r.in.hostname = &hostname;
-       r.in.message = talloc(tctx, struct initshutdown_String);
-       init_initshutdown_String(tctx, r.in.message, "spottyfood");
+       r.in.message = talloc(tctx, struct lsa_StringLarge);
+       init_lsa_StringLarge(r.in.message, "spottyfood");
        r.in.force_apps = 1;
        r.in.timeout = 30;
        r.in.reboot = 1;
index a13172b695bc72026fbf51e9a230cf97e12f9c50..5b92ce138261643b4a3547c15b556ce09ba7ab28 100644 (file)
@@ -532,7 +532,7 @@ bool test_netlogon_ops(struct dcerpc_pipe *p, struct torture_context *tctx,
        chal = data_blob_const(ninfo.challenge, 
                               sizeof(ninfo.challenge));
 
-       names_blob = NTLMv2_generate_names_blob(tctx, cli_credentials_get_workstation(credentials), 
+       names_blob = NTLMv2_generate_names_blob(tctx, lp_iconv_convenience(tctx->lp_ctx), cli_credentials_get_workstation(credentials), 
                                                cli_credentials_get_domain(credentials));
 
        status = cli_credentials_get_ntlm_response(cmdline_credentials, tctx, 
index b08cd05bdb8b89a269ba6d86e5353450bd0a7372..95252e7397f2b346442fa20b9c6d5a861cf0b224 100644 (file)
@@ -806,6 +806,7 @@ static bool join3(struct smbcli_state *cli,
  */
 
 static bool auth2(struct smbcli_state *cli,
+                 struct loadparm_context *lp_ctx,
                  struct cli_credentials *wks_cred)
 {
        TALLOC_CTX *mem_ctx;
@@ -829,7 +830,7 @@ static bool auth2(struct smbcli_state *cli,
 
        net_pipe = dcerpc_pipe_init(mem_ctx,
                                    cli->transport->socket->event.ctx,
-                                   lp_iconv_convenience(global_loadparm));
+                                   lp_iconv_convenience(lp_ctx));
        if (net_pipe == NULL) {
                d_printf("dcerpc_pipe_init failed\n");
                goto done;
@@ -984,7 +985,8 @@ static bool schan(struct smbcli_state *cli,
 
                generate_random_buffer(chal.data, chal.length);
                names_blob = NTLMv2_generate_names_blob(
-                       mem_ctx, cli_credentials_get_workstation(user_creds),
+                       mem_ctx, lp_iconv_convenience(lp_ctx), 
+                       cli_credentials_get_workstation(user_creds),
                        cli_credentials_get_domain(user_creds));
                status = cli_credentials_get_ntlm_response(
                        user_creds, mem_ctx, &flags, chal, names_blob,
@@ -1204,7 +1206,7 @@ bool torture_netlogon_samba3(struct torture_context *torture)
 
                int j;
 
-               if (!auth2(cli, wks_creds)) {
+               if (!auth2(cli, torture->lp_ctx, wks_creds)) {
                        d_printf("auth2 failed\n");
                        goto done;
                }
@@ -1283,7 +1285,7 @@ static bool test_join3(struct torture_context *tctx,
                cmdline_credentials, cli_credentials_get_domain(wks_creds),
                CRED_SPECIFIED);
 
-       if (!auth2(cli, wks_creds)) {
+       if (!auth2(cli, tctx->lp_ctx, wks_creds)) {
                d_printf("auth2 failed\n");
                goto done;
        }
@@ -1381,6 +1383,7 @@ bool torture_samba3_sessionkey(struct torture_context *torture)
  */
 
 static NTSTATUS pipe_bind_smb(TALLOC_CTX *mem_ctx,
+                             struct loadparm_context *lp_ctx,
                              struct smbcli_tree *tree,
                              const char *pipe_name,
                              const struct ndr_interface_table *iface,
@@ -1391,7 +1394,7 @@ static NTSTATUS pipe_bind_smb(TALLOC_CTX *mem_ctx,
 
        if (!(result = dcerpc_pipe_init(
                      mem_ctx, tree->session->transport->socket->event.ctx, 
-                     lp_iconv_convenience(global_loadparm)))) {
+                     lp_iconv_convenience(lp_ctx)))) {
                return NT_STATUS_NO_MEMORY;
        }
 
@@ -1507,7 +1510,9 @@ static struct dom_sid *name2sid(TALLOC_CTX *mem_ctx,
  * Find out the user SID on this connection
  */
 
-static struct dom_sid *whoami(TALLOC_CTX *mem_ctx, struct smbcli_tree *tree)
+static struct dom_sid *whoami(TALLOC_CTX *mem_ctx, 
+                             struct loadparm_context *lp_ctx, 
+                             struct smbcli_tree *tree)
 {
        struct dcerpc_pipe *lsa;
        struct lsa_GetUserName r;
@@ -1515,7 +1520,7 @@ static struct dom_sid *whoami(TALLOC_CTX *mem_ctx, struct smbcli_tree *tree)
        struct lsa_StringPointer authority_name_p;
        struct dom_sid *result;
 
-       status = pipe_bind_smb(mem_ctx, tree, "\\pipe\\lsarpc",
+       status = pipe_bind_smb(mem_ctx, lp_ctx, tree, "\\pipe\\lsarpc",
                               &ndr_table_lsarpc, &lsa);
        if (!NT_STATUS_IS_OK(status)) {
                d_printf("(%s) Could not bind to LSA: %s\n",
@@ -1631,7 +1636,7 @@ bool torture_samba3_rpc_getusername(struct torture_context *torture)
                goto done;
        }
 
-       if (!(user_sid = whoami(mem_ctx, cli->tree))) {
+       if (!(user_sid = whoami(mem_ctx, torture->lp_ctx, cli->tree))) {
                d_printf("(%s) whoami on auth'ed connection failed\n",
                         __location__);
                ret = false;
@@ -1658,7 +1663,7 @@ bool torture_samba3_rpc_getusername(struct torture_context *torture)
                goto done;
        }
 
-       if (!(user_sid = whoami(mem_ctx, cli->tree))) {
+       if (!(user_sid = whoami(mem_ctx, torture->lp_ctx, cli->tree))) {
                d_printf("(%s) whoami on anon connection failed\n",
                         __location__);
                ret = false;
@@ -1732,7 +1737,7 @@ bool torture_samba3_rpc_getusername(struct torture_context *torture)
                        goto done;
                }
 
-               if (!(user_sid = whoami(mem_ctx, tree))) {
+               if (!(user_sid = whoami(mem_ctx, torture->lp_ctx, tree))) {
                        d_printf("(%s) whoami on user connection failed\n",
                                 __location__);
                        ret = false;
@@ -1870,8 +1875,8 @@ bool torture_samba3_rpc_srvsvc(struct torture_context *torture)
                return false;
        }
 
-       status = pipe_bind_smb(mem_ctx, cli->tree, "\\pipe\\srvsvc",
-                              &ndr_table_srvsvc, &p);
+       status = pipe_bind_smb(mem_ctx, torture->lp_ctx, cli->tree, 
+                              "\\pipe\\srvsvc", &ndr_table_srvsvc, &p);
        if (!NT_STATUS_IS_OK(status)) {
                d_printf("(%s) could not bind to srvsvc pipe: %s\n",
                         __location__, nt_errstr(status));
@@ -2007,6 +2012,7 @@ bool torture_samba3_rpc_randomauth2(struct torture_context *torture)
 }
 
 static struct security_descriptor *get_sharesec(TALLOC_CTX *mem_ctx,
+                                               struct loadparm_context *lp_ctx,
                                                struct smbcli_session *sess,
                                                const char *sharename)
 {
@@ -2028,7 +2034,7 @@ static struct security_descriptor *get_sharesec(TALLOC_CTX *mem_ctx,
                return NULL;
        }
 
-       status = pipe_bind_smb(mem_ctx, tree, "\\pipe\\srvsvc",
+       status = pipe_bind_smb(mem_ctx, lp_ctx, tree, "\\pipe\\srvsvc",
                               &ndr_table_srvsvc, &p);
        if (!NT_STATUS_IS_OK(status)) {
                d_printf("(%s) could not bind to srvsvc pipe: %s\n",
@@ -2060,6 +2066,7 @@ static struct security_descriptor *get_sharesec(TALLOC_CTX *mem_ctx,
 }
 
 static NTSTATUS set_sharesec(TALLOC_CTX *mem_ctx,
+                            struct loadparm_context *lp_ctx,
                             struct smbcli_session *sess,
                             const char *sharename,
                             struct security_descriptor *sd)
@@ -2083,7 +2090,7 @@ static NTSTATUS set_sharesec(TALLOC_CTX *mem_ctx,
                return NT_STATUS_UNSUCCESSFUL;
        }
 
-       status = pipe_bind_smb(mem_ctx, tree, "\\pipe\\srvsvc",
+       status = pipe_bind_smb(mem_ctx, lp_ctx, tree, "\\pipe\\srvsvc",
                               &ndr_table_srvsvc, &p);
        if (!NT_STATUS_IS_OK(status)) {
                d_printf("(%s) could not bind to srvsvc pipe: %s\n",
@@ -2115,6 +2122,7 @@ static NTSTATUS set_sharesec(TALLOC_CTX *mem_ctx,
 }
 
 bool try_tcon(TALLOC_CTX *mem_ctx,
+             struct loadparm_context *lp_ctx,
              struct security_descriptor *orig_sd,
              struct smbcli_session *session,
              const char *sharename, const struct dom_sid *user_sid,
@@ -2162,7 +2170,7 @@ bool try_tcon(TALLOC_CTX *mem_ctx,
                 return false;
         }
 
-       status = set_sharesec(mem_ctx, session, sharename, sd);
+       status = set_sharesec(mem_ctx, lp_ctx, session, sharename, sd);
        if (!NT_STATUS_IS_OK(status)) {
                d_printf("custom set_sharesec failed: %s\n",
                         nt_errstr(status));
@@ -2193,7 +2201,7 @@ bool try_tcon(TALLOC_CTX *mem_ctx,
  done:
        smbcli_rmdir(rmdir_tree, "sharesec_testdir");
 
-       status = set_sharesec(mem_ctx, session, sharename, orig_sd);
+       status = set_sharesec(mem_ctx, lp_ctx, session, sharename, orig_sd);
        if (!NT_STATUS_IS_OK(status)) {
                d_printf("custom set_sharesec failed: %s\n",
                         nt_errstr(status));
@@ -2225,25 +2233,25 @@ bool torture_samba3_rpc_sharesec(struct torture_context *torture)
                return false;
        }
 
-       if (!(user_sid = whoami(mem_ctx, cli->tree))) {
+       if (!(user_sid = whoami(mem_ctx, torture->lp_ctx, cli->tree))) {
                d_printf("whoami failed\n");
                talloc_free(mem_ctx);
                return false;
        }
 
-       sd = get_sharesec(mem_ctx, cli->session, torture_setting_string(torture,
-                                                               "share", NULL));
+       sd = get_sharesec(mem_ctx, torture->lp_ctx, cli->session, 
+                         torture_setting_string(torture, "share", NULL));
 
-       ret &= try_tcon(mem_ctx, sd, cli->session,
+       ret &= try_tcon(mem_ctx, torture->lp_ctx, sd, cli->session,
                        torture_setting_string(torture, "share", NULL),
                        user_sid, 0, NT_STATUS_ACCESS_DENIED, NT_STATUS_OK);
 
-       ret &= try_tcon(mem_ctx, sd, cli->session,
+       ret &= try_tcon(mem_ctx, torture->lp_ctx, sd, cli->session,
                        torture_setting_string(torture, "share", NULL),
                        user_sid, SEC_FILE_READ_DATA, NT_STATUS_OK,
                        NT_STATUS_MEDIA_WRITE_PROTECTED);
 
-       ret &= try_tcon(mem_ctx, sd, cli->session,
+       ret &= try_tcon(mem_ctx, torture->lp_ctx, sd, cli->session,
                        torture_setting_string(torture, "share", NULL),
                        user_sid, SEC_FILE_ALL, NT_STATUS_OK, NT_STATUS_OK);
 
@@ -2273,7 +2281,7 @@ bool torture_samba3_rpc_lsa(struct torture_context *torture)
                return false;
        }
 
-       status = pipe_bind_smb(mem_ctx, cli->tree, "\\lsarpc",
+       status = pipe_bind_smb(mem_ctx, torture->lp_ctx, cli->tree, "\\lsarpc",
                               &ndr_table_lsarpc, &p);
        if (!NT_STATUS_IS_OK(status)) {
                d_printf("(%s) pipe_bind_smb failed: %s\n", __location__,
@@ -2330,6 +2338,7 @@ bool torture_samba3_rpc_lsa(struct torture_context *torture)
 }
 
 static NTSTATUS get_servername(TALLOC_CTX *mem_ctx, struct smbcli_tree *tree,
+                              struct smb_iconv_convenience *iconv_convenience,
                               char **name)
 {
        struct rap_WserverGetInfo r;
@@ -2339,7 +2348,7 @@ static NTSTATUS get_servername(TALLOC_CTX *mem_ctx, struct smbcli_tree *tree,
        r.in.level = 0;
        r.in.bufsize = 0xffff;
 
-       status = smbcli_rap_netservergetinfo(tree, mem_ctx, &r);
+       status = smbcli_rap_netservergetinfo(tree, iconv_convenience, mem_ctx, &r);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
@@ -2347,7 +2356,7 @@ static NTSTATUS get_servername(TALLOC_CTX *mem_ctx, struct smbcli_tree *tree,
        memcpy(servername, r.out.info.info0.name, 16);
        servername[16] = '\0';
 
-       if (pull_ascii_talloc(mem_ctx, lp_iconv_convenience(global_loadparm)
+       if (pull_ascii_talloc(mem_ctx, iconv_convenience
                              name, servername) < 0) {
                return NT_STATUS_NO_MEMORY;
        }
@@ -2356,7 +2365,8 @@ static NTSTATUS get_servername(TALLOC_CTX *mem_ctx, struct smbcli_tree *tree,
 }
 
 
-static NTSTATUS find_printers(TALLOC_CTX *ctx, struct smbcli_tree *tree,
+static NTSTATUS find_printers(TALLOC_CTX *ctx, struct loadparm_context *lp_ctx,
+                             struct smbcli_tree *tree,
                              const char ***printers, int *num_printers)
 {
        TALLOC_CTX *mem_ctx;
@@ -2372,7 +2382,8 @@ static NTSTATUS find_printers(TALLOC_CTX *ctx, struct smbcli_tree *tree,
                return NT_STATUS_NO_MEMORY;
        }
 
-       status = pipe_bind_smb(mem_ctx, tree, "\\srvsvc", &ndr_table_srvsvc,
+       status = pipe_bind_smb(mem_ctx, lp_ctx, 
+                              tree, "\\srvsvc", &ndr_table_srvsvc,
                               &p);
        if (!NT_STATUS_IS_OK(status)) {
                d_printf("could not bind to srvsvc pipe\n");
@@ -2552,7 +2563,7 @@ bool torture_samba3_rpc_spoolss(struct torture_context *torture)
                return false;
        }
 
-       status = get_servername(mem_ctx, cli->tree, &servername);
+       status = get_servername(mem_ctx, cli->tree, lp_iconv_convenience(torture->lp_ctx), &servername);
        if (!NT_STATUS_IS_OK(status)) {
                d_fprintf(stderr, "(%s) get_servername returned %s\n",
                          __location__, nt_errstr(status));
@@ -2560,7 +2571,7 @@ bool torture_samba3_rpc_spoolss(struct torture_context *torture)
                return false;
        }
 
-       if (!NT_STATUS_IS_OK(find_printers(mem_ctx, cli->tree,
+       if (!NT_STATUS_IS_OK(find_printers(mem_ctx, torture->lp_ctx, cli->tree,
                                           &printers, &num_printers))) {
                talloc_free(mem_ctx);
                return false;
@@ -2572,7 +2583,7 @@ bool torture_samba3_rpc_spoolss(struct torture_context *torture)
                return true;
        }
 
-       status = pipe_bind_smb(mem_ctx, cli->tree, "\\spoolss",
+       status = pipe_bind_smb(mem_ctx, torture->lp_ctx, cli->tree, "\\spoolss",
                               &ndr_table_spoolss, &p);
        if (!NT_STATUS_IS_OK(status)) {
                d_printf("(%s) pipe_bind_smb failed: %s\n", __location__,
@@ -2738,7 +2749,7 @@ bool torture_samba3_rpc_wkssvc(struct torture_context *torture)
                return false;
        }
 
-       status = get_servername(mem_ctx, cli->tree, &servername);
+       status = get_servername(mem_ctx, cli->tree, lp_iconv_convenience(torture->lp_ctx), &servername);
        if (!NT_STATUS_IS_OK(status)) {
                d_fprintf(stderr, "(%s) get_servername returned %s\n",
                          __location__, nt_errstr(status));
@@ -2746,7 +2757,7 @@ bool torture_samba3_rpc_wkssvc(struct torture_context *torture)
                return false;
        }
 
-       status = pipe_bind_smb(mem_ctx, cli->tree, "\\wkssvc",
+       status = pipe_bind_smb(mem_ctx, torture->lp_ctx, cli->tree, "\\wkssvc",
                               &ndr_table_wkssvc, &p);
        if (!NT_STATUS_IS_OK(status)) {
                d_printf("(%s) pipe_bind_smb failed: %s\n", __location__,
@@ -2995,6 +3006,7 @@ bool torture_samba3_rpc_winreg(struct torture_context *torture)
 }
 
 static NTSTATUS get_shareinfo(TALLOC_CTX *mem_ctx,
+                             struct loadparm_context *lp_ctx,
                              struct smbcli_state *cli,
                              const char *share,
                              struct srvsvc_NetShareInfo502 **info)
@@ -3006,7 +3018,7 @@ static NTSTATUS get_shareinfo(TALLOC_CTX *mem_ctx,
 
        if (!(p = dcerpc_pipe_init(cli,
                                   cli->transport->socket->event.ctx,
-                                  lp_iconv_convenience(global_loadparm)))) {
+                                  lp_iconv_convenience(lp_ctx)))) {
                status = NT_STATUS_NO_MEMORY;
                goto fail;
        }
@@ -3056,6 +3068,7 @@ static NTSTATUS get_shareinfo(TALLOC_CTX *mem_ctx,
 
 static NTSTATUS get_hklm_handle(TALLOC_CTX *mem_ctx,
                                struct smbcli_state *cli,
+                               struct smb_iconv_convenience *iconv_convenience,
                                struct dcerpc_pipe **pipe_p,
                                struct policy_handle **handle)
 {
@@ -3073,7 +3086,7 @@ static NTSTATUS get_hklm_handle(TALLOC_CTX *mem_ctx,
 
        if (!(p = dcerpc_pipe_init(result,
                                   cli->transport->socket->event.ctx,
-                                  lp_iconv_convenience(global_loadparm)))) {
+                                  iconv_convenience))) {
                status = NT_STATUS_NO_MEMORY;
                goto fail;
        }
@@ -3118,6 +3131,7 @@ static NTSTATUS get_hklm_handle(TALLOC_CTX *mem_ctx,
 }
 
 static NTSTATUS torture_samba3_createshare(struct smbcli_state *cli,
+                                          struct smb_iconv_convenience *iconv_convenience,
                                           const char *sharename)
 {
        struct dcerpc_pipe *p;
@@ -3132,7 +3146,7 @@ static NTSTATUS torture_samba3_createshare(struct smbcli_state *cli,
        mem_ctx = talloc_new(cli);
        NT_STATUS_HAVE_NO_MEMORY(mem_ctx);
 
-       status = get_hklm_handle(mem_ctx, cli, &p, &hklm);
+       status = get_hklm_handle(mem_ctx, cli, iconv_convenience, &p, &hklm);
        if (!NT_STATUS_IS_OK(status)) {
                d_printf("get_hklm_handle failed: %s\n", nt_errstr(status));
                goto fail;
@@ -3176,7 +3190,8 @@ static NTSTATUS torture_samba3_createshare(struct smbcli_state *cli,
        return status;
 }
 
-static NTSTATUS torture_samba3_deleteshare(struct smbcli_state *cli,
+static NTSTATUS torture_samba3_deleteshare(struct torture_context *torture,
+                                          struct smbcli_state *cli,
                                           const char *sharename)
 {
        struct dcerpc_pipe *p;
@@ -3188,7 +3203,8 @@ static NTSTATUS torture_samba3_deleteshare(struct smbcli_state *cli,
        mem_ctx = talloc_new(cli);
        NT_STATUS_HAVE_NO_MEMORY(mem_ctx);
 
-       status = get_hklm_handle(cli, cli, &p, &hklm);
+       status = get_hklm_handle(cli, cli, lp_iconv_convenience(torture->lp_ctx),
+                                &p, &hklm);
        if (!NT_STATUS_IS_OK(status)) {
                d_printf("get_hklm_handle failed: %s\n", nt_errstr(status));
                goto fail;
@@ -3215,6 +3231,7 @@ static NTSTATUS torture_samba3_deleteshare(struct smbcli_state *cli,
 }
 
 static NTSTATUS torture_samba3_setconfig(struct smbcli_state *cli,
+                                        struct loadparm_context *lp_ctx,
                                         const char *sharename,
                                         const char *parameter,
                                         const char *value)
@@ -3227,7 +3244,7 @@ static NTSTATUS torture_samba3_setconfig(struct smbcli_state *cli,
        DATA_BLOB val;
        NTSTATUS status;
 
-       status = get_hklm_handle(cli, cli, &p, &hklm);
+       status = get_hklm_handle(cli, cli, lp_iconv_convenience(lp_ctx), &p, &hklm);
        if (!NT_STATUS_IS_OK(status)) {
                d_printf("get_hklm_handle failed: %s\n", nt_errstr(status));
                return status;;
@@ -3252,7 +3269,8 @@ static NTSTATUS torture_samba3_setconfig(struct smbcli_state *cli,
                goto done;
        }
 
-       if (!reg_string_to_val(hklm, "REG_SZ", value, &type, &val)) {
+       if (!reg_string_to_val(hklm, lp_iconv_convenience(lp_ctx), "REG_SZ", 
+                              value, &type, &val)) {
                d_printf("(%s) reg_string_to_val failed\n", __location__);
                goto done;
        }
@@ -3287,21 +3305,21 @@ bool torture_samba3_regconfig(struct torture_context *torture)
                return false;
        }
 
-       status = torture_samba3_createshare(cli, "blubber");
+       status = torture_samba3_createshare(cli, lp_iconv_convenience(torture->lp_ctx), "blubber");
        if (!NT_STATUS_IS_OK(status)) {
                torture_warning(torture, "torture_samba3_createshare failed: "
                                "%s\n", nt_errstr(status));
                goto done;
        }
 
-       status = torture_samba3_setconfig(cli, "blubber", "comment", comment);
+       status = torture_samba3_setconfig(cli, torture->lp_ctx, "blubber", "comment", comment);
        if (!NT_STATUS_IS_OK(status)) {
                torture_warning(torture, "torture_samba3_setconfig failed: "
                                "%s\n", nt_errstr(status));
                goto done;
        }
 
-       status = get_shareinfo(torture, cli, "blubber", &i);
+       status = get_shareinfo(torture, torture->lp_ctx, cli, "blubber", &i);
        if (!NT_STATUS_IS_OK(status)) {
                torture_warning(torture, "get_shareinfo failed: "
                                "%s\n", nt_errstr(status));
@@ -3314,7 +3332,7 @@ bool torture_samba3_regconfig(struct torture_context *torture)
                goto done;
        }
 
-       status = torture_samba3_deleteshare(cli, "blubber");
+       status = torture_samba3_deleteshare(torture, cli, "blubber");
        if (!NT_STATUS_IS_OK(status)) {
                torture_warning(torture, "torture_samba3_deleteshare failed: "
                                "%s\n", nt_errstr(status));
index 7fd5199908fc0fc46bd1cb291ee26e4498780bc6..aba71477168c655c6d12f2a05fc824f85cfd7c12 100644 (file)
@@ -64,6 +64,7 @@ struct samlogon_state {
        NTSTATUS expected_error;
        bool old_password; /* Allow an old password to be accepted or rejected without error, as well as session key bugs */
        DATA_BLOB chall;
+       struct smb_iconv_convenience *iconv_convenience;
 };
 
 /* 
@@ -591,7 +592,7 @@ static bool test_lmv2_ntlmv2_broken(struct samlogon_state *samlogon_state,
        DATA_BLOB lmv2_response = data_blob(NULL, 0);
        DATA_BLOB lmv2_session_key = data_blob(NULL, 0);
        DATA_BLOB ntlmv2_session_key = data_blob(NULL, 0);
-       DATA_BLOB names_blob = NTLMv2_generate_names_blob(samlogon_state->mem_ctx, TEST_MACHINE_NAME, lp_workgroup(global_loadparm));
+       DATA_BLOB names_blob = NTLMv2_generate_names_blob(samlogon_state->mem_ctx, samlogon_state->iconv_convenience, TEST_MACHINE_NAME, lp_workgroup(global_loadparm));
 
        uint8_t lm_session_key[8];
        uint8_t user_session_key[16];
@@ -739,7 +740,7 @@ static bool test_lmv2_ntlm_broken(struct samlogon_state *samlogon_state,
        DATA_BLOB lmv2_response = data_blob(NULL, 0);
        DATA_BLOB lmv2_session_key = data_blob(NULL, 0);
        DATA_BLOB ntlmv2_session_key = data_blob(NULL, 0);
-       DATA_BLOB names_blob = NTLMv2_generate_names_blob(samlogon_state->mem_ctx, lp_netbios_name(global_loadparm), lp_workgroup(global_loadparm));
+       DATA_BLOB names_blob = NTLMv2_generate_names_blob(samlogon_state->mem_ctx, samlogon_state->iconv_convenience, lp_netbios_name(global_loadparm), lp_workgroup(global_loadparm));
 
        DATA_BLOB ntlm_response = data_blob_talloc(samlogon_state->mem_ctx, NULL, 24);
        DATA_BLOB ntlm_session_key = data_blob_talloc(samlogon_state->mem_ctx, NULL, 16);
@@ -1158,7 +1159,7 @@ static bool test_plaintext(struct samlogon_state *samlogon_state, enum ntlm_brea
        ZERO_STRUCT(user_session_key);
        
        if ((push_ucs2_talloc(samlogon_state->mem_ctx, 
-                             lp_iconv_convenience(global_loadparm)
+                             samlogon_state->iconv_convenience
                              &unicodepw, samlogon_state->password)) == -1) {
                DEBUG(0, ("push_ucs2_allocate failed!\n"));
                exit(1);
@@ -1169,7 +1170,7 @@ static bool test_plaintext(struct samlogon_state *samlogon_state, enum ntlm_brea
        password = strupper_talloc(samlogon_state->mem_ctx, samlogon_state->password);
 
        if ((convert_string_talloc(samlogon_state->mem_ctx, 
-                                  lp_iconv_convenience(global_loadparm),
+                                  samlogon_state->iconv_convenience,
                                   CH_UNIX, CH_DOS, 
                                   password, strlen(password)+1, 
                                   (void**)&dospw)) == -1) {
@@ -1310,6 +1311,7 @@ static const struct ntlm_tests {
   try a netlogon SamLogon
 */
 static bool test_SamLogon(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, 
+                         struct torture_context *tctx,
                          struct creds_CredentialState *creds, 
                          const char *comment,
                          const char *account_domain, const char *account_name, 
@@ -1340,6 +1342,7 @@ static bool test_SamLogon(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
        samlogon_state.chall = data_blob_talloc(fn_ctx, NULL, 8);
        samlogon_state.parameter_control = parameter_control;
        samlogon_state.old_password = old_password;
+       samlogon_state.iconv_convenience = lp_iconv_convenience(tctx->lp_ctx);
 
        generate_random_buffer(samlogon_state.chall.data, 8);
        samlogon_state.r_flags.in.server_name = talloc_asprintf(fn_ctx, "\\\\%s", dcerpc_server_name(p));
@@ -1792,7 +1795,7 @@ bool torture_rpc_samlogon(struct torture_context *torture)
                        }
                
                        if (usercreds[ci].network_login) {
-                               if (!test_SamLogon(p, mem_ctx, creds, 
+                               if (!test_SamLogon(p, mem_ctx, torture, creds, 
                                                   usercreds[ci].comment,
                                                   usercreds[ci].domain,
                                                   usercreds[ci].username,
@@ -1825,7 +1828,7 @@ bool torture_rpc_samlogon(struct torture_context *torture)
                        }
                
                        if (usercreds[0].network_login) {
-                               if (!test_SamLogon(p, mem_ctx, creds,
+                               if (!test_SamLogon(p, mem_ctx, torture, creds,
                                                   usercreds[0].comment,
                                                   usercreds[0].domain,
                                                   usercreds[0].username,
index 1f7f9f463eabd9522f0ba1f64a4994e74b469953..865ebf9fd21be6b8cf153cb526da9e4b5d67a5b4 100644 (file)
@@ -398,7 +398,7 @@ static bool samsync_handle_policy(TALLOC_CTX *mem_ctx, struct samsync_state *sam
        return true;
 }
 
-static bool samsync_handle_user(TALLOC_CTX *mem_ctx, struct samsync_state *samsync_state,
+static bool samsync_handle_user(struct torture_context *tctx, TALLOC_CTX *mem_ctx, struct samsync_state *samsync_state,
                                int database_id, struct netr_DELTA_ENUM *delta) 
 {
        uint32_t rid = delta->delta_id_union.rid;
@@ -548,7 +548,7 @@ static bool samsync_handle_user(TALLOC_CTX *mem_ctx, struct samsync_state *samsy
                data.data = user->user_private_info.SensitiveData;
                data.length = user->user_private_info.DataLength;
                creds_arcfour_crypt(samsync_state->creds, data.data, data.length);
-               ndr_err = ndr_pull_struct_blob(&data, mem_ctx, lp_iconv_convenience(global_loadparm), &keys, (ndr_pull_flags_fn_t)ndr_pull_netr_USER_KEYS);
+               ndr_err = ndr_pull_struct_blob(&data, mem_ctx, lp_iconv_convenience(tctx->lp_ctx), &keys, (ndr_pull_flags_fn_t)ndr_pull_netr_USER_KEYS);
                if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                        if (keys.keys.keys2.lmpassword.length == 16) {
                                sam_rid_crypt(rid, keys.keys.keys2.lmpassword.pwd.hash, lm_hash.hash, 0);
@@ -1101,8 +1101,9 @@ static bool samsync_handle_account(TALLOC_CTX *mem_ctx, struct samsync_state *sa
 /*
   try a netlogon DatabaseSync
 */
-static bool test_DatabaseSync(struct samsync_state *samsync_state,
-                             TALLOC_CTX *mem_ctx)
+static bool test_DatabaseSync(struct torture_context *tctx, 
+                                                         struct samsync_state *samsync_state,
+                                                         TALLOC_CTX *mem_ctx)
 {
        NTSTATUS status;
        TALLOC_CTX *loop_ctx, *delta_ctx, *trustdom_ctx;
@@ -1162,7 +1163,7 @@ static bool test_DatabaseSync(struct samsync_state *samsync_state,
                                        }
                                        break;
                                case NETR_DELTA_USER:
-                                       if (!samsync_handle_user(delta_ctx, samsync_state, 
+                                       if (!samsync_handle_user(tctx, delta_ctx, samsync_state, 
                                                                 r.in.database_id, &r.out.delta_enum_array->delta_enum[d])) {
                                                printf("Failed to handle DELTA_USER\n");
                                                ret = false;
@@ -1611,7 +1612,7 @@ bool torture_rpc_samsync(struct torture_context *torture)
                ret = false;
        }
 
-       if (!test_DatabaseSync(samsync_state, mem_ctx)) {
+       if (!test_DatabaseSync(torture, samsync_state, mem_ctx)) {
                printf("DatabaseSync failed\n");
                ret = false;
        }
index cb9b8be2c95736fe35bbb0caaa938bfd1af42b7c..5a91366980b1cddf826ff4c447d282c48cbf2407 100644 (file)
@@ -64,7 +64,7 @@ bool test_netlogon_ex_ops(struct dcerpc_pipe *p, struct torture_context *tctx,
        chal = data_blob_const(ninfo.challenge, 
                               sizeof(ninfo.challenge));
 
-       names_blob = NTLMv2_generate_names_blob(tctx, cli_credentials_get_workstation(credentials), 
+       names_blob = NTLMv2_generate_names_blob(tctx, lp_iconv_convenience(tctx->lp_ctx), cli_credentials_get_workstation(credentials), 
                                                cli_credentials_get_domain(credentials));
 
        status = cli_credentials_get_ntlm_response(cmdline_credentials, tctx, 
index d77295605f041c417e7b909af6fb418dd30fe7e9..469573367102b7d34982150718e8fcd5db21f23d 100644 (file)
 
 #define TEST_SID "S-1-5-21-1234567890-1234567890-1234567890-500"
 
-static void init_initshutdown_String(TALLOC_CTX *mem_ctx,
-                                    struct initshutdown_String *name,
-                                    const char *s)
+static void init_lsa_StringLarge(struct lsa_StringLarge *name, const char *s)
 {
-       name->name = talloc(mem_ctx, struct initshutdown_String_sub);
-       name->name->name = s;
+       name->string = s;
 }
 
 static void init_winreg_String(struct winreg_String *name, const char *s)
@@ -1636,8 +1633,8 @@ static bool test_InitiateSystemShutdown(struct torture_context *tctx,
        uint16_t hostname = 0x0;
 
        r.in.hostname = &hostname;
-       r.in.message = talloc(tctx, struct initshutdown_String);
-       init_initshutdown_String(tctx, r.in.message, "spottyfood");
+       r.in.message = talloc(tctx, struct lsa_StringLarge);
+       init_lsa_StringLarge(r.in.message, "spottyfood");
        r.in.force_apps = 1;
        r.in.timeout = 30;
        r.in.reboot = 1;
@@ -1660,8 +1657,8 @@ static bool test_InitiateSystemShutdownEx(struct torture_context *tctx,
        uint16_t hostname = 0x0;
 
        r.in.hostname = &hostname;
-       r.in.message = talloc(tctx, struct initshutdown_String);
-       init_initshutdown_String(tctx, r.in.message, "spottyfood");
+       r.in.message = talloc(tctx, struct lsa_StringLarge);
+       init_lsa_StringLarge(r.in.message, "spottyfood");
        r.in.force_apps = 1;
        r.in.timeout = 30;
        r.in.reboot = 1;
index 371ddc729771d9e884de7a8666c0bf6cb0cb98b7..4eeea73003c329d4cd05c39d7b587c2703de8e53 100644 (file)
@@ -615,8 +615,6 @@ int main(int argc,char *argv[])
                alarm(max_runtime);
        }
 
-       ldb_global_init();
-
        if (extra_module != NULL) {
            init_module_fn fn = load_module(talloc_autofree_context(), poptGetOptArg(pc));
 
index 2c95e9033dd9b6c9232a6fcdb2485ac9e9cf73dc..e0865c441662a2b328a1d8c83edf5bc7ea1f26ac 100644 (file)
@@ -182,8 +182,6 @@ static int binary_net(int argc, const char **argv)
 
        dcerpc_init();
 
-       ldb_global_init();
-
        mem_ctx = talloc_init("net_context");
        ctx = talloc(mem_ctx, struct net_context);
        if (!ctx) {
index da5b71f2ae85a780296ae498e09493c5e4b3b818..2567d617da946e29fe50bf0e619605b1b766bd13 100644 (file)
@@ -37,6 +37,7 @@ OBJ_FILES = \
                wb_sam_logon.o
 PRIVATE_DEPENDENCIES = \
                WB_HELPER \
+               IDMAP \
                NDR_WINBIND \
                process_model \
                RPC_NDR_LSA \
@@ -56,3 +57,13 @@ OBJ_FILES = \
 PUBLIC_DEPENDENCIES = RPC_NDR_LSA dcerpc_samr
 # End SUBSYSTEM WB_HELPER
 ################################################
+
+################################################
+# Start SUBYSTEM IDMAP
+[SUBSYSTEM::IDMAP]
+PRIVATE_PROTO_HEADER = idmap_proto.h
+OBJ_FILES = \
+               idmap.o
+PUBLIC_DEPENDENCIES = SAMDB_COMMON
+# End SUBSYSTEM IDMAP
+################################################
diff --git a/source4/winbind/idmap.c b/source4/winbind/idmap.c
new file mode 100644 (file)
index 0000000..3372ad5
--- /dev/null
@@ -0,0 +1,1072 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   Map SIDs to uids/gids and back
+
+   Copyright (C) Kai Blin 2008
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "auth/auth.h"
+#include "librpc/gen_ndr/lsa.h"
+#include "librpc/gen_ndr/samr.h"
+#include "librpc/gen_ndr/ndr_security.h"
+#include "lib/ldb/include/ldb.h"
+#include "lib/ldb/include/ldb_errors.h"
+#include "lib/ldb_wrap.h"
+#include "param/param.h"
+#include "winbind/idmap.h"
+#include "libcli/security/proto.h"
+#include "libcli/ldap/ldap_ndr.h"
+
+/**
+ * Get uid/gid bounds from idmap database
+ *
+ * \param idmap_ctx idmap context to use
+ * \param low lower uid/gid bound is stored here
+ * \param high upper uid/gid bound is stored here
+ * \return 0 on success, nonzero on failure
+ */
+static int idmap_get_bounds(struct idmap_context *idmap_ctx, uint32_t *low,
+               uint32_t *high)
+{
+       int ret = -1;
+       struct ldb_context *ldb = idmap_ctx->ldb_ctx;
+       struct ldb_dn *dn;
+       struct ldb_result *res = NULL;
+       TALLOC_CTX *tmp_ctx = talloc_new(idmap_ctx);
+       uint32_t lower_bound = (uint32_t) -1;
+       uint32_t upper_bound = (uint32_t) -1;
+
+       dn = ldb_dn_new(tmp_ctx, ldb, "CN=CONFIG");
+       if (dn == NULL) goto failed;
+
+       ret = ldb_search(ldb, dn, LDB_SCOPE_BASE, NULL, NULL, &res);
+       if (ret != LDB_SUCCESS) goto failed;
+
+       talloc_steal(tmp_ctx, res);
+
+       if (res->count != 1) {
+               ret = -1;
+               goto failed;
+       }
+
+       lower_bound = ldb_msg_find_attr_as_uint(res->msgs[0], "lowerBound", -1);
+       if (lower_bound != (uint32_t) -1) {
+               ret = LDB_SUCCESS;
+       } else {
+               ret = -1;
+               goto failed;
+       }
+
+       upper_bound = ldb_msg_find_attr_as_uint(res->msgs[0], "upperBound", -1);
+       if (upper_bound != (uint32_t) -1) {
+               ret = LDB_SUCCESS;
+       } else {
+               ret = -1;
+       }
+
+failed:
+       talloc_free(tmp_ctx);
+       *low  = lower_bound;
+       *high = upper_bound;
+       return ret;
+}
+
+/**
+ * Add a dom_sid structure to a ldb_message
+ * \param idmap_ctx idmap context to use
+ * \param mem_ctx talloc context to use
+ * \param ldb_message ldb message to add dom_sid to
+ * \param attr_name name of the attribute to store the dom_sid in
+ * \param sid dom_sid to store
+ * \return 0 on success, an ldb error code on failure.
+ */
+static int idmap_msg_add_dom_sid(struct idmap_context *idmap_ctx,
+               TALLOC_CTX *mem_ctx, struct ldb_message *msg,
+               const char *attr_name, const struct dom_sid *sid)
+{
+       struct ldb_val val;
+       enum ndr_err_code ndr_err;
+
+       ndr_err = ndr_push_struct_blob(&val, mem_ctx,
+                                      lp_iconv_convenience(idmap_ctx->lp_ctx),
+                                      sid,
+                                      (ndr_push_flags_fn_t)ndr_push_dom_sid);
+
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               return -1;
+       }
+
+       return ldb_msg_add_value(msg, attr_name, &val, NULL);
+}
+
+/**
+ * Get a dom_sid structure from a ldb message.
+ *
+ * \param mem_ctx talloc context to allocate dom_sid memory in
+ * \param msg ldb_message to get dom_sid from
+ * \param attr_name key that has the dom_sid as data
+ * \return dom_sid structure on success, NULL on failure
+ */
+static struct dom_sid *idmap_msg_get_dom_sid(TALLOC_CTX *mem_ctx,
+               struct ldb_message *msg, const char *attr_name)
+{
+       struct dom_sid *sid;
+       const struct ldb_val *val;
+       enum ndr_err_code ndr_err;
+
+       val = ldb_msg_find_ldb_val(msg, attr_name);
+       if (val == NULL) {
+               return NULL;
+       }
+
+       sid = talloc(mem_ctx, struct dom_sid);
+       if (sid == NULL) {
+               return NULL;
+       }
+
+       ndr_err = ndr_pull_struct_blob(val, sid, NULL, sid,
+                                      (ndr_pull_flags_fn_t)ndr_pull_dom_sid);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(sid);
+               return NULL;
+       }
+
+       return sid;
+}
+
+/**
+ * Initialize idmap context
+ *
+ * talloc_free to close.
+ *
+ * \param mem_ctx talloc context to use.
+ * \return allocated idmap_context on success, NULL on error
+ */
+struct idmap_context *idmap_init(TALLOC_CTX *mem_ctx,
+               struct loadparm_context *lp_ctx)
+{
+       struct idmap_context *idmap_ctx;
+
+       idmap_ctx = talloc(mem_ctx, struct idmap_context);
+       if (idmap_ctx == NULL) {
+               return NULL;
+       }
+
+       idmap_ctx->lp_ctx = lp_ctx;
+
+       idmap_ctx->ldb_ctx = ldb_wrap_connect(mem_ctx, lp_ctx,
+                                             lp_idmap_url(lp_ctx),
+                                             system_session(mem_ctx, lp_ctx),
+                                             NULL, 0, NULL);
+       if (idmap_ctx->ldb_ctx == NULL) {
+               return NULL;
+       }
+
+       return idmap_ctx;
+}
+
+/**
+ * Convert a uid to the corresponding SID
+ *
+ * \param idmap_ctx idmap context to use
+ * \param mem_ctx talloc context the memory for the struct dom_sid is allocated
+ * from.
+ * \param uid Unix uid to map to a SID
+ * \param sid Pointer that will take the struct dom_sid pointer if the mapping
+ * succeeds.
+ * \return NT_STATUS_OK on success, NT_STATUS_NONE_MAPPED if mapping not
+ * possible or some other NTSTATUS that is more descriptive on failure.
+ */
+
+NTSTATUS idmap_uid_to_sid(struct idmap_context *idmap_ctx, TALLOC_CTX *mem_ctx,
+               const uid_t uid, struct dom_sid **sid)
+{
+       int ret;
+       NTSTATUS status = NT_STATUS_NONE_MAPPED;
+       struct ldb_context *ldb = idmap_ctx->ldb_ctx;
+       struct ldb_message *msg;
+       struct ldb_result *res = NULL;
+       int trans = -1;
+       uid_t low, high;
+       char *sid_string, *uid_string;
+       struct dom_sid *unix_users_sid, *new_sid;
+       TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
+
+       ret = ldb_search_exp_fmt(ldb, tmp_ctx, &res, NULL, LDB_SCOPE_SUBTREE,
+                                NULL, "(&(objectClass=sidMap)(uidNumber=%u))",
+                                uid);
+       if (ret != LDB_SUCCESS) {
+               DEBUG(1, ("Search failed: %s\n", ldb_errstring(ldb)));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       if (res->count == 1) {
+               *sid = idmap_msg_get_dom_sid(mem_ctx, res->msgs[0],
+                                            "objectSid");
+               if (*sid == NULL) {
+                       DEBUG(1, ("Failed to get sid from db: %u\n", ret));
+                       status = NT_STATUS_NONE_MAPPED;
+                       goto failed;
+               }
+               talloc_free(tmp_ctx);
+               return NT_STATUS_OK;
+       }
+
+       DEBUG(6, ("uid not found in idmap db, trying to allocate SID.\n"));
+
+       trans = ldb_transaction_start(ldb);
+       if (trans != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       /* Now redo the search to make sure noone added a mapping for that SID
+        * while we weren't looking.*/
+       ret = ldb_search_exp_fmt(ldb, tmp_ctx, &res, NULL, LDB_SCOPE_SUBTREE,
+                                NULL, "(&(objectClass=sidMap)(uidNumber=%u))",
+                                uid);
+       if (ret != LDB_SUCCESS) {
+               DEBUG(1, ("Search failed: %s\n", ldb_errstring(ldb)));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       if (res->count > 0) {
+               DEBUG(1, ("sidMap modified while trying to add a mapping.\n"));
+               status = NT_STATUS_RETRY;
+               goto failed;
+       }
+
+       ret = idmap_get_bounds(idmap_ctx, &low, &high);
+       if (ret != LDB_SUCCESS) {
+               DEBUG(1, ("Failed to get id bounds from db: %u\n", ret));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       if (uid >= low && uid <= high) {
+               /* An existing user would have been mapped before */
+               status = NT_STATUS_NO_SUCH_USER;
+               goto failed;
+       }
+
+       /* For local users, we just create a rid = uid +1, so root doesn't end
+        * up with a 0 rid */
+       unix_users_sid = dom_sid_parse_talloc(tmp_ctx, "S-1-22-1");
+       if (unix_users_sid == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       new_sid = dom_sid_add_rid(mem_ctx, unix_users_sid, uid + 1);
+       if (new_sid == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       sid_string = dom_sid_string(tmp_ctx, new_sid);
+       if (sid_string == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       uid_string = talloc_asprintf(tmp_ctx, "%u", uid);
+       if (uid_string == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       msg = ldb_msg_new(tmp_ctx);
+       if (msg == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       msg->dn = ldb_dn_new_fmt(tmp_ctx, ldb, "CN=%s", sid_string);
+       if (msg->dn == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       ret = ldb_msg_add_string(msg, "uidNumber", uid_string);
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       ret = idmap_msg_add_dom_sid(idmap_ctx, tmp_ctx, msg, "objectSid",
+                                   new_sid);
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       ret = ldb_msg_add_string(msg, "objectClass", "sidMap");
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       ret = ldb_msg_add_string(msg, "cn", sid_string);
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       ret = ldb_add(ldb, msg);
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       trans = ldb_transaction_commit(ldb);
+       if (trans != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       *sid = new_sid;
+       talloc_free(tmp_ctx);
+       return NT_STATUS_OK;
+
+failed:
+       if (trans == LDB_SUCCESS) ldb_transaction_cancel(ldb);
+       talloc_free(tmp_ctx);
+       return status;
+}
+
+/**
+ * Map a Unix gid to the corresponding SID
+ *
+ * \param idmap_ctx idmap context to use
+ * \param mem_ctx talloc context the memory for the struct dom_sid is allocated
+ * from.
+ * \param gid Unix gid to map to a SID
+ * \param sid Pointer that will take the struct dom_sid pointer if mapping
+ * succeeds.
+ * \return NT_STATUS_OK on success, NT_STATUS_NONE_MAPPED if mapping not
+ * possible or some other NTSTATUS that is more descriptive on failure.
+ */
+NTSTATUS idmap_gid_to_sid(struct idmap_context *idmap_ctx, TALLOC_CTX *mem_ctx,
+               const gid_t gid, struct dom_sid **sid)
+{
+       int ret;
+       NTSTATUS status = NT_STATUS_NONE_MAPPED;
+       struct ldb_context *ldb = idmap_ctx->ldb_ctx;
+       struct ldb_message *msg;
+       struct ldb_result *res = NULL;
+       int trans = -1;
+       gid_t low, high;
+       char *sid_string, *gid_string;
+       struct dom_sid *unix_groups_sid, *new_sid;
+       TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
+
+       ret = ldb_search_exp_fmt(ldb, tmp_ctx, &res, NULL, LDB_SCOPE_SUBTREE,
+                       NULL, "(&(objectClass=sidMap)(gidNumber=%u))", gid);
+       if (ret != LDB_SUCCESS) {
+               DEBUG(1, ("Search failed: %s\n", ldb_errstring(ldb)));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       if (res->count == 1) {
+               *sid = idmap_msg_get_dom_sid(mem_ctx, res->msgs[0],
+                               "objectSid");
+               if (*sid == NULL) {
+                       DEBUG(1, ("Failed to get sid from db: %u\n", ret));
+                       status = NT_STATUS_NONE_MAPPED;
+                       goto failed;
+               }
+               /* No change, so cancel the transaction */
+               ldb_transaction_cancel(ldb);
+               talloc_free(tmp_ctx);
+               return NT_STATUS_OK;
+       }
+
+       DEBUG(6, ("gid not found in idmap db, trying to allocate SID.\n"));
+
+       trans = ldb_transaction_start(ldb);
+       if (trans != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       /* Now redo the search to make sure noone added a mapping for that SID
+        * while we weren't looking.*/
+       ret = ldb_search_exp_fmt(ldb, tmp_ctx, &res, NULL, LDB_SCOPE_SUBTREE,
+                                NULL, "(&(objectClass=sidMap)(gidNumber=%u))",
+                                gid);
+       if (ret != LDB_SUCCESS) {
+               DEBUG(1, ("Search failed: %s\n", ldb_errstring(ldb)));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       if (res->count > 0) {
+               DEBUG(1, ("sidMap modified while trying to add a mapping.\n"));
+               status = NT_STATUS_RETRY;
+               goto failed;
+       }
+
+       ret = idmap_get_bounds(idmap_ctx, &low, &high);
+       if (ret != LDB_SUCCESS) {
+               DEBUG(1, ("Failed to get id bounds from db: %u\n", ret));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       if (gid >= low && gid <= high) {
+               /* An existing group would have been mapped before */
+               status = NT_STATUS_NO_SUCH_USER;
+               goto failed;
+       }
+
+       /* For local groups, we just create a rid = gid +1, so root doesn't end
+        * up with a 0 rid */
+       unix_groups_sid = dom_sid_parse_talloc(tmp_ctx, "S-1-22-2");
+       if (unix_groups_sid == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       new_sid = dom_sid_add_rid(mem_ctx, unix_groups_sid, gid + 1);
+       if (new_sid == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       sid_string = dom_sid_string(tmp_ctx, new_sid);
+       if (sid_string == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       gid_string = talloc_asprintf(tmp_ctx, "%u", gid);
+       if (gid_string == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       msg = ldb_msg_new(tmp_ctx);
+       if (msg == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       msg->dn = ldb_dn_new_fmt(tmp_ctx, ldb, "CN=%s", sid_string);
+       if (msg->dn == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       ret = ldb_msg_add_string(msg, "gidNumber", gid_string);
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       ret = idmap_msg_add_dom_sid(idmap_ctx, tmp_ctx, msg, "objectSid",
+                       new_sid);
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       ret = ldb_msg_add_string(msg, "objectClass", "sidMap");
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       ret = ldb_msg_add_string(msg, "cn", sid_string);
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       ret = ldb_add(ldb, msg);
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       trans = ldb_transaction_commit(ldb);
+       if (trans != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       *sid = new_sid;
+       talloc_free(tmp_ctx);
+       return NT_STATUS_OK;
+
+failed:
+       if (trans == LDB_SUCCESS) ldb_transaction_cancel(ldb);
+       talloc_free(tmp_ctx);
+       return status;
+}
+
+/**
+ * Map a SID to a Unix uid.
+ *
+ * If no mapping exists, a new mapping will be created.
+ *
+ * \todo Check if SIDs can be resolved if lp_idmap_trusted_only() == true
+ *
+ * \param idmap_ctx idmap context to use
+ * \param mem_ctx talloc context to use
+ * \param sid SID to map to a Unix uid
+ * \param uid pointer to receive the mapped uid
+ * \return NT_STATUS_OK on success, NT_STATUS_INVALID_SID if the sid is not from
+ * a trusted domain and idmap trusted only = true, NT_STATUS_NONE_MAPPED if the
+ * mapping failed.
+ */
+NTSTATUS idmap_sid_to_uid(struct idmap_context *idmap_ctx, TALLOC_CTX *mem_ctx,
+               const struct dom_sid *sid, uid_t *uid)
+{
+       int ret;
+       NTSTATUS status = NT_STATUS_NONE_MAPPED;
+       struct ldb_context *ldb = idmap_ctx->ldb_ctx;
+       struct ldb_dn *dn;
+       struct ldb_message *hwm_msg, *map_msg;
+       struct ldb_result *res = NULL;
+       int trans;
+       uid_t low, high, hwm, new_uid;
+       char *sid_string, *uid_string, *hwm_string;
+       bool hwm_entry_exists;
+       TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
+
+       ret = ldb_search_exp_fmt(ldb, tmp_ctx, &res, NULL, LDB_SCOPE_SUBTREE,
+                                NULL, "(&(objectClass=sidMap)(objectSid=%s))",
+                                ldap_encode_ndr_dom_sid(tmp_ctx, sid));
+       if (ret != LDB_SUCCESS) {
+               DEBUG(1, ("Search failed: %s\n", ldb_errstring(ldb)));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       if (res->count == 1) {
+               new_uid = ldb_msg_find_attr_as_uint(res->msgs[0], "uidNumber",
+                                                   -1);
+               if (new_uid == (uid_t) -1) {
+                       DEBUG(1, ("Invalid uid mapping.\n"));
+                       status = NT_STATUS_NONE_MAPPED;
+                       goto failed;
+               }
+               *uid = new_uid;
+               talloc_free(tmp_ctx);
+               return NT_STATUS_OK;
+       }
+
+       DEBUG(6, ("No existing mapping found, attempting to create one.\n"));
+
+       trans = ldb_transaction_start(ldb);
+       if (trans != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       /* Redo the search to make sure noone changed the mapping while we
+        * weren't looking */
+       ret = ldb_search_exp_fmt(ldb, tmp_ctx, &res, NULL, LDB_SCOPE_SUBTREE,
+                                NULL, "(&(objectClass=sidMap)(objectSid=%s))",
+                                ldap_encode_ndr_dom_sid(tmp_ctx, sid));
+       if (ret != LDB_SUCCESS) {
+               DEBUG(1, ("Search failed: %s\n", ldb_errstring(ldb)));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       if (res->count > 0) {
+               DEBUG(1, ("Database changed while trying to add a sidmap.\n"));
+               status = NT_STATUS_RETRY;
+               goto failed;
+       }
+
+       /*FIXME: if lp_idmap_trusted_only() == true, check if SID can be
+        * resolved here. */
+
+       ret = idmap_get_bounds(idmap_ctx, &low, &high);
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       dn = ldb_dn_new(tmp_ctx, ldb, "CN=CONFIG");
+       if (dn == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       ret = ldb_search(ldb, dn, LDB_SCOPE_BASE, NULL, NULL, &res);
+       if (ret != LDB_SUCCESS) {
+               DEBUG(1, ("Search failed: %s\n", ldb_errstring(ldb)));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       talloc_steal(tmp_ctx, res);
+
+       if (res->count != 1) {
+               DEBUG(1, ("No CN=CONFIG record, idmap database is broken.\n"));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       hwm = ldb_msg_find_attr_as_uint(res->msgs[0], "uidNumber", -1);
+       if (hwm == (uid_t)-1) {
+               hwm = low;
+               hwm_entry_exists = false;
+       } else {
+               hwm_entry_exists = true;
+       }
+
+       if (hwm > high) {
+               DEBUG(1, ("Out of uids to allocate.\n"));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       hwm_msg = ldb_msg_new(tmp_ctx);
+       if (hwm_msg == NULL) {
+               DEBUG(1, ("Out of memory when creating ldb_message\n"));
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       hwm_msg->dn = dn;
+
+       new_uid = hwm;
+       hwm++;
+
+       hwm_string = talloc_asprintf(tmp_ctx, "%u", hwm);
+       if (hwm_string == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       sid_string = dom_sid_string(tmp_ctx, sid);
+       if (sid_string == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       uid_string = talloc_asprintf(tmp_ctx, "%u", new_uid);
+       if (uid_string == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       if (hwm_entry_exists) {
+               struct ldb_message_element *els;
+               struct ldb_val *vals;
+
+               /* We're modifying the entry, not just adding a new one. */
+               els = talloc_array(tmp_ctx, struct ldb_message_element, 2);
+               if (els == NULL) {
+                       status = NT_STATUS_NO_MEMORY;
+                       goto failed;
+               }
+
+               vals = talloc_array(tmp_ctx, struct ldb_val, 2);
+               if (els == NULL) {
+                       status = NT_STATUS_NO_MEMORY;
+                       goto failed;
+               }
+
+               hwm_msg->num_elements = 2;
+               hwm_msg->elements = els;
+
+               els[0].num_values = 1;
+               els[0].values = &vals[0];
+               els[0].flags = LDB_FLAG_MOD_DELETE;
+               els[0].name = talloc_strdup(tmp_ctx, "uidNumber");
+               if (els[0].name == NULL) {
+                       status = NT_STATUS_NO_MEMORY;
+                       goto failed;
+               }
+
+               els[1].num_values = 1;
+               els[1].values = &vals[1];
+               els[1].flags = LDB_FLAG_MOD_ADD;
+               els[1].name = els[0].name;
+
+               vals[0].data = (uint8_t *)uid_string;
+               vals[0].length = strlen(uid_string);
+               vals[1].data = (uint8_t *)hwm_string;
+               vals[1].length = strlen(hwm_string);
+       } else {
+               ret = ldb_msg_add_empty(hwm_msg, "uidNumber", LDB_FLAG_MOD_ADD,
+                                       NULL);
+               if (ret != LDB_SUCCESS) {
+                       status = NT_STATUS_NONE_MAPPED;
+                       goto failed;
+               }
+
+               ret = ldb_msg_add_string(hwm_msg, "uidNumber", hwm_string);
+               if (ret != LDB_SUCCESS)
+               {
+                       status = NT_STATUS_NONE_MAPPED;
+                       goto failed;
+               }
+       }
+
+       ret = ldb_modify(ldb, hwm_msg);
+       if (ret != LDB_SUCCESS) {
+               DEBUG(1, ("Updating the uid high water mark failed: %s\n",
+                         ldb_errstring(ldb)));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       map_msg = ldb_msg_new(tmp_ctx);
+       if (map_msg == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       map_msg->dn = ldb_dn_new_fmt(tmp_ctx, ldb, "CN=%s", sid_string);
+       if (map_msg->dn == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       ret = ldb_msg_add_string(map_msg, "uidNumber", uid_string);
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       ret = idmap_msg_add_dom_sid(idmap_ctx, tmp_ctx, map_msg, "objectSid",
+                       sid);
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       ret = ldb_msg_add_string(map_msg, "objectClass", "sidMap");
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       ret = ldb_msg_add_string(map_msg, "cn", sid_string);
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       ret = ldb_add(ldb, map_msg);
+       if (ret != LDB_SUCCESS) {
+               DEBUG(1, ("Adding a sidmap failed: %s\n", ldb_errstring(ldb)));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       trans = ldb_transaction_commit(ldb);
+       if (trans != LDB_SUCCESS) {
+               DEBUG(1, ("Transaction failed: %s\n", ldb_errstring(ldb)));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       *uid = new_uid;
+       talloc_free(tmp_ctx);
+       return NT_STATUS_OK;
+
+failed:
+       if (trans == LDB_SUCCESS) ldb_transaction_cancel(ldb);
+       talloc_free(tmp_ctx);
+       return status;
+}
+
+/**
+ * Map a SID to a Unix gid.
+ *
+ * If no mapping exist, a new mapping will be created.
+ *
+ * \todo Check if SID resolve when lp_idmap_trusted_only() == true
+ *
+ * \param idmap_ctx idmap context to use
+ * \param mem_ctx talloc context to use
+ * \param sid SID to map to a Unix gid
+ * \param gid pointer to receive the mapped gid
+ * \return NT_STATUS_OK on success, NT_STATUS_INVALID_SID if the sid is not from
+ * a trusted domain and idmap trusted only = true, NT_STATUS_NONE_MAPPED if the
+ * mapping failed.
+ */
+NTSTATUS idmap_sid_to_gid(struct idmap_context *idmap_ctx, TALLOC_CTX *mem_ctx,
+               const struct dom_sid *sid, gid_t *gid)
+{
+       int ret;
+       NTSTATUS status = NT_STATUS_NONE_MAPPED;
+       struct ldb_context *ldb = idmap_ctx->ldb_ctx;
+       struct ldb_dn *dn;
+       struct ldb_message *hwm_msg, *map_msg;
+       struct ldb_result *res = NULL;
+       int trans = -1;
+       gid_t low, high, hwm, new_gid;
+       char *sid_string, *gid_string, *hwm_string;
+       bool hwm_entry_exists;
+       TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
+
+       ret = ldb_search_exp_fmt(ldb, tmp_ctx, &res, NULL, LDB_SCOPE_SUBTREE,
+                                NULL, "(&(objectClass=sidMap)(objectSid=%s))",
+                                ldap_encode_ndr_dom_sid(tmp_ctx, sid));
+       if (ret != LDB_SUCCESS) {
+               DEBUG(1, ("Search failed: %s\n", ldb_errstring(ldb)));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       if (res->count == 1) {
+               new_gid = ldb_msg_find_attr_as_uint(res->msgs[0], "gidNumber",
+                               -1);
+               if (new_gid == (gid_t) -1) {
+                       DEBUG(1, ("Invalid gid mapping.\n"));
+                       status = NT_STATUS_NONE_MAPPED;
+                       goto failed;
+               }
+               *gid = new_gid;
+               talloc_free(tmp_ctx);
+               return NT_STATUS_OK;
+       }
+
+       DEBUG(6, ("No existing mapping found, attempting to create one.\n"));
+
+       trans = ldb_transaction_start(ldb);
+       if (trans != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       /* Redo the search to make sure noone changed the mapping while we
+        * weren't looking */
+       ret = ldb_search_exp_fmt(ldb, tmp_ctx, &res, NULL, LDB_SCOPE_SUBTREE,
+                                NULL, "(&(objectClass=sidMap)(objectSid=%s))",
+                                ldap_encode_ndr_dom_sid(tmp_ctx, sid));
+       if (ret != LDB_SUCCESS) {
+               DEBUG(1, ("Search failed: %s\n", ldb_errstring(ldb)));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       if (res->count > 0) {
+               DEBUG(1, ("Database changed while trying to add a sidmap.\n"));
+               status = NT_STATUS_RETRY;
+               goto failed;
+       }
+
+       /*FIXME: if lp_idmap_trusted_only() == true, check if SID can be
+        * resolved here. */
+
+       ret = idmap_get_bounds(idmap_ctx, &low, &high);
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       dn = ldb_dn_new(tmp_ctx, ldb, "CN=CONFIG");
+       if (dn == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       ret = ldb_search(ldb, dn, LDB_SCOPE_BASE, NULL, NULL, &res);
+       if (ret != LDB_SUCCESS) {
+               DEBUG(1, ("Search failed: %s\n", ldb_errstring(ldb)));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       talloc_steal(tmp_ctx, res);
+
+       if (res->count != 1) {
+               DEBUG(1, ("No CN=CONFIG record, idmap database is broken.\n"));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       hwm = ldb_msg_find_attr_as_uint(res->msgs[0], "gidNumber", -1);
+       if (hwm == (gid_t)-1) {
+               hwm = low;
+               hwm_entry_exists = false;
+       } else {
+               hwm_entry_exists = true;
+       }
+
+       if (hwm > high) {
+               DEBUG(1, ("Out of gids to allocate.\n"));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       hwm_msg = ldb_msg_new(tmp_ctx);
+       if (hwm_msg == NULL) {
+               DEBUG(1, ("Out of memory when creating ldb_message\n"));
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       hwm_msg->dn = dn;
+
+       new_gid = hwm;
+       hwm++;
+
+       hwm_string = talloc_asprintf(tmp_ctx, "%u", hwm);
+       if (hwm_string == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       sid_string = dom_sid_string(tmp_ctx, sid);
+       if (sid_string == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       gid_string = talloc_asprintf(tmp_ctx, "%u", new_gid);
+       if (gid_string == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       if (hwm_entry_exists) {
+               struct ldb_message_element *els;
+               struct ldb_val *vals;
+
+               /* We're modifying the entry, not just adding a new one. */
+               els = talloc_array(tmp_ctx, struct ldb_message_element, 2);
+               if (els == NULL) {
+                       status = NT_STATUS_NO_MEMORY;
+                       goto failed;
+               }
+
+               vals = talloc_array(tmp_ctx, struct ldb_val, 2);
+               if (els == NULL) {
+                       status = NT_STATUS_NO_MEMORY;
+                       goto failed;
+               }
+
+               hwm_msg->num_elements = 2;
+               hwm_msg->elements = els;
+
+               els[0].num_values = 1;
+               els[0].values = &vals[0];
+               els[0].flags = LDB_FLAG_MOD_DELETE;
+               els[0].name = talloc_strdup(tmp_ctx, "gidNumber");
+               if (els[0].name == NULL) {
+                       status = NT_STATUS_NO_MEMORY;
+                       goto failed;
+               }
+
+               els[1].num_values = 1;
+               els[1].values = &vals[1];
+               els[1].flags = LDB_FLAG_MOD_ADD;
+               els[1].name = els[0].name;
+
+               vals[0].data = (uint8_t *)gid_string;
+               vals[0].length = strlen(gid_string);
+               vals[1].data = (uint8_t *)hwm_string;
+               vals[1].length = strlen(hwm_string);
+       } else {
+               ret = ldb_msg_add_empty(hwm_msg, "gidNumber", LDB_FLAG_MOD_ADD,
+                                       NULL);
+               if (ret != LDB_SUCCESS) {
+                       status = NT_STATUS_NONE_MAPPED;
+                       goto failed;
+               }
+
+               ret = ldb_msg_add_string(hwm_msg, "gidNumber", hwm_string);
+               if (ret != LDB_SUCCESS)
+               {
+                       status = NT_STATUS_NONE_MAPPED;
+                       goto failed;
+               }
+       }
+
+       ret = ldb_modify(ldb, hwm_msg);
+       if (ret != LDB_SUCCESS) {
+               DEBUG(1, ("Updating the gid high water mark failed: %s\n",
+                         ldb_errstring(ldb)));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       map_msg = ldb_msg_new(tmp_ctx);
+       if (map_msg == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       map_msg->dn = ldb_dn_new_fmt(tmp_ctx, ldb, "CN=%s", sid_string);
+       if (map_msg->dn == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       ret = ldb_msg_add_string(map_msg, "gidNumber", gid_string);
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       ret = idmap_msg_add_dom_sid(idmap_ctx, tmp_ctx, map_msg, "objectSid",
+                       sid);
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       ret = ldb_msg_add_string(map_msg, "objectClass", "sidMap");
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       ret = ldb_msg_add_string(map_msg, "cn", sid_string);
+       if (ret != LDB_SUCCESS) {
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       ret = ldb_add(ldb, map_msg);
+       if (ret != LDB_SUCCESS) {
+               DEBUG(1, ("Adding a sidmap failed: %s\n", ldb_errstring(ldb)));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       trans = ldb_transaction_commit(ldb);
+       if (trans != LDB_SUCCESS) {
+               DEBUG(1, ("Transaction failed: %s\n", ldb_errstring(ldb)));
+               status = NT_STATUS_NONE_MAPPED;
+               goto failed;
+       }
+
+       *gid = new_gid;
+       talloc_free(tmp_ctx);
+       return NT_STATUS_OK;
+
+failed:
+       if (trans == LDB_SUCCESS) ldb_transaction_cancel(ldb);
+       talloc_free(tmp_ctx);
+       return status;
+}
+
diff --git a/source4/winbind/idmap.h b/source4/winbind/idmap.h
new file mode 100644 (file)
index 0000000..8781819
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   Map SIDs to uids/gids and back
+
+   Copyright (C) Kai Blin 2008
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _IDMAP_H_
+#define _IDMAP_H_
+
+struct idmap_context {
+       struct loadparm_context *lp_ctx;
+       struct ldb_context *ldb_ctx;
+};
+
+#include "winbind/idmap_proto.h"
+
+#endif
+
index 5c0b87118d1d4591bed0a046307fe6d37eb8d868..f2577029aaba2c3dec46e21ea567abecfbb49d6b 100644 (file)
@@ -25,6 +25,7 @@
 #include "smbd/service_task.h"
 #include "winbind/wb_helper.h"
 #include "libcli/security/proto.h"
+#include "winbind/idmap.h"
 
 struct gid2sid_state {
        struct composite_context *ctx;
@@ -50,10 +51,14 @@ struct composite_context *wb_gid2sid_send(TALLOC_CTX *mem_ctx,
        result->private_data = state;
        state->service = service;
 
-       /* FIXME: This is a stub so far.
-        * We cheat by just using the gid as RID with the domain SID.*/
-       state->sid = dom_sid_add_rid(result, service->primary_sid, gid);
-       if (composite_nomem(state->sid, state->ctx)) return result;
+       state->ctx->status = idmap_gid_to_sid(service->idmap_ctx, mem_ctx, gid,
+                                             &state->sid);
+       if (NT_STATUS_EQUAL(state->ctx->status, NT_STATUS_RETRY)) {
+               state->ctx->status = idmap_gid_to_sid(service->idmap_ctx,
+                                                     mem_ctx, gid,
+                                                     &state->sid);
+       }
+       if (!composite_is_ok(state->ctx)) return result;
 
        composite_done(state->ctx);
        return result;
index a34f3fbdd0a8fe6558f697b8dafa05b8c707d2b2..0073e3fdf8ae7bbe1b3e8c3173f11b536df6e997 100644 (file)
@@ -258,6 +258,7 @@ struct composite_context *wb_cmd_pam_auth_send(TALLOC_CTX *mem_ctx,
 
        names_blob = NTLMv2_generate_names_blob(
                mem_ctx,
+               lp_iconv_convenience(service->task->lp_ctx),
                cli_credentials_get_workstation(credentials), 
                cli_credentials_get_domain(credentials));
 
index 9b303f36158f32507e69ef5d3bbad7b07cb588c1..99191f3c6ce6a957398ec1ec3b0b397d33b1457f 100644 (file)
@@ -149,6 +149,12 @@ static void winbind_task_init(struct task_server *task)
                return;
        }
 
+       service->idmap_ctx = idmap_init(service, task->lp_ctx);
+       if (service->idmap_ctx == NULL) {
+               task_server_terminate(task, "Failed to load idmap database");
+               return;
+       }
+
        /* setup the unprivileged samba3 socket */
        listen_socket = talloc(service, struct wbsrv_listen_socket);
        if (!listen_socket) goto nomem;
index f3cfc185654b1c3bc2bd974b48b8544abdc1ea1e..ce972932f5378135b6569e98c1b44ab3ddcf58c6 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "nsswitch/winbind_nss_config.h"
 #include "nsswitch/winbind_struct_protocol.h"
+#include "winbind/idmap.h"
 #include "libnet/libnet.h"
 
 #define WINBINDD_SAMBA3_SOCKET "pipe"
@@ -33,6 +34,7 @@ struct wbsrv_service {
 
        const struct dom_sid *primary_sid;
        struct wbsrv_domain *domains;
+       struct idmap_context *idmap_ctx;
 };
 
 struct wbsrv_samconn {
index 8cb5608b2f8dcd927cc67f2277f80bff67d78f81..12129226be5ac94bc1ffaf58a0b8b8c2027b20fa 100644 (file)
@@ -25,6 +25,7 @@
 #include "smbd/service_task.h"
 #include "winbind/wb_helper.h"
 #include "libcli/security/proto.h"
+#include "winbind/idmap.h"
 
 struct sid2gid_state {
        struct composite_context *ctx;
@@ -50,9 +51,13 @@ struct composite_context *wb_sid2gid_send(TALLOC_CTX *mem_ctx,
        result->private_data = state;
        state->service = service;
 
-       /*FIXME: This is a stub so far. */
-       state->ctx->status = dom_sid_split_rid(result, sid, NULL, &state->gid);
-       if(!composite_is_ok(state->ctx)) return result;
+       state->ctx->status = idmap_sid_to_gid(service->idmap_ctx, state, sid,
+                                             &state->gid);
+       if (NT_STATUS_EQUAL(state->ctx->status, NT_STATUS_RETRY)) {
+               state->ctx->status = idmap_sid_to_gid(service->idmap_ctx, state,
+                                                     sid, &state->gid);
+       }
+       if (!composite_is_ok(state->ctx)) return result;
 
        composite_done(state->ctx);
        return result;
index 449596ef38edf2dca6985d75f9bba6d4999619d4..0de45fdea9b50065e1eb637490ee9a301ca51574 100644 (file)
@@ -3,7 +3,7 @@
 
    Map a SID to a uid
 
-   Copyright (C) Kai Blin 2007
+   Copyright (C) Kai Blin 2007-2008
 
    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
@@ -25,6 +25,7 @@
 #include "smbd/service_task.h"
 #include "winbind/wb_helper.h"
 #include "libcli/security/proto.h"
+#include "winbind/idmap.h"
 
 struct sid2uid_state {
        struct composite_context *ctx;
@@ -50,11 +51,13 @@ struct composite_context *wb_sid2uid_send(TALLOC_CTX *mem_ctx,
        result->private_data = state;
        state->service = service;
 
-       /*FIXME: This is a stub so far. */
-       state->ctx->status = dom_sid_split_rid(result, sid, NULL, &state->uid);
-       if(!composite_is_ok(state->ctx)) return result;
-
-       DEBUG(5, ("Rid is %d\n", state->uid));
+       state->ctx->status = idmap_sid_to_uid(service->idmap_ctx, state, sid,
+                                             &state->uid);
+       if (NT_STATUS_EQUAL(state->ctx->status, NT_STATUS_RETRY)) {
+               state->ctx->status = idmap_sid_to_uid(service->idmap_ctx, state,
+                                                     sid, &state->uid);
+       }
+       if (!composite_is_ok(state->ctx)) return result;
 
        composite_done(state->ctx);
        return result;
index d7a909fda2993c2a590516410bef77c20fcfde52..e81d2e46717e4ad168fa4f4c0ab14325ab7ed409 100644 (file)
@@ -3,7 +3,7 @@
 
    Command backend for wbinfo -U
 
-   Copyright (C) Kai Blin 2007
+   Copyright (C) Kai Blin 2007-2008
 
    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
@@ -25,6 +25,7 @@
 #include "smbd/service_task.h"
 #include "winbind/wb_helper.h"
 #include "libcli/security/proto.h"
+#include "winbind/idmap.h"
 
 struct uid2sid_state {
        struct composite_context *ctx;
@@ -50,10 +51,14 @@ struct composite_context *wb_uid2sid_send(TALLOC_CTX *mem_ctx,
        result->private_data = state;
        state->service = service;
 
-       /* FIXME: This is a stub so far.
-        * We cheat by just using the uid as RID with the domain SID.*/
-       state->sid = dom_sid_add_rid(result, service->primary_sid, uid);
-       if (composite_nomem(state->sid, state->ctx)) return result;
+       state->ctx->status = idmap_uid_to_sid(service->idmap_ctx, mem_ctx, uid,
+                                             &state->sid);
+       if (NT_STATUS_EQUAL(state->ctx->status, NT_STATUS_RETRY)) {
+               state->ctx->status = idmap_uid_to_sid(service->idmap_ctx,
+                                                     mem_ctx, uid,
+                                                     &state->sid);
+       }
+       if (!composite_is_ok(state->ctx)) return result;
 
        composite_done(state->ctx);
        return result;