summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2013-10-14 15:46:43 +1300
committerStefan Metzmacher <metze@samba.org>2013-10-16 09:31:41 +0200
commit033dc776de81b9674735f1ac0ed4085503068e60 (patch)
tree968913401088089412622365f7f3bc4a0bbf6b0b
parent651cf893903147cf6d3f1ccb6432c2661cdc36c5 (diff)
downloadsamba-033dc776de81b9674735f1ac0ed4085503068e60.tar.gz
param: Autogenerate s3 lp_ctx glue table
This allows us to use more lpcfg_ functions without adding them manually. Signed-off-by: Andrew Bartlett <abartlet@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org>
-rw-r--r--lib/param/wscript_build1
-rw-r--r--script/mks3param_ctx_table.pl139
-rw-r--r--source3/param/loadparm_ctx.c64
-rw-r--r--source3/param/wscript_build5
4 files changed, 146 insertions, 63 deletions
diff --git a/lib/param/wscript_build b/lib/param/wscript_build
index 10e05a3072d..0e1a2e04f33 100644
--- a/lib/param/wscript_build
+++ b/lib/param/wscript_build
@@ -11,6 +11,7 @@ bld.SAMBA_GENERATOR('s3_param_h',
target='s3_param.h',
rule='${PERL} ${SRC[0].abspath(env)} ${SRC[1].abspath(env)} ${SRC[2].abspath(env)} --file ${TGT}')
+
bld.SAMBA_GENERATOR('param_global_h',
source= '../../script/mkparamdefs.pl loadparm.c param_functions.c',
target='param_global.h',
diff --git a/script/mks3param_ctx_table.pl b/script/mks3param_ctx_table.pl
new file mode 100644
index 00000000000..cfd6e029dab
--- /dev/null
+++ b/script/mks3param_ctx_table.pl
@@ -0,0 +1,139 @@
+#!/usr/bin/perl
+# Generate loadparm interfaces tables for Samba3/Samba4 integration
+# by Andrew Bartlett
+# based on mkproto.pl Written by Jelmer Vernooij
+# based on the original mkproto.sh by Andrew Tridgell
+
+use strict;
+
+# don't use warnings module as it is not portable enough
+# use warnings;
+
+use Getopt::Long;
+use File::Basename;
+use File::Path;
+
+#####################################################################
+# read a file into a string
+
+my $file = undef;
+my $public_define = undef;
+my $_public = "";
+my $_private = "";
+my $public_data = \$_public;
+my $builddir = ".";
+my $srcdir = ".";
+
+sub public($)
+{
+ my ($d) = @_;
+ $$public_data .= $d;
+}
+
+sub usage()
+{
+ print "Usage: mks3param.pl [options] [c files]\n";
+ print "OPTIONS:\n";
+ print " --srcdir=path Read files relative to this directory\n";
+ print " --builddir=path Write file relative to this directory\n";
+ print " --help Print this help message\n\n";
+ exit 0;
+}
+
+GetOptions(
+ 'file=s' => sub { my ($f,$v) = @_; $file = $v; },
+ 'srcdir=s' => sub { my ($f,$v) = @_; $srcdir = $v; },
+ 'builddir=s' => sub { my ($f,$v) = @_; $builddir = $v; },
+ 'help' => \&usage
+) or exit(1);
+
+sub file_load($)
+{
+ my($filename) = @_;
+ local(*INPUTFILE);
+ open(INPUTFILE, $filename) or return undef;
+ my($saved_delim) = $/;
+ undef $/;
+ my($data) = <INPUTFILE>;
+ close(INPUTFILE);
+ $/ = $saved_delim;
+ return $data;
+}
+
+sub print_header($)
+{
+ my ($file) = @_;
+ $file->("/* This file was automatically generated by mks3param_ctx.pl. DO NOT EDIT */\n\n");
+ $file->("static const struct loadparm_s3_helpers s3_fns = \n");
+ $file->("{\n");
+ $file->("\t.get_parametric = lp_parm_const_string_service,\n");
+ $file->("\t.get_parm_struct = lp_get_parameter,\n");
+ $file->("\t.get_parm_ptr = lp_parm_ptr,\n");
+ $file->("\t.get_service = lp_service_for_s4_ctx,\n");
+ $file->("\t.get_servicebynum = lp_servicebynum_for_s4_ctx,\n");
+ $file->("\t.get_default_loadparm_service = lp_default_loadparm_service,\n");
+ $file->("\t.get_numservices = lp_numservices,\n");
+ $file->("\t.load = lp_load_for_s4_ctx,\n");
+ $file->("\t.set_cmdline = lp_set_cmdline,\n");
+ $file->("\t.dump = lp_dump,\n");
+}
+
+sub print_footer($)
+{
+ my ($file) = @_;
+ $file->("};");
+}
+
+sub handle_loadparm($$)
+{
+ my ($file,$line) = @_;
+
+ # STRING isn't handled here, as we still don't know what to do with the substituted vars */
+ # LOCAL also isn't handled here
+ if ($line =~ /^FN_(GLOBAL)_(CONST_STRING|BOOL|bool|CHAR|INTEGER|LIST)\((\w+),.*\)/o) {
+ my $scope = $1;
+ my $type = $2;
+ my $name = $3;
+
+ $file->(".$name = lp_$name,\n");
+ }
+}
+
+sub process_file($$)
+{
+ my ($file, $filename) = @_;
+
+ $filename =~ s/\.o$/\.c/g;
+
+ if ($filename =~ /^\//) {
+ open(FH, "<$filename") or die("Failed to open $filename");
+ } elsif (!open(FH, "< $builddir/$filename")) {
+ open(FH, "< $srcdir/$filename") || die "Failed to open $filename";
+ }
+
+ my $comment = undef;
+ my $incomment = 0;
+ while (my $line = <FH>) {
+ if ($line =~ /^FN_/) {
+ handle_loadparm($file, $line);
+ }
+ next;
+ }
+
+ close(FH);
+}
+
+
+print_header(\&public);
+
+process_file(\&public, $_) foreach (@ARGV);
+print_footer(\&public);
+
+if (not defined($file)) {
+ print STDOUT $$public_data;
+}
+
+mkpath(dirname($file), 0, 0755);
+open(PUBLIC, ">$file") or die("Can't open `$file': $!");
+print PUBLIC "$$public_data";
+close(PUBLIC);
diff --git a/source3/param/loadparm_ctx.c b/source3/param/loadparm_ctx.c
index 63ead53ac1b..5cbc920529c 100644
--- a/source3/param/loadparm_ctx.c
+++ b/source3/param/loadparm_ctx.c
@@ -56,69 +56,7 @@ static bool lp_load_for_s4_ctx(const char *filename)
return status;
}
-/* These are in the order that they appear in the s4 loadparm file.
- * All of the s4 loadparm functions should be here eventually, once
- * they are implemented in the s3 loadparm, have the same format (enum
- * values in particular) and defaults. */
-static const struct loadparm_s3_helpers s3_fns =
-{
- .get_parametric = lp_parm_const_string_service,
- .get_parm_struct = lp_get_parameter,
- .get_parm_ptr = lp_parm_ptr,
- .get_service = lp_service_for_s4_ctx,
- .get_servicebynum = lp_servicebynum_for_s4_ctx,
- .get_default_loadparm_service = lp_default_loadparm_service,
- .get_numservices = lp_numservices,
- .load = lp_load_for_s4_ctx,
- .set_cmdline = lp_set_cmdline,
- .dump = lp_dump,
-
- ._server_role = lp__server_role,
- ._security = lp__security,
- ._domain_master = lp__domain_master,
- ._domain_logons = lp__domain_logons,
-
- .winbind_separator = lp_winbind_separator,
- .template_homedir = lp_template_homedir,
- .template_shell = lp_template_shell,
-
- .dos_charset = lp_dos_charset,
- .unix_charset = lp_unix_charset,
-
- .realm = lp_realm,
- .dnsdomain = lp_dnsdomain,
- .socket_options = lp_socket_options,
- .workgroup = lp_workgroup,
-
- .netbios_name = lp_netbios_name,
- .netbios_scope = lp_netbios_scope,
- .netbios_aliases = lp_netbios_aliases,
-
- .lanman_auth = lp_lanman_auth,
- .ntlm_auth = lp_ntlm_auth,
-
- .client_plaintext_auth = lp_client_plaintext_auth,
- .client_lanman_auth = lp_client_lanman_auth,
- .client_ntlmv2_auth = lp_client_ntlmv2_auth,
- .client_use_spnego_principal = lp_client_use_spnego_principal,
-
- .private_dir = lp_private_dir,
- .ncalrpc_dir = lp_ncalrpc_dir,
- .lockdir = lp_lockdir,
-
- .passdb_backend = lp_passdb_backend,
-
- .host_msdfs = lp_host_msdfs,
- .unix_extensions = lp_unix_extensions,
- .use_spnego = lp_use_spnego,
- .use_mmap = lp_use_mmap,
- .use_ntdb = lp_use_ntdb,
-
- .srv_minprotocol = lp_srv_minprotocol,
- .srv_maxprotocol = lp_srv_maxprotocol,
-
- .passwordserver = lp_passwordserver
-};
+#include "loadparm_ctx_table.c"
const struct loadparm_s3_helpers *loadparm_s3_helpers(void)
{
diff --git a/source3/param/wscript_build b/source3/param/wscript_build
index 643c27eac47..673cb4d049b 100644
--- a/source3/param/wscript_build
+++ b/source3/param/wscript_build
@@ -18,6 +18,11 @@ bld.SAMBA_GENERATOR('s3_param_proto_h',
target='param_proto.h',
rule='${PERL} ${SRC[0].abspath(env)} ${SRC[1].abspath(env)} ${SRC[2].abspath(env)} --file ${TGT}')
+bld.SAMBA_GENERATOR('s3_loadparm_ctx_table_c',
+ source= ' ../../script/mks3param_ctx_table.pl ../../lib/param/loadparm.c ../../lib/param/param_functions.c',
+ target='loadparm_ctx_table.c',
+ rule='${PERL} ${SRC[0].abspath(env)} ${SRC[1].abspath(env)} ${SRC[2].abspath(env)} --file ${TGT}')
+
bld.SAMBA3_PYTHON('pys3param',
source='pyparam.c',
deps='param',