1--- a/source3/Makefile.in
2+++ b/source3/Makefile.in
3@@ -73,22 +73,22 @@ LDAP_LIBS=@LDAP_LIBS@
4 NSCD_LIBS=@NSCD_LIBS@
5 UUID_LIBS=@UUID_LIBS@
6 LIBWBCLIENT=@LIBWBCLIENT_STATIC@ @LIBWBCLIENT_SHARED@
7-LIBWBCLIENT_LIBS=@LIBWBCLIENT_LIBS@
8+LIBWBCLIENT_LIBS=@LIBWBCLIENT_STATIC@
9 PTHREAD_LDFLAGS=@PTHREAD_LDFLAGS@
10 PTHREAD_CFLAGS=@PTHREAD_CFLAGS@
11 DNSSD_LIBS=@DNSSD_LIBS@
12 AVAHI_LIBS=@AVAHI_LIBS@
13 POPT_LIBS=@POPTLIBS@
14 LIBTALLOC=@LIBTALLOC_STATIC@ @LIBTALLOC_SHARED@
15-LIBTALLOC_LIBS=@LIBTALLOC_LIBS@
16+LIBTALLOC_LIBS=@LIBTALLOC_STATIC@
17 LIBTEVENT=@LIBTEVENT_STATIC@ @LIBTEVENT_SHARED@
18 LIBTEVENT_LIBS=@LIBTEVENT_LIBS@
19 LIBREPLACE_LIBS=@LIBREPLACE_LIBS@
20 LIBTDB=@LIBTDB_STATIC@ @LIBTDB_SHARED@
21-LIBTDB_LIBS=@LIBTDB_LIBS@
22+LIBTDB_LIBS=@LIBTDB_STATIC@
23 TDB_DEPS=@TDB_DEPS@
24 LIBNETAPI=@LIBNETAPI_STATIC@ @LIBNETAPI_SHARED@
25-LIBNETAPI_LIBS=@LIBNETAPI_LIBS@
26+LIBNETAPI_LIBS=@LIBNETAPI_STATIC@
27 LIBSMBCLIENT_LIBS=@LIBSMBCLIENT_LIBS@
28 LIBSMBSHAREMODES_LIBS=@LIBSMBSHAREMODES_LIBS@
29 
30@@ -216,7 +216,7 @@ PATH_FLAGS = -DSMB_PASSWD_FILE=\"$(SMB_P
31 
32 # Note that all executable programs now provide for an optional executable suffix.
33 
34-SBIN_PROGS = bin/smbd@EXEEXT@ bin/nmbd@EXEEXT@ @SWAT_SBIN_TARGETS@ @EXTRA_SBIN_PROGS@
35+SBIN_PROGS = bin/samba_multicall@EXEEXT@ bin/smbd@EXEEXT@ bin/nmbd@EXEEXT@ @SWAT_SBIN_TARGETS@ @EXTRA_SBIN_PROGS@
36 
37 BIN_PROGS1 = bin/smbclient@EXEEXT@ bin/net@EXEEXT@ bin/smbspool@EXEEXT@ \
38 	bin/testparm@EXEEXT@ bin/smbstatus@EXEEXT@ bin/smbget@EXEEXT@ \
39@@ -1799,6 +1799,42 @@ bin/.dummy:
40 	  dir=bin $(MAKEDIR); fi
41 	@: >> $@ || : > $@ # what a fancy emoticon!
42 
43+smbd/server_multicall.o: smbd/server.c smbd/server.o
44+	@echo Compiling $<.c
45+	@$(COMPILE_CC_PATH) -Dmain=smbd_main && exit 0;\
46+		echo "The following command failed:" 1>&2;\
47+		echo "$(COMPILE_CC_PATH)" 1>&2;\
48+		$(COMPILE_CC_PATH) >/dev/null 2>&1
49+
50+nmbd/nmbd_multicall.o: nmbd/nmbd.c nmbd/nmbd.o
51+	@echo Compiling $<.c
52+	@$(COMPILE_CC_PATH) -Dmain=nmbd_main && exit 0;\
53+		echo "The following command failed:" 1>&2;\
54+		echo "$(COMPILE_CC_PATH)" 1>&2;\
55+		$(COMPILE_CC_PATH) >/dev/null 2>&1
56+
57+utils/smbpasswd_multicall.o: utils/smbpasswd.c utils/smbpasswd.o
58+	@echo Compiling $<.c
59+	@$(COMPILE_CC_PATH) -Dmain=smbpasswd_main && exit 0;\
60+		echo "The following command failed:" 1>&2;\
61+		echo "$(COMPILE_CC_PATH)" 1>&2;\
62+		$(COMPILE_CC_PATH) >/dev/null 2>&1
63+
64+SMBD_MULTI_O = $(patsubst smbd/server.o,smbd/server_multicall.o,$(SMBD_OBJ))
65+NMBD_MULTI_O = $(patsubst nmbd/nmbd.o,nmbd/nmbd_multicall.o,$(filter-out $(LIB_DUMMY_OBJ),$(NMBD_OBJ)))
66+SMBPASSWD_MULTI_O = $(patsubst utils/smbpasswd.o,utils/smbpasswd_multicall.o,$(filter-out $(LIB_DUMMY_OBJ),$(SMBPASSWD_OBJ)))
67+MULTI_O = multi.o
68+
69+MULTICALL_O = $(sort $(SMBD_MULTI_O) $(NMBD_MULTI_O) $(SMBPASSWD_MULTI_O) $(MULTI_O))
70+
71+bin/samba_multicall@EXEEXT@: $(BINARY_PREREQS) $(MULTICALL_O) $(LIBTALLOC) $(LIBTDB) $(LIBWBCLIENT) @BUILD_POPT@
72+	@echo Linking $@
73+	@$(CC) -o $@ $(MULTICALL_O) $(LDFLAGS) $(LDAP_LIBS) @SMBD_FAM_LIBS@ \
74+		$(KRB5LIBS) $(DYNEXP) $(PRINT_LIBS) $(AUTH_LIBS) \
75+		$(ACL_LIBS) $(PASSDB_LIBS) $(LIBS) $(DNSSD_LIBS) $(AVAHI_LIBS) \
76+		$(POPT_LIBS) @SMBD_LIBS@ $(LIBTALLOC_LIBS) $(LIBTEVENT_LIBS) $(LIBTDB_LIBS) \
77+		$(LIBWBCLIENT_LIBS) $(ZLIB_LIBS)
78+
79 bin/smbd@EXEEXT@: $(BINARY_PREREQS) $(SMBD_OBJ) $(LIBTALLOC) $(LIBTEVENT) $(LIBTDB) $(LIBWBCLIENT) @BUILD_POPT@
80 	@echo Linking $@
81 	@$(CC) -o $@ $(SMBD_OBJ) $(LDFLAGS) $(LDAP_LIBS) @SMBD_FAM_LIBS@ \
82--- /dev/null
83+++ b/source3/multi.c
84@@ -0,0 +1,35 @@
85+#include <stdio.h>
86+#include <string.h>
87+
88+extern int smbd_main(int argc, char **argv);
89+extern int nmbd_main(int argc, char **argv);
90+extern int smbpasswd_main(int argc, char **argv);
91+
92+static struct {
93+	const char *name;
94+	int (*func)(int argc, char **argv);
95+} multicall[] = {
96+	{ "smbd", smbd_main },
97+	{ "nmbd", nmbd_main },
98+	{ "smbpasswd", smbpasswd_main },
99+};
100+
101+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
102+
103+int main(int argc, char **argv)
104+{
105+	int i;
106+
107+	for (i = 0; i < ARRAY_SIZE(multicall); i++) {
108+		if (strstr(argv[0], multicall[i].name))
109+			return multicall[i].func(argc, argv);
110+	}
111+
112+	fprintf(stderr, "Invalid multicall command, available commands:");
113+	for (i = 0; i < ARRAY_SIZE(multicall); i++)
114+		fprintf(stderr, " %s", multicall[i].name);
115+
116+	fprintf(stderr, "\n");
117+
118+	return 1;
119+}
120