/*
Bacula® - The Network Backup Solution
- Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2009 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.
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Bacula® is a registered trademark of John Walker.
+ Bacula® is a registered trademark of Kern Sibbald.
The licensor of Bacula is the Free Software Foundation Europe
(FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
Switzerland, email:ftf@fsfeurope.org.
#define MAX_PATH 1024
#endif
-/* Each daemon has a slightly different set of
- * resources, so it will define the following
- * global values.
- */
-extern int r_first;
-extern int r_last;
-extern RES_TABLE resources[];
-extern RES **res_head;
-
/*
* Define the Union of all the common resource structure definitions.
*/
#else
extern URES res_all;
#endif
-extern int res_all_size;
extern brwlock_t res_lock; /* resource lock */
items[i].default_value);
if (items[i].flags & ITEM_DEFAULT && items[i].default_value != 0) {
if (items[i].handler == store_bit) {
- *(int *)(items[i].value) |= items[i].code;
+ *(uint32_t *)(items[i].value) |= items[i].code;
} else if (items[i].handler == store_bool) {
*(bool *)(items[i].value) = items[i].default_value != 0;
- } else if (items[i].handler == store_pint ||
- items[i].handler == store_int) {
- *(int *)(items[i].value) = items[i].default_value;
+ } else if (items[i].handler == store_pint32 ||
+ items[i].handler == store_int32) {
+ *(uint32_t *)(items[i].value) = items[i].default_value;
} else if (items[i].handler == store_int64) {
*(int64_t *)(items[i].value) = items[i].default_value;
} else if (items[i].handler == store_size) {
}
if (token != T_EQUALS) {
scan_err1(lc, _("expected an =, got: %s"), lc->str);
+ return;
}
break;
}
Dmsg1(900, "store_msgs dest=%s:\n", NPRT(dest));
if (token != T_EQUALS) {
scan_err1(lc, _("expected an =, got: %s"), lc->str);
+ return;
}
scan_types(lc, (MSGS *)(item->value), item->code, dest, NULL);
free_pool_memory(dest);
default:
scan_err1(lc, _("Unknown item code: %d\n"), item->code);
- break;
+ return;
}
}
scan_to_eol(lc);
}
if (!found) {
scan_err1(lc, _("message type: %s not found"), str);
- /* NOT REACHED */
+ return;
}
if (msg_type == M_MAX+1) { /* all? */
lex_get_token(lc, T_NAME);
if (!is_name_valid(lc->str, &msg)) {
scan_err1(lc, "%s\n", msg);
+ return;
}
free_pool_memory(msg);
/* Store the name both pass 1 and pass 2 */
if (*(item->value)) {
scan_err2(lc, _("Attempt to redefine name \"%s\" to \"%s\"."),
*(item->value), lc->str);
+ return;
}
*(item->value) = bstrdup(lc->str);
scan_to_eol(lc);
if (res == NULL) {
scan_err3(lc, _("Could not find config Resource %s referenced on line %d : %s\n"),
lc->str, lc->line_no, lc->line);
+ return;
}
if (*(item->value)) {
scan_err3(lc, _("Attempt to redefine resource \"%s\" referenced on line %d : %s\n"),
item->name, lc->line_no, lc->line);
+ return;
}
*(item->value) = (char *)res;
}
if (i >= count) {
scan_err4(lc, _("Too many %s directives. Max. is %d. line %d: %s\n"),
lc->str, count, lc->line_no, lc->line);
+ return;
}
list = New(alist(10, not_owned_by_alist));
}
if (res == NULL) {
scan_err3(lc, _("Could not find config Resource \"%s\" referenced on line %d : %s\n"),
item->name, lc->line_no, lc->line);
+ return;
}
Dmsg5(900, "Append %p to alist %p size=%d i=%d %s\n",
res, list, list->size(), i, item->name);
if (res == NULL) {
scan_err3(lc, _("Missing config Resource \"%s\" referenced on line %d : %s\n"),
lc->str, lc->line_no, lc->line);
+ return;
}
}
scan_to_eol(lc);
/* Store an integer at specified address */
-void store_int(LEX *lc, RES_ITEM *item, int index, int pass)
+void store_int32(LEX *lc, RES_ITEM *item, int index, int pass)
{
lex_get_token(lc, T_INT32);
- *(int *)(item->value) = lc->int32_val;
+ *(uint32_t *)(item->value) = lc->int32_val;
scan_to_eol(lc);
set_bit(index, res_all.hdr.item_present);
}
/* Store a positive integer at specified address */
-void store_pint(LEX *lc, RES_ITEM *item, int index, int pass)
+void store_pint32(LEX *lc, RES_ITEM *item, int index, int pass)
{
lex_get_token(lc, T_PINT32);
- *(int *)(item->value) = lc->pint32_val;
+ *(uint32_t *)(item->value) = lc->pint32_val;
scan_to_eol(lc);
set_bit(index, res_all.hdr.item_present);
}
}
if (!size_to_uint64(bsize, strlen(bsize), &uvalue)) {
scan_err1(lc, _("expected a size number, got: %s"), lc->str);
+ return;
}
*(uint64_t *)(item->value) = uvalue;
break;
default:
scan_err1(lc, _("expected a size, got: %s"), lc->str);
- break;
+ return;
}
if (token != T_EOL) {
scan_to_eol(lc);
}
if (!duration_to_utime(period, &utime)) {
scan_err1(lc, _("expected a time period, got: %s"), period);
+ return;
}
*(utime_t *)(item->value) = utime;
break;
default:
scan_err1(lc, _("expected a time period, got: %s"), lc->str);
- break;
+ return;
}
if (token != T_EOL) {
scan_to_eol(lc);
{
lex_get_token(lc, T_NAME);
if (strcasecmp(lc->str, "yes") == 0 || strcasecmp(lc->str, "true") == 0) {
- *(int *)(item->value) |= item->code;
+ *(uint32_t *)(item->value) |= item->code;
} else if (strcasecmp(lc->str, "no") == 0 || strcasecmp(lc->str, "false") == 0) {
- *(int *)(item->value) &= ~(item->code);
+ *(uint32_t *)(item->value) &= ~(item->code);
} else {
scan_err2(lc, _("Expect %s, got: %s"), "YES, NO, TRUE, or FALSE", lc->str); /* YES and NO must not be translated */
+ return;
}
scan_to_eol(lc);
set_bit(index, res_all.hdr.item_present);
*(bool *)(item->value) = false;
} else {
scan_err2(lc, _("Expect %s, got: %s"), "YES, NO, TRUE, or FALSE", lc->str); /* YES and NO must not be translated */
+ return;
}
scan_to_eol(lc);
set_bit(index, res_all.hdr.item_present);
/* Store the label pass 2 so that type is defined */
for (i=0; tapelabels[i].name; i++) {
if (strcasecmp(lc->str, tapelabels[i].name) == 0) {
- *(int *)(item->value) = tapelabels[i].token;
+ *(uint32_t *)(item->value) = tapelabels[i].token;
i = 0;
break;
}
}
if (i != 0) {
scan_err1(lc, _("Expected a Tape Label keyword, got: %s"), lc->str);
+ return;
}
scan_to_eol(lc);
set_bit(index, res_all.hdr.item_present);
void CONFIG::init(
const char *cf,
LEX_ERROR_HANDLER *scan_error,
- int err_type,
+ int32_t err_type,
void *vres_all,
- int res_all_size,
- int r_first,
- int r_last,
+ int32_t res_all_size,
+ int32_t r_first,
+ int32_t r_last,
RES_TABLE *resources,
RES **res_head)
{
* Note, the default behavior unless you have set an alternate
* scan_error handler is to die on an error.
*/
+#ifdef xxx
int
parse_config(const char *cf, LEX_ERROR_HANDLER *scan_error, int err_type)
{
free(config);
return ok;
}
+#endif
bool CONFIG::parse_config()
if (first && (errstat=rwl_init(&res_lock)) != 0) {
berrno be;
- Emsg1(M_ABORT, 0, _("Unable to initialize resource lock. ERR=%s\n"),
+ Jmsg1(NULL, M_ABORT, 0, _("Unable to initialize resource lock. ERR=%s\n"),
be.bstrerror(errstat));
}
first = false;
char *full_path = (char *)alloca(MAX_PATH + 1);
- if (find_config_file(cf, full_path, MAX_PATH +1)) {
- cf = full_path;
+ if (!find_config_file(cf, full_path, MAX_PATH +1)) {
+ Jmsg0(NULL, M_ABORT, 0, _("Config filename too long.\n"));
}
+ cf = full_path;
/* Make two passes. The first builds the name symbol table,
* and the second picks up the items.
Dmsg0(900, "T_EOB => define new resource\n");
if (res_all.hdr.name == NULL) {
scan_err0(lc, _("Name not specified for resource"));
+ return 0;
}
save_resource(res_type, items, pass); /* save resource */
break;
}
if (debug_level >= 900 && pass == 2) {
int i;
- for (i=r_first; i<=r_last; i++) {
- dump_resource(i, res_head[i-r_first], prtmsg, NULL);
+ for (i=m_r_first; i<=m_r_last; i++) {
+ dump_resource(i, m_res_head[i-m_r_first], prtmsg, NULL);
}
}
lc = lex_close_file(lc);
#endif
}
+/*
+ * Returns false on error
+ * true on OK, with full_path set to where config file should be
+ */
static bool
find_config_file(const char *config_file, char *full_path, int max_path)
{
- if (first_path_separator(config_file) != NULL) {
- return false;
- }
+ int file_length = strlen(config_file) + 1;
- struct stat st;
-
- if (stat(config_file, &st) == 0) {
- return false;
+ /* If a full path specified, use it */
+ if (first_path_separator(config_file) != NULL) {
+ if (file_length > max_path) {
+ return false;
+ }
+ bstrncpy(full_path, config_file, file_length);
+ return true;
}
+ /* config_file is default file name, now find default dir */
const char *config_dir = get_default_configdir();
int dir_length = strlen(config_dir);
- int file_length = strlen(config_file);
- if ((dir_length + 1 + file_length + 1) > max_path) {
+ if ((dir_length + 1 + file_length) > max_path) {
return false;
}
full_path[dir_length++] = '/';
}
- memcpy(&full_path[dir_length], config_file, file_length + 1);
+ memcpy(&full_path[dir_length], config_file, file_length);
return true;
}
return res;
}
+
+#ifdef xxx
void free_config_resources()
{
for (int i=r_first; i<=r_last; i++) {
}
}
-#ifdef xxx
RES **save_config_resources()
{
int num = r_last - r_first + 1;