153 lines
3.7 KiB
Plaintext
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
|
|
|