/*
- 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
* 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 */
{
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,
}
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;
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;
}