summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2011-06-20 15:48:12 +1000
committerAndrew Bartlett <abartlet@samba.org>2011-06-21 04:41:54 +0200
commit233a6223b2ff84dcd965d0f295fbe88ba50ce5c5 (patch)
tree3526bdacdf595fc2dcde8bd9cae73ac69e4eecbf
parent79b1a1092dbbb45bb8839c71e48479d1c6037b48 (diff)
downloadsamba-233a6223b2ff84dcd965d0f295fbe88ba50ce5c5.tar.gz
samba-233a6223b2ff84dcd965d0f295fbe88ba50ce5c5.tar.bz2
samba-233a6223b2ff84dcd965d0f295fbe88ba50ce5c5.zip
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
-rw-r--r--source4/param/loadparm.c177
-rw-r--r--source4/param/wscript_build10
-rw-r--r--source4/script/mkparamdefs.pl192
3 files changed, 226 insertions, 153 deletions
diff --git a/source4/param/loadparm.c b/source4/param/loadparm.c
index 61cb9797a4..67a782ded0 100644
--- a/source4/param/loadparm.c
+++ b/source4/param/loadparm.c
@@ -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))
diff --git a/source4/param/wscript_build b/source4/param/wscript_build
index 98e838133e..da10565c6c 100644
--- a/source4/param/wscript_build
+++ b/source4/param/wscript_build
@@ -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',
diff --git a/source4/script/mkparamdefs.pl b/source4/script/mkparamdefs.pl
new file mode 100644
index 0000000000..9b255a86fc
--- /dev/null
+++ b/source4/script/mkparamdefs.pl
@@ -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);
+