1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-27 22:50:26 +03:00

s4-param Autogenerate the loadparm_globals and loadparm_service tables

This makes it much easier and less error prone to add new parameters
as we merge the s3 and s4 loadparm systems.

Andrew Bartlett

Autobuild-User: Andrew Bartlett <abartlet@samba.org>
Autobuild-Date: Tue Jun 21 04:41:54 CEST 2011 on sn-devel-104
This commit is contained in:
Andrew Bartlett 2011-06-20 15:48:12 +10:00
parent 79b1a1092d
commit 233a6223b2
3 changed files with 226 additions and 153 deletions

View File

@ -75,161 +75,32 @@
static bool do_parameter(const char *, const char *, void *);
static bool defaults_saved = false;
/**
* This structure describes global (ie., server-wide) parameters.
*/
struct loadparm_global
{
enum server_role server_role;
const char **smb_ports;
char *ncalrpc_dir;
char *dos_charset;
char *unix_charset;
char *display_charset;
char *szLockDir;
char *szPidDir;
char *szServerString;
char *szAutoServices;
char *szPasswdChat;
char *szShareBackend;
char *szSPOOLSS_URL;
char *szWINS_CONFIG_URL;
char *szWINS_URL;
char *szPrivateDir;
const char **szPasswordServers;
char *szSocketOptions;
char *szRealm;
char *szRealm_upper;
char *szRealm_lower;
const char **szWINSservers;
const char **szInterfaces;
char *szSocketAddress;
char *szAnnounceVersion; /* This is initialised in init_globals */
char *szWorkgroup;
char *szNetbiosName;
const char **szNetbiosAliases;
char *szNetbiosScope;
char *szDomainOtherSIDs;
const char **szNameResolveOrder;
const char **dcerpc_ep_servers;
const char **server_services;
char *ntptr_providor;
char *szWinbindSeparator;
char *szWinbinddPrivilegedSocketDirectory;
char *szWinbinddSocketDirectory;
char *szTemplateShell;
char *szTemplateHomedir;
int bWinbindSealedPipes;
int bIdmapTrustedOnly;
int tls_enabled;
char *tls_keyfile;
char *tls_certfile;
char *tls_cafile;
char *tls_crlfile;
char *tls_dhpfile;
char *logfile;
char *loglevel;
char *panic_action;
int max_mux;
int debuglevel;
int max_xmit;
int pwordlevel;
int srv_maxprotocol;
int srv_minprotocol;
int cli_maxprotocol;
int cli_minprotocol;
int security;
int paranoid_server_security;
int max_wins_ttl;
int min_wins_ttl;
int announce_as; /* This is initialised in init_globals */
int nbt_port;
int dgram_port;
int cldap_port;
int krb5_port;
int kpasswd_port;
int web_port;
char *socket_options;
int bWINSsupport;
int bWINSdnsProxy;
char *szWINSHook;
int bLocalMaster;
int bPreferredMaster;
int bEncryptPasswords;
int bNullPasswords;
int bObeyPamRestrictions;
int bLargeReadwrite;
int bReadRaw;
int bWriteRaw;
int bTimeServer;
int bBindInterfacesOnly;
int bNTSmbSupport;
int bNTStatusSupport;
int bLanmanAuth;
int bNTLMAuth;
int bUseSpnego;
int server_signing;
int client_signing;
int bClientPlaintextAuth;
int bClientLanManAuth;
int bClientNTLMv2Auth;
int client_use_spnego_principal;
int bHostMSDfs;
int bUnicode;
int bUnixExtensions;
int bDisableNetbios;
int bRpcBigEndian;
char *szNTPSignDSocketDirectory;
const char **szRNDCCommand;
const char **szDNSUpdateCommand;
const char **szSPNUpdateCommand;
const char **szNSUpdateCommand;
struct parmlist_entry *param_opt;
};
/**
* This structure describes a single service.
*/
struct loadparm_service
{
char *szService;
char *szPath;
char *szCopy;
char *szInclude;
char *szPrintername;
char **szHostsallow;
char **szHostsdeny;
char *comment;
char *volume;
char *fstype;
char **ntvfs_handler;
int iMaxPrintJobs;
int iMaxConnections;
int iCSCPolicy;
int bAvailable;
int bBrowseable;
int bRead_only;
int bPrint_ok;
int bMap_system;
int bMap_hidden;
int bMap_archive;
int bStrictLocking;
int bOplocks;
int iCreate_mask;
int iCreate_force_mode;
int iDir_mask;
int iDir_force_mode;
int *copymap;
int bMSDfsRoot;
int bStrictSync;
int bCIFileSystem;
struct parmlist_entry *param_opt;
#define LOADPARM_EXTRA_GLOBALS \
struct parmlist_entry *param_opt; \
char *szRealm; \
char *tls_keyfile; \
char *tls_certfile; \
char *tls_cafile; \
char *tls_crlfile; \
char *tls_dhpfile; \
char *loglevel; \
char *panic_action; \
int bPreferredMaster; \
char *szAnnounceVersion; /* This is initialised in init_globals */
#define LOADPARM_EXTRA_LOCALS \
struct parmlist_entry *param_opt; \
char *szService; \
char *szCopy; \
char *szInclude; \
char *szPrintername; \
int bAvailable; \
int iMaxPrintJobs; \
char *volume; \
int *copymap; \
char dummy[3]; /* for alignment */
};
#include "param_global.h"
#include "param_local.h"
#define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))

