From 033dc776de81b9674735f1ac0ed4085503068e60 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 14 Oct 2013 15:46:43 +1300 Subject: param: Autogenerate s3 lp_ctx glue table This allows us to use more lpcfg_ functions without adding them manually. Signed-off-by: Andrew Bartlett Reviewed-by: Stefan Metzmacher --- lib/param/wscript_build | 1 + script/mks3param_ctx_table.pl | 139 ++++++++++++++++++++++++++++++++++++++++++ source3/param/loadparm_ctx.c | 64 +------------------ source3/param/wscript_build | 5 ++ 4 files changed, 146 insertions(+), 63 deletions(-) create mode 100644 script/mks3param_ctx_table.pl diff --git a/lib/param/wscript_build b/lib/param/wscript_build index 10e05a3072..0e1a2e04f3 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 0000000000..cfd6e029da --- /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) = ; + 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 = ) { + 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 63ead53ac1..5cbc920529 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 643c27eac4..673cb4d049 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', -- cgit