fixed devnull handling
authorNurPech <nurpech@nurpech.de>
Fri, 30 Aug 2013 19:35:17 +0000 (21:35 +0200)
committerNurPech <nurpech@nurpech.de>
Fri, 30 Aug 2013 19:57:21 +0000 (21:57 +0200)
src/mod-hostserv.c

index 24de72dc7ee471bcd15e5100b0e81a9e2d90416f..462bed94422ea0202b03f1b7dd0069d951cf15af 100644 (file)
@@ -1281,17 +1281,10 @@ struct devnull_class hostserv_get_user_priv(struct handle_info *hi) {
     
     struct hs_user *huser = hs_get_user(hi, 0);
     if(huser) {
-        struct hs_assignment *assignment;
-        struct hs_secondlevel *slfh;
         struct devnull_class *devc;
-        for(assignment = huser->assignments; assignment; assignment = assignment->unext) {
-            slfh = assignment->secondlevel;
-            if(slfh->devnull_id) {
-                devc = devnull_find_id(slfh->devnull_id);
-                if(!devc) {
-                    slfh->devnull_id = 0;
-                    continue;
-                }
+        if(hi->devnull_id != 0) {
+            devc = devnull_find_id(huser->hi->devnull_id);
+            if(devc) {
                 if(DEVNULL_HAS_PRIV(devc, CHANLIMIT) && (!DEVNULL_HAS_PRIV(&th, CHANLIMIT) || th.maxchan < devc->maxchan))
                     th.maxchan = devc->maxchan;
                 if(DEVNULL_HAS_PRIV(devc, MAXSENDQ) && (!DEVNULL_HAS_PRIV(&th, MAXSENDQ) || th.maxsendq < devc->maxsendq))
@@ -1300,6 +1293,26 @@ struct devnull_class hostserv_get_user_priv(struct handle_info *hi) {
                 if(!th.name)
                     th.name = devc->name;
             }
+        } else {
+            struct hs_assignment *assignment;
+            struct hs_secondlevel *slfh;
+            for(assignment = huser->assignments; assignment; assignment = assignment->unext) {
+                slfh = assignment->secondlevel;
+                if(slfh->devnull_id) {
+                    devc = devnull_find_id(slfh->devnull_id);
+                    if(!devc) {
+                        slfh->devnull_id = 0;
+                        continue;
+                    }
+                    if(DEVNULL_HAS_PRIV(devc, CHANLIMIT) && (!DEVNULL_HAS_PRIV(&th, CHANLIMIT) || th.maxchan < devc->maxchan))
+                        th.maxchan = devc->maxchan;
+                    if(DEVNULL_HAS_PRIV(devc, MAXSENDQ) && (!DEVNULL_HAS_PRIV(&th, MAXSENDQ) || th.maxsendq < devc->maxsendq))
+                        th.maxsendq = devc->maxsendq;
+                    th.modes |= devc->modes;
+                    if(!th.name)
+                        th.name = devc->name;
+                }
+            }
         }
     }
     return th;