summaryrefslogtreecommitdiff
path: root/script/mks3param_ctx_table.pl
diff options
context:
space:
mode:
Diffstat (limited to 'script/mks3param_ctx_table.pl')
-rw-r--r--script/mks3param_ctx_table.pl139
1 files changed, 139 insertions, 0 deletions
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) = <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);