#!/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->("\t.$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);