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