diff options
author | Alexey Dokuchaev <danfe@FreeBSD.org> | 2005-03-20 09:29:05 +0000 |
---|---|---|
committer | Alexey Dokuchaev <danfe@FreeBSD.org> | 2005-03-20 09:29:05 +0000 |
commit | 8f5d0f33d7992b40fdb069f46a75144c3a55586d (patch) | |
tree | 43a8dd51d6c30076bdd5282926379f97d45155e7 /net/samba3 | |
parent | 52b647504aecdb73ee4360b557372bccdbae6d1d (diff) | |
download | ports-8f5d0f33d7992b40fdb069f46a75144c3a55586d.tar.gz ports-8f5d0f33d7992b40fdb069f46a75144c3a55586d.zip |
Notes
Diffstat (limited to 'net/samba3')
-rw-r--r-- | net/samba3/Makefile | 19 | ||||
-rw-r--r-- | net/samba3/distinfo | 4 | ||||
-rw-r--r-- | net/samba3/files/patch-configure.in | 37 | ||||
-rw-r--r-- | net/samba3/files/patch-lib_system.c | 306 | ||||
-rw-r--r-- | net/samba3/files/patch-utils_net_time.c | 19 | ||||
-rw-r--r-- | net/samba3/pkg-message | 8 | ||||
-rw-r--r-- | net/samba3/pkg-plist | 6 |
7 files changed, 363 insertions, 36 deletions
diff --git a/net/samba3/Makefile b/net/samba3/Makefile index 3c23e4204806..febbe9088b80 100644 --- a/net/samba3/Makefile +++ b/net/samba3/Makefile @@ -6,7 +6,7 @@ # PORTNAME= samba -PORTVERSION?= 3.0.11 +PORTVERSION?= 3.0.12 PORTREVISION?= 0 PORTEPOCH?= 1 CATEGORIES?= net @@ -59,9 +59,16 @@ CONFIGURE_ARGS+= --exec-prefix=${PREFIX} \ CONFIGURE_ARGS+= --with-libiconv=${LOCALBASE} .if !defined(SAMBA_SUBPORT) -OPTIONS= LDAP "With LDAP support" on \ - ADS "With Active Directory support" on \ - CUPS "With CUPS printing support" on \ + +OPTIONS= LDAP "With LDAP support" on +.if defined(PACKAGE_BUILDING) +# Kerberos5 setup is very box specific, we don't +# want artificial dependencies in the packages +OPTIONS+= ADS "With Active Directory support" off +.else +OPTIONS+= ADS "With Active Directory support" on +.endif +OPTIONS+= CUPS "With CUPS printing support" on \ WINBIND "With WinBIND support" on \ ACL_SUPPORT "With ACL support" off \ SYSLOG "With Syslog support" off \ @@ -293,8 +300,8 @@ post-patch: @${RM} -rf ${WRKDIR}/${DISTNAME}/examples/libsmbclient @${RM} -rf ${WRKDIR}/${DISTNAME}/swat/lang @${FIND} ${WRKSRC} -name CVS -o -name .cvsignore | ${XARGS} ${RM} - @${FIND} ${WRKDIR}/${DISTNAME} -type d | ${XARGS} ${CHMOD} 0755 - @${FIND} ${WRKDIR}/${DISTNAME}/examples -type f | ${XARGS} ${CHMOD} 0644 + @${FIND} ${WRKDIR}/${DISTNAME} -type d | ${XARGS} ${CHMOD} u+w,a+rx + @${FIND} ${WRKDIR}/${DISTNAME} -type f | ${XARGS} ${CHMOD} u+w,a+r pre-install: -@${FIND} ${SAMBA_LIBDIR} -type f 2>/dev/null | ${SORT} | ${SED} -e 's|^${PREFIX}||; s|^/||' >> ${WRKDIR}/.PLIST.exclude diff --git a/net/samba3/distinfo b/net/samba3/distinfo index 0e018f3c3ccf..267e1be389ff 100644 --- a/net/samba3/distinfo +++ b/net/samba3/distinfo @@ -1,2 +1,2 @@ -MD5 (samba-3.0.11.tar.gz) = 217e489646a474b4fb69d5802c14bc6e -SIZE (samba-3.0.11.tar.gz) = 15372539 +MD5 (samba-3.0.12.tar.gz) = 5c31e5d115ba08b30d1541983d30e2dc +SIZE (samba-3.0.12.tar.gz) = 15576905 diff --git a/net/samba3/files/patch-configure.in b/net/samba3/files/patch-configure.in index acf85135f9f5..368939ca41bc 100644 --- a/net/samba3/files/patch-configure.in +++ b/net/samba3/files/patch-configure.in @@ -1,6 +1,6 @@ ---- configure.in.orig Tue Nov 16 04:03:30 2004 -+++ configure.in Fri Nov 26 02:04:59 2004 -@@ -691,7 +691,9 @@ +--- configure.in.orig Fri Mar 11 14:47:05 2005 ++++ configure.in Sun Mar 20 01:24:25 2005 +@@ -724,7 +724,9 @@ AC_CHECK_HEADERS(nss.h nss_common.h nsswitch.h ns_api.h sys/security.h security/pam_appl.h) AC_CHECK_HEADERS(stropts.h poll.h) AC_CHECK_HEADERS(sys/capability.h syscall.h sys/syscall.h) @@ -11,29 +11,22 @@ # These faile to compile on Solaris so just check for their presence AC_CHECK_HEADERS(security/pam_modules.h net/if.h netinet/ip.h, [], [], -) -@@ -829,6 +831,13 @@ - AC_DEFINE(HAVE_SIG_ATOMIC_T_TYPE,1,[Whether we have the atomic_t variable type]) - fi - -+AC_CACHE_CHECK([for optreset], samba_cv_var_optreset, [ -+ AC_TRY_LINK([#include <unistd.h>],[optreset = 1], -+ [samba_cv_var_optreset=yes],[samba_cv_var_optreset=no])]) -+if test x"$samba_cv_var_optreset" = x"yes"; then -+ AC_DEFINE(HAVE_OPTRESET,1,[Whether the system has optreset]) -+fi -+ - # stupid headers have the functions but no declaration. grrrr. - AC_HAVE_DECL(errno, [#include <errno.h>]) - AC_HAVE_DECL(setresuid, [#include <unistd.h>]) -@@ -1125,6 +1134,11 @@ +@@ -1159,6 +1161,18 @@ AC_CHECK_FUNCS(setxattr lsetxattr fsetxattr) AC_CHECK_FUNCS(attr_get attr_list attr_set attr_remove) AC_CHECK_FUNCS(attr_getf attr_listf attr_setf attr_removef) +# Check if we have extattr -+AC_CHECK_FUNCS(extattr_delete_fd extattr_delete_file extattr_delete_link) -+AC_CHECK_FUNCS(extattr_get_fd extattr_get_file extattr_get_link) -+AC_CHECK_FUNCS(extattr_list_fd extattr_list_file extattr_list_link) -+AC_CHECK_FUNCS(extattr_set_fd extattr_set_file extattr_set_link) ++case "$host_os" in ++ *freebsd4* | *DragonFly* ) ++ AC_DEFINE(BROKEN_EXTATTR, 1, [Does extattr API work]) ++ ;; ++ *) ++ AC_CHECK_FUNCS(extattr_delete_fd extattr_delete_file extattr_delete_link) ++ AC_CHECK_FUNCS(extattr_get_fd extattr_get_file extattr_get_link) ++ AC_CHECK_FUNCS(extattr_list_fd extattr_list_file extattr_list_link) ++ AC_CHECK_FUNCS(extattr_set_fd extattr_set_file extattr_set_link) ++ ;; ++esac # Assume non-shared by default and override below BLDSHARED="false" diff --git a/net/samba3/files/patch-lib_system.c b/net/samba3/files/patch-lib_system.c new file mode 100644 index 000000000000..f67b92a915e8 --- /dev/null +++ b/net/samba3/files/patch-lib_system.c @@ -0,0 +1,306 @@ +--- lib/system.c.orig Fri Feb 25 18:59:32 2005 ++++ lib/system.c Fri Mar 4 02:04:45 2005 +@@ -1373,10 +1373,17 @@ + { + #if defined(HAVE_GETXATTR) + return getxattr(path, name, value, size); ++#elif defined(HAVE_EXTATTR_GET_FILE) ++ char *s; ++ int attrnamespace = (strncmp(name, "system", 6) == 0) ? ++ EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER; ++ const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1; ++ ++ return extattr_get_file(path, attrnamespace, attrname, value, size); + #elif defined(HAVE_ATTR_GET) + int retval, flags = 0; + int valuelength = (int)size; +- char *attrname = strchr(name,'.') +1; ++ char *attrname = strchr(name,'.') + 1; + + if (strncmp(name, "system", 6) == 0) flags |= ATTR_ROOT; + +@@ -1393,10 +1400,17 @@ + { + #if defined(HAVE_LGETXATTR) + return lgetxattr(path, name, value, size); ++#elif defined(HAVE_EXTATTR_GET_LINK) ++ char *s; ++ int attrnamespace = (strncmp(name, "system", 6) == 0) ? ++ EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER; ++ const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1; ++ ++ return extattr_get_link(path, attrnamespace, attrname, value, size); + #elif defined(HAVE_ATTR_GET) + int retval, flags = ATTR_DONTFOLLOW; + int valuelength = (int)size; +- char *attrname = strchr(name,'.') +1; ++ char *attrname = strchr(name,'.') + 1; + + if (strncmp(name, "system", 6) == 0) flags |= ATTR_ROOT; + +@@ -1413,10 +1427,17 @@ + { + #if defined(HAVE_FGETXATTR) + return fgetxattr(filedes, name, value, size); ++#elif defined(HAVE_EXTATTR_GET_FD) ++ char *s; ++ int attrnamespace = (strncmp(name, "system", 6) == 0) ? ++ EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER; ++ const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1; ++ ++ return extattr_get_fd(filedes, attrnamespace, attrname, value, size); + #elif defined(HAVE_ATTR_GETF) + int retval, flags = 0; + int valuelength = (int)size; +- char *attrname = strchr(name,'.') +1; ++ char *attrname = strchr(name,'.') + 1; + + if (strncmp(name, "system", 6) == 0) flags |= ATTR_ROOT; + +@@ -1429,6 +1450,99 @@ + #endif + } + ++#if defined(HAVE_EXTATTR_LIST_FILE) ++ ++#define EXTATTR_PREFIX(s) (s), (sizeof((s))-1) ++ ++static struct { ++ int space; ++ const char *name; ++ size_t len; ++} ++extattr[] = { ++ { EXTATTR_NAMESPACE_SYSTEM, EXTATTR_PREFIX("system.") }, ++ { EXTATTR_NAMESPACE_USER, EXTATTR_PREFIX("user.") }, ++}; ++ ++typedef union { ++ const char *path; ++ int filedes; ++} extattr_arg; ++ ++static ssize_t bsd_attr_list (int type, extattr_arg arg, char *list, size_t size) ++{ ++ ssize_t list_size, total_size = 0; ++ int i, t, len; ++ char *buf; ++ /* Iterate through extattr(2) namespaces */ ++ for(t = 0; t < (sizeof(extattr)/sizeof(extattr[0])); t++) { ++ switch(type) { ++#if defined(HAVE_EXTATTR_LIST_FILE) ++ case 0: ++ list_size = extattr_list_file(arg.path, extattr[t].space, list, size); ++ break; ++#endif ++#if defined(HAVE_EXTATTR_LIST_LINK) ++ case 1: ++ list_size = extattr_list_link(arg.path, extattr[t].space, list, size); ++ break; ++#endif ++#if defined(HAVE_EXTATTR_LIST_FD) ++ case 2: ++ list_size = extattr_list_fd(arg.filedes, extattr[t].space, list, size); ++ break; ++#endif ++ default: ++ errno = ENOSYS; ++ return -1; ++ } ++ /* Some error happend. Errno should be set by the previous call */ ++ if(list_size < 0) ++ return -1; ++ /* No attributes */ ++ if(list_size == 0) ++ continue; ++ /* XXX: Call with an empty buffer may be used to calculate ++ necessary buffer size. Unfortunately, we can't say, how ++ many attributes were returned, so here is the potential ++ problem with the emulation. ++ */ ++ if(list == NULL) { ++ /* Take the worse case of one char attribute names - ++ two bytes per name plus one more for sanity. ++ */ ++ total_size += list_size + (list_size/2 + 1)*extattr[t].len; ++ continue; ++ } ++ /* Count necessary offset to fit namespace prefixes */ ++ len = 0; ++ for(i = 0; i < list_size; i += list[i] + 1) ++ len += extattr[t].len; ++ ++ total_size += list_size + len; ++ /* Buffer is too small to fit the results */ ++ if(total_size > size) { ++ errno = ERANGE; ++ return -1; ++ } ++ /* Shift the results back, so we can prepend prefixes */ ++ buf = memmove(list + len, list, list_size); ++ ++ for(i = 0; i < list_size; i += len + 1) { ++ len = buf[i]; ++ strncpy(list, extattr[t].name, extattr[t].len + 1); ++ list += extattr[t].len; ++ strncpy(list, buf + i + 1, len); ++ list[len] = '\0'; ++ list += len + 1; ++ } ++ size -= total_size; ++ } ++ return total_size; ++} ++ ++#endif ++ + #if defined(HAVE_ATTR_LIST) && defined(HAVE_SYS_ATTRIBUTES_H) + static char attr_buffer[ATTR_MAX_VALUELEN]; + +@@ -1501,6 +1615,10 @@ + { + #if defined(HAVE_LISTXATTR) + return listxattr(path, list, size); ++#elif defined(HAVE_EXTATTR_LIST_FILE) ++ extattr_arg arg; ++ arg.path = path; ++ return bsd_attr_list(0, arg, list, size); + #elif defined(HAVE_ATTR_LIST) && defined(HAVE_SYS_ATTRIBUTES_H) + return irix_attr_list(path, 0, list, size, 0); + #else +@@ -1513,6 +1631,10 @@ + { + #if defined(HAVE_LLISTXATTR) + return llistxattr(path, list, size); ++#elif defined(HAVE_EXTATTR_LIST_LINK) ++ extattr_arg arg; ++ arg.path = path; ++ return bsd_attr_list(1, arg, list, size); + #elif defined(HAVE_ATTR_LIST) && defined(HAVE_SYS_ATTRIBUTES_H) + return irix_attr_list(path, 0, list, size, ATTR_DONTFOLLOW); + #else +@@ -1525,6 +1647,10 @@ + { + #if defined(HAVE_FLISTXATTR) + return flistxattr(filedes, list, size); ++#elif defined(HAVE_EXTATTR_LIST_FD) ++ extattr_arg arg; ++ arg.filedes = filedes; ++ return bsd_attr_list(2, arg, list, size); + #elif defined(HAVE_ATTR_LISTF) + return irix_attr_list(NULL, filedes, list, size, 0); + #else +@@ -1537,9 +1663,16 @@ + { + #if defined(HAVE_REMOVEXATTR) + return removexattr(path, name); ++#elif defined(HAVE_EXTATTR_DELETE_FILE) ++ char *s; ++ int attrnamespace = (strncmp(name, "system", 6) == 0) ? ++ EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER; ++ const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1; ++ ++ return extattr_delete_file(path, attrnamespace, attrname); + #elif defined(HAVE_ATTR_REMOVE) + int flags = 0; +- char *attrname = strchr(name,'.') +1; ++ char *attrname = strchr(name,'.') + 1; + + if (strncmp(name, "system", 6) == 0) flags |= ATTR_ROOT; + +@@ -1554,9 +1687,16 @@ + { + #if defined(HAVE_LREMOVEXATTR) + return lremovexattr(path, name); ++#elif defined(HAVE_EXTATTR_DELETE_LINK) ++ char *s; ++ int attrnamespace = (strncmp(name, "system", 6) == 0) ? ++ EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER; ++ const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1; ++ ++ return extattr_delete_link(path, attrnamespace, attrname); + #elif defined(HAVE_ATTR_REMOVE) + int flags = ATTR_DONTFOLLOW; +- char *attrname = strchr(name,'.') +1; ++ char *attrname = strchr(name,'.') + 1; + + if (strncmp(name, "system", 6) == 0) flags |= ATTR_ROOT; + +@@ -1571,9 +1711,16 @@ + { + #if defined(HAVE_FREMOVEXATTR) + return fremovexattr(filedes, name); ++#elif defined(HAVE_EXTATTR_DELETE_FD) ++ char *s; ++ int attrnamespace = (strncmp(name, "system", 6) == 0) ? ++ EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER; ++ const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1; ++ ++ return extattr_delete_fd(filedes, attrnamespace, attrname); + #elif defined(HAVE_ATTR_REMOVEF) + int flags = 0; +- char *attrname = strchr(name,'.') +1; ++ char *attrname = strchr(name,'.') + 1; + + if (strncmp(name, "system", 6) == 0) flags |= ATTR_ROOT; + +@@ -1593,9 +1740,18 @@ + { + #if defined(HAVE_SETXATTR) + return setxattr(path, name, value, size, flags); ++#elif defined(HAVE_EXTATTR_SET_FILE) ++ char *s; ++ int retval = 0; ++ int attrnamespace = (strncmp(name, "system", 6) == 0) ? ++ EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER; ++ const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1; ++ ++ retval = extattr_set_file(path, attrnamespace, attrname, value, size); ++ return (retval < 0) ? -1 : 0; + #elif defined(HAVE_ATTR_SET) + int myflags = 0; +- char *attrname = strchr(name,'.') +1; ++ char *attrname = strchr(name,'.') + 1; + + if (strncmp(name, "system", 6) == 0) myflags |= ATTR_ROOT; + if (flags & XATTR_CREATE) myflags |= ATTR_CREATE; +@@ -1612,9 +1768,18 @@ + { + #if defined(HAVE_LSETXATTR) + return lsetxattr(path, name, value, size, flags); ++#elif defined(HAVE_EXTATTR_SET_LINK) ++ char *s; ++ int retval = 0; ++ int attrnamespace = (strncmp(name, "system", 6) == 0) ? ++ EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER; ++ const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1; ++ ++ retval = extattr_set_link(path, attrnamespace, attrname, value, size); ++ return (retval < 0) ? -1 : 0; + #elif defined(HAVE_ATTR_SET) + int myflags = ATTR_DONTFOLLOW; +- char *attrname = strchr(name,'.') +1; ++ char *attrname = strchr(name,'.') + 1; + + if (strncmp(name, "system", 6) == 0) myflags |= ATTR_ROOT; + if (flags & XATTR_CREATE) myflags |= ATTR_CREATE; +@@ -1631,9 +1796,18 @@ + { + #if defined(HAVE_FSETXATTR) + return fsetxattr(filedes, name, value, size, flags); ++#elif defined(HAVE_EXTATTR_SET_FD) ++ char *s; ++ int retval = 0; ++ int attrnamespace = (strncmp(name, "system", 6) == 0) ? ++ EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER; ++ const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1; ++ ++ retval = extattr_set_fd(filedes, attrnamespace, attrname, value, size); ++ return (retval < 0) ? -1 : 0; + #elif defined(HAVE_ATTR_SETF) + int myflags = 0; +- char *attrname = strchr(name,'.') +1; ++ char *attrname = strchr(name,'.') + 1; + + if (strncmp(name, "system", 6) == 0) myflags |= ATTR_ROOT; + if (flags & XATTR_CREATE) myflags |= ATTR_CREATE; diff --git a/net/samba3/files/patch-utils_net_time.c b/net/samba3/files/patch-utils_net_time.c new file mode 100644 index 000000000000..7248d85066dc --- /dev/null +++ b/net/samba3/files/patch-utils_net_time.c @@ -0,0 +1,19 @@ +--- utils/net_time.c.orig Fri Feb 25 18:59:42 2005 ++++ utils/net_time.c Sun Mar 20 01:41:20 2005 +@@ -76,9 +76,16 @@ + + tm = localtime(&t); + ++#if defined(FREEBSD) ++ fstr_sprintf(s, "%02d%02d%02d%02d%02d.%02d", ++ tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday, ++ tm->tm_hour,tm->tm_min,tm->tm_sec); ++#else + fstr_sprintf(s, "%02d%02d%02d%02d%04d.%02d", + tm->tm_mon+1, tm->tm_mday, tm->tm_hour, + tm->tm_min, tm->tm_year + 1900, tm->tm_sec); ++#endif /* defined(FREEBSD) */ ++ + return s; + } + diff --git a/net/samba3/pkg-message b/net/samba3/pkg-message index 963462793a9b..47350b7bc8b2 100644 --- a/net/samba3/pkg-message +++ b/net/samba3/pkg-message @@ -1,5 +1,5 @@ -****************************************************************************** -NOTICE: *.tdb files have been moved from /var/run/samba/ to /var/db/samba/! -NOTICE: Please, move them manually, if necessary, at least winbind_*.tdb. -****************************************************************************** +Samba3 package now doesn't include ADS support due the portability problems +with Kerberos5 libraries on different installations. You need to compile port +yourself to get this functionality. + For additional hints and directions, please, look into the README.FreeBSD file. diff --git a/net/samba3/pkg-plist b/net/samba3/pkg-plist index 1095e81ccfb6..2bcd033e93d7 100644 --- a/net/samba3/pkg-plist +++ b/net/samba3/pkg-plist @@ -61,6 +61,8 @@ sbin/swat %%EXAMPLESDIR%%/dce-dfs/README %%EXAMPLESDIR%%/dce-dfs/smb.conf %%EXAMPLESDIR%%/genlogon/genlogon.pl +%%EXAMPLESDIR%%/misc/adssearch.pl +%%EXAMPLESDIR%%/misc/check_multiple_LDAP_entries.pl %%EXAMPLESDIR%%/misc/extra_smbstatus %%EXAMPLESDIR%%/misc/swat.pl %%EXAMPLESDIR%%/misc/wall.perl @@ -238,6 +240,7 @@ share/swat/help/Samba-Guide/index.html share/swat/help/Samba-Guide/ix01.html share/swat/help/Samba-Guide/kerberos.html share/swat/help/Samba-Guide/migration.html +share/swat/help/Samba-Guide/nw4migration.html share/swat/help/Samba-Guide/pr01.html share/swat/help/Samba-Guide/pr02.html share/swat/help/Samba-Guide/pr03.html @@ -335,6 +338,7 @@ share/swat/help/Samba-HOWTO-Collection/install.html share/swat/help/Samba-HOWTO-Collection/integrate-ms-networks.html share/swat/help/Samba-HOWTO-Collection/introduction.html share/swat/help/Samba-HOWTO-Collection/ix01.html +share/swat/help/Samba-HOWTO-Collection/largefile.html share/swat/help/Samba-HOWTO-Collection/locking.html share/swat/help/Samba-HOWTO-Collection/migration.html share/swat/help/Samba-HOWTO-Collection/msdfs.html @@ -577,12 +581,10 @@ share/swat/using_samba/toc.html @dirrm share/swat/using_samba @dirrm share/swat/include @dirrm share/swat/images -@dirrm share/swat/help/images @dirrm share/swat/help/Samba-HOWTO-Collection/images @dirrm share/swat/help/Samba-HOWTO-Collection @dirrm share/swat/help/Samba-Guide/images @dirrm share/swat/help/Samba-Guide -@dirrm share/swat/help/Samba-Developers-Guide/images @dirrm share/swat/help/Samba-Developers-Guide @dirrm share/swat/help @dirrm share/swat |