summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authordholland <dholland>2012-05-12 21:53:19 +0000
committerdholland <dholland>2012-05-12 21:53:19 +0000
commitf2b332ea5b91df21cb8a3a370a40de049e1329e2 (patch)
treed971c1a2cea5c70a86c2c727bd011d8241a0104c /net
parentabf840177a43edf92da6dfa246a77a570d1a8302 (diff)
downloadpkgsrc-f2b332ea5b91df21cb8a3a370a40de049e1329e2.tar.gz
PR 46072: netatalk broken with netbsd-6 quotas
Add support for the new libquota. Drop support for the proplib libquota; it's not worth the configure-time hassle. Fix some moderately serious bugs in the original/previous libquota patches; it's clear for example they were never tested with group quotas.
Diffstat (limited to 'net')
-rw-r--r--net/netatalk/Makefile13
-rw-r--r--net/netatalk/distinfo8
-rw-r--r--net/netatalk/patches/patch-aa26
-rw-r--r--net/netatalk/patches/patch-etc_afpd_quota_c184
-rw-r--r--net/netatalk/patches/patch-macros_quota-check.m430
5 files changed, 192 insertions, 69 deletions
diff --git a/net/netatalk/Makefile b/net/netatalk/Makefile
index 35d95256ced..036103c9d85 100644
--- a/net/netatalk/Makefile
+++ b/net/netatalk/Makefile
@@ -1,7 +1,7 @@
-# $NetBSD: Makefile,v 1.82 2012/04/17 16:14:54 hauke Exp $
+# $NetBSD: Makefile,v 1.83 2012/05/12 21:53:19 dholland Exp $
DISTNAME= netatalk-2.2.1
-PKGREVISION= 4
+PKGREVISION= 5
CATEGORIES= net print
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=netatalk/}
EXTRACT_SUFX= .tar.bz2
@@ -42,6 +42,7 @@ CONFIGURE_ARGS+= --enable-netbsd
CONFIGURE_ARGS+= --enable-overwrite
CONFIGURE_ARGS+= --enable-timelord
CONFIGURE_ARGS+= --enable-ddp
+CONFIGURE_ARGS+= --enable-quota
CONFIGURE_ARGS+= --libexecdir=${PREFIX}/libexec/netatalk
CONFIGURE_ARGS+= --sbindir=${PREFIX}/libexec/netatalk
CONFIGURE_ARGS+= --with-pkgconfdir=${PKG_SYSCONFDIR}
@@ -51,14 +52,6 @@ CONFIGURE_ARGS+= --with-uams-path=${PREFIX}/libexec/netatalk/uams
CONFIGURE_ARGS+= --with-bdb=${BDBBASE}
CONFIGURE_ARGS+= --with-ssl-dir=${BUILDLINK_PREFIX.openssl}
-# XXX Waiting for NetBSD quota patches
-.if empty(MACHINE_PLATFORM:MNetBSD-5.99.6[2-5]*) && \
- empty(MACHINE_PLATFORM:MNetBSD-[6-9]*)
-CONFIGURE_ARGS+= --enable-quota
-.else
-CONFIGURE_ARGS+= --disable-quota
-.endif
-
MAKE_DIRS+= ${PKG_SYSCONFDIR}/msg
SUBST_CLASSES+= paths
diff --git a/net/netatalk/distinfo b/net/netatalk/distinfo
index fa67f499b58..f31f981011c 100644
--- a/net/netatalk/distinfo
+++ b/net/netatalk/distinfo
@@ -1,9 +1,9 @@
-$NetBSD: distinfo,v 1.44 2011/12/16 05:21:37 dholland Exp $
+$NetBSD: distinfo,v 1.45 2012/05/12 21:53:20 dholland Exp $
SHA1 (netatalk-2.2.1.tar.bz2) = e588b89eced7769f65e213bc4b1b1e4f8035c8b3
RMD160 (netatalk-2.2.1.tar.bz2) = bc55a591fe134d3bf05ca442aa5b5246fd766b8c
Size (netatalk-2.2.1.tar.bz2) = 1227602 bytes
-SHA1 (patch-aa) = 20df0964b4fcb934ba2072e0aa7df3b75ada5e77
+SHA1 (patch-aa) = 060de5d023c3cc4e8d4e126270f2be69cf8a8913
SHA1 (patch-ac) = 605e87479202cbf093dfbadb25f2972595246d97
SHA1 (patch-ae) = e114085fbe2abf2fb821f2d2737e877c53e7c151
SHA1 (patch-af) = 649be7e50210e6e4156aeff74d3fc0effb90f9f2
@@ -17,5 +17,5 @@ SHA1 (patch-ar) = 8c6c6169496b9b2cdec6049d2ee45884d5513d11
SHA1 (patch-au) = 8505351fee21ac1effa4dc620b8006c572b913c1
SHA1 (patch-bj) = abbc2809b6b7fe75ec2d2f8f2fa8d6cd9d6de7b0
SHA1 (patch-bk) = c3fb7c3a42f148171fa99b6121b099dd4998947a
-SHA1 (patch-etc_afpd_quota_c) = 0d0a4d5cb8b8f2a9793096b61c326eecc403587c
-SHA1 (patch-macros_quota-check.m4) = 40d1e404905398be03aad6d472bf42af920c7b20
+SHA1 (patch-etc_afpd_quota_c) = 5005abb6528c0b3160a587fbe9fb285f485e6759
+SHA1 (patch-macros_quota-check.m4) = b1484f83a2a6ba5bd50623ab525d5366bb71abaa
diff --git a/net/netatalk/patches/patch-aa b/net/netatalk/patches/patch-aa
index 7e36e561abf..3686e9f0f56 100644
--- a/net/netatalk/patches/patch-aa
+++ b/net/netatalk/patches/patch-aa
@@ -1,4 +1,4 @@
-$NetBSD: patch-aa,v 1.23 2011/11/29 19:26:28 bouyer Exp $
+$NetBSD: patch-aa,v 1.24 2012/05/12 21:53:20 dholland Exp $
--- configure.orig 2011-09-06 13:41:25.000000000 +0200
+++ configure 2011-11-29 18:59:56.000000000 +0100
@@ -41760,13 +41760,13 @@ $NetBSD: patch-aa,v 1.23 2011/11/29 19:26:28 bouyer Exp $
+done
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getfsquota in -lquota" >&5
-+$as_echo_n "checking for getfsquota in -lquota... " >&6; }
-+if test "${ac_cv_lib_quota_getfsquota+set}" = set; then :
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for quota_open in -lquota" >&5
++$as_echo_n "checking for quota_open in -lquota... " >&6; }
++if test "${ac_cv_lib_quota_quota_open+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
-+LIBS="-lquota -lprop -lrpcsvc $LIBS"
++LIBS="-lquota -lrpcsvc $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
@@ -41783,31 +41783,31 @@ $NetBSD: patch-aa,v 1.23 2011/11/29 19:26:28 bouyer Exp $
+#ifdef __cplusplus
+extern "C"
+#endif
-+char getfsquota ();
++char quota_open ();
+int
+main ()
+{
-+return getfsquota ();
++return quota_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
-+ ac_cv_lib_quota_getfsquota=yes
++ ac_cv_lib_quota_quota_open=yes
else
- CFLAGS="-D_U_=\"\" $CFLAGS"
- { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-+ ac_cv_lib_quota_getfsquota=no
++ ac_cv_lib_quota_quota_open=no
fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_quota_getfsquota" >&5
-+$as_echo "$ac_cv_lib_quota_getfsquota" >&6; }
-+if test "x$ac_cv_lib_quota_getfsquota" = x""yes; then :
-+ QUOTA_LIBS="-lquota -lprop -lrpcsvc"
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_quota_quota_open" >&5
++$as_echo "$ac_cv_lib_quota_quota_open" >&6; }
++if test "x$ac_cv_lib_quota_quota_open" = x""yes; then :
++ QUOTA_LIBS="-lquota -lrpcsvc"
+$as_echo "#define HAVE_LIBQUOTA 1" >>confdefs.h
diff --git a/net/netatalk/patches/patch-etc_afpd_quota_c b/net/netatalk/patches/patch-etc_afpd_quota_c
index 6e18243f1e4..4942f948f3b 100644
--- a/net/netatalk/patches/patch-etc_afpd_quota_c
+++ b/net/netatalk/patches/patch-etc_afpd_quota_c
@@ -1,61 +1,173 @@
-$NetBSD: patch-etc_afpd_quota_c,v 1.1 2011/12/16 05:21:37 dholland Exp $
+$NetBSD: patch-etc_afpd_quota_c,v 1.2 2012/05/12 21:53:20 dholland Exp $
-Account for changes in prerelease NetBSD quota API.
+Use the netbsd-6 quota API, not the prerelease stuff from 5.99.x.
---- etc/afpd/quota.c~ 2011-08-18 12:23:44.000000000 +0000
+Fix some glaring bugs in the code for the 5.99.x quotas (seteuid'ing
+to group ids, using uninitialized group quota values, etc.)
+
+--- etc/afpd/quota.c.orig 2011-08-18 12:23:44.000000000 +0000
+++ etc/afpd/quota.c
-@@ -49,13 +49,25 @@ char *strchr (), *strrchr ();
+@@ -48,14 +48,18 @@ char *strchr (), *strrchr ();
+ #include "unix.h"
#ifdef HAVE_LIBQUOTA
- #include <quota/quota.h>
-+#include <quota/quotaprop.h>
-+
-+/* Sleazy. */
-+#if defined(__NetBSD__) && defined(_QUOTA_QUOTA_H)
-+/* old names in -current only from ~March 2011 through ~Nov 2011 */
-+#define quotaval ufs_quota_entry
-+#define qv_hardlimit ufsqe_hardlimit
-+#define qv_softlimit ufsqe_softlimit
-+#define qv_usage ufsqe_cur
-+#define qv_expiretime ufsqe_time
-+#define qv_grace ufsqe_grace
-+#endif
+-#include <quota/quota.h>
++#include <quota.h>
++
static int
getfreespace(struct vol *vol, VolSpace *bfree, VolSpace *btotal,
- uid_t uid, const char *classq)
+- uid_t uid, const char *classq)
++ id_t id, int idtype)
{
- int retq;
+- int retq;
- struct ufs_quota_entry ufsq[QUOTA_NLIMITS];
-+ struct quotaval ufsq[QUOTA_NLIMITS];
++ uid_t prevuid;
++ const char *msg;
++ struct quotahandle *qh;
++ struct quotakey qk;
++ struct quotaval qv;
time_t now;
if (time(&now) == -1) {
-@@ -77,19 +89,19 @@ getfreespace(struct vol *vol, VolSpace *
- if (retq < 1)
- return retq;
+@@ -64,65 +68,107 @@ getfreespace(struct vol *vol, VolSpace *
+ return -1;
+ }
+
++ prevuid = geteuid();
++ if (prevuid == -1) {
++ LOG(log_info, logtype_afpd, "geteuid(): %s",
++ strerror(errno));
++ return -1;
++ }
++
+ if ( seteuid( getuid() ) != 0 ) {
+ LOG(log_info, logtype_afpd, "seteuid(): %s",
+ strerror(errno));
+ return -1;
+ }
+- if ((retq = getfsquota(vol->v_path, ufsq, uid, classq)) < 0) {
+- LOG(log_info, logtype_afpd, "getfsquota(%s, %s): %s",
+- vol->v_path, classq, strerror(errno));
++
++ /*
++ * In a tidier world we might keep the quotahandle open for longer...
++ */
++ qh = quota_open(vol->v_path);
++ if (qh == NULL) {
++ if (errno == EOPNOTSUPP || errno == ENXIO) {
++ /* no quotas on this volume */
++ seteuid( prevuid );
++ return 0;
++ }
++
++ LOG(log_info, logtype_afpd, "quota_open(%s): %s", vol->v_path,
++ strerror(errno));
++ seteuid( prevuid );
++ return -1;
+ }
+- seteuid( uid );
+- if (retq < 1)
+- return retq;
- switch(QL_STATUS(quota_check_limit(ufsq[QUOTA_LIMIT_BLOCK].ufsqe_cur, 1,
- ufsq[QUOTA_LIMIT_BLOCK].ufsqe_softlimit,
- ufsq[QUOTA_LIMIT_BLOCK].ufsqe_hardlimit,
- ufsq[QUOTA_LIMIT_BLOCK].ufsqe_time, now))) {
-+ switch(QL_STATUS(quota_check_limit(ufsq[QUOTA_LIMIT_BLOCK].qv_usage, 1,
-+ ufsq[QUOTA_LIMIT_BLOCK].qv_softlimit,
-+ ufsq[QUOTA_LIMIT_BLOCK].qv_hardlimit,
-+ ufsq[QUOTA_LIMIT_BLOCK].qv_expiretime, now))) {
- case QL_S_DENY_HARD:
- case QL_S_DENY_GRACE:
+- case QL_S_DENY_HARD:
+- case QL_S_DENY_GRACE:
++ qk.qk_idtype = idtype;
++ qk.qk_id = id;
++ qk.qk_objtype = QUOTA_OBJTYPE_BLOCKS;
++ if (quota_get(qh, &qk, &qv) < 0) {
++ if (errno == ENOENT) {
++ /* no quotas for this id */
++ quota_close(qh);
++ seteuid( prevuid );
++ return 0;
++ }
++ msg = strerror(errno);
++ LOG(log_info, logtype_afpd, "quota_get(%s, %s): %s",
++ vol->v_path, quota_idtype_getname(qh, idtype), msg);
++ quota_close(qh);
++ seteuid( prevuid );
++ return -1;
++ }
++
++ quota_close(qh);
++
++ seteuid( prevuid );
++
++ if (qv.qv_usage >= qv.qv_hardlimit ||
++ (qv.qv_usage >= qv.qv_softlimit && now > qv.qv_expiretime)) {
*bfree = 0;
- *btotal = dbtob(ufsq[QUOTA_LIMIT_BLOCK].ufsqe_cur);
-+ *btotal = dbtob(ufsq[QUOTA_LIMIT_BLOCK].qv_usage);
- break;
- default:
+- break;
+- default:
- *bfree = dbtob(ufsq[QUOTA_LIMIT_BLOCK].ufsqe_hardlimit -
- ufsq[QUOTA_LIMIT_BLOCK].ufsqe_cur);
- *btotal = dbtob(ufsq[QUOTA_LIMIT_BLOCK].ufsqe_hardlimit);
-+ *bfree = dbtob(ufsq[QUOTA_LIMIT_BLOCK].qv_hardlimit -
-+ ufsq[QUOTA_LIMIT_BLOCK].qv_usage);
-+ *btotal = dbtob(ufsq[QUOTA_LIMIT_BLOCK].qv_hardlimit);
- break;
+- break;
++ *btotal = dbtob(qv.qv_usage);
++ }
++ else {
++ *bfree = dbtob(qv.qv_hardlimit - qv.qv_usage);
++ *btotal = dbtob(qv.qv_hardlimit);
}
++
return 1;
+ }
+
+ int uquota_getvolspace( struct vol *vol, VolSpace *bfree, VolSpace *btotal, const u_int32_t bsize)
+ {
+- int uretq, gretq;
++ int uret, gret;
+ VolSpace ubfree, ubtotal;
+ VolSpace gbfree, gbtotal;
+
+- uretq = getfreespace(vol, &ubfree, &ubtotal,
+- uuid, QUOTADICT_CLASS_USER);
+- LOG(log_info, logtype_afpd, "getfsquota(%s): %d %d",
+- vol->v_path, (int)ubfree, (int)ubtotal);
++ uret = getfreespace(vol, &ubfree, &ubtotal,
++ uuid, QUOTA_IDTYPE_USER);
++ if (uret == 1) {
++ LOG(log_info, logtype_afpd, "quota_get(%s, user): %d %d",
++ vol->v_path, (int)ubfree, (int)ubtotal);
++ }
++
+ if (ngroups >= 1) {
+- gretq = getfreespace(vol, &ubfree, &ubtotal,
+- groups[0], QUOTADICT_CLASS_GROUP);
++ gret = getfreespace(vol, &gbfree, &gbtotal,
++ groups[0], QUOTA_IDTYPE_GROUP);
++ if (gret == 1) {
++ LOG(log_info, logtype_afpd, "quota_get(%s, group): %d %d",
++ vol->v_path, (int)gbfree, (int)gbtotal);
++ }
+ } else
+- gretq = -1;
+- if (uretq < 1 && gretq < 1) { /* no quota for this fs */
++ gret = 0;
++
++ if (uret < 1 && gret < 1) { /* no quota for this fs */
+ return AFPERR_PARAM;
+ }
+- if (uretq < 1) {
+- /* use group quotas */
++ if (uret < 1) {
++ /* no user quotas, but group quotas; use them */
+ *bfree = gbfree;
+ *btotal = gbtotal;
+- } else if (gretq < 1) {
+- /* use user quotas */
++ } else if (gret < 1) {
++ /* no group quotas, but user quotas; use them */
+ *bfree = ubfree;
+ *btotal = ubtotal;
+ } else {
+- /* return smallest remaining space of user and group */
++ /* both; return smallest remaining space of user and group */
+ if (ubfree < gbfree) {
+ *bfree = ubfree;
+ *btotal = ubtotal;
diff --git a/net/netatalk/patches/patch-macros_quota-check.m4 b/net/netatalk/patches/patch-macros_quota-check.m4
index 8998bfddeff..57eccaae7ed 100644
--- a/net/netatalk/patches/patch-macros_quota-check.m4
+++ b/net/netatalk/patches/patch-macros_quota-check.m4
@@ -1,8 +1,22 @@
-$NetBSD: patch-macros_quota-check.m4,v 1.1 2011/11/29 19:26:28 bouyer Exp $
+$NetBSD: patch-macros_quota-check.m4,v 1.2 2012/05/12 21:53:20 dholland Exp $
---- macros/quota-check.m4.orig 2011-11-29 18:51:25.000000000 +0100
-+++ macros/quota-check.m4 2011-11-29 18:53:09.000000000 +0100
-@@ -10,11 +10,7 @@
+- do not disable quota support if some of rpc/rpc.h, rpc/pmap_prot.h,
+ rpcsvc/rquota.h are missing.
+
+- fix libquota test to check for the netbsd-6 release quota API, not
+ the prerelease proplib-based API in 5.99 that got removed before
+ netbsd-6.
+
+This logic should probably be simplified, and expanded some to
+simplify the mess of quota-related ifdefs in the source; the rquotad
+support connected to the rpc headers and -lrpcsvc should be
+independent of the local quota support, and can be probed for
+independently. However, this needs to be coordinated with upstream,
+not done in pkgsrc.
+
+--- macros/quota-check.m4.orig 2011-08-18 12:23:44.000000000 +0000
++++ macros/quota-check.m4
+@@ -10,13 +10,9 @@ AC_DEFUN([AC_CHECK_QUOTA], [
QUOTA_LIBS=""
netatalk_cv_quotasupport="yes"
AC_CHECK_LIB(rpcsvc, main, [QUOTA_LIBS="-lrpcsvc"])
@@ -11,7 +25,11 @@ $NetBSD: patch-macros_quota-check.m4,v 1.1 2011/11/29 19:26:28 bouyer Exp $
- netatalk_cv_quotasupport="no"
- AC_DEFINE(NO_QUOTA_SUPPORT, 1, [Define if quota support should not compiled])
- ])
+- AC_CHECK_LIB(quota, getfsquota, [QUOTA_LIBS="-lquota -lprop -lrpcsvc"
+- AC_DEFINE(HAVE_LIBQUOTA, 1, [define if you have libquota])], [], [-lprop -lrpcsvc])
+ AC_CHECK_HEADERS([rpc/rpc.h rpc/pmap_prot.h rpcsvc/rquota.h],[],[])
- AC_CHECK_LIB(quota, getfsquota, [QUOTA_LIBS="-lquota -lprop -lrpcsvc"
- AC_DEFINE(HAVE_LIBQUOTA, 1, [define if you have libquota])], [], [-lprop -lrpcsvc])
++ AC_CHECK_LIB(quota, quota_open, [QUOTA_LIBS="-lquota -lrpcsvc"
++ AC_DEFINE(HAVE_LIBQUOTA, 1, [define if you have libquota])], [], [-lrpcsvc])
else
+ netatalk_cv_quotasupport="no"
+ AC_DEFINE(NO_QUOTA_SUPPORT, 1, [Define if quota support should not compiled])