View File

@ -5,6 +5,16 @@ bld.SAMBA_GENERATOR('s3_param_h',
target='s3_param.h',
rule='${PERL} ${SRC[1].abspath(env)} ${SRC[0].abspath(env)} --file ${TGT}')
bld.SAMBA_GENERATOR('param_local_h',
source= 'loadparm.c ../script/mkparamdefs.pl',
target='param_local.h',
rule='${PERL} ${SRC[1].abspath(env)} ${SRC[0].abspath(env)} --file ${TGT} --generate-scope=LOCAL')
bld.SAMBA_GENERATOR('param_global_h',
source= 'loadparm.c ../script/mkparamdefs.pl',
target='param_global.h',
rule='${PERL} ${SRC[1].abspath(env)} ${SRC[0].abspath(env)} --file ${TGT} --generate-scope=GLOBAL')
bld.SAMBA_LIBRARY('samba-hostconfig',
source='loadparm.c generic.c util.c',
pc_files='samba-hostconfig.pc',

View File

@ -0,0 +1,192 @@
#!/usr/bin/perl
# Generate loadparm tables for loadparm.c
# 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 = ".";
my $generate_scope = undef;
sub public($)
{
my ($d) = @_;
$$public_data .= $d;
}
sub usage()
{
print "Usage: mkparamdefs.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 " --generate-scope=[GLOBAL|LOCAL] Filter which definitions to generate\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; },
'generate-scope=s' => sub { my ($f,$v) = @_; $generate_scope = $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_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,$generate_scope) = @_;
$file->("#ifndef $header_name\n");
$file->("#define $header_name\n\n");
$file->("/* This file was automatically generated by mkparmdefs.pl. DO NOT EDIT */\n\n");
$file->("/**\n");
if ($generate_scope eq "GLOBAL") {
$file->(" * This structure describes global (ie., server-wide) parameters.\n");
$file->(" */\n");
$file->("struct loadparm_global \n");
} elsif ($generate_scope eq "LOCAL") {
$file->(" * This structure describes a single service.\n");
$file->(" */\n");
$file->("struct loadparm_service \n");
}
$file->("{\n");
}
sub print_footer($$$)
{
my ($file, $header_name, $generate_scope) = @_;
$file->("LOADPARM_EXTRA_" . $generate_scope . "S\n");
$file->("};\n");
$file->("\n#endif /* $header_name */\n\n");
}
sub handle_loadparm($$$)
{
my ($file,$line,$generate_scope) = @_;
if ($line =~ /^FN_(GLOBAL|LOCAL)_(CONST_STRING|STRING|BOOL|bool|CHAR|INTEGER|LIST)\((\w+),(.*)\)/o) {
my $scope = $1;
my $type = $2;
my $name = $3;
my $var = $4;
my %tmap = (
"BOOL" => "int ",
"CONST_STRING" => "char *",
"STRING" => "char *",
"INTEGER" => "int ",
"CHAR" => "char ",
"LIST" => "const char **",
);
if ($scope eq $generate_scope) {
$file->("\t$tmap{$type} $var;\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, $generate_scope);
}
next;
}
close(FH);
}
print_header(\&public, $public_define, $generate_scope);
process_file(\&public, $_) foreach (@ARGV);
print_footer(\&public, $public_define, $generate_scope);
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);