Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
		}
	}
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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()