summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2013-10-14 15:39:10 +1300
committerStefan Metzmacher <metze@samba.org>2013-10-16 09:31:01 +0200
commit651cf893903147cf6d3f1ccb6432c2661cdc36c5 (patch)
tree4c336321c78a1639b10825ef5ec9cc134cf14a53
parent22ca0404fc973a6f716f76e7b4bbfa4656f33ab3 (diff)
downloadsamba-651cf893903147cf6d3f1ccb6432c2661cdc36c5.tar.gz
samba-651cf893903147cf6d3f1ccb6432c2661cdc36c5.tar.bz2
samba-651cf893903147cf6d3f1ccb6432c2661cdc36c5.zip
s3/param: Autogenerate parameters prototypes again after proto.h was frozen
This autogenerates the parameters so that we can keep everything in sync easier, particularly when adding new parameters. This will also make it easier to move to a fully autogenerated system in the future, as it reduces special cases. Andrew Bartlett Signed-off-by: Andrew Bartlett <abartlet@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org>
-rw-r--r--script/mks3param_proto.pl199
-rw-r--r--source3/include/proto.h2
-rw-r--r--source3/param/wscript_build5
3 files changed, 206 insertions, 0 deletions
diff --git a/script/mks3param_proto.pl b/script/mks3param_proto.pl
new file mode 100644
index 0000000000..446e343ec5
--- /dev/null
+++ b/script/mks3param_proto.pl
@@ -0,0 +1,199 @@
+#!/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 normalize_define($$)
+{
+ my ($define, $file) = @_;
+
+ if (not defined($define) and defined($file)) {
+ $define = "__" . uc($file) . "__";
+ $define =~ tr{./}{__};
+ $define =~ tr{\-}{_};
+ } elsif (not defined($define)) {
+ $define = '_S3_PARAM_PROTO_H_';
+ }
+
+ return $define;
+}
+
+$public_define = normalize_define($public_define, $file);
+
+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, $header_name) = @_;
+ $file->("#ifndef $header_name\n");
+ $file->("#define $header_name\n\n");
+ $file->("/* This file was automatically generated by mks3param_proto.pl. DO NOT EDIT */\n\n");
+}
+
+sub print_footer($$)
+{
+ my ($file, $header_name) = @_;
+ $file->("\n#endif /* $header_name */\n\n");
+}
+
+sub handle_loadparm($$)
+{
+ my ($file,$line) = @_;
+
+ my $scope;
+ my $type;
+ my $name;
+ my $var;
+ my $param;
+
+ if ($line =~ /^FN_(GLOBAL|LOCAL)_(CONST_STRING|STRING|BOOL|bool|CHAR|INTEGER|LIST)\((\w+),(.*)\)/o) {
+ $scope = $1;
+ $type = $2;
+ $name = $3;
+ $var = $4;
+ $param = "int";
+ } elsif ($line =~ /^FN_(GLOBAL|LOCAL)_PARM_(CONST_STRING|STRING|BOOL|bool|CHAR|INTEGER|LIST)\((\w+),(.*)\)/o) {
+ $scope = $1;
+ $type = $2;
+ $name = $3;
+ $var = $4;
+ $param = "const struct share_params *p";
+ } else {
+ return;
+ }
+
+ my %tmap = (
+ "BOOL" => "bool ",
+ "CONST_STRING" => "const char *",
+ "STRING" => "char *",
+ "INTEGER" => "int ",
+ "CHAR" => "char ",
+ "LIST" => "const char **",
+ );
+
+ my %smap = (
+ "GLOBAL" => "void",
+ "LOCAL" => "$param"
+ );
+
+ if (($type eq "STRING") and ($scope eq "GLOBAL")) {
+ $file->("$tmap{$type}lp_$name(TALLOC_CTX *ctx);\n");
+ } elsif (($type eq "STRING") and ($scope eq "LOCAL")) {
+ $file->("$tmap{$type}lp_$name(TALLOC_CTX *ctx, $smap{$scope});\n");
+ } else {
+ $file->("$tmap{$type}lp_$name($smap{$scope});\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 =~ /^\/\*\*/) {
+ $comment = "";
+ $incomment = 1;
+ }
+
+ if ($incomment) {
+ $comment .= $line;
+ if ($line =~ /\*\//) {
+ $incomment = 0;
+ }
+ }
+
+ # these are ordered for maximum speed
+ next if ($line =~ /^\s/);
+
+ next unless ($line =~ /\(/);
+
+ next if ($line =~ /^\/|[;]/);
+
+ if ($line =~ /^FN_/) {
+ handle_loadparm($file, $line);
+ }
+ next;
+ }
+
+ close(FH);
+}
+
+
+print_header(\&public, $public_define);
+
+process_file(\&public, $_) foreach (@ARGV);
+print_footer(\&public, $public_define);
+
+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/include/proto.h b/source3/include/proto.h
index 9612a07f66..db6063c7f6 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -984,6 +984,8 @@ NTSTATUS change_trust_account_password( const char *domain, const char *remote_m
/* The following definitions come from param/loadparm.c */
+#include "source3/param/param_proto.h"
+
const char **lp_smb_ports(void);
const char *lp_dos_charset(void);
const char *lp_unix_charset(void);
diff --git a/source3/param/wscript_build b/source3/param/wscript_build
index 278d5f5d5f..643c27eac4 100644
--- a/source3/param/wscript_build
+++ b/source3/param/wscript_build
@@ -13,6 +13,11 @@ bld.SAMBA_GENERATOR('s3_param_global_h',
target='param_global.h',
rule='${PERL} ${SRC[0].abspath(env)} ${SRC[1].abspath(env)} ${SRC[2].abspath(env)} --file ${TGT} --generate-scope=GLOBAL')
+bld.SAMBA_GENERATOR('s3_param_proto_h',
+ source= '../../script/mks3param_proto.pl loadparm.c ../../lib/param/param_functions.c',
+ target='param_proto.h',
+ 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',