]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/res.c
Big backport from Enterprise
[bacula/bacula] / bacula / src / lib / res.c
index 4209943ffee5992c991960ced082c31279bd1681..414b1c9cbf021742f5f32cc66e656b9efe14ae4f 100644 (file)
@@ -1,29 +1,20 @@
 /*
-   Bacula® - The Network Backup Solution
-
-   Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
-
-   The main author of Bacula is Kern Sibbald, with contributions from
-   many others, a complete list can be found in the file AUTHORS.
-   This program is Free Software; you can redistribute it and/or
-   modify it under the terms of version two of the GNU General Public
-   License as published by the Free Software Foundation and included
-   in the file LICENSE.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.
-
-   Bacula® is a registered trademark of John Walker.
-   The licensor of Bacula is the Free Software Foundation Europe
-   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
-   Switzerland, email:ftf@fsfeurope.org.
+   Bacula(R) - The Network Backup Solution
+
+   Copyright (C) 2000-2016 Kern Sibbald
+
+   The original author of Bacula is Kern Sibbald, with contributions
+   from many others, a complete list can be found in the file AUTHORS.
+
+   You may use this file and others of this release according to the
+   license defined in the LICENSE file, which includes the Affero General
+   Public License, v3.0 ("AGPLv3") and some additional permissions and
+   terms pursuant to its AGPLv3 Section 7.
+
+   This notice must be preserved when any source code is 
+   conveyed and/or propagated.
+
+   Bacula(R) is a registered trademark of Kern Sibbald.
 */
 /*
  *  This file handles locking and seaching resources
@@ -31,7 +22,6 @@
  *     Kern Sibbald, January MM
  *       Split from parse_conf.c April MMV
  *
- *   Version $Id$
  */
 
 #include "bacula.h"
  * resources, so it will define the following
  * global values.
  */
-extern int r_first;
-extern int r_last;
+extern int32_t r_first;
+extern int32_t r_last;
 extern RES_TABLE resources[];
-extern RES **res_head;
+extern RES_HEAD **res_head;
 
 brwlock_t res_lock;                   /* resource lock */
-static int res_locked = 0;            /* set when resource chains locked -- for debug */
+static int res_locked = 0;            /* resource chain lock count -- for debug */
 
 
 /* #define TRACE_RES */
@@ -55,7 +45,7 @@ void b_LockRes(const char *file, int line)
 {
    int errstat;
 #ifdef TRACE_RES
-   Pmsg4(000, "LockRes  locked=%d w_active=%d at %s:%d\n", 
+   Pmsg4(000, "LockRes  locked=%d w_active=%d at %s:%d\n",
          res_locked, res_lock.w_active, file, line);
     if (res_locked) {
        Pmsg2(000, "LockRes writerid=%d myid=%d\n", res_lock.writer_id,
@@ -78,28 +68,35 @@ void b_UnlockRes(const char *file, int line)
    }
    res_locked--;
 #ifdef TRACE_RES
-   Pmsg4(000, "UnLockRes locked=%d wactive=%d at %s:%d\n", 
+   Pmsg4(000, "UnLockRes locked=%d wactive=%d at %s:%d\n",
          res_locked, res_lock.w_active, file, line);
 #endif
 }
 
+/*
+ * Compare two resource names
+ */
+int res_compare(void *item1, void *item2)
+{
+   RES *res1 = (RES *)item1;
+   RES *res2 = (RES *)item2;
+   return strcmp(res1->name, res2->name);
+}
+
 /*
  * Return resource of type rcode that matches name
  */
 RES *
 GetResWithName(int rcode, const char *name)
 {
-   RES *res;
+   RES_HEAD *reshead;
    int rindex = rcode - r_first;
+   RES item, *res;
 
    LockRes();
-   res = res_head[rindex];
-   while (res) {
-      if (strcmp(res->name, name) == 0) {
-         break;
-      }
-      res = res->next;
-   }
+   reshead = res_head[rindex];
+   item.name = (char *)name;
+   res = (RES *)reshead->res_list->search(&item, res_compare);
    UnlockRes();
    return res;
 
@@ -117,9 +114,28 @@ GetNextRes(int rcode, RES *res)
    int rindex = rcode - r_first;
 
    if (res == NULL) {
-      nres = res_head[rindex];
+      nres = (RES *)res_head[rindex]->first;
+   } else {
+      nres = res->res_next;
+   }
+   return nres;
+}
+
+/*
+ * Return next resource of type rcode. On first
+ * call second arg (res) is NULL, on subsequent
+ * calls, it is called with previous value.
+ */
+RES *
+GetNextRes(RES_HEAD **rhead, int rcode, RES *res)
+{
+   RES *nres;
+   int rindex = rcode - r_first;
+
+   if (res == NULL) {
+      nres = (RES *)rhead[rindex]->first;
    } else {
-      nres = res->next;
+      nres = res->res_next;
    }
    return nres;
 }