s4-param Autogenerate the loadparm_globals and loadparm_service tables
authorAndrew Bartlett <abartlet@samba.org>
Mon, 20 Jun 2011 05:48:12 +0000 (15:48 +1000)
committerAndrew Bartlett <abartlet@samba.org>
Tue, 21 Jun 2011 02:41:54 +0000 (04:41 +0200)
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

source4/param/loadparm.c
source4/param/wscript_build
source4/script/mkparamdefs.pl [new file with mode: 0644]

index 61cb9797a448e72388260dfd6f8c997f422b2a8a..67a782ded02d35fb6dd22bbe369e25060255a605 100644 (file)
 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))
 
index 98e838133e62df28a17eb09acb730c3a7dc8b6a4..da10565c6c8a854e33ac11549ca63b0ffea51c16 100644 (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',
diff --git a/source4/script/mkparamdefs.pl b/source4/script/mkparamdefs.pl
new file mode 100644 (file)
index 0000000..9b255a8
--- /dev/null
@@ -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);
+