[SCM] Samba Shared Repository - branch v3-3-test updated - release-3-2-0pre2-4363-g1ec66e9

Günther Deschner gd at samba.org
Thu Nov 13 11:45:08 GMT 2008


The branch, v3-3-test has been updated
       via  1ec66e9db4b8b8c928d48aa3aa5c1cf618c722c1 (commit)
      from  a9f2609e6f89945c5b05f50efc58618e27cd96f1 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-3-test


- Log -----------------------------------------------------------------
commit 1ec66e9db4b8b8c928d48aa3aa5c1cf618c722c1
Author: Bo Yang <boyang at suse.de>
Date:   Thu Oct 30 13:02:41 2008 +0800

    i18n/l10n pam_winbind

-----------------------------------------------------------------------

Summary of changes:
 source/Makefile.in               |   29 +++++++--
 source/configure.in              |    3 +-
 source/include/localedir.h       |    6 ++
 source/locale/pam_winbind/genmsg |   25 ++++++++
 source/localedir.c               |    3 +
 source/m4/check_path.m4          |   19 ++++++
 source/nsswitch/pam_winbind.c    |  119 ++++++++++++++++++++++----------------
 source/nsswitch/pam_winbind.h    |   15 +++++-
 source/script/installmo.sh       |   83 ++++++++++++++++++++++++++
 source/script/uninstallmo.sh     |    1 +
 10 files changed, 245 insertions(+), 58 deletions(-)
 create mode 100644 source/include/localedir.h
 create mode 100755 source/locale/pam_winbind/genmsg
 create mode 100644 source/localedir.c
 create mode 100644 source/script/installmo.sh
 create mode 120000 source/script/uninstallmo.sh


Changeset truncated at 500 lines:

diff --git a/source/Makefile.in b/source/Makefile.in
index ac03204..9df43e6 100644
--- a/source/Makefile.in
+++ b/source/Makefile.in
@@ -137,6 +137,9 @@ PRIVATE_DIR = $(PRIVATEDIR)
 # This is where SWAT images and help files go
 SWATDIR = @swatdir@
 
+# This is where locale(mo) files go
+LOCALEDIR= @localedir@
+
 # the directory where lock files go
 LOCKDIR = @lockdir@
 
@@ -174,7 +177,8 @@ PATH_FLAGS = -DSMB_PASSWD_FILE=\"$(SMB_PASSWD_FILE)\" \
 	-DCONFIGDIR=\"$(CONFIGDIR)\" \
 	-DCODEPAGEDIR=\"$(CODEPAGEDIR)\" \
 	-DCACHEDIR=\"$(CACHEDIR)\" \
-	-DSTATEDIR=\"$(STATEDIR)\"
+	-DSTATEDIR=\"$(STATEDIR)\" \
+	-DLOCALEDIR=\"$(LOCALEDIR)\"
 
 # Note that all executable programs now provide for an optional executable suffix.
 
@@ -780,7 +784,7 @@ RPCCLIENT_OBJ = $(RPCCLIENT_OBJ1) \
 	     $(LIBADS_OBJ) $(POPT_LIB_OBJ) \
 	     $(SMBLDAP_OBJ) $(DCUTIL_OBJ) $(LDB_OBJ) 
 
-PAM_WINBIND_OBJ = nsswitch/pam_winbind.o $(WBCOMMON_OBJ) \
+PAM_WINBIND_OBJ = nsswitch/pam_winbind.o localedir.o $(WBCOMMON_OBJ) \
 		  $(LIBREPLACE_OBJ) @BUILD_INIPARSER@
 
 LIBSMBCLIENT_OBJ0 = \
@@ -1276,6 +1280,13 @@ dynconfig.o: dynconfig.c Makefile
 		echo "$(COMPILE_CC_PATH)" 1>&2;\
 		$(COMPILE_CC_PATH) >/dev/null 2>&1
 
+localedir.o: localedir.c Makefile
+	@echo Compiling $*.c
+	@$(COMPILE_CC_PATH) && exit 0;\
+		echo "The following command failed:" 1>&2;\
+		echo "$(COMPILE_CC_PATH)" 1>&2;\
+		$(COMPILE_CC_PATH) >/dev/null 2>&1
+
 lib/pidfile.o: lib/pidfile.c
 	@echo Compiling $*.c
 	@$(COMPILE_CC_PATH) && exit 0;\
