const struct smb_filename *new_smb_fname)
{
char *link_target = NULL;
+ struct smb_filename target_fname;
TALLOC_CTX *ctx = talloc_tos();
+ NTSTATUS status;
int ret;
/* Set a symbolic link. */
return NT_STATUS_INVALID_PARAMETER;
}
+ target_fname = (struct smb_filename) {
+ .base_name = link_target,
+ };
+
+ /* Removes @GMT tokens if any */
+ status = canonicalize_snapshot_path(&target_fname, 0);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
DEBUG(10,("smb_set_file_unix_link: SMB_SET_FILE_UNIX_LINK doing symlink %s -> %s\n",
new_smb_fname->base_name, link_target ));
ret = SMB_VFS_SYMLINKAT(conn,
- link_target,
+ target_fname.base_name,
conn->cwd_fsp,
new_smb_fname);
if (ret != 0) {
static NTSTATUS cmd_symlink(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv)
{
int ret;
+ char *target = NULL;
+ struct smb_filename target_fname;
struct smb_filename *new_smb_fname = NULL;
+ NTSTATUS status;
if (argc != 3) {
printf("Usage: symlink <path> <link>\n");
if (new_smb_fname == NULL) {
return NT_STATUS_NO_MEMORY;
}
+
+ target = talloc_strdup(mem_ctx, argv[1]);
+ if (target == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ target_fname = (struct smb_filename) {
+ .base_name = target,
+ };
+
+ /* Removes @GMT tokens if any */
+ status = canonicalize_snapshot_path(&target_fname, 0);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
ret = SMB_VFS_SYMLINKAT(vfs->conn,
- argv[1],
+ target_fname.base_name,
vfs->conn->cwd_fsp,
new_smb_fname);
if (ret == -1) {