1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-22 13:34:15 +03:00
samba-mirror/script/mks3param_ctx_table.pl

140 lines
3.3 KiB
Perl
Raw Normal View History

#!/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);