@@ -2508,7 +2519,7 @@ bin/rpc_open_tcp at EXEEXT@: $(BINARY_PREREQS) $(RPC_OPEN_TCP_OBJ) @LIBTALLOC_SHARE
 
 install:: installservers installbin @INSTALL_CIFSMOUNT@ @INSTALL_CIFSUPCALL@ installman \
 		installscripts installdat installmodules @SWAT_INSTALL_TARGETS@ \
-		@INSTALL_PAM_MODULES@ installlibs
+		@INSTALL_PAM_MODULES@ installlibs installmo
 
 install-everything:: install installmodules
 
@@ -2521,7 +2532,7 @@ install-everything:: install installmodules
 # is not used
 
 installdirs::
-	@$(SHELL) $(srcdir)/script/installdirs.sh $(INSTALLPERMS_BIN) $(DESTDIR) $(prefix) $(BINDIR) $(SBINDIR) $(LIBDIR) $(VARDIR) $(PRIVATEDIR) $(PIDDIR) $(LOCKDIR) $(MANDIR) $(CODEPAGEDIR) $(MODULESDIR)
+	@$(SHELL) $(srcdir)/script/installdirs.sh $(INSTALLPERMS_BIN) $(DESTDIR) $(prefix) $(BINDIR) $(SBINDIR) $(LIBDIR) $(VARDIR) $(PRIVATEDIR) $(PIDDIR) $(LOCKDIR) $(MANDIR) $(CODEPAGEDIR) $(MODULESDIR) $(LOCALEDIR)
 
 installservers:: all installdirs
 	@$(SHELL) script/installbin.sh $(INSTALLPERMS_BIN) $(DESTDIR) $(prefix) $(SBINDIR) $(SBIN_PROGS)
@@ -2587,6 +2598,9 @@ revert::
 installman:: installdirs
 	@$(SHELL) $(srcdir)/script/installman.sh $(DESTDIR)$(MANDIR) $(srcdir) C "@ROFF@"
 
+installmo:: all installdirs
+	@$(SHELL) $(srcdir)/script/installmo.sh $(DESTDIR) $(LOCALEDIR) $(srcdir)
+
 .PHONY: showlayout
 
 showlayout::
@@ -2606,7 +2620,10 @@ showlayout::
 	@echo "  codepagedir: $(CODEPAGEDIR)"
 
 
-uninstall:: uninstallman uninstallservers uninstallbin @UNINSTALL_CIFSMOUNT@ @UNINSTALL_CIFSUPCALL@ uninstallscripts uninstalldat uninstallswat uninstallmodules uninstalllibs @UNINSTALL_PAM_MODULES@
+uninstall:: uninstallmo uninstallman uninstallservers uninstallbin @UNINSTALL_CIFSMOUNT@ @UNINSTALL_CIFSUPCALL@ uninstallscripts uninstalldat uninstallswat uninstallmodules uninstalllibs @UNINSTALL_PAM_MODULES@
+
+uninstallmo::
+	@$(SHELL) $(srcdir)/script/uninstallmo.sh $(DESTDIR) $(LOCALEDIR) $(srcdir)
 
 uninstallman::
 	@$(SHELL) $(srcdir)/script/uninstallman.sh $(DESTDIR)$(MANDIR) $(srcdir) C
@@ -2651,7 +2668,7 @@ uninstallpammodules::
 	done
 
 # Toplevel clean files
-TOPFILES=dynconfig.o
+TOPFILES=dynconfig.o localedir.o
 
 clean:: cleanlibs
 	-rm -f include/build_env.h
diff --git a/source/configure.in b/source/configure.in
index 95ddb67..1665e0e 100644
--- a/source/configure.in
+++ b/source/configure.in
@@ -662,7 +662,7 @@ LIBS="${LIBS} ${LIBDL} ${LIBREPLACE_NETWORK_LIBS}"
 
 AC_CHECK_HEADERS(aio.h sys/fcntl.h sys/select.h fcntl.h sys/time.h sys/unistd.h rpc/nettype.h)
 AC_CHECK_HEADERS(unistd.h utime.h grp.h sys/id.h memory.h alloca.h)
