From: Jeremy Allison Date: Thu, 5 Sep 2019 18:09:40 +0000 (-0700) Subject: s3: VFS: vfs_xattr_tdb. Implement mkdirat(). X-Git-Tag: talloc-2.3.1~891 X-Git-Url: http://git.samba.org/?a=commitdiff_plain;h=a799866f2b4e7c38b09140af47ad165172aaf544;p=samba.git s3: VFS: vfs_xattr_tdb. Implement mkdirat(). Currently identical to mkdir(). Signed-off-by: Jeremy Allison Reviewed-by: Ralph Boehme --- diff --git a/source3/modules/vfs_xattr_tdb.c b/source3/modules/vfs_xattr_tdb.c index 037c4045632..3841627b904 100644 --- a/source3/modules/vfs_xattr_tdb.c +++ b/source3/modules/vfs_xattr_tdb.c @@ -586,6 +586,59 @@ static int xattr_tdb_mkdir(vfs_handle_struct *handle, return 0; } +static int xattr_tdb_mkdirat(vfs_handle_struct *handle, + struct files_struct *dirfsp, + const struct smb_filename *smb_fname, + mode_t mode) +{ + struct db_context *db = NULL; + TALLOC_CTX *frame = NULL; + struct file_id fileid; + int ret; + struct smb_filename *smb_fname_tmp = NULL; + + ret = SMB_VFS_NEXT_MKDIRAT(handle, + dirfsp, + smb_fname, + mode); + if (ret < 0) { + return ret; + } + + frame = talloc_stackframe(); + smb_fname_tmp = cp_smb_filename(frame, smb_fname); + if (smb_fname_tmp == NULL) { + TALLOC_FREE(frame); + errno = ENOMEM; + return -1; + } + + /* Always use LSTAT here - we just creaded the directory. */ + ret = SMB_VFS_LSTAT(handle->conn, smb_fname_tmp); + if (ret == -1) { + /* Rename race. Let upper level take care of it. */ + TALLOC_FREE(frame); + return -1; + } + if (!S_ISDIR(smb_fname_tmp->st.st_ex_mode)) { + /* Rename race. Let upper level take care of it. */ + TALLOC_FREE(frame); + return -1; + } + + fileid = SMB_VFS_FILE_ID_CREATE(handle->conn, &smb_fname_tmp->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); + TALLOC_FREE(frame); + return 0; +} + /* * On unlink we need to delete the tdb record */ @@ -742,6 +795,7 @@ static struct vfs_fn_pointers vfs_xattr_tdb_fns = { .fremovexattr_fn = xattr_tdb_fremovexattr, .open_fn = xattr_tdb_open, .mkdir_fn = xattr_tdb_mkdir, + .mkdirat_fn = xattr_tdb_mkdirat, .unlink_fn = xattr_tdb_unlink, .rmdir_fn = xattr_tdb_rmdir, .connect_fn = xattr_tdb_connect,