summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
Diffstat (limited to 'source4')
-rw-r--r--source4/auth/gensec/gensec.c5
-rw-r--r--source4/build/smb_build/config_mk.pm2
-rw-r--r--source4/build/smb_build/smb_build_h.pm31
-rw-r--r--source4/client/client.c4
-rw-r--r--source4/gtk/tools/gepdump.c3
-rw-r--r--source4/gtk/tools/gregedit.c3
-rw-r--r--source4/gtk/tools/gwcrontab.c6
-rw-r--r--source4/gtk/tools/gwsam.c6
-rw-r--r--source4/lib/com/config.mk1
-rw-r--r--source4/lib/com/main.c11
-rw-r--r--source4/lib/ldb/tools/cmdline.c4
-rw-r--r--source4/lib/registry/reg_backend_rpc.c1
-rw-r--r--source4/lib/registry/tools/regdiff.c3
-rw-r--r--source4/lib/registry/tools/regpatch.c3
-rw-r--r--source4/lib/registry/tools/regshell.c3
-rw-r--r--source4/lib/registry/tools/regtree.c3
-rw-r--r--source4/librpc/config.mk9
-rw-r--r--source4/librpc/rpc/dcerpc.c7
-rw-r--r--source4/librpc/tables.pl5
-rw-r--r--source4/rpc_server/remote/dcesrv_remote.c3
-rw-r--r--source4/scripting/ejs/smbcalls_rpc.c2
-rw-r--r--source4/scripting/ejs/smbscript.c4
-rw-r--r--source4/smbd/server.c3
-rw-r--r--source4/torture/com/simple.c2
-rw-r--r--source4/torture/gentest.c4
-rw-r--r--source4/torture/locktest.c4
-rw-r--r--source4/torture/masktest.c4
-rw-r--r--source4/torture/torture.c3
-rw-r--r--source4/utils/ndrdump.c1
-rw-r--r--source4/utils/net/net.c3
-rw-r--r--source4/utils/ntlm_auth.c4
31 files changed, 58 insertions, 89 deletions
diff --git a/source4/auth/gensec/gensec.c b/source4/auth/gensec/gensec.c
index aaac3ef78c..5ff925c078 100644
--- a/source4/auth/gensec/gensec.c
+++ b/source4/auth/gensec/gensec.c
@@ -943,9 +943,14 @@ const struct gensec_critical_sizes *gensec_interface_version(void)
*/
NTSTATUS gensec_init(void)
{
+ static BOOL initialized = False;
+
init_module_fn static_init[] = STATIC_GENSEC_MODULES;
init_module_fn *shared_init = load_samba_modules(NULL, "gensec");
+ if (initialized) return NT_STATUS_OK;
+ initialized = False;
+
run_init_functions(static_init);
run_init_functions(shared_init);
diff --git a/source4/build/smb_build/config_mk.pm b/source4/build/smb_build/config_mk.pm
index 405298eef2..b7c4ff572a 100644
--- a/source4/build/smb_build/config_mk.pm
+++ b/source4/build/smb_build/config_mk.pm
@@ -20,7 +20,6 @@ my $section_types = {
"LDFLAGS" => "list",
},
"SUBSYSTEM" => {
- "INIT_FUNCTION" => "string",
"OBJ_FILES" => "list",
"REQUIRED_SUBSYSTEMS" => "list",
@@ -64,7 +63,6 @@ my $section_types = {
"MINOR_VERSION" => "string",
"RELEASE_VERSION" => "string",
- "INIT_FUNCTION" => "string",
"OBJ_FILES" => "list",
"DESCRIPTION" => "string",
diff --git a/source4/build/smb_build/smb_build_h.pm b/source4/build/smb_build/smb_build_h.pm
index 2bb9f35c53..52fe0da6da 100644
--- a/source4/build/smb_build/smb_build_h.pm
+++ b/source4/build/smb_build/smb_build_h.pm
@@ -24,39 +24,8 @@ sub _prepare_smb_build_h($)
{
my $depend = shift;
my @defines = ();
- my %declared = ();
my $output = "";
- #
- # loop over all binaries
- #
- foreach my $key (values %{$depend}) {
- next if ($key->{TYPE} ne "BINARY");
-
- my $NAME = $key->{NAME};
- my $DEFINE = ();
- my $name = lc($NAME);
-
- #
- # Static modules
- #
- $DEFINE->{COMMENT} = "BINARY $NAME INIT";
- $DEFINE->{KEY} = $name . "_init_subsystems";
- $DEFINE->{VAL} = "do { \\\n";
- foreach my $subkey (@{$key->{SUBSYSTEM_INIT_FUNCTIONS}}) {
- next if defined($declared{$subkey});
- $output .= "NTSTATUS $subkey(void);\n";
- $declared{$subkey} = 1;
- }
-
- foreach my $subkey (@{$key->{SUBSYSTEM_INIT_FUNCTIONS}}) {
- $DEFINE->{VAL} .= "\t\tif (NT_STATUS_IS_ERR($subkey())) exit(1); \\\n";
- }
- $DEFINE->{VAL} .= "\t} while(0)";
-
- push(@defines,$DEFINE);
- }
-
foreach my $key (values %{$depend}) {
my $DEFINE = ();
next if ($key->{TYPE} ne "LIBRARY" and $key->{TYPE} ne "SUBSYSTEM");
diff --git a/source4/client/client.c b/source4/client/client.c
index fef847e8b2..fb07042496 100644
--- a/source4/client/client.c
+++ b/source4/client/client.c
@@ -33,7 +33,7 @@
#include "dlinklist.h"
#include "system/readline.h"
#include "pstring.h"
-#include "smb_build.h"
+#include "auth/gensec/gensec.h"
static struct smbcli_state *cli;
static int port = 0;
@@ -3402,7 +3402,7 @@ static void remember_query_host(const char *arg,
}
}
- smbclient_init_subsystems;
+ gensec_init();
if(poptPeekArg(pc)) {
pstrcpy(service,poptGetArg(pc));
diff --git a/source4/gtk/tools/gepdump.c b/source4/gtk/tools/gepdump.c
index ea77b19385..eab3987a9a 100644
--- a/source4/gtk/tools/gepdump.c
+++ b/source4/gtk/tools/gepdump.c
@@ -24,7 +24,6 @@
#include "librpc/gen_ndr/ndr_mgmt.h"
#include "gtk/common/gtk-smb.h"
#include "auth/gensec/gensec.h"
-#include "smb_build.h"
/*
* Show:
@@ -461,7 +460,7 @@ static GtkWidget* create_mainwindow (void)
int main(int argc, char **argv)
{
- gepdump_init_subsystems;
+ dcerpc_init();
lp_load();
setup_logging(argv[0], DEBUG_STDERR);
diff --git a/source4/gtk/tools/gregedit.c b/source4/gtk/tools/gregedit.c
index 8c243873ca..5dd5ec1a92 100644
--- a/source4/gtk/tools/gregedit.c
+++ b/source4/gtk/tools/gregedit.c
@@ -22,7 +22,6 @@
#include "includes.h"
#include "lib/registry/registry.h"
#include "gtk/common/gtk-smb.h"
-#include "smb_build.h"
static GtkTreeStore *store_keys;
static GtkListStore *store_vals;
@@ -964,8 +963,8 @@ int main(int argc, char *argv[])
{
int ret;
- gregedit_init_subsystems;
registry_init();
+
lp_load();
setup_logging(argv[0], DEBUG_STDERR);
diff --git a/source4/gtk/tools/gwcrontab.c b/source4/gtk/tools/gwcrontab.c
index f294e84392..9ebc7f43fd 100644
--- a/source4/gtk/tools/gwcrontab.c
+++ b/source4/gtk/tools/gwcrontab.c
@@ -22,7 +22,6 @@
#include "includes.h"
#include "librpc/gen_ndr/ndr_atsvc.h"
#include "gtk/common/gtk-smb.h"
-#include "smb_build.h"
static struct dcerpc_pipe *at_pipe = NULL;
static GtkWidget *mainwin;
@@ -489,10 +488,9 @@ static GtkWidget*create_new_job_dialog (void)
}
-
- int main(int argc, char **argv)
+int main(int argc, char **argv)
{
- gwcrontab_init_subsystems;
+ dcerpc_init();
lp_load();
setup_logging(argv[0], DEBUG_STDERR);
diff --git a/source4/gtk/tools/gwsam.c b/source4/gtk/tools/gwsam.c
index 963397810c..3764afe046 100644
--- a/source4/gtk/tools/gwsam.c
+++ b/source4/gtk/tools/gwsam.c
@@ -23,7 +23,6 @@
#include "librpc/gen_ndr/ndr_samr.h"
#include "gtk/common/select.h"
#include "gtk/common/gtk-smb.h"
-#include "smb_build.h"
struct policy_handle sam_handle;
struct dcerpc_pipe *sam_pipe = NULL;
@@ -398,11 +397,8 @@ static GtkWidget* create_mainwindow (void)
return mainwin;
}
-
-
- int main(int argc, char **argv)
+int main(int argc, char **argv)
{
- gwsam_init_subsystems;
lp_load();
setup_logging(argv[0], DEBUG_STDERR);
diff --git a/source4/lib/com/config.mk b/source4/lib/com/config.mk
index 9e66502046..12f0481b0f 100644
--- a/source4/lib/com/config.mk
+++ b/source4/lib/com/config.mk
@@ -1,5 +1,4 @@
[SUBSYSTEM::COM]
-INIT_FUNCTION = com_init
OBJ_FILES = \
tables.o \
rot.o \
diff --git a/source4/lib/com/main.c b/source4/lib/com/main.c
index 123ba49b09..f2e4f6473a 100644
--- a/source4/lib/com/main.c
+++ b/source4/lib/com/main.c
@@ -92,8 +92,15 @@ WERROR com_get_class_object(struct com_context *ctx, struct GUID *clsid, struct
NTSTATUS com_init(void)
{
- init_module_fn static_init[] = STATIC_COM_MODULES;
- init_module_fn *shared_init = load_samba_modules(NULL, "com");
+ static BOOL initialized = False;
+
+ init_module_fn static_init[] = STATIC_COM_MODULES;
+ init_module_fn *shared_init;
+
+ if (initialized) return NT_STATUS_OK;
+ initialized = True;
+
+ shared_init = load_samba_modules(NULL, "com");
run_init_functions(static_init);
run_init_functions(shared_init);
diff --git a/source4/lib/ldb/tools/cmdline.c b/source4/lib/ldb/tools/cmdline.c
index a14434622f..c134c3befd 100644
--- a/source4/lib/ldb/tools/cmdline.c
+++ b/source4/lib/ldb/tools/cmdline.c
@@ -28,7 +28,6 @@
#include "ldb/tools/cmdline.h"
#ifdef _SAMBA_BUILD_
#include "lib/cmdline/popt_common.h"
-#include "smb_build.h"
#include "auth/auth.h"
#endif
@@ -72,7 +71,8 @@ struct ldb_cmdline *ldb_cmdline_process(struct ldb_context *ldb, int argc, const
};
#ifdef _SAMBA_BUILD_
- ldbsearch_init_subsystems;
+ gensec_init();
+
r = ldb_register_samba_handlers(ldb);
if (r != 0) {
goto failed;
diff --git a/source4/lib/registry/reg_backend_rpc.c b/source4/lib/registry/reg_backend_rpc.c
index e799b3a8e4..32ecbec6c6 100644
--- a/source4/lib/registry/reg_backend_rpc.c
+++ b/source4/lib/registry/reg_backend_rpc.c
@@ -389,5 +389,6 @@ WERROR reg_open_remote(struct registry_context **ctx, struct cli_credentials *cr
NTSTATUS registry_rpc_init(void)
{
+ dcerpc_init();
return registry_register(&reg_backend_rpc);
}
diff --git a/source4/lib/registry/tools/regdiff.c b/source4/lib/registry/tools/regdiff.c
index 68cc56f9dd..5b876ca025 100644
--- a/source4/lib/registry/tools/regdiff.c
+++ b/source4/lib/registry/tools/regdiff.c
@@ -22,7 +22,6 @@
#include "includes.h"
#include "lib/registry/registry.h"
#include "lib/cmdline/popt_common.h"
-#include "smb_build.h"
int main(int argc, char **argv)
{
@@ -45,8 +44,6 @@ int main(int argc, char **argv)
POPT_TABLEEND
};
- regdiff_init_subsystems;
-
registry_init();
pc = poptGetContext(argv[0], argc, (const char **) argv, long_options,0);
diff --git a/source4/lib/registry/tools/regpatch.c b/source4/lib/registry/tools/regpatch.c
index b8b8805486..6f5c79bc0e 100644
--- a/source4/lib/registry/tools/regpatch.c
+++ b/source4/lib/registry/tools/regpatch.c
@@ -22,7 +22,6 @@
#include "includes.h"
#include "lib/registry/registry.h"
#include "lib/cmdline/popt_common.h"
-#include "smb_build.h"
int main(int argc, char **argv)
{
@@ -41,8 +40,6 @@ int main(int argc, char **argv)
POPT_TABLEEND
};
- regpatch_init_subsystems;
-
registry_init();
pc = poptGetContext(argv[0], argc, (const char **) argv, long_options,0);
diff --git a/source4/lib/registry/tools/regshell.c b/source4/lib/registry/tools/regshell.c
index c858b37f4a..89493c761e 100644
--- a/source4/lib/registry/tools/regshell.c
+++ b/source4/lib/registry/tools/regshell.c
@@ -23,7 +23,6 @@
#include "lib/registry/registry.h"
#include "lib/cmdline/popt_common.h"
#include "system/time.h"
-#include "smb_build.h"
/*
* ck/cd - change key
@@ -415,8 +414,6 @@ static char **reg_completion(const char *text, int start, int end)
POPT_TABLEEND
};
- regshell_init_subsystems;
-
registry_init();
pc = poptGetContext(argv[0], argc, (const char **) argv, long_options,0);
diff --git a/source4/lib/registry/tools/regtree.c b/source4/lib/registry/tools/regtree.c
index 9a9121379b..d8f5d68a94 100644
--- a/source4/lib/registry/tools/regtree.c
+++ b/source4/lib/registry/tools/regtree.c
@@ -22,7 +22,6 @@
#include "includes.h"
#include "lib/registry/registry.h"
#include "lib/cmdline/popt_common.h"
-#include "smb_build.h"
static void print_tree(int l, struct registry_key *p, int fullpath, int novals)
{
@@ -98,8 +97,6 @@ int main(int argc, char **argv)
POPT_TABLEEND
};
- regtree_init_subsystems;
-
registry_init();
pc = poptGetContext(argv[0], argc, (const char **) argv, long_options,0);
diff --git a/source4/librpc/config.mk b/source4/librpc/config.mk
index 06254a6748..03367bdf17 100644
--- a/source4/librpc/config.mk
+++ b/source4/librpc/config.mk
@@ -302,14 +302,9 @@ librpc/gen_ndr/tables.c: librpc/gen_ndr/ndr_*.h
@$(PERL) librpc/tables.pl --output=librpc/gen_ndr/tables.c \
librpc/gen_ndr/ndr_*.h
-[SUBSYSTEM::NDR_IFACE_TABLE]
-NOPROTO = YES
-OBJ_FILES = gen_ndr/tables.o
-
[SUBSYSTEM::NDR_ALL]
-INIT_FUNCTION = dcerpc_table_init
-OBJ_FILES = rpc/table.o
-REQUIRED_SUBSYSTEMS = NDR_IFACE_TABLE NDR_AUDIOSRV NDR_ECHO NDR_DCERPC NDR_EXCHANGE \
+OBJ_FILES = rpc/table.o gen_ndr/tables.o
+REQUIRED_SUBSYSTEMS = NDR_AUDIOSRV NDR_ECHO NDR_DCERPC NDR_EXCHANGE \
NDR_DSBACKUP NDR_EFS NDR_MISC NDR_LSA NDR_DFS NDR_DRSUAPI \
NDR_POLICYAGENT NDR_UNIXINFO NDR_SAMR NDR_SPOOLSS NDR_WKSSVC NDR_SRVSVC NDR_ATSVC \
NDR_EVENTLOG NDR_EPMAPPER NDR_DBGIDL NDR_DSSETUP NDR_MSGSVC NDR_WINS \
diff --git a/source4/librpc/rpc/dcerpc.c b/source4/librpc/rpc/dcerpc.c
index df71be7651..0269eb9919 100644
--- a/source4/librpc/rpc/dcerpc.c
+++ b/source4/librpc/rpc/dcerpc.c
@@ -29,6 +29,13 @@
#include "libcli/composite/composite.h"
#include "auth/gensec/gensec.h"
+NTSTATUS dcerpc_init(void)
+{
+ gensec_init();
+
+ return NT_STATUS_OK;
+}
+
static void dcerpc_ship_next_request(struct dcerpc_connection *c);
/* destroy a dcerpc connection */
diff --git a/source4/librpc/tables.pl b/source4/librpc/tables.pl
index 5757dc000a..7ef1dbd14a 100644
--- a/source4/librpc/tables.pl
+++ b/source4/librpc/tables.pl
@@ -82,6 +82,11 @@ print TABLEC <<EOF;
NTSTATUS dcerpc_table_init(void)
{
+ static BOOL initialized = False;
+
+ if (initialized) return NT_STATUS_OK;
+ initialized = True;
+
$init_fns
return NT_STATUS_OK;
diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c
index 4cd4b2b507..f7de3031ce 100644
--- a/source4/rpc_server/remote/dcesrv_remote.c
+++ b/source4/rpc_server/remote/dcesrv_remote.c
@@ -309,5 +309,8 @@ NTSTATUS dcerpc_server_remote_init(void)
return ret;
}
+ /* We need the full DCE/RPC interface table */
+ dcerpc_table_init();
+
return ret;
}
diff --git a/source4/scripting/ejs/smbcalls_rpc.c b/source4/scripting/ejs/smbcalls_rpc.c
index dff04a4c40..a104f0eb16 100644
--- a/source4/scripting/ejs/smbcalls_rpc.c
+++ b/source4/scripting/ejs/smbcalls_rpc.c
@@ -367,6 +367,8 @@ done:
*/
int ejs_rpc_init(struct MprVar *obj, const char *name)
{
+ dcerpc_table_init();
+
mprSetStringCFunction(obj, "connect", ejs_rpc_connect);
if (mprGetProperty(obj, "pipe_name", NULL) == NULL) {
mprSetVar(obj, "pipe_name", mprString(name));
diff --git a/source4/scripting/ejs/smbscript.c b/source4/scripting/ejs/smbscript.c
index 0e131e0ba5..20675dadf9 100644
--- a/source4/scripting/ejs/smbscript.c
+++ b/source4/scripting/ejs/smbscript.c
@@ -25,7 +25,7 @@
#include "lib/appweb/ejs/ejs.h"
#include "lib/appweb/ejs/ejsInternal.h"
#include "scripting/ejs/smbcalls.h"
-#include "smb_build.h"
+#include "auth/gensec/gensec.h"
static EjsId eid;
@@ -50,7 +50,7 @@ void ejs_exception(const char *reason)
int exit_status, i;
fault_setup(argv[0]);
- smbscript_init_subsystems;
+ gensec_init();
mprSetCtx(mem_ctx);
lp_load();
diff --git a/source4/smbd/server.c b/source4/smbd/server.c
index e09c993f3c..513fa19c42 100644
--- a/source4/smbd/server.c
+++ b/source4/smbd/server.c
@@ -33,6 +33,7 @@
#include "registry/registry.h"
#include "ntvfs/ntvfs.h"
#include "ntptr/ntptr.h"
+#include "auth/gensec/gensec.h"
/*
recursively delete a directory tree
@@ -217,7 +218,7 @@ static int binary_smbd_main(const char *binary_name, int argc, const char *argv[
exit(1);
}
- smbd_init_subsystems;
+ gensec_init();
registry_init(); /* FIXME: maybe run this in the initialization function
of the winreg RPC server instead? */
diff --git a/source4/torture/com/simple.c b/source4/torture/com/simple.c
index 09061422f5..5d3c6250c4 100644
--- a/source4/torture/com/simple.c
+++ b/source4/torture/com/simple.c
@@ -38,6 +38,8 @@ static BOOL test_readwrite(TALLOC_CTX *mem_ctx, const char *host)
char test_data[5];
int i;
+ com_init();
+
com_init_ctx(&ctx, NULL);
dcom_client_init(ctx, cmdline_credentials);
diff --git a/source4/torture/gentest.c b/source4/torture/gentest.c
index d466671252..a576b57458 100644
--- a/source4/torture/gentest.c
+++ b/source4/torture/gentest.c
@@ -24,7 +24,7 @@
#include "request.h"
#include "libcli/raw/libcliraw.h"
#include "librpc/gen_ndr/ndr_security.h"
-#include "smb_build.h"
+#include "auth/gensec/gensec.h"
#define NSERVERS 2
#define NINSTANCES 2
@@ -2234,7 +2234,7 @@ static void usage(void)
}
}
- gentest_init_subsystems;
+ gensec_init();
if (username_count == 0) {
usage();
diff --git a/source4/torture/locktest.c b/source4/torture/locktest.c
index a94a6f1ec9..be2d3022da 100644
--- a/source4/torture/locktest.c
+++ b/source4/torture/locktest.c
@@ -22,7 +22,7 @@
#include "system/filesys.h"
#include "system/time.h"
#include "pstring.h"
-#include "smb_build.h"
+#include "auth/gensec/gensec.h"
static int numops = 1000;
static BOOL showall;
@@ -550,7 +550,7 @@ static void usage(void)
servers[1] = servers[0];
}
- locktest_init_subsystems;
+ gensec_init();
argc -= optind;
argv += optind;
diff --git a/source4/torture/masktest.c b/source4/torture/masktest.c
index 5e8f973c4c..ca5bdf7c21 100644
--- a/source4/torture/masktest.c
+++ b/source4/torture/masktest.c
@@ -24,7 +24,7 @@
#include "libcli/raw/libcliraw.h"
#include "system/time.h"
#include "pstring.h"
-#include "smb_build.h"
+#include "auth/gensec/gensec.h"
static struct cli_credentials *credentials;
static BOOL showall = False;
@@ -353,7 +353,7 @@ static void usage(void)
}
}
- masktest_init_subsystems;
+ gensec_init();
argc -= optind;
argv += optind;
diff --git a/source4/torture/torture.c b/source4/torture/torture.c
index 149ee78065..82fda0d4ff 100644
--- a/source4/torture/torture.c
+++ b/source4/torture/torture.c
@@ -25,7 +25,6 @@
#include "system/wait.h"
#include "system/filesys.h"
#include "ioctl.h"
-#include "smb_build.h"
int torture_nprocs=4;
int torture_numops=10;
@@ -2609,7 +2608,7 @@ static void max_runtime_handler(int sig)
alarm(max_runtime);
}
- smbtorture_init_subsystems;
+ dcerpc_init();
dcerpc_table_init();
diff --git a/source4/utils/ndrdump.c b/source4/utils/ndrdump.c
index 33bffe77b5..497726279b 100644
--- a/source4/utils/ndrdump.c
+++ b/source4/utils/ndrdump.c
@@ -22,7 +22,6 @@
#include "lib/cmdline/popt_common.h"
#include "system/iconv.h"
#include "system/filesys.h"
-#include "smb_build.h"
static const struct dcerpc_interface_call *find_function(
const struct dcerpc_interface_table *p,
diff --git a/source4/utils/net/net.c b/source4/utils/net/net.c
index 17b12b7103..f82eddb763 100644
--- a/source4/utils/net/net.c
+++ b/source4/utils/net/net.c
@@ -44,7 +44,6 @@
#include "includes.h"
#include "utils/net/net.h"
#include "lib/cmdline/popt_common.h"
-#include "smb_build.h"
/*
run a function from a function table. If not found then
@@ -186,7 +185,7 @@ static int binary_net(int argc, const char **argv)
return net_usage(ctx, argc, argv);
}
- net_init_subsystems;
+ dcerpc_init();
mem_ctx = talloc_init("net_context");
ctx = talloc(mem_ctx, struct net_context);
diff --git a/source4/utils/ntlm_auth.c b/source4/utils/ntlm_auth.c
index ffdbd2f2f6..d6b65d75d7 100644
--- a/source4/utils/ntlm_auth.c
+++ b/source4/utils/ntlm_auth.c
@@ -27,7 +27,6 @@
#include "lib/cmdline/popt_common.h"
#include "auth/auth.h"
#include "pstring.h"
-#include "smb_build.h"
#define SQUID_BUFFER_SIZE 2010
@@ -931,8 +930,7 @@ int main(int argc, const char **argv)
return 1;
}
- ntlm_auth_init_subsystems;
-
+ gensec_init();
if (opt_domain == NULL) {
opt_domain = lp_workgroup();