pkgsrc-Changes archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: CVS commit: pkgsrc/net/netatalk3/patches



"Pullup request/bug report URL with the patch" (which will show it
being accepted) is good, too.

On Mon, Nov 07, 2016 at 05:47:24AM +0000, coypu%SDF.ORG@localhost wrote:
> Hi christos!
> 
> having patches like patch-etc_afpd_quota.c without a comment in the patch
> is a little problematic for other people who may interact with the package.
> 
> it appears to be changing runtime behaviour to a more correct one.
> 
> even if you sent this upstream right away, the next person to update the
> package will need to remove this patch, which is something requiring
> confidence that it hasn't broken anything, and from a brief view, it's
> not clear how to test that the functionality still works.
> 
> (although there is some chance it will show as a reversed patch, so
> easier to understand it just needs to be removed)
> 
> could you leave a comment explaining at least what it fixes?
> 
> thanks
> 
> On Sun, Nov 06, 2016 at 07:41:58PM -0500, Christos Zoulas wrote:
> > Index: pkgsrc/net/netatalk3/patches/patch-etc_afpd_quota.c
> > diff -u /dev/null pkgsrc/net/netatalk3/patches/patch-etc_afpd_quota.c:1.1
> > --- /dev/null       Sun Nov  6 19:41:58 2016
> > +++ pkgsrc/net/netatalk3/patches/patch-etc_afpd_quota.c     Sun Nov  6 19:41:57 2016
> > @@ -0,0 +1,161 @@
> > +$NetBSD: patch-etc_afpd_quota.c,v 1.1 2016/11/07 00:41:57 christos Exp $
> > +
> > +--- etc/afpd/quota.c.orig  2013-04-09 12:56:18.000000000 +0000
> > ++++ etc/afpd/quota.c
> > +@@ -36,10 +36,13 @@
> > + 
> > + static int
> > + getfreespace(const AFPObj *obj, struct vol *vol, VolSpace *bfree, VolSpace *btotal,
> > +-       uid_t uid, const char *classq)
> > ++       id_t id, int idtype)
> > + {
> > +-  int retq;
> > +-  struct ufs_quota_entry 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) {
> > +@@ -48,64 +51,102 @@ getfreespace(const AFPObj *obj, struct v
> > +           return -1;
> > +   }
> > + 
> > ++  prevuid = geteuid();
> > ++  if (prevuid == -1) {
> > ++          LOG(log_info, logtype_afpd, "geteuid(): %s",
> > ++              strerror(errno));
> > ++          return -1;
> > ++  }
> > ++
> > +     become_root();
> > + 
> > +-  if ((retq = getfsquota(obj, vol, ufsq, uid, classq)) < 0) {
> > +-          LOG(log_info, logtype_afpd, "getfsquota(%s, %s): %s",
> > +-              vol->v_path, classq, strerror(errno));
> > +-  }
> > +-
> > +-    unbecome_root();
> > +-
> > +-  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))) {
> > +-  case QL_S_DENY_HARD:
> > +-  case QL_S_DENY_GRACE:
> > ++  /*
> > ++   * 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;
> > ++  }
> > ++  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);
> > +-          break;
> > +-  default:
> > +-          *bfree = dbtob(ufsq[QUOTA_LIMIT_BLOCK].ufsqe_hardlimit -
> > +-              ufsq[QUOTA_LIMIT_BLOCK].ufsqe_cur);
> > +-          *btotal = dbtob(ufsq[QUOTA_LIMIT_BLOCK].ufsqe_hardlimit);
> > +-          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(const AFPObj *obj, struct vol *vol, VolSpace *bfree, VolSpace *btotal, const u_int32_t bsize)
> > + {
> > +-  int uretq, gretq;
> > ++  int uret, gret;
> > +   VolSpace ubfree, ubtotal;
> > +   VolSpace gbfree, gbtotal;
> > ++  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);
> > ++  }
> > + 
> > +-  uretq = getfreespace(obj, vol, &ubfree, &ubtotal,
> > +-                       uuid, QUOTADICT_CLASS_USER);
> > +-  LOG(log_info, logtype_afpd, "getfsquota(%s): %d %d",
> > +-      vol->v_path, (int)ubfree, (int)ubtotal);
> > +   if (obj->ngroups >= 1) {
> > +-          gretq = getfreespace(vol, &ubfree, &ubtotal,
> > +-              obj->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;



Home | Main Index | Thread Index | Old Index