void frrstr_filter_vec(vector v, regex_t *filter) { regmatch_t ignored[1]; for (unsigned int i = 0; i < vector_active(v); i++) { if (regexec(filter, vector_slot(v, i), 0, ignored, 0)) { XFREE(MTYPE_TMP, vector_slot(v, i)); vector_unset(v, i); } } }
/* Delete interface from stp_enable_if. */ static int stp_enable_if_delete (const char *ifname) { int index; char *str; index = stp_enable_if_lookup (ifname); if (index < 0) return -1; str = vector_slot (stp_enable_interface, index); free (str); vector_unset (stp_enable_interface, index); return 1; }
static int ripng_passive_interface_unset (struct vty *vty, const char *ifname) { int i; char *str; i = ripng_passive_interface_lookup (ifname); if (i < 0) return CMD_WARNING; str = vector_slot (Vripng_passive_interface, i); free (str); vector_unset (Vripng_passive_interface, i); ripng_passive_interface_apply_all (); return CMD_SUCCESS; }
/* Delete interface from ripng_enable_if. */ static int ripng_enable_if_delete (const char *ifname) { int index; char *str; index = ripng_enable_if_lookup (ifname); if (index < 0) return -1; str = vector_slot (ripng_enable_if, index); free (str); vector_unset (ripng_enable_if, index); ripng_enable_apply_all(); return 1; }
static void process_stream(vector_t *keywords_vec, int need_bob) { unsigned int i; keyword_t *keyword_vec; char *str; char *buf; vector_t *strvec; vector_t *prev_keywords = current_keywords; current_keywords = keywords_vec; int bob_needed = 0; size_t config_id_len = 0; char *buf_start; if (config_id) config_id_len = strlen(config_id); buf = MALLOC(MAXBUF); while (read_line(buf, MAXBUF)) { if (buf[0] == '@') { /* If the line starts '@', check the following word matches the system id */ if (!config_id) continue; buf_start = strpbrk(buf, " \t"); if ((size_t)(buf_start - (buf + 1)) != config_id_len || strncmp(buf + 1, config_id, config_id_len)) continue; } else buf_start = buf; strvec = alloc_strvec(buf_start); memset(buf, 0, MAXBUF); if (!strvec) continue; str = vector_slot(strvec, 0); if (skip_sublevel == -1) { /* There wasn't a '{' on the keyword line */ if (!strcmp(str, BOB)) { /* We've got the opening '{' now */ skip_sublevel = 1; free_strvec(strvec); continue; } else { /* The skipped keyword doesn't have a {} block, so we no longer want to skip */ skip_sublevel = 0; } } if (skip_sublevel) { for (i = 0; i < vector_size(strvec); i++) { str = vector_slot(strvec,i); if (!strcmp(str,BOB)) skip_sublevel++; else if (!strcmp(str,EOB)) { if (--skip_sublevel == 0) break; } } free_strvec(strvec); continue; } if (need_bob) { need_bob = 0; if (!strcmp(str, BOB) && kw_level > 0) { free_strvec(strvec); continue; } else log_message(LOG_INFO, "Missing '{' at beginning of configuration block"); } else if (!strcmp(str, BOB)) { log_message(LOG_INFO, "Unexpected '{' - ignoring"); free_strvec(strvec); continue; } if (!strcmp(str, EOB) && kw_level > 0) { free_strvec(strvec); break; } for (i = 0; i < vector_size(keywords_vec); i++) { keyword_vec = vector_slot(keywords_vec, i); if (!strcmp(keyword_vec->string, str)) { if (!keyword_vec->active) { if (!strcmp(vector_slot(strvec, vector_size(strvec)-1), BOB)) skip_sublevel = 1; else skip_sublevel = -1; } /* There is an inconsistency here. 'static_ipaddress' for example * does not have sub levels, but needs a '{' */ if (keyword_vec->sub) { /* Remove a trailing '{' */ char *bob = vector_slot(strvec, vector_size(strvec)-1) ; if (!strcmp(bob, BOB)) { vector_unset(strvec, vector_size(strvec)-1); FREE(bob); bob_needed = 0; } else bob_needed = 1; } if (keyword_vec->handler) (*keyword_vec->handler) (strvec); if (keyword_vec->sub) { kw_level++; process_stream(keyword_vec->sub, bob_needed); kw_level--; if (keyword_vec->active && keyword_vec->sub_close_handler) (*keyword_vec->sub_close_handler) (); } break; } } if (i >= vector_size(keywords_vec)) log_message(LOG_INFO, "Unknown keyword '%s'", str ); free_strvec(strvec); } current_keywords = prev_keywords; FREE(buf); return; }
void cnode_child_delete(struct cnode *parent, struct cnode *child) { vector_unset(parent->v, child); }