summaryrefslogtreecommitdiff
path: root/script/mks3param_ctx_table.pl
blob: 22efc88ca631f1bf713d7eb3b489a54dfb8082cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
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->("\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 = <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);