static int zdb_dat_scan_path(ZDB *db, const char *path, int (*walk_fn)(ZDB_DAT_STORE *store)) { const char *myname = "zdb_dat_scan_path"; ZDB_DAT_STORE *store; ACL_SCAN_DIR *scan; const char *fname; char pathbuf[256]; int ret = 0; scan = acl_scan_dir_open(path, 1); if (scan == NULL) { acl_msg_error("%s(%d): open dir %s error(%s)", myname, __LINE__, path, acl_last_serror()); return (-1); } while (1) { fname = acl_scan_dir_next_file(scan); if (fname == NULL) { acl_msg_info("%s(%d): scan over for %s", myname, __LINE__, path); break; } if (strrncasecmp(fname, ".dat", 4) != 0) { acl_msg_info("%s(%d): skip %s/%s", myname, __LINE__, acl_scan_dir_path(scan), fname); continue; } snprintf(pathbuf, sizeof(pathbuf), "%s/%s", acl_scan_dir_path(scan), fname); store = zdb_dat_store_open(db, pathbuf); if (store == NULL) { acl_msg_error("%s(%d): open file(%s) error(%s)", myname, __LINE__, pathbuf, acl_last_serror()); break; } ret = walk_fn(store); zdb_dat_store_close(store); if (ret < 0) { acl_msg_error("%s(%d): walk_fn ret: %d, break", myname, __LINE__, ret); break; } } acl_scan_dir_close(scan); return (ret); }
void acl_token_tree_walk(const ACL_TOKEN *token_tree, void (*walk_fn)(const ACL_TOKEN*, void*), void *arg) { int i; if ((token_tree->flag & ACL_TOKEN_F_STOP)) walk_fn(token_tree, arg); for (i = 0; i < ACL_TOKEN_WIDTH; i++) { if (token_tree->tokens[i]) { acl_token_tree_walk(token_tree->tokens[i], walk_fn, arg); } } }
int zdb_key_walk(ZDB *db, int (*walk_fn)(ZDB_KEY_STORE*)) { const char *myname = "zdb_key_walk"; ZDB_KEY_STORE *store; ACL_SCAN_DIR *scan = NULL; const char *fname; char pathbuf[256]; int ret = 0; scan = acl_scan_dir_open(db->key_path, 1); if (scan == NULL) { acl_msg_error("%s: open dir %s error(%s)", myname, db->key_path, acl_last_serror()); return (-1); } while (1) { fname = acl_scan_dir_next_file(scan); if (fname == NULL) { acl_msg_info("%s: scan over for %s\n", myname, db->key_path); break; } if (strrncasecmp(fname, ".key", 4) != 0) { acl_msg_info("%s: skip %s/%s\n", myname, acl_scan_dir_path(scan), fname); continue; } snprintf(pathbuf, sizeof(pathbuf), "%s/%s", acl_scan_dir_path(scan), fname); store = zdb_key_store_open2(db, pathbuf); if (store == NULL) { acl_msg_error("%s: open file(%s) error(%s)", myname, pathbuf, acl_last_serror()); ret = -1; break; } ret = walk_fn(store); zdb_key_store_close(store); if (ret < 0) break; } acl_scan_dir_close(scan); return (ret); }
std_rt_head * std_radix_versionwalk(std_rt_table *rtt, std_rt_head *rth, int (* walk_fn)(std_rt_head *, va_list ap), int cnt, std_radix_version_t min_ver, std_radix_version_t max_ver, ...) { int dir; rt_node *y; va_list ap; u_long lcnt; rt_node *rtn; std_rt_head *t_rth; RDX_DEBUG_START(rtt); RDX_DEBUG_END; if (!cnt) lcnt = 0xffffffff; else lcnt = (u_long) cnt; if (!rth) dir = RDX_WALKDOWN, rtn = rtt->rtt_root; else { rtn = rth->rth_rtn; if (!rtn) return (std_rt_head *)0; dir = RDX_WALKRIGHT; } while (lcnt && rtn) { switch (dir) { case RDX_WALKDOWN: if (rtn->rtn_version < min_ver) { dir = RDX_WALKUP; continue; } if (rtn->rtn_rth && walk_fn) { t_rth = rtn->rtn_rth; if (t_rth->rth_version >= min_ver && t_rth->rth_version <= max_ver) { lcnt--; RN_LOCK(rtn); va_start(ap, max_ver); if (walk_fn(t_rth, ap)) { lcnt = 0; } va_end(ap); RN_UNLOCK(rtn); } } if (rtn->rtn_left) { rtn = rtn->rtn_left; } else { dir = RDX_WALKRIGHT; } continue; case RDX_WALKRIGHT: if (!rtn->rtn_right) { dir = RDX_WALKUP; } else { dir = RDX_WALKDOWN; rtn = rtn->rtn_right; } continue; case RDX_WALKUP: y = rtn; rtn = rtn->rtn_parent; if (!RN_IFLOCK(y) && RDX_TEST_BIT(y->rtn_flags,RDX_RN_DELE_BIT)) { rtn = _std_radix_remove(rtt, y, &dir); } else { if (rtn && y == rtn->rtn_left) { dir = RDX_WALKRIGHT; } else { dir = RDX_WALKUP; } } continue; default: RDX_ASSERT(0); } // switch } // while if (rtn) { y = rtn; do { if (!RN_IFLOCK(y) && RDX_TEST_BIT(y->rtn_flags, RDX_RN_DELE_BIT)) y = _std_radix_remove(rtt, y, &dir); else y = y->rtn_parent; } while (y); return rtn->rtn_rth; } return (std_rt_head *)0; } // std_radix_versionwalk()