Files
pkgsrc-ng/sysutils/p5-Quota/patches/patch-ac
2013-09-26 17:14:40 +02:00

153 lines
3.7 KiB
Plaintext

$NetBSD: patch-ac,v 1.1 2012/08/14 14:24:20 dholland Exp $
Extend Quota.xs to use the new NetBSD 6 libquota interface.
--- Quota.xs.orig 2011-01-02 18:25:40.000000000 +0100
+++ Quota.xs 2012-05-15 12:00:50.000000000 +0200
@@ -331,6 +331,12 @@
struct dqblk dqblk;
char *p = NULL;
int err;
+ int pushed = 0;
+#ifdef NETBSD_LIBQUOTA
+ struct quotahandle *qh;
+ struct quotakey qk;
+ struct quotaval qv;
+#endif
#ifdef USE_IOCTL
struct quotactl qp;
int fd = -1;
@@ -411,6 +417,35 @@
#endif /* NO_RPC */
}
else {
+#ifdef NETBSD_LIBQUOTA
+ err = 0;
+ qh = quota_open(dev);
+ if (qh != NULL) {
+ qk.qk_idtype = kind ? QUOTA_IDTYPE_GROUP : QUOTA_IDTYPE_USER;
+ qk.qk_id = uid;
+ qk.qk_objtype = QUOTA_OBJTYPE_BLOCKS;
+ if (quota_get(qh, &qk, &qv) >= 0) {
+ pushed = 1;
+ EXTEND(SP, 4);
+ PUSHs(sv_2mortal(newSViv(Q_DIV(qv.qv_usage))));
+ PUSHs(sv_2mortal(newSViv(Q_DIV(qv.qv_softlimit))));
+ PUSHs(sv_2mortal(newSViv(Q_DIV(qv.qv_hardlimit))));
+ PUSHs(sv_2mortal(newSViv(qv.qv_expiretime)));
+ qk.qk_objtype = QUOTA_OBJTYPE_FILES;
+ if (quota_get(qh, &qk, &qv) >= 0) {
+ EXTEND(SP, 4);
+ PUSHs(sv_2mortal(newSViv(qv.qv_usage)));
+ PUSHs(sv_2mortal(newSViv(qv.qv_softlimit)));
+ PUSHs(sv_2mortal(newSViv(qv.qv_hardlimit)));
+ PUSHs(sv_2mortal(newSViv(qv.qv_expiretime)));
+ }
+ else err = -1;
+ }
+ else err = -1;
+ quota_close(qh);
+ }
+ else err = -1;
+#else /* not NETBSD_LIBQUOTA */
#ifdef USE_IOCTL
qp.op = Q_GETQUOTA;
qp.uid = uid;
@@ -457,8 +492,9 @@
#endif /* not Q_CTL_V2 */
#endif /* Q_CTL_V3 */
#endif /* not USE_IOCTL */
+#endif /* not NETBSD_LIBQUOTA */
}
- if(!err) {
+ if(!err && !pushed) {
EXTEND(SP, 8);
PUSHs(sv_2mortal(newSViv(Q_DIV(dqblk.QS_BCUR))));
PUSHs(sv_2mortal(newSViv(Q_DIV(dqblk.QS_BSOFT))));
@@ -479,15 +515,21 @@
setqlim(dev,uid,bs,bh,fs,fh,timelimflag=0,kind=0)
char * dev
int uid
- long bs
- long bh
- long fs
- long fh
+ double bs
+ double bh
+ double fs
+ double fh
int timelimflag
int kind
CODE:
{
+#ifdef NETBSD_LIBQUOTA
+ struct quotahandle *qh;
+ struct quotakey qk;
+ struct quotaval qv;
+#else /* not NETBSD_LIBQUOTA */
struct dqblk dqblk;
+#endif /* NETBSD_LIBQUOTA */
#ifdef USE_IOCTL
struct quotactl qp;
int fd;
@@ -563,6 +605,33 @@
else
#endif /* HAVE_JFS2 */
{
+#ifdef NETBSD_LIBQUOTA
+ qh = quota_open(dev);
+ if (qh != NULL) {
+ qk.qk_idtype = kind ? QUOTA_IDTYPE_GROUP : QUOTA_IDTYPE_USER;
+ qk.qk_id = uid;
+ qk.qk_objtype = QUOTA_OBJTYPE_BLOCKS;
+
+ qv.qv_usage = 0;
+ qv.qv_hardlimit = Q_MUL(bh);
+ qv.qv_softlimit = Q_MUL(bs);
+ qv.qv_expiretime = timelimflag;
+ qv.qv_grace = 0; /* XXX should be able to manipulate this */
+ if (quota_put(qh, &qk, &qv) >= 0) {
+ qk.qk_objtype = QUOTA_OBJTYPE_FILES;
+
+ qv.qv_usage = 0;
+ qv.qv_hardlimit = fh;
+ qv.qv_softlimit = fs;
+ qv.qv_expiretime = timelimflag;
+ qv.qv_grace = 0; /* XXX should be able to manipulate this */
+ if (quota_put(qh, &qk, &qv) >= 0) {
+ RETVAL = 0;
+ } else RETVAL = -1;
+ } else RETVAL = -1;
+ quota_close(qh);
+ } else RETVAL = -1;
+#else /* not NETBSD_LIBQUOTA */
memset(&dqblk, 0, sizeof(dqblk));
dqblk.QS_BSOFT = Q_MUL(bs);
dqblk.QS_BHARD = Q_MUL(bh);
@@ -588,6 +657,7 @@
#endif
#endif
#endif
+#endif /* NETBSD_LIBQUOTA */
}
}
OUTPUT:
@@ -616,6 +686,9 @@
}
else
#endif
+#ifdef NETBSD_LIBQUOTA
+ RETVAL = 0;
+#else /* not NETBSD_LIBQUOTA */
#ifdef USE_IOCTL
{
struct quotactl qp;
@@ -698,6 +771,7 @@
#endif
}
#endif
+#endif /* NETBSD_LIBQUOTA */
OUTPUT:
RETVAL