struct rx_node *rx_parse_tok(struct dm_pool *mem, const char *begin, const char *end) { struct rx_node *r; struct parse_sp *ps = dm_pool_zalloc(mem, sizeof(*ps)); if (!ps) return_NULL; ps->mem = mem; if (!(ps->charset = dm_bitset_create(mem, 256))) { log_error("Regex charset allocation failed"); dm_pool_free(mem, ps); return NULL; } ps->cursor = begin; ps->rx_end = end; _rx_get_token(ps); /* load the first token */ if (!(r = _or_term(ps))) { log_error("Parse error in regex"); dm_pool_free(mem, ps); return NULL; } if (!(r = _optimise(mem, r))) { log_error("Regex optimisation error"); dm_pool_free(mem, ps); return NULL; } return r; }
static struct rx_node *_node(struct dm_pool *mem, int type, struct rx_node *l, struct rx_node *r) { struct rx_node *n = dm_pool_zalloc(mem, sizeof(*n)); if (n) { if (!(n->charset = dm_bitset_create(mem, 256))) { dm_pool_free(mem, n); return NULL; } n->type = type; n->left = l; n->right = r; } return n; }
/* * FIXME Update bitset in long-running process if dm claims new major numbers. */ static int _create_dm_bitset(void) { #ifdef DM_IOCTLS struct utsname uts; if (_dm_bitset || _dm_device_major) return 1; if (uname(&uts)) return 0; /* * 2.6 kernels are limited to one major number. * Assume 2.4 kernels are patched not to. * FIXME Check _dm_version and _dm_version_minor if 2.6 changes this. */ if (!strncmp(uts.release, "2.6.", 4)) _dm_multiple_major_support = 0; if (!_dm_multiple_major_support) { if (!_get_proc_number(PROC_DEVICES, DM_NAME, &_dm_device_major)) return 0; return 1; } /* Multiple major numbers supported */ if (!(_dm_bitset = dm_bitset_create(NULL, NUMBER_OF_MAJORS))) return 0; if (!_get_proc_number(PROC_DEVICES, DM_NAME, NULL)) { dm_bitset_destroy(_dm_bitset); _dm_bitset = NULL; return 0; } return 1; #else return 0; #endif }