diff options
author | dholland <dholland> | 2012-05-12 21:53:19 +0000 |
---|---|---|
committer | dholland <dholland> | 2012-05-12 21:53:19 +0000 |
commit | 697cf4c919847a76bf895bf0f1683f4a528c3201 (patch) | |
tree | d971c1a2cea5c70a86c2c727bd011d8241a0104c /net | |
parent | 5fbea7097ba9baa944d9cb256441f12baa7b367f (diff) | |
download | pkgsrc-697cf4c919847a76bf895bf0f1683f4a528c3201.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/Makefile | 13 | ||||
-rw-r--r-- | net/netatalk/distinfo | 8 | ||||
-rw-r--r-- | net/netatalk/patches/patch-aa | 26 | ||||
-rw-r--r-- | net/netatalk/patches/patch-etc_afpd_quota_c | 184 | ||||
-rw-r--r-- | net/netatalk/patches/patch-macros_quota-check.m4 | 30 |
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]) |