-AC_CHECK_HEADERS(limits.h float.h pthread.h)
+AC_CHECK_HEADERS(limits.h float.h pthread.h libintl.h)
 AC_CHECK_HEADERS(rpc/rpc.h rpcsvc/nis.h rpcsvc/ypclnt.h)
 AC_CHECK_HEADERS(sys/param.h ctype.h sys/wait.h sys/resource.h sys/ioctl.h sys/ipc.h sys/prctl.h)
 AC_CHECK_HEADERS(sys/mman.h sys/filio.h sys/priv.h sys/shm.h string.h strings.h stdlib.h)
@@ -1055,6 +1055,7 @@ AC_CHECK_FUNCS(memalign posix_memalign hstrerror)
 AC_CHECK_HEADERS(sys/mman.h)
 # setbuffer, shmget, shm_open are needed for smbtorture
 AC_CHECK_FUNCS(setbuffer shmget shm_open)
+AC_CHECK_FUNCS(gettext dgettext)
 
 # Find a method of generating a stack trace
 AC_CHECK_HEADERS(execinfo.h libexc.h libunwind.h)
diff --git a/source/include/localedir.h b/source/include/localedir.h
new file mode 100644
index 0000000..2a291d3
--- /dev/null
+++ b/source/include/localedir.h
@@ -0,0 +1,6 @@
+#ifndef __LOCALEDIR_H__
+#define __LOCALEDIR_H__
+
+extern const char *dyn_LOCALEDIR;
+
+#endif
diff --git a/source/locale/pam_winbind/genmsg b/source/locale/pam_winbind/genmsg
new file mode 100755
index 0000000..5aa258a
--- /dev/null
+++ b/source/locale/pam_winbind/genmsg
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+FILES="../../nsswitch/pam_winbind.c ../../nsswitch/pam_winbind.h"
+LANGS="af ar bg bn bs ca cs cy da de el en_GB en_US es et fi fr gl gu he hi hr hu id it ja ka km ko lo lt mk mr nb nl pa pl pt_BR pt ro ru si sk sl sr sv ta th tr uk vi wa xh zh_CN zh_TW zu"
+
+XGETTEXT=xgettext
+MSGMERGE=msgmerge
+
+WIDTH=256
+
+$XGETTEXT --default-domain="pam_winbind" \
+	--add-comments \
+	--keyword=_ --keyword=N_ \
+	--width=${WIDTH} \
+	${FILES}
+
+for lang in ${LANGS}; do
+	echo -n $lang
+	touch ${lang}.po
+	mv ${lang}.po ${lang}.po.old
+	${MSGMERGE} --width=${WIDTH} ${lang}.po.old pam_winbind.po -o ${lang}.po
+	rm -fr ${lang}.po.old
+done
+
+rm -fr pam_winbind.po
diff --git a/source/localedir.c b/source/localedir.c
new file mode 100644
index 0000000..20f6921
--- /dev/null
+++ b/source/localedir.c
@@ -0,0 +1,3 @@
+#include "localedir.h"
+
+const char *dyn_LOCALEDIR = LOCALEDIR;
diff --git a/source/m4/check_path.m4 b/source/m4/check_path.m4
index 7aa8c21..59771b0 100644
--- a/source/m4/check_path.m4
+++ b/source/m4/check_path.m4
@@ -29,6 +29,7 @@ swatdir="\${prefix}/swat"
 codepagedir="\${MODULESDIR}"
 statedir="\${LOCKDIR}"
 cachedir="\${LOCKDIR}"
+localedir="\${prefix}/share/locale"
 
 AC_ARG_WITH(fhs,
 [AS_HELP_STRING([--with-fhs],[Use FHS-compliant paths (default=no)])],
@@ -224,6 +225,23 @@ AC_ARG_WITH(mandir,
     ;;
   esac])
 
+################################################
+# set locale directory location
+AC_ARG_WITH(localedir,
+[  --with-localedir=DIR    Where to put po files ($ac_default_prefix/share/locale)],
+[ case "$withval" in
+  yes|no)
+    #
+    # Just in case anybody does it
+    #
+    AC_MSG_WARN([--with-localedir called without argument - will use default])
+  ;;
+  *)
+  localedir="$withval"
+  ;;
+  esac])
+
+
 AC_SUBST(configdir)
 AC_SUBST(lockdir)
 AC_SUBST(piddir)
