1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-12 20:58:37 +03:00

vfs_xattr_tdb: add a module config

BUG: https://bugzilla.samba.org/show_bug.cgi?id=15126
MR: https://gitlab.com/samba-team/samba/-/merge_requests/2643

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
(cherry picked from commit 451ad315a9bf32c627e1966ec30185542701c87e)
This commit is contained in:
Ralph Boehme 2022-07-27 11:59:54 +02:00 committed by Jule Anger
parent 6d8a013942
commit a3795100e4

View File

@ -29,7 +29,12 @@
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_VFS
static bool xattr_tdb_init(int snum, TALLOC_CTX *mem_ctx, struct db_context **p_db);
struct xattr_tdb_config {
struct db_context *db;
};
static bool xattr_tdb_init(struct vfs_handle_struct *handle,
struct xattr_tdb_config **_config);
static int xattr_tdb_get_file_id(struct vfs_handle_struct *handle,
const char *path, struct file_id *id)
@ -77,16 +82,20 @@ static struct tevent_req *xattr_tdb_getxattrat_send(
const char *xattr_name,
size_t alloc_hint)
{
struct xattr_tdb_config *config = NULL;
struct tevent_req *req = NULL;
struct xattr_tdb_getxattrat_state *state = NULL;
struct smb_filename *cwd = NULL;
struct db_context *db = NULL;
struct file_id id;
int ret;
int error;
int cwd_ret;
DATA_BLOB xattr_blob;
if (!xattr_tdb_init(handle, &config)) {
return NULL;
}
req = tevent_req_create(mem_ctx, &state,
struct xattr_tdb_getxattrat_state);
if (req == NULL) {
@ -94,11 +103,6 @@ static struct tevent_req *xattr_tdb_getxattrat_send(
}
state->xattr_size = -1;
SMB_VFS_HANDLE_GET_DATA(handle, db, struct db_context,
if (!xattr_tdb_init(-1, state, &db)) {
tevent_req_error(req, EIO);
return tevent_req_post(req, ev);
});
cwd = SMB_VFS_GETWD(dir_fsp->conn, state);
if (tevent_req_nomem(cwd, req)) {
@ -122,7 +126,7 @@ static struct tevent_req *xattr_tdb_getxattrat_send(
return tevent_req_post(req, ev);
}
state->xattr_size = xattr_tdb_getattr(db,
state->xattr_size = xattr_tdb_getattr(config->db,
state,
&id,
xattr_name,
@ -194,27 +198,27 @@ static ssize_t xattr_tdb_fgetxattr(struct vfs_handle_struct *handle,
struct files_struct *fsp,
const char *name, void *value, size_t size)
{
struct xattr_tdb_config *config = NULL;
SMB_STRUCT_STAT sbuf;
struct file_id id;
struct db_context *db;
ssize_t xattr_size;
DATA_BLOB blob;
TALLOC_CTX *frame = talloc_stackframe();
TALLOC_CTX *frame = NULL;
SMB_VFS_HANDLE_GET_DATA(handle, db, struct db_context,
if (!xattr_tdb_init(-1, frame, &db))
{
TALLOC_FREE(frame); return -1;
});
if (SMB_VFS_NEXT_FSTAT(handle, fsp, &sbuf) == -1) {
TALLOC_FREE(frame);
if (!xattr_tdb_init(handle, &config)) {
return -1;
}
if (SMB_VFS_NEXT_FSTAT(handle, fsp, &sbuf) == -1) {
return -1;
}
frame = talloc_stackframe();
id = SMB_VFS_NEXT_FILE_ID_CREATE(handle, &sbuf);
xattr_size = xattr_tdb_getattr(db, frame, &id, name, &blob);
xattr_size = xattr_tdb_getattr(config->db, frame, &id, name, &blob);
if (xattr_size < 0) {
errno = ENOATTR;
TALLOC_FREE(frame);
@ -241,27 +245,22 @@ static int xattr_tdb_fsetxattr(struct vfs_handle_struct *handle,
const char *name, const void *value,
size_t size, int flags)
{
struct xattr_tdb_config *config = NULL;
SMB_STRUCT_STAT sbuf;
struct file_id id;
struct db_context *db;
int ret;
TALLOC_CTX *frame = talloc_stackframe();
SMB_VFS_HANDLE_GET_DATA(handle, db, struct db_context,
if (!xattr_tdb_init(-1, frame, &db))
{
TALLOC_FREE(frame); return -1;
});
if (!xattr_tdb_init(handle, &config)) {
return -1;
}
if (SMB_VFS_NEXT_FSTAT(handle, fsp, &sbuf) == -1) {
TALLOC_FREE(frame);
return -1;
}
id = SMB_VFS_NEXT_FILE_ID_CREATE(handle, &sbuf);
ret = xattr_tdb_setattr(db, &id, name, value, size, flags);
TALLOC_FREE(frame);
ret = xattr_tdb_setattr(config->db, &id, name, value, size, flags);
return ret;
}
@ -270,105 +269,120 @@ static ssize_t xattr_tdb_flistxattr(struct vfs_handle_struct *handle,
struct files_struct *fsp, char *list,
size_t size)
{
struct xattr_tdb_config *config = NULL;
SMB_STRUCT_STAT sbuf;
struct file_id id;
struct db_context *db;
int ret;
TALLOC_CTX *frame = talloc_stackframe();
SMB_VFS_HANDLE_GET_DATA(handle, db, struct db_context,
if (!xattr_tdb_init(-1, frame, &db))
{
TALLOC_FREE(frame); return -1;
});
if (!xattr_tdb_init(handle, &config)) {
return -1;
}
if (SMB_VFS_NEXT_FSTAT(handle, fsp, &sbuf) == -1) {
TALLOC_FREE(frame);
return -1;
}
id = SMB_VFS_NEXT_FILE_ID_CREATE(handle, &sbuf);
ret = xattr_tdb_listattr(db, &id, list, size);
TALLOC_FREE(frame);
return ret;
return xattr_tdb_listattr(config->db, &id, list, size);
}
static int xattr_tdb_fremovexattr(struct vfs_handle_struct *handle,
struct files_struct *fsp, const char *name)
{
struct xattr_tdb_config *config = NULL;
SMB_STRUCT_STAT sbuf;
struct file_id id;
struct db_context *db;
int ret;
TALLOC_CTX *frame = talloc_stackframe();
SMB_VFS_HANDLE_GET_DATA(handle, db, struct db_context,
if (!xattr_tdb_init(-1, frame, &db))
{
TALLOC_FREE(frame); return -1;
});
if (!xattr_tdb_init(handle, &config)) {
return -1;
}
if (SMB_VFS_NEXT_FSTAT(handle, fsp, &sbuf) == -1) {
TALLOC_FREE(frame);
return -1;
}
id = SMB_VFS_NEXT_FILE_ID_CREATE(handle, &sbuf);
ret = xattr_tdb_removeattr(db, &id, name);
TALLOC_FREE(frame);
return ret;
return xattr_tdb_removeattr(config->db, &id, name);
}
/*
* Destructor for the VFS private data
*/
static void close_xattr_db(void **data)
static void config_destructor(void **data)
{
struct db_context **p_db = (struct db_context **)data;
TALLOC_FREE(*p_db);
struct xattr_tdb_config **config = (struct xattr_tdb_config **)data;
TALLOC_FREE((*config)->db);
}
/*
* Open the tdb file upon VFS_CONNECT
*/
static bool xattr_tdb_init(int snum, TALLOC_CTX *mem_ctx, struct db_context **p_db)
static bool xattr_tdb_init(struct vfs_handle_struct *handle,
struct xattr_tdb_config **_config)
{
struct db_context *db;
struct xattr_tdb_config *config = NULL;
const char *dbname;
char *def_dbname;
if (SMB_VFS_HANDLE_TEST_DATA(handle)) {
SMB_VFS_HANDLE_GET_DATA(handle, config, struct xattr_tdb_config,
return false);
if (_config != NULL) {
*_config = config;
}
return true;
}
config = talloc_zero(handle->conn, struct xattr_tdb_config);
if (config == NULL) {
errno = ENOMEM;
goto error;
}
def_dbname = state_path(talloc_tos(), "xattr.tdb");
if (def_dbname == NULL) {
errno = ENOSYS;
return false;
goto error;
}
dbname = lp_parm_const_string(snum, "xattr_tdb", "file", def_dbname);
dbname = lp_parm_const_string(SNUM(handle->conn),
"xattr_tdb",
"file",
def_dbname);
/* now we know dbname is not NULL */
become_root();
db = db_open(NULL, dbname, 0, TDB_DEFAULT, O_RDWR|O_CREAT, 0600,
DBWRAP_LOCK_ORDER_2, DBWRAP_FLAG_NONE);
config->db = db_open(handle, dbname, 0, TDB_DEFAULT, O_RDWR|O_CREAT, 0600,
DBWRAP_LOCK_ORDER_2, DBWRAP_FLAG_NONE);
unbecome_root();
if (db == NULL) {
if (config->db == NULL) {
#if defined(ENOTSUP)
errno = ENOTSUP;
#else
errno = ENOSYS;
#endif
TALLOC_FREE(def_dbname);
return false;
goto error;
}
*p_db = db;
TALLOC_FREE(def_dbname);
SMB_VFS_HANDLE_SET_DATA(handle, config, config_destructor,
struct xattr_tdb_config, return false);
if (_config != NULL) {
*_config = config;
}
return true;
error:
DBG_WARNING("Failed to initialize config: %s\n", strerror(errno));
lp_do_parameter(SNUM(handle->conn), "ea support", "False");
return false;
}
static int xattr_tdb_openat(struct vfs_handle_struct *handle,
@ -378,12 +392,15 @@ static int xattr_tdb_openat(struct vfs_handle_struct *handle,
int flags,
mode_t mode)
{
struct db_context *db = NULL;
TALLOC_CTX *frame = NULL;
struct xattr_tdb_config *config = NULL;
SMB_STRUCT_STAT sbuf;
int fd;
int ret;
if (!xattr_tdb_init(handle, &config)) {
return -1;
}
fd = SMB_VFS_NEXT_OPENAT(handle,
dirfsp,
smb_fname,
@ -417,17 +434,8 @@ static int xattr_tdb_openat(struct vfs_handle_struct *handle,
fsp->file_id = SMB_VFS_FILE_ID_CREATE(fsp->conn, &sbuf);
frame = talloc_stackframe();
xattr_tdb_remove_all_attrs(config->db, &fsp->file_id);
SMB_VFS_HANDLE_GET_DATA(handle, db, struct db_context,
if (!xattr_tdb_init(-1, frame, &db))
{
TALLOC_FREE(frame); return -1;
});
xattr_tdb_remove_all_attrs(db, &fsp->file_id);
TALLOC_FREE(frame);
return fd;
}
@ -436,12 +444,16 @@ static int xattr_tdb_mkdirat(vfs_handle_struct *handle,
const struct smb_filename *smb_fname,
mode_t mode)
{
struct db_context *db = NULL;
struct xattr_tdb_config *config = NULL;
TALLOC_CTX *frame = NULL;
struct file_id fileid;
int ret;
struct smb_filename *full_fname = NULL;
if (!xattr_tdb_init(handle, &config)) {
return -1;
}
ret = SMB_VFS_NEXT_MKDIRAT(handle,
dirfsp,
smb_fname,
@ -475,13 +487,7 @@ static int xattr_tdb_mkdirat(vfs_handle_struct *handle,
fileid = SMB_VFS_FILE_ID_CREATE(handle->conn, &full_fname->st);
SMB_VFS_HANDLE_GET_DATA(handle, db, struct db_context,
if (!xattr_tdb_init(-1, frame, &db))
{
TALLOC_FREE(frame); return -1;
});
xattr_tdb_remove_all_attrs(db, &fileid);
xattr_tdb_remove_all_attrs(config->db, &fileid);
TALLOC_FREE(frame);
return 0;
}
@ -494,19 +500,19 @@ static int xattr_tdb_unlinkat(vfs_handle_struct *handle,
const struct smb_filename *smb_fname,
int flags)
{
struct xattr_tdb_config *config = NULL;
struct smb_filename *smb_fname_tmp = NULL;
struct smb_filename *full_fname = NULL;
struct file_id id;
struct db_context *db;
int ret = -1;
bool remove_record = false;
TALLOC_CTX *frame = talloc_stackframe();
TALLOC_CTX *frame = NULL;
SMB_VFS_HANDLE_GET_DATA(handle, db, struct db_context,
if (!xattr_tdb_init(-1, frame, &db))
{
TALLOC_FREE(frame); return -1;
});
if (!xattr_tdb_init(handle, &config)) {
return -1;
}
frame = talloc_stackframe();
smb_fname_tmp = cp_smb_filename(frame, smb_fname);
if (smb_fname_tmp == NULL) {
@ -571,7 +577,7 @@ static int xattr_tdb_unlinkat(vfs_handle_struct *handle,
id = SMB_VFS_NEXT_FILE_ID_CREATE(handle, &smb_fname_tmp->st);
xattr_tdb_remove_all_attrs(db, &id);
xattr_tdb_remove_all_attrs(config->db, &id);
out:
TALLOC_FREE(frame);
@ -583,7 +589,6 @@ static int xattr_tdb_connect(vfs_handle_struct *handle, const char *service,
{
char *sname = NULL;
int res, snum;
struct db_context *db;
res = SMB_VFS_NEXT_CONNECT(handle, service, user);
if (res < 0) {
@ -598,7 +603,7 @@ static int xattr_tdb_connect(vfs_handle_struct *handle, const char *service,
return 0;
}
if (!xattr_tdb_init(snum, NULL, &db)) {
if (!xattr_tdb_init(handle, NULL)) {
DEBUG(5, ("Could not init xattr tdb\n"));
lp_do_parameter(snum, "ea support", "False");
return 0;
@ -606,9 +611,6 @@ static int xattr_tdb_connect(vfs_handle_struct *handle, const char *service,
lp_do_parameter(snum, "ea support", "True");
SMB_VFS_HANDLE_SET_DATA(handle, db, close_xattr_db,
struct db_context, return -1);
return 0;
}