s3/param: Autogenerate parameters prototypes again after proto.h was frozen
authorAndrew Bartlett <abartlet@samba.org>
Mon, 14 Oct 2013 02:39:10 +0000 (15:39 +1300)
committerStefan Metzmacher <metze@samba.org>
Wed, 16 Oct 2013 07:31:01 +0000 (09:31 +0200)
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>
script/mks3param_proto.pl [new file with mode: 0644]
source3/include/proto.h
source3/param/wscript_build

diff --git a/script/mks3param_proto.pl b/script/mks3param_proto.pl
new file mode 100644 (file)
index 0000000..446e343
--- /dev/null
@@ -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);
index 9612a07f664f9f2e9e6b9f03a3a7134f45cfcbbf..db6063c7f61b1f1f5c90a529cd447bc4931c0f9f 100644 (file)
@@ -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);
index 278d5f5d5f047c3d22fc7cfa93f2d68e0664b237..643c27eac47bdffa751f8c81ea0f17b706bf8518 100644 (file)
@@ -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',