@@ -239,6 +257,7 @@ AC_SUBST(cachedir)
 AC_SUBST(rootsbindir)
 AC_SUBST(pammodulesdir)
 AC_SUBST(modulesdir)
+AC_SUBST(localedir)
 
 #################################################
 # set prefix for 'make test'
diff --git a/source/nsswitch/pam_winbind.c b/source/nsswitch/pam_winbind.c
index 5593114..17e8c95 100644
--- a/source/nsswitch/pam_winbind.c
+++ b/source/nsswitch/pam_winbind.c
@@ -111,6 +111,21 @@ static const char *_pam_error_code_str(int err)
 
 #define MAX_PASSWD_TRIES	3
 
+#ifdef HAVE_GETTEXT
+static char initialized = 0;
+
+static inline void textdomain_init(void);
+static inline void textdomain_init(void)
+{
+	if (!initialized) {
+		bindtextdomain(MODULE_NAME, dyn_LOCALEDIR);
+		initialized = 1;
+	}
+	return;
+}
+#endif
+
+
 /*
  * Work around the pam API that has functions with void ** as parameters
  * These lead to strict aliasing warnings with gcc.
@@ -469,6 +484,10 @@ static int _pam_winbind_init_context(pam_handle_t *pamh,
 {
 	struct pwb_context *r = NULL;
 
+#ifdef HAVE_GETTEXT
+	textdomain_init();
+#endif
+
 	r = (struct pwb_context *)malloc(sizeof(struct pwb_context));
 	if (!r) {
 		return PAM_BUF_ERR;
@@ -511,44 +530,44 @@ static const struct ntstatus_errors {
 	const char *error_string;
 } ntstatus_errors[] = {
 	{"NT_STATUS_OK",
-		"Success"},
+		N_("Success")},
 	{"NT_STATUS_BACKUP_CONTROLLER",
-		"No primary Domain Controler available"},
+		N_("No primary Domain Controler available")},
 	{"NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND",
-		"No domain controllers found"},
+		N_("No domain controllers found")},
 	{"NT_STATUS_NO_LOGON_SERVERS",
-		"No logon servers"},
+		N_("No logon servers")},
 	{"NT_STATUS_PWD_TOO_SHORT",
-		"Password too short"},
+		N_("Password too short")},
 	{"NT_STATUS_PWD_TOO_RECENT",
-		"The password of this user is too recent to change"},
+		N_("The password of this user is too recent to change")},
 	{"NT_STATUS_PWD_HISTORY_CONFLICT",
-		"Password is already in password history"},
+		N_("Password is already in password history")},
 	{"NT_STATUS_PASSWORD_EXPIRED",
-		"Your password has expired"},
+		N_("Your password has expired")},
 	{"NT_STATUS_PASSWORD_MUST_CHANGE",
-		"You need to change your password now"},
+		N_("You need to change your password now")},
 	{"NT_STATUS_INVALID_WORKSTATION",
-		"You are not allowed to logon from this workstation"},
+		N_("You are not allowed to logon from this workstation")},
 	{"NT_STATUS_INVALID_LOGON_HOURS",
-		"You are not allowed to logon at this time"},
+		N_("You are not allowed to logon at this time")},
 	{"NT_STATUS_ACCOUNT_EXPIRED",
 		"Your account has expired. "
-		"Please contact your System administrator"}, /* SCNR */
+		N_("Please contact your System administrator")}, /* SCNR */
 	{"NT_STATUS_ACCOUNT_DISABLED",
 		"Your account is disabled. "
-		"Please contact your System administrator"}, /* SCNR */
+		N_("Please contact your System administrator")}, /* SCNR */
 	{"NT_STATUS_ACCOUNT_LOCKED_OUT",
 		"Your account has been locked. "
-		"Please contact your System administrator"}, /* SCNR */
+		N_("Please contact your System administrator")}, /* SCNR */
 	{"NT_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT",
-		"Invalid Trust Account"},
+		N_("Invalid Trust Account")},
 	{"NT_STATUS_NOLOGON_SERVER_TRUST_ACCOUNT",
-		"Invalid Trust Account"},
+		N_("Invalid Trust Account")},
 	{"NT_STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT",
-		"Invalid Trust Account"},
+		N_("Invalid Trust Account")},
 	{"NT_STATUS_ACCESS_DENIED",
-		"Access is denied"},
+		N_("Access is denied")},
 	{NULL, NULL}
 };
 
