Пример #1
0
int dbfs_aopen(struct mangoo_store *storep, const char *locator, struct mangoo_handle **mhpp)
{
	int error;
	struct dbfs_handle *dh;
	struct dbfs_store *dsp = (struct dbfs_store *)storep;

	printf("dbfs_aopen:1\n");
	if (!(dh = dbfs_createhandle(locator, dsp->dbp))) {
		error = ENOMEM;
		goto errout;
	}

	printf("dbfs_aopen:2\n");
	dh->mh.mh_interface = mangoo_attr_interface;
	dh->mh.mh_fvector = (void *)&dbfs_attr_ops;
	
	if ((error = dbfs_read_attr(dsp->dbp, dh->attr_ddk, dbfs_ddk_size(locator),
		&dh->attr_ddd))) {
		goto errout;
	}
	printf("dbfs_aopen:3\n");

	*mhpp = (struct mangoo_handle *)dh;

	return 0;

errout:
	return error;
}
Пример #2
0
int dbfs_write_attr(DB *dbp, struct dbfs_dentry_key *attr_ddk, struct dbfs_dentry_data *attr_ddd)
{
	int error;
	DBT key, data;

	attr_ddk->ddk_dk.dk_type = kt_dentry;

	memset(&key, 0, sizeof(DBT));
	key.data = attr_ddk;
	key.size = dbfs_ddk_size(attr_ddk->ddk_path);

	memset(&data, 0, sizeof(DBT));
	data.data = attr_ddd;
	data.size = sizeof(*attr_ddd);

	if ((error = dbp->put(dbp, NULL, &key, &data, 0))) {
		dbp->err(dbp, error, "Can't update attribute record for %s\n", attr_ddk->ddk_path);
		error = EINVAL;
		goto errout;
	}
	return 0;

errout:
	return error;
}
Пример #3
0
int dbfs_stat(DB *dbp, const char *locator, struct stat *stbuf)
{
	struct dbfs_dentry_key *ddk;
	struct dbfs_dentry_data ddd;
	int ddk_size;
	uint32_t ddd_type;
	uint64_t ino;
	int type;

	int error;

	printf("dbfs_stat:1 %s\n", locator);
	ddk_size = dbfs_ddk_size(locator);
	if (!(ddk = malloc(ddk_size))) {
		error = ENOMEM;
		goto errout;
	}
	ddk->ddk_dk.dk_type = kt_dentry;
	strcpy(ddk->ddk_path, locator);

	if ((error = dbfs_read_attr(dbp, ddk, ddk_size, &ddd))) {
		goto errout;
	}

	ino = ddd.ddd_ino;

	memset(stbuf, 0, sizeof(*stbuf));
	stbuf->st_ino = ino;

	/* Hardcoded for now */
	stbuf->st_uid = geteuid();
	stbuf->st_gid = getegid();
	stbuf->st_ctime = time(NULL);
	stbuf->st_mtime = time(NULL);
	stbuf->st_atime = time(NULL);
	stbuf->st_size = ddd.ddd_size;

	ddd_type = ddd.ddd_type;
	if (ddd_type == S_IFREG) {
		stbuf->st_mode = S_IFREG | 0444;
		stbuf->st_nlink = 1;
	} else if (ddd_type == S_IFDIR) {
		stbuf->st_mode = S_IFDIR | 0755;
		stbuf->st_nlink = 2;
	} else {
		error = EINVAL;
		goto errout;
	}

	printf("dbfs_stat:10\n");
	return 0;

errout:
	return error;
}
Пример #4
0
int main(int argc, const char *argv[])
{
	DB *dbp;
	int error;
	const char *progname = argv[0];
	const char *dbname = argv[1];
	int retval = 0;
	struct dbfs_fsinfo_data dfd;
	struct dbfs_dentry_key *ddk;
	struct dbfs_dentry_data ddd;
	size_t ddk_size;

	if (argc != 2) {
		fprintf(stderr, "Format: %s file name\n", progname);
		goto out1;
	}
	if ((error = db_create(&dbp, NULL, 0))) {
		fprintf(stderr, "%s: db_create failed", progname);	
		goto out1;
	}
	dbp->set_errfile(dbp, stderr);
	dbp->set_errpfx(dbp, progname);

	if ((error = dbp->set_bt_compare(dbp, dbfs_bt_compare))) {
		dbp->err(dbp, error, "%s: open failed", dbname);
		goto out1;
	}

	/* Create database */
	if ((error = dbp->open(dbp,
	    NULL, dbname, NULL, DB_BTREE, DB_CREATE | DB_EXCL | DB_THREAD, 0664))) {
		dbp->err(dbp, error, "open: %s", dbname);
		goto out1;
	}

	ddk_size = dbfs_ddk_size("/");
	if (!(ddk = malloc(ddk_size))) {
		goto out2;
	}

	dbfs_init_dentry_key("/", ddk);

	if ((error = dbfs_create_attr(dbp, ddk, ddk_size, &ddd, mangoo_container, 
		S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH, DBFS_ROOT_INO))) {
		goto out2;
	}

	dfd.dfd_lastino = DBFS_ROOT_INO;

	if ((error = dbfs_create_fsinfo(dbp, &dfd)))
		goto out2;

	printf("dbfs created successfully.\n");

out2:
	if ((dbp->close(dbp, 0))) {
		fprintf(stderr, "%s: close failed", progname);	
	}

out1:
	return retval;
}