@@ -558,7 +577,7 @@ static const char *_get_ntstatus_error_string(const char *nt_status_string)
 	for (i=0; ntstatus_errors[i].ntstatus_string != NULL; i++) {
 		if (!strcasecmp(ntstatus_errors[i].ntstatus_string,
 				nt_status_string)) {
-			return ntstatus_errors[i].error_string;
+			return _(ntstatus_errors[i].error_string);
 		}
 	}
 	return NULL;
@@ -823,14 +842,14 @@ static bool _pam_send_password_expiry_message(struct pwb_context *ctx,
 
 	if (days == 0) {
 		_make_remark(ctx, PAM_TEXT_INFO,
-			     "Your password expires today");
+			     _("Your password expires today"));
 		return true;
 	}
 
 	if (days > 0 && days < warn_pwd_expire) {
 		_make_remark_format(ctx, PAM_TEXT_INFO,
-				    "Your password will expire in %d %s",
-				    days, (days > 1) ? "days":"day");
+				    _("Your password will expire in %d %s"),
+				    days, (days > 1) ? _("days"):_("day"));
 		return true;
 	}
 
@@ -1171,9 +1190,9 @@ static void _pam_warn_logon_type(struct pwb_context *ctx,
 	if (PAM_WB_GRACE_LOGON(info3_user_flgs)) {
 
 		_make_remark(ctx, PAM_ERROR_MSG,
-			     "Grace login. "
-			     "Please change your password as soon you're "
-			     "online again");
+			     _("Grace login. "
+			       "Please change your password as soon you're "
+			       "online again"));
 		_pam_log_debug(ctx, LOG_DEBUG,
 			       "User %s logged on using grace logon\n",
 			       username);
@@ -1181,9 +1200,9 @@ static void _pam_warn_logon_type(struct pwb_context *ctx,
 	} else if (PAM_WB_CACHED_LOGON(info3_user_flgs)) {
 
 		_make_remark(ctx, PAM_ERROR_MSG,
-			     "Domain Controller unreachable, "
-			     "using cached credentials instead. "
-			     "Network resources may be unavailable");
+			     _("Domain Controller unreachable, "
+			       "using cached credentials instead. "
+			       "Network resources may be unavailable"));
 		_pam_log_debug(ctx, LOG_DEBUG,
 			       "User %s logged on using cached credentials\n",
 			       username);
@@ -1206,10 +1225,10 @@ static void _pam_warn_krb5_failure(struct pwb_context *ctx,
 {
 	if (PAM_WB_KRB5_CLOCK_SKEW(info3_user_flgs)) {
 		_make_remark(ctx, PAM_ERROR_MSG,
-			     "Failed to establish your Kerberos Ticket cache "
-			     "due time differences\n"
-			     "with the domain controller.  "
-			     "Please verify the system time.\n");
+			     _("Failed to establish your Kerberos Ticket cache "
+			       "due time differences\n"
+			       "with the domain controller.  "
+			       "Please verify the system time.\n"));
 		_pam_log_debug(ctx, LOG_DEBUG,
 			       "User %s: Clock skew when getting Krb5 TGT\n",
 			       username);
@@ -1236,14 +1255,14 @@ static char *_pam_compose_pwd_restriction_string(struct winbindd_response *respo
 
 	memset(str, '\0', str_size);
 
-	offset = snprintf(str, str_size, "Your password ");
+	offset = snprintf(str, str_size, _("Your password "));
 	if (offset == -1) {
 		goto failed;
 	}
 
 	if (response->data.auth.policy.min_length_password > 0) {
 		ret = snprintf(str+offset, str_size-offset,
-			       "must be at least %d characters; ",
+			       _("must be at least %d characters; "),
 			       response->data.auth.policy.min_length_password);
 		if (ret == -1) {
 			goto failed;
@@ -1253,8 +1272,8 @@ static char *_pam_compose_pwd_restriction_string(struct winbindd_response *respo
 
 	if (response->data.auth.policy.password_history > 0) {
 		ret = snprintf(str+offset, str_size-offset,
-			       "cannot repeat any of your previous %d "
-			       "passwords; ",
+			       _("cannot repeat any of your previous %d "
+			         "passwords; "),
 			       response->data.auth.policy.password_history);
 		if (ret == -1) {
 			goto failed;
@@ -1265,10 +1284,10 @@ static char *_pam_compose_pwd_restriction_string(struct winbindd_response *respo
 	if (response->data.auth.policy.password_properties &
 	    DOMAIN_PASSWORD_COMPLEX) {
 		ret = snprintf(str+offset, str_size-offset,
-			       "must contain capitals, numerals "
-			       "or punctuation; "
-			       "and cannot contain your account "
-			       "or full name; ");
+			       _("must contain capitals, numerals "
+			         "or punctuation; "
+			         "and cannot contain your account "
+			         "or full name; "));
 		if (ret == -1) {
 			goto failed;
 		}
@@ -1276,9 +1295,9 @@ static char *_pam_compose_pwd_restriction_string(struct winbindd_response *respo
 	}
 
 	ret = snprintf(str+offset, str_size-offset,
-		       "Please type a different password. "
-		       "Type a password which meets these requirements in "
-		       "both text boxes.");
+		       _("Please type a different password. "
+		         "Type a password which meets these requirements in "
+		         "both text boxes."));
 	if (ret == -1) {
 		goto failed;
 	}
@@ -1578,8 +1597,8 @@ static int winbind_chauthtok_request(struct pwb_context *ctx,
 				break;
 			case SAMR_REJECT_COMPLEXITY:
 				_make_remark(ctx, PAM_ERROR_MSG,
-					     "Password does not meet "
-					     "complexity requirements");
+					     _("Password does not meet "
+					       "complexity requirements"));
 				break;
 			default:
 				_pam_log_debug(ctx, LOG_DEBUG,
@@ -2092,7 +2111,7 @@ int pam_sm_authenticate(pam_handle_t *pamh, int flags,
 	}
 
 	retval = _winbind_read_password(ctx, ctx->ctrl, NULL,
-					"Password: ", NULL,
+					_("Password: "), NULL,
 					&password);
 
 	if (retval != PAM_SUCCESS) {
@@ -2567,7 +2586,7 @@ int pam_sm_chauthtok(pam_handle_t * pamh, int flags,
 		time_t pwdlastset_prelim = 0;
 
 		/* instruct user what is happening */
-#define greeting "Changing password for "
+#define greeting _("Changing password for ")
 		Announce = (char *) malloc(sizeof(greeting) + strlen(user));
 		if (Announce == NULL) {
 			_pam_log(ctx, LOG_CRIT,
@@ -2582,7 +2601,7 @@ int pam_sm_chauthtok(pam_handle_t * pamh, int flags,
 		lctrl = ctx->ctrl | WINBIND__OLD_PASSWORD;
 		ret = _winbind_read_password(ctx, lctrl,
 						Announce,
-						"(current) NT password: ",
+						_("(current) NT password: "),
 						NULL,
 						(const char **) &pass_old);
 		if (ret != PAM_SUCCESS) {
@@ -2650,8 +2669,8 @@ int pam_sm_chauthtok(pam_handle_t * pamh, int flags,
 
 			ret = _winbind_read_password(ctx, lctrl,
 						     NULL,
-						     "Enter new NT password: ",
-						     "Retype new NT password: ",
+						     _("Enter new NT password: "),
+						     _("Retype new NT password: "),
 						     (const char **)&pass_new);
 
 			if (ret != PAM_SUCCESS) {
diff --git a/source/nsswitch/pam_winbind.h b/source/nsswitch/pam_winbind.h
index c8c1910..e99c8ab 100644
--- a/source/nsswitch/pam_winbind.h
+++ b/source/nsswitch/pam_winbind.h
@@ -7,6 +7,7 @@
 #include "lib/replace/replace.h"
 #include "system/syslog.h"
 #include "system/time.h"
+#include "localedir.h"
 
 #define MODULE_NAME "pam_winbind"
 #define PAM_SM_AUTH
@@ -20,6 +21,10 @@
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list