mirror of
https://github.com/samba-team/samba.git
synced 2025-03-24 10:50:22 +03:00
s3: Change fsp->fsp_name to be an smb_filename struct!
This commit is contained in:
parent
635e5e7ff0
commit
5a8d70d465
@ -6365,9 +6365,12 @@ void file_sync_all(connection_struct *conn);
|
||||
void file_free(struct smb_request *req, files_struct *fsp);
|
||||
files_struct *file_fnum(uint16 fnum);
|
||||
files_struct *file_fsp(struct smb_request *req, uint16 fid);
|
||||
void dup_file_fsp(struct smb_request *req, files_struct *from,
|
||||
NTSTATUS dup_file_fsp(struct smb_request *req, files_struct *from,
|
||||
uint32 access_mask, uint32 share_access,
|
||||
uint32 create_options, files_struct *to);
|
||||
const char *fsp_str_dbg(const struct files_struct *fsp);
|
||||
NTSTATUS fsp_set_smb_fname(struct files_struct *fsp,
|
||||
const struct smb_filename *smb_fname_in);
|
||||
|
||||
/* The following definitions come from smbd/ipc.c */
|
||||
|
||||
|
@ -452,7 +452,7 @@ typedef struct files_struct {
|
||||
bool lockdb_clean;
|
||||
bool initial_delete_on_close; /* Only set at NTCreateX if file was created. */
|
||||
bool posix_open;
|
||||
char *fsp_name;
|
||||
struct smb_filename *fsp_name;
|
||||
|
||||
struct vfs_fsp_data *vfs_extension;
|
||||
struct fake_file_handle *fake_file_handle;
|
||||
|
@ -1196,7 +1196,7 @@ bool brl_locktest(struct byte_range_lock *br_lck,
|
||||
|
||||
DEBUG(10,("brl_locktest: posix start=%.0f len=%.0f %s for fnum %d file %s\n",
|
||||
(double)start, (double)size, ret ? "locked" : "unlocked",
|
||||
fsp->fnum, fsp->fsp_name ));
|
||||
fsp->fnum, fsp_str_dbg(fsp)));
|
||||
|
||||
/* We need to return the inverse of is_posix_locked. */
|
||||
ret = !ret;
|
||||
@ -1262,7 +1262,7 @@ NTSTATUS brl_lockquery(struct byte_range_lock *br_lck,
|
||||
|
||||
DEBUG(10,("brl_lockquery: posix start=%.0f len=%.0f %s for fnum %d file %s\n",
|
||||
(double)*pstart, (double)*psize, ret ? "locked" : "unlocked",
|
||||
fsp->fnum, fsp->fsp_name ));
|
||||
fsp->fnum, fsp_str_dbg(fsp)));
|
||||
|
||||
if (ret) {
|
||||
/* Hmmm. No clue what to set smbpid to - use -1. */
|
||||
|
@ -109,11 +109,11 @@ bool strict_lock_default(files_struct *fsp, struct lock_struct *plock)
|
||||
|
||||
if (strict_locking == Auto) {
|
||||
if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && (plock->lock_type == READ_LOCK || plock->lock_type == WRITE_LOCK)) {
|
||||
DEBUG(10,("is_locked: optimisation - exclusive oplock on file %s\n", fsp->fsp_name ));
|
||||
DEBUG(10,("is_locked: optimisation - exclusive oplock on file %s\n", fsp_str_dbg(fsp)));
|
||||
ret = True;
|
||||
} else if ((fsp->oplock_type == LEVEL_II_OPLOCK) &&
|
||||
(plock->lock_type == READ_LOCK)) {
|
||||
DEBUG(10,("is_locked: optimisation - level II oplock on file %s\n", fsp->fsp_name ));
|
||||
DEBUG(10,("is_locked: optimisation - level II oplock on file %s\n", fsp_str_dbg(fsp)));
|
||||
ret = True;
|
||||
} else {
|
||||
struct byte_range_lock *br_lck = brl_get_locks_readonly(talloc_tos(), fsp);
|
||||
@ -149,7 +149,7 @@ bool strict_lock_default(files_struct *fsp, struct lock_struct *plock)
|
||||
lock_flav_name(plock->lock_flav),
|
||||
(double)plock->start, (double)plock->size,
|
||||
ret ? "unlocked" : "locked",
|
||||
plock->fnum, fsp->fsp_name ));
|
||||
plock->fnum, fsp_str_dbg(fsp)));
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -259,7 +259,7 @@ struct byte_range_lock *do_lock(struct messaging_context *msg_ctx,
|
||||
"blocking_lock=%s requested for fnum %d file %s\n",
|
||||
lock_flav_name(lock_flav), lock_type_name(lock_type),
|
||||
(double)offset, (double)count, blocking_lock ? "true" :
|
||||
"false", fsp->fnum, fsp->fsp_name));
|
||||
"false", fsp->fnum, fsp_str_dbg(fsp)));
|
||||
|
||||
br_lck = brl_get_locks(talloc_tos(), fsp);
|
||||
if (!br_lck) {
|
||||
@ -308,7 +308,8 @@ NTSTATUS do_unlock(struct messaging_context *msg_ctx,
|
||||
}
|
||||
|
||||
DEBUG(10,("do_unlock: unlock start=%.0f len=%.0f requested for fnum %d file %s\n",
|
||||
(double)offset, (double)count, fsp->fnum, fsp->fsp_name ));
|
||||
(double)offset, (double)count, fsp->fnum,
|
||||
fsp_str_dbg(fsp)));
|
||||
|
||||
br_lck = brl_get_locks(talloc_tos(), fsp);
|
||||
if (!br_lck) {
|
||||
@ -358,7 +359,8 @@ NTSTATUS do_lock_cancel(files_struct *fsp,
|
||||
}
|
||||
|
||||
DEBUG(10,("do_lock_cancel: cancel start=%.0f len=%.0f requested for fnum %d file %s\n",
|
||||
(double)offset, (double)count, fsp->fnum, fsp->fsp_name ));
|
||||
(double)offset, (double)count, fsp->fnum,
|
||||
fsp_str_dbg(fsp)));
|
||||
|
||||
br_lck = brl_get_locks(talloc_tos(), fsp);
|
||||
if (!br_lck) {
|
||||
@ -1311,7 +1313,7 @@ NTSTATUS can_set_delete_on_close(files_struct *fsp, bool delete_on_close,
|
||||
!lp_delete_readonly(SNUM(fsp->conn))) {
|
||||
DEBUG(10,("can_set_delete_on_close: file %s delete on close "
|
||||
"flag set but file attribute is readonly.\n",
|
||||
fsp->fsp_name ));
|
||||
fsp_str_dbg(fsp)));
|
||||
return NT_STATUS_CANNOT_DELETE;
|
||||
}
|
||||
|
||||
@ -1322,7 +1324,7 @@ NTSTATUS can_set_delete_on_close(files_struct *fsp, bool delete_on_close,
|
||||
if (!CAN_WRITE(fsp->conn)) {
|
||||
DEBUG(10,("can_set_delete_on_close: file %s delete on "
|
||||
"close flag set but write access denied on share.\n",
|
||||
fsp->fsp_name ));
|
||||
fsp_str_dbg(fsp)));
|
||||
return NT_STATUS_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
@ -1334,13 +1336,15 @@ NTSTATUS can_set_delete_on_close(files_struct *fsp, bool delete_on_close,
|
||||
if (!(fsp->access_mask & DELETE_ACCESS)) {
|
||||
DEBUG(10,("can_set_delete_on_close: file %s delete on "
|
||||
"close flag set but delete access denied.\n",
|
||||
fsp->fsp_name ));
|
||||
fsp_str_dbg(fsp)));
|
||||
return NT_STATUS_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
/* Don't allow delete on close for non-empty directories. */
|
||||
if (fsp->is_directory) {
|
||||
return can_delete_directory(fsp->conn, fsp->fsp_name);
|
||||
SMB_ASSERT(!is_ntfs_stream_smb_fname(fsp->fsp_name));
|
||||
return can_delete_directory(fsp->conn,
|
||||
fsp->fsp_name->base_name);
|
||||
}
|
||||
|
||||
return NT_STATUS_OK;
|
||||
@ -1422,7 +1426,7 @@ bool set_delete_on_close(files_struct *fsp, bool delete_on_close, const UNIX_USE
|
||||
DEBUG(10,("set_delete_on_close: %s delete on close flag for "
|
||||
"fnum = %d, file %s\n",
|
||||
delete_on_close ? "Adding" : "Removing", fsp->fnum,
|
||||
fsp->fsp_name ));
|
||||
fsp_str_dbg(fsp)));
|
||||
|
||||
lck = get_share_mode_lock(talloc_tos(), fsp->file_id, NULL, NULL,
|
||||
NULL);
|
||||
@ -1443,7 +1447,8 @@ bool set_delete_on_close(files_struct *fsp, bool delete_on_close, const UNIX_USE
|
||||
set_delete_on_close_lck(lck, delete_on_close, tok);
|
||||
|
||||
if (fsp->is_directory) {
|
||||
send_stat_cache_delete_message(fsp->fsp_name);
|
||||
SMB_ASSERT(!is_ntfs_stream_smb_fname(fsp->fsp_name));
|
||||
send_stat_cache_delete_message(fsp->fsp_name->base_name);
|
||||
}
|
||||
|
||||
TALLOC_FREE(lck);
|
||||
|
@ -280,8 +280,9 @@ bool is_posix_locked(files_struct *fsp,
|
||||
SMB_OFF_T count;
|
||||
int posix_lock_type = map_posix_lock_type(fsp,*plock_type);
|
||||
|
||||
DEBUG(10,("is_posix_locked: File %s, offset = %.0f, count = %.0f, type = %s\n",
|
||||
fsp->fsp_name, (double)*pu_offset, (double)*pu_count, posix_lock_type_name(*plock_type) ));
|
||||
DEBUG(10,("is_posix_locked: File %s, offset = %.0f, count = %.0f, "
|
||||
"type = %s\n", fsp_str_dbg(fsp), (double)*pu_offset,
|
||||
(double)*pu_count, posix_lock_type_name(*plock_type)));
|
||||
|
||||
/*
|
||||
* If the requested lock won't fit in the POSIX range, we will
|
||||
@ -424,7 +425,7 @@ static void increment_windows_lock_ref_count(files_struct *fsp)
|
||||
TALLOC_FREE(rec);
|
||||
|
||||
DEBUG(10,("increment_windows_lock_ref_count for file now %s = %d\n",
|
||||
fsp->fsp_name, lock_ref_count ));
|
||||
fsp_str_dbg(fsp), lock_ref_count));
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -460,7 +461,7 @@ void reduce_windows_lock_ref_count(files_struct *fsp, unsigned int dcount)
|
||||
TALLOC_FREE(rec);
|
||||
|
||||
DEBUG(10,("reduce_windows_lock_ref_count for file now %s = %d\n",
|
||||
fsp->fsp_name, lock_ref_count ));
|
||||
fsp_str_dbg(fsp), lock_ref_count));
|
||||
}
|
||||
|
||||
static void decrement_windows_lock_ref_count(files_struct *fsp)
|
||||
@ -492,7 +493,7 @@ static int get_windows_lock_ref_count(files_struct *fsp)
|
||||
}
|
||||
|
||||
DEBUG(10,("get_windows_lock_count for file %s = %d\n",
|
||||
fsp->fsp_name, lock_ref_count ));
|
||||
fsp_str_dbg(fsp), lock_ref_count));
|
||||
|
||||
return lock_ref_count;
|
||||
}
|
||||
@ -518,7 +519,7 @@ static void delete_windows_lock_ref_count(files_struct *fsp)
|
||||
TALLOC_FREE(rec);
|
||||
|
||||
DEBUG(10,("delete_windows_lock_ref_count for file %s\n",
|
||||
fsp->fsp_name));
|
||||
fsp_str_dbg(fsp)));
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -555,7 +556,7 @@ static void add_fd_to_close_entry(files_struct *fsp)
|
||||
TALLOC_FREE(rec);
|
||||
|
||||
DEBUG(10,("add_fd_to_close_entry: added fd %d file %s\n",
|
||||
fsp->fh->fd, fsp->fsp_name ));
|
||||
fsp->fh->fd, fsp_str_dbg(fsp)));
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -945,8 +946,10 @@ bool set_posix_lock_windows_flavour(files_struct *fsp,
|
||||
struct lock_list *llist = NULL;
|
||||
struct lock_list *ll = NULL;
|
||||
|
||||
DEBUG(5,("set_posix_lock_windows_flavour: File %s, offset = %.0f, count = %.0f, type = %s\n",
|
||||
fsp->fsp_name, (double)u_offset, (double)u_count, posix_lock_type_name(lock_type) ));
|
||||
DEBUG(5,("set_posix_lock_windows_flavour: File %s, offset = %.0f, "
|
||||
"count = %.0f, type = %s\n", fsp_str_dbg(fsp),
|
||||
(double)u_offset, (double)u_count,
|
||||
posix_lock_type_name(lock_type)));
|
||||
|
||||
/*
|
||||
* If the requested lock won't fit in the POSIX range, we will
|
||||
@ -1079,8 +1082,9 @@ bool release_posix_lock_windows_flavour(files_struct *fsp,
|
||||
struct lock_list *ulist = NULL;
|
||||
struct lock_list *ul = NULL;
|
||||
|
||||
DEBUG(5,("release_posix_lock_windows_flavour: File %s, offset = %.0f, count = %.0f\n",
|
||||
fsp->fsp_name, (double)u_offset, (double)u_count ));
|
||||
DEBUG(5,("release_posix_lock_windows_flavour: File %s, offset = %.0f, "
|
||||
"count = %.0f\n", fsp_str_dbg(fsp),
|
||||
(double)u_offset, (double)u_count));
|
||||
|
||||
/* Remember the number of Windows locks we have on this dev/ino pair. */
|
||||
decrement_windows_lock_ref_count(fsp);
|
||||
@ -1197,8 +1201,10 @@ bool set_posix_lock_posix_flavour(files_struct *fsp,
|
||||
SMB_OFF_T count;
|
||||
int posix_lock_type = map_posix_lock_type(fsp,lock_type);
|
||||
|
||||
DEBUG(5,("set_posix_lock_posix_flavour: File %s, offset = %.0f, count = %.0f, type = %s\n",
|
||||
fsp->fsp_name, (double)u_offset, (double)u_count, posix_lock_type_name(lock_type) ));
|
||||
DEBUG(5,("set_posix_lock_posix_flavour: File %s, offset = %.0f, count "
|
||||
"= %.0f, type = %s\n", fsp_str_dbg(fsp),
|
||||
(double)u_offset, (double)u_count,
|
||||
posix_lock_type_name(lock_type)));
|
||||
|
||||
/*
|
||||
* If the requested lock won't fit in the POSIX range, we will
|
||||
@ -1241,8 +1247,9 @@ bool release_posix_lock_posix_flavour(files_struct *fsp,
|
||||
struct lock_list *ulist = NULL;
|
||||
struct lock_list *ul = NULL;
|
||||
|
||||
DEBUG(5,("release_posix_lock_posix_flavour: File %s, offset = %.0f, count = %.0f\n",
|
||||
fsp->fsp_name, (double)u_offset, (double)u_count ));
|
||||
DEBUG(5,("release_posix_lock_posix_flavour: File %s, offset = %.0f, "
|
||||
"count = %.0f\n", fsp_str_dbg(fsp),
|
||||
(double)u_offset, (double)u_count));
|
||||
|
||||
/*
|
||||
* If the requested lock won't fit in the POSIX range, we will
|
||||
|
@ -188,7 +188,7 @@ bool schedule_aio_read_and_X(connection_struct *conn,
|
||||
|
||||
DEBUG(10,("schedule_aio_read_and_X: scheduled aio_read for file %s, "
|
||||
"offset %.0f, len = %u (mid = %u)\n",
|
||||
fsp->fsp_name, (double)startpos, (unsigned int)smb_maxcnt,
|
||||
fsp_str_dbg(fsp), (double)startpos, (unsigned int)smb_maxcnt,
|
||||
(unsigned int)aio_ex->req->mid ));
|
||||
|
||||
outstanding_aio_calls++;
|
||||
@ -241,7 +241,7 @@ bool schedule_aio_write_and_X(connection_struct *conn,
|
||||
DEBUG(10,("schedule_aio_write_and_X: failed to schedule "
|
||||
"aio_write for file %s, offset %.0f, len = %u "
|
||||
"(mid = %u)\n",
|
||||
fsp->fsp_name, (double)startpos,
|
||||
fsp_str_dbg(fsp), (double)startpos,
|
||||
(unsigned int)numtowrite,
|
||||
(unsigned int)req->mid ));
|
||||
return False;
|
||||
@ -300,14 +300,14 @@ bool schedule_aio_write_and_X(connection_struct *conn,
|
||||
"failed.");
|
||||
}
|
||||
DEBUG(10,("schedule_aio_write_and_X: scheduled aio_write "
|
||||
"behind for file %s\n", fsp->fsp_name ));
|
||||
"behind for file %s\n", fsp_str_dbg(fsp)));
|
||||
}
|
||||
outstanding_aio_calls++;
|
||||
|
||||
DEBUG(10,("schedule_aio_write_and_X: scheduled aio_write for file "
|
||||
"%s, offset %.0f, len = %u (mid = %u) "
|
||||
"outstanding_aio_calls = %d\n",
|
||||
fsp->fsp_name, (double)startpos, (unsigned int)numtowrite,
|
||||
fsp_str_dbg(fsp), (double)startpos, (unsigned int)numtowrite,
|
||||
(unsigned int)aio_ex->req->mid, outstanding_aio_calls ));
|
||||
|
||||
return True;
|
||||
@ -341,7 +341,7 @@ static int handle_aio_read_complete(struct aio_extra *aio_ex)
|
||||
|
||||
DEBUG( 3,( "handle_aio_read_complete: file %s nread == -1. "
|
||||
"Error = %s\n",
|
||||
aio_ex->fsp->fsp_name, strerror(errno) ));
|
||||
fsp_str_dbg(aio_ex->fsp), strerror(errno)));
|
||||
|
||||
ret = errno;
|
||||
ERROR_NT(map_nt_error_from_unix(ret));
|
||||
@ -359,7 +359,7 @@ static int handle_aio_read_complete(struct aio_extra *aio_ex)
|
||||
|
||||
DEBUG( 3, ( "handle_aio_read_complete file %s max=%d "
|
||||
"nread=%d\n",
|
||||
aio_ex->fsp->fsp_name,
|
||||
fsp_str_dbg(aio_ex->fsp),
|
||||
(int)aio_ex->acb.aio_nbytes, (int)nread ) );
|
||||
|
||||
}
|
||||
@ -374,7 +374,7 @@ static int handle_aio_read_complete(struct aio_extra *aio_ex)
|
||||
|
||||
DEBUG(10,("handle_aio_read_complete: scheduled aio_read completed "
|
||||
"for file %s, offset %.0f, len = %u\n",
|
||||
aio_ex->fsp->fsp_name, (double)aio_ex->acb.aio_offset,
|
||||
fsp_str_dbg(aio_ex->fsp), (double)aio_ex->acb.aio_offset,
|
||||
(unsigned int)nread ));
|
||||
|
||||
return ret;
|
||||
@ -399,13 +399,13 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex)
|
||||
DEBUG(5,("handle_aio_write_complete: "
|
||||
"aio_write_behind failed ! File %s "
|
||||
"is corrupt ! Error %s\n",
|
||||
fsp->fsp_name, strerror(errno) ));
|
||||
fsp_str_dbg(fsp), strerror(errno)));
|
||||
ret = errno;
|
||||
} else {
|
||||
DEBUG(0,("handle_aio_write_complete: "
|
||||
"aio_write_behind failed ! File %s "
|
||||
"is corrupt ! Wanted %u bytes but "
|
||||
"only wrote %d\n", fsp->fsp_name,
|
||||
"only wrote %d\n", fsp_str_dbg(fsp),
|
||||
(unsigned int)numtowrite,
|
||||
(int)nwritten ));
|
||||
ret = EIO;
|
||||
@ -413,7 +413,7 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex)
|
||||
} else {
|
||||
DEBUG(10,("handle_aio_write_complete: "
|
||||
"aio_write_behind completed for file %s\n",
|
||||
fsp->fsp_name ));
|
||||
fsp_str_dbg(fsp)));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -424,7 +424,7 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex)
|
||||
if(nwritten == -1) {
|
||||
DEBUG( 3,( "handle_aio_write: file %s wanted %u bytes. "
|
||||
"nwritten == %d. Error = %s\n",
|
||||
fsp->fsp_name, (unsigned int)numtowrite,
|
||||
fsp_str_dbg(fsp), (unsigned int)numtowrite,
|
||||
(int)nwritten, strerror(errno) ));
|
||||
|
||||
/* If errno is ECANCELED then don't return anything to the
|
||||
@ -456,7 +456,7 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex)
|
||||
ERRHRD, ERRdiskfull);
|
||||
srv_set_message(outbuf,0,0,true);
|
||||
DEBUG(5,("handle_aio_write: sync_file for %s returned %s\n",
|
||||
fsp->fsp_name, nt_errstr(status) ));
|
||||
fsp_str_dbg(fsp), nt_errstr(status)));
|
||||
}
|
||||
|
||||
aio_ex->fsp->fh->pos = aio_ex->acb.aio_offset + nwritten;
|
||||
@ -472,7 +472,7 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex)
|
||||
|
||||
DEBUG(10,("handle_aio_write_complete: scheduled aio_write completed "
|
||||
"for file %s, offset %.0f, requested %u, written = %u\n",
|
||||
fsp->fsp_name, (double)aio_ex->acb.aio_offset,
|
||||
fsp_str_dbg(fsp), (double)aio_ex->acb.aio_offset,
|
||||
(unsigned int)numtowrite, (unsigned int)nwritten ));
|
||||
|
||||
return ret;
|
||||
@ -496,7 +496,7 @@ static bool handle_aio_completed(struct aio_extra *aio_ex, int *perr)
|
||||
if (SMB_VFS_AIO_ERROR(aio_ex->fsp, &aio_ex->acb) == EINPROGRESS) {
|
||||
DEBUG(10,( "handle_aio_completed: operation mid %u still in "
|
||||
"process for file %s\n",
|
||||
aio_ex->req->mid, aio_ex->fsp->fsp_name ));
|
||||
aio_ex->req->mid, fsp_str_dbg(aio_ex->fsp)));
|
||||
return False;
|
||||
}
|
||||
|
||||
|
@ -202,7 +202,7 @@ bool push_blocking_lock_request( struct byte_range_lock *br_lck,
|
||||
"expiry time (%u sec. %u usec) (+%d msec) for fnum = %d, name = %s\n",
|
||||
(unsigned int)blr->expire_time.tv_sec,
|
||||
(unsigned int)blr->expire_time.tv_usec, lock_timeout,
|
||||
blr->fsp->fnum, blr->fsp->fsp_name ));
|
||||
blr->fsp->fnum, fsp_str_dbg(blr->fsp)));
|
||||
|
||||
return True;
|
||||
}
|
||||
@ -418,8 +418,9 @@ static bool process_lockingX(struct blocking_lock_record *blr)
|
||||
* Success - we got all the locks.
|
||||
*/
|
||||
|
||||
DEBUG(3,("process_lockingX file = %s, fnum=%d type=%d num_locks=%d\n",
|
||||
fsp->fsp_name, fsp->fnum, (unsigned int)locktype, num_locks) );
|
||||
DEBUG(3,("process_lockingX file = %s, fnum=%d type=%d "
|
||||
"num_locks=%d\n", fsp_str_dbg(fsp), fsp->fnum,
|
||||
(unsigned int)locktype, num_locks));
|
||||
|
||||
reply_lockingX_success(blr);
|
||||
return True;
|
||||
@ -442,7 +443,7 @@ static bool process_lockingX(struct blocking_lock_record *blr)
|
||||
|
||||
DEBUG(10,("process_lockingX: only got %d locks of %d needed for file %s, fnum = %d. \
|
||||
Waiting....\n",
|
||||
blr->lock_num, num_locks, fsp->fsp_name, fsp->fnum));
|
||||
blr->lock_num, num_locks, fsp_str_dbg(fsp), fsp->fnum));
|
||||
|
||||
return False;
|
||||
}
|
||||
@ -533,7 +534,7 @@ void cancel_pending_lock_requests_by_fid(files_struct *fsp, struct byte_range_lo
|
||||
|
||||
DEBUG(10, ("remove_pending_lock_requests_by_fid - removing "
|
||||
"request type %d for file %s fnum = %d\n",
|
||||
blr->req->cmd, fsp->fsp_name, fsp->fnum));
|
||||
blr->req->cmd, fsp_str_dbg(fsp), fsp->fnum));
|
||||
|
||||
blr_cancelled = blocking_lock_cancel(fsp,
|
||||
blr->lock_pid,
|
||||
@ -583,7 +584,7 @@ void remove_pending_lock_requests_by_mid(int mid)
|
||||
if (br_lck) {
|
||||
DEBUG(10, ("remove_pending_lock_requests_by_mid - "
|
||||
"removing request type %d for file %s fnum "
|
||||
"= %d\n", blr->req->cmd, fsp->fsp_name,
|
||||
"= %d\n", blr->req->cmd, fsp_str_dbg(fsp),
|
||||
fsp->fnum ));
|
||||
|
||||
brl_lock_cancel(br_lck,
|
||||
@ -703,7 +704,7 @@ void process_blocking_lock_queue(void)
|
||||
DEBUG(5,("process_blocking_lock_queue: "
|
||||
"pending lock fnum = %d for file %s "
|
||||
"timed out.\n", blr->fsp->fnum,
|
||||
blr->fsp->fsp_name ));
|
||||
fsp_str_dbg(blr->fsp)));
|
||||
|
||||
brl_lock_cancel(br_lck,
|
||||
blr->lock_pid,
|
||||
|
@ -36,90 +36,102 @@ static NTSTATUS check_magic(struct files_struct *fsp)
|
||||
TALLOC_CTX *ctx = NULL;
|
||||
const char *p;
|
||||
struct connection_struct *conn = fsp->conn;
|
||||
char *fname = NULL;
|
||||
NTSTATUS status;
|
||||
|
||||
if (!*lp_magicscript(SNUM(conn))) {
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
DEBUG(5,("checking magic for %s\n",fsp->fsp_name));
|
||||
DEBUG(5,("checking magic for %s\n", fsp_str_dbg(fsp)));
|
||||
|
||||
if (!(p = strrchr_m(fsp->fsp_name,'/'))) {
|
||||
p = fsp->fsp_name;
|
||||
ctx = talloc_stackframe();
|
||||
|
||||
status = get_full_smb_filename(ctx, fsp->fsp_name, &fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!(p = strrchr_m(fname,'/'))) {
|
||||
p = fname;
|
||||
} else {
|
||||
p++;
|
||||
}
|
||||
|
||||
if (!strequal(lp_magicscript(SNUM(conn)),p)) {
|
||||
return NT_STATUS_OK;
|
||||
status = NT_STATUS_OK;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ctx = talloc_stackframe();
|
||||
|
||||
if (*lp_magicoutput(SNUM(conn))) {
|
||||
magic_output = lp_magicoutput(SNUM(conn));
|
||||
} else {
|
||||
magic_output = talloc_asprintf(ctx,
|
||||
"%s.out",
|
||||
fsp->fsp_name);
|
||||
fname);
|
||||
}
|
||||
if (!magic_output) {
|
||||
TALLOC_FREE(ctx);
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
status = NT_STATUS_NO_MEMORY;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Ensure we don't depend on user's PATH. */
|
||||
p = talloc_asprintf(ctx, "./%s", fsp->fsp_name);
|
||||
p = talloc_asprintf(ctx, "./%s", fname);
|
||||
if (!p) {
|
||||
TALLOC_FREE(ctx);
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
status = NT_STATUS_NO_MEMORY;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (chmod(fsp->fsp_name,0755) == -1) {
|
||||
TALLOC_FREE(ctx);
|
||||
return map_nt_error_from_unix(errno);
|
||||
if (chmod(fname, 0755) == -1) {
|
||||
status = map_nt_error_from_unix(errno);
|
||||
goto out;
|
||||
}
|
||||
ret = smbrun(p,&tmp_fd);
|
||||
DEBUG(3,("Invoking magic command %s gave %d\n",
|
||||
p,ret));
|
||||
|
||||
unlink(fsp->fsp_name);
|
||||
unlink(fname);
|
||||
if (ret != 0 || tmp_fd == -1) {
|
||||
if (tmp_fd != -1) {
|
||||
close(tmp_fd);
|
||||
}
|
||||
TALLOC_FREE(ctx);
|
||||
return NT_STATUS_UNSUCCESSFUL;
|
||||
status = NT_STATUS_UNSUCCESSFUL;
|
||||
goto out;
|
||||
}
|
||||
outfd = open(magic_output, O_CREAT|O_EXCL|O_RDWR, 0600);
|
||||
if (outfd == -1) {
|
||||
int err = errno;
|
||||
close(tmp_fd);
|
||||
TALLOC_FREE(ctx);
|
||||
return map_nt_error_from_unix(err);
|
||||
status = map_nt_error_from_unix(err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (sys_fstat(tmp_fd,&st) == -1) {
|
||||
int err = errno;
|
||||
close(tmp_fd);
|
||||
close(outfd);
|
||||
TALLOC_FREE(ctx);
|
||||
return map_nt_error_from_unix(err);
|
||||
status = map_nt_error_from_unix(err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (transfer_file(tmp_fd,outfd,(SMB_OFF_T)st.st_ex_size) == (SMB_OFF_T)-1) {
|
||||
int err = errno;
|
||||
close(tmp_fd);
|
||||
close(outfd);
|
||||
TALLOC_FREE(ctx);
|
||||
return map_nt_error_from_unix(err);
|
||||
status = map_nt_error_from_unix(err);
|
||||
goto out;
|
||||
}
|
||||
close(tmp_fd);
|
||||
if (close(outfd) == -1) {
|
||||
TALLOC_FREE(ctx);
|
||||
return map_nt_error_from_unix(errno);
|
||||
status = map_nt_error_from_unix(errno);
|
||||
goto out;
|
||||
}
|
||||
|
||||
status = NT_STATUS_OK;
|
||||
|
||||
out:
|
||||
TALLOC_FREE(ctx);
|
||||
return NT_STATUS_OK;
|
||||
return status;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -261,18 +273,10 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
|
||||
bool delete_file = false;
|
||||
bool changed_user = false;
|
||||
struct share_mode_lock *lck = NULL;
|
||||
struct smb_filename *smb_fname = NULL;
|
||||
char *fname = NULL;
|
||||
NTSTATUS status = NT_STATUS_OK;
|
||||
int ret;
|
||||
struct file_id id;
|
||||
|
||||
status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
|
||||
NULL, &smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
/*
|
||||
* Lock the share entries, and determine if we should delete
|
||||
* on close. If so delete whilst the lock is still in effect.
|
||||
@ -284,7 +288,7 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
|
||||
|
||||
if (lck == NULL) {
|
||||
DEBUG(0, ("close_remove_share_mode: Could not get share mode "
|
||||
"lock for file %s\n", smb_fname_str_dbg(smb_fname)));
|
||||
"lock for file %s\n", fsp_str_dbg(fsp)));
|
||||
status = NT_STATUS_INVALID_PARAMETER;
|
||||
goto done;
|
||||
}
|
||||
@ -296,7 +300,7 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
|
||||
if (!del_share_mode(lck, fsp)) {
|
||||
DEBUG(0, ("close_remove_share_mode: Could not delete share "
|
||||
"entry for file %s\n",
|
||||
smb_fname_str_dbg(smb_fname)));
|
||||
fsp_str_dbg(fsp)));
|
||||
}
|
||||
|
||||
if (fsp->initial_delete_on_close && (lck->delete_token == NULL)) {
|
||||
@ -354,7 +358,7 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
|
||||
*/
|
||||
|
||||
DEBUG(5,("close_remove_share_mode: file %s. Delete on close was set "
|
||||
"- deleting file.\n", smb_fname_str_dbg(smb_fname)));
|
||||
"- deleting file.\n", fsp_str_dbg(fsp)));
|
||||
|
||||
/*
|
||||
* Don't try to update the write time when we delete the file
|
||||
@ -366,7 +370,7 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
|
||||
|
||||
DEBUG(5,("close_remove_share_mode: file %s. "
|
||||
"Change user to uid %u\n",
|
||||
smb_fname_str_dbg(smb_fname),
|
||||
fsp_str_dbg(fsp),
|
||||
(unsigned int)lck->delete_token->uid));
|
||||
|
||||
if (!push_sec_ctx()) {
|
||||
@ -387,30 +391,30 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
|
||||
hasn't been renamed. */
|
||||
|
||||
if (fsp->posix_open) {
|
||||
ret = SMB_VFS_LSTAT(conn, smb_fname);
|
||||
ret = SMB_VFS_LSTAT(conn, fsp->fsp_name);
|
||||
} else {
|
||||
ret = SMB_VFS_STAT(conn, smb_fname);
|
||||
ret = SMB_VFS_STAT(conn, fsp->fsp_name);
|
||||
}
|
||||
|
||||
if (ret != 0) {
|
||||
DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
|
||||
"was set and stat failed with error %s\n",
|
||||
smb_fname_str_dbg(smb_fname), strerror(errno)));
|
||||
fsp_str_dbg(fsp), strerror(errno)));
|
||||
/*
|
||||
* Don't save the errno here, we ignore this error
|
||||
*/
|
||||
goto done;
|
||||
}
|
||||
|
||||
id = vfs_file_id_from_sbuf(conn, &smb_fname->st);
|
||||
id = vfs_file_id_from_sbuf(conn, &fsp->fsp_name->st);
|
||||
|
||||
if (!file_id_equal(&fsp->file_id, &id)) {
|
||||
DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
|
||||
"was set and dev and/or inode does not match\n",
|
||||
smb_fname_str_dbg(smb_fname)));
|
||||
fsp_str_dbg(fsp)));
|
||||
DEBUG(5,("close_remove_share_mode: file %s. stored file_id %s, "
|
||||
"stat file_id %s\n",
|
||||
smb_fname_str_dbg(smb_fname),
|
||||
fsp_str_dbg(fsp),
|
||||
file_id_string_tos(&fsp->file_id),
|
||||
file_id_string_tos(&id)));
|
||||
/*
|
||||
@ -420,9 +424,9 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
|
||||
}
|
||||
|
||||
if ((conn->fs_capabilities & FILE_NAMED_STREAMS)
|
||||
&& !is_ntfs_stream_smb_fname(smb_fname)) {
|
||||
&& !is_ntfs_stream_smb_fname(fsp->fsp_name)) {
|
||||
|
||||
status = delete_all_streams(conn, smb_fname->base_name);
|
||||
status = delete_all_streams(conn, fsp->fsp_name->base_name);
|
||||
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
DEBUG(5, ("delete_all_streams failed: %s\n",
|
||||
@ -432,7 +436,7 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
|
||||
}
|
||||
|
||||
|
||||
if (SMB_VFS_UNLINK(conn, smb_fname) != 0) {
|
||||
if (SMB_VFS_UNLINK(conn, fsp->fsp_name) != 0) {
|
||||
/*
|
||||
* This call can potentially fail as another smbd may
|
||||
* have had the file open with delete on close set and
|
||||
@ -443,21 +447,14 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
|
||||
|
||||
DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
|
||||
"was set and unlink failed with error %s\n",
|
||||
smb_fname_str_dbg(smb_fname), strerror(errno)));
|
||||
fsp_str_dbg(fsp), strerror(errno)));
|
||||
|
||||
status = map_nt_error_from_unix(errno);
|
||||
}
|
||||
|
||||
status = get_full_smb_filename(talloc_tos(), smb_fname, &fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
notify_fname(conn, NOTIFY_ACTION_REMOVED,
|
||||
FILE_NOTIFY_CHANGE_FILE_NAME,
|
||||
fname);
|
||||
|
||||
TALLOC_FREE(fname);
|
||||
fsp->fsp_name->base_name);
|
||||
|
||||
/* As we now have POSIX opens which can unlink
|
||||
* with other open files we may have taken
|
||||
@ -476,7 +473,6 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
|
||||
}
|
||||
|
||||
TALLOC_FREE(lck);
|
||||
TALLOC_FREE(smb_fname);
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -499,7 +495,6 @@ void set_close_write_time(struct files_struct *fsp, struct timespec ts)
|
||||
|
||||
static NTSTATUS update_write_time_on_close(struct files_struct *fsp)
|
||||
{
|
||||
struct smb_filename *smb_fname = NULL;
|
||||
struct smb_file_time ft;
|
||||
NTSTATUS status;
|
||||
int ret = -1;
|
||||
@ -514,43 +509,32 @@ static NTSTATUS update_write_time_on_close(struct files_struct *fsp)
|
||||
fsp->close_write_time = timespec_current();
|
||||
}
|
||||
|
||||
/* XXX: Remove when fsp->fsp_name is converted to smb_filename. */
|
||||
status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
|
||||
NULL, &smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Ensure we have a valid stat struct for the source. */
|
||||
if (fsp->fh->fd != -1) {
|
||||
ret = SMB_VFS_FSTAT(fsp, &smb_fname->st);
|
||||
ret = SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st);
|
||||
} else {
|
||||
if (fsp->posix_open) {
|
||||
ret = SMB_VFS_LSTAT(fsp->conn, smb_fname);
|
||||
ret = SMB_VFS_LSTAT(fsp->conn, fsp->fsp_name);
|
||||
} else {
|
||||
ret = SMB_VFS_STAT(fsp->conn, smb_fname);
|
||||
ret = SMB_VFS_STAT(fsp->conn, fsp->fsp_name);
|
||||
}
|
||||
}
|
||||
|
||||
if (ret == -1) {
|
||||
status = map_nt_error_from_unix(errno);
|
||||
goto out;
|
||||
return map_nt_error_from_unix(errno);
|
||||
}
|
||||
|
||||
if (!VALID_STAT(smb_fname->st)) {
|
||||
if (!VALID_STAT(fsp->fsp_name->st)) {
|
||||
/* if it doesn't seem to be a real file */
|
||||
status = NT_STATUS_OK;
|
||||
goto out;
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
ft.mtime = fsp->close_write_time;
|
||||
status = smb_set_file_time(fsp->conn, fsp, smb_fname, &ft, true);
|
||||
status = smb_set_file_time(fsp->conn, fsp, fsp->fsp_name, &ft, true);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
goto out;
|
||||
return status;
|
||||
}
|
||||
|
||||
out:
|
||||
TALLOC_FREE(smb_fname);
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -647,7 +631,7 @@ static NTSTATUS close_normal_file(struct smb_request *req, files_struct *fsp,
|
||||
status = ntstatus_keeperror(status, tmp);
|
||||
|
||||
DEBUG(2,("%s closed file %s (numopen=%d) %s\n",
|
||||
conn->server_info->unix_name,fsp->fsp_name,
|
||||
conn->server_info->unix_name, fsp_str_dbg(fsp),
|
||||
conn->num_files_open - 1,
|
||||
nt_errstr(status) ));
|
||||
|
||||
@ -663,16 +647,9 @@ static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
|
||||
enum file_close_type close_type)
|
||||
{
|
||||
struct share_mode_lock *lck = NULL;
|
||||
struct smb_filename *smb_dname = NULL;
|
||||
bool delete_dir = False;
|
||||
NTSTATUS status = NT_STATUS_OK;
|
||||
|
||||
status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
|
||||
NULL, &smb_dname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* NT can set delete_on_close of the last open
|
||||
* reference to a directory also.
|
||||
@ -683,14 +660,14 @@ static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
|
||||
|
||||
if (lck == NULL) {
|
||||
DEBUG(0, ("close_directory: Could not get share mode lock for "
|
||||
"%s\n", smb_fname_str_dbg(smb_dname)));
|
||||
"%s\n", fsp_str_dbg(fsp)));
|
||||
status = NT_STATUS_INVALID_PARAMETER;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!del_share_mode(lck, fsp)) {
|
||||
DEBUG(0, ("close_directory: Could not delete share entry for "
|
||||
"%s\n", smb_fname_str_dbg(smb_dname)));
|
||||
"%s\n", fsp_str_dbg(fsp)));
|
||||
}
|
||||
|
||||
if (fsp->initial_delete_on_close) {
|
||||
@ -704,7 +681,7 @@ static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
|
||||
become_user(fsp->conn, fsp->vuid);
|
||||
became_user = True;
|
||||
}
|
||||
send_stat_cache_delete_message(fsp->fsp_name);
|
||||
send_stat_cache_delete_message(fsp->fsp_name->base_name);
|
||||
set_delete_on_close_lck(lck, True, ¤t_user.ut);
|
||||
if (became_user) {
|
||||
unbecome_user();
|
||||
@ -747,11 +724,12 @@ static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
|
||||
|
||||
TALLOC_FREE(lck);
|
||||
|
||||
status = rmdir_internals(talloc_tos(), fsp->conn, smb_dname);
|
||||
status = rmdir_internals(talloc_tos(), fsp->conn,
|
||||
fsp->fsp_name);
|
||||
|
||||
DEBUG(5,("close_directory: %s. Delete on close was set - "
|
||||
"deleting directory returned %s.\n",
|
||||
smb_fname_str_dbg(smb_dname), nt_errstr(status)));
|
||||
fsp_str_dbg(fsp), nt_errstr(status)));
|
||||
|
||||
/* unbecome user. */
|
||||
pop_sec_ctx();
|
||||
@ -774,7 +752,7 @@ static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
|
||||
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
DEBUG(0, ("Could not close dir! fname=%s, fd=%d, err=%d=%s\n",
|
||||
smb_fname_str_dbg(smb_dname), fsp->fh->fd, errno,
|
||||
fsp_str_dbg(fsp), fsp->fh->fd, errno,
|
||||
strerror(errno)));
|
||||
}
|
||||
|
||||
@ -786,7 +764,6 @@ static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
|
||||
|
||||
out:
|
||||
TALLOC_FREE(lck);
|
||||
TALLOC_FREE(smb_dname);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -845,7 +845,7 @@ bool update_write_time(struct files_struct *fsp)
|
||||
}
|
||||
|
||||
notify_fname(fsp->conn, NOTIFY_ACTION_MODIFIED,
|
||||
FILE_NOTIFY_CHANGE_LAST_WRITE, fsp->fsp_name);
|
||||
FILE_NOTIFY_CHANGE_LAST_WRITE, fsp->fsp_name->base_name);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -103,7 +103,7 @@ tryagain:
|
||||
}
|
||||
|
||||
DEBUG(10,("read_file (%s): pos = %.0f, size = %lu, returned %lu\n",
|
||||
fsp->fsp_name, (double)pos, (unsigned long)n, (long)ret ));
|
||||
fsp_str_dbg(fsp), (double)pos, (unsigned long)n, (long)ret));
|
||||
|
||||
fsp->fh->pos += ret;
|
||||
fsp->fh->position_information = fsp->fh->pos;
|
||||
@ -136,7 +136,7 @@ static ssize_t real_write_file(struct smb_request *req,
|
||||
}
|
||||
|
||||
DEBUG(10,("real_write_file (%s): pos = %.0f, size = %lu, returned %ld\n",
|
||||
fsp->fsp_name, (double)pos, (unsigned long)n, (long)ret ));
|
||||
fsp_str_dbg(fsp), (double)pos, (unsigned long)n, (long)ret));
|
||||
|
||||
if (ret != -1) {
|
||||
fsp->fh->pos += ret;
|
||||
@ -164,8 +164,9 @@ static int wcp_file_size_change(files_struct *fsp)
|
||||
wcp->file_size = wcp->offset + wcp->data_size;
|
||||
ret = SMB_VFS_FTRUNCATE(fsp, wcp->file_size);
|
||||
if (ret == -1) {
|
||||
DEBUG(0,("wcp_file_size_change (%s): ftruncate of size %.0f error %s\n",
|
||||
fsp->fsp_name, (double)wcp->file_size, strerror(errno) ));
|
||||
DEBUG(0,("wcp_file_size_change (%s): ftruncate of size %.0f "
|
||||
"error %s\n", fsp_str_dbg(fsp),
|
||||
(double)wcp->file_size, strerror(errno)));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@ -179,7 +180,7 @@ static void update_write_time_handler(struct event_context *ctx,
|
||||
|
||||
/* Remove the timed event handler. */
|
||||
TALLOC_FREE(fsp->update_write_time_event);
|
||||
DEBUG(5, ("Update write time on %s\n", fsp->fsp_name));
|
||||
DEBUG(5, ("Update write time on %s\n", fsp_str_dbg(fsp)));
|
||||
|
||||
/* change the write time if not already changed by someone else */
|
||||
update_write_time(fsp);
|
||||
@ -244,7 +245,8 @@ void trigger_write_time_update_immediate(struct files_struct *fsp)
|
||||
}
|
||||
|
||||
TALLOC_FREE(fsp->update_write_time_event);
|
||||
DEBUG(5, ("Update write time immediate on %s\n", fsp->fsp_name));
|
||||
DEBUG(5, ("Update write time immediate on %s\n",
|
||||
fsp_str_dbg(fsp)));
|
||||
|
||||
fsp->update_write_time_triggered = true;
|
||||
|
||||
@ -285,28 +287,17 @@ ssize_t write_file(struct smb_request *req,
|
||||
}
|
||||
|
||||
if (!fsp->modified) {
|
||||
struct smb_filename *smb_fname = NULL;
|
||||
NTSTATUS status;
|
||||
|
||||
fsp->modified = True;
|
||||
|
||||
status = create_synthetic_smb_fname_split(talloc_tos(),
|
||||
fsp->fsp_name, NULL,
|
||||
&smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
errno = map_errno_from_nt_status(status);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (SMB_VFS_FSTAT(fsp, &smb_fname->st) == 0) {
|
||||
if (SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st) == 0) {
|
||||
int dosmode;
|
||||
trigger_write_time_update(fsp);
|
||||
dosmode = dos_mode(fsp->conn, smb_fname);
|
||||
dosmode = dos_mode(fsp->conn, fsp->fsp_name);
|
||||
if ((lp_store_dos_attributes(SNUM(fsp->conn)) ||
|
||||
MAP_ARCHIVE(fsp->conn)) &&
|
||||
!IS_DOS_ARCHIVE(dosmode)) {
|
||||
file_set_dosmode(fsp->conn, smb_fname,
|
||||
dosmode | aARCH, NULL, false);
|
||||
file_set_dosmode(fsp->conn, fsp->fsp_name,
|
||||
dosmode | aARCH, NULL, false);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -316,11 +307,10 @@ ssize_t write_file(struct smb_request *req,
|
||||
|
||||
if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && !wcp) {
|
||||
setup_write_cache(fsp,
|
||||
smb_fname->st.st_ex_size);
|
||||
fsp->fsp_name->st.st_ex_size);
|
||||
wcp = fsp->wcp;
|
||||
}
|
||||
}
|
||||
TALLOC_FREE(smb_fname);
|
||||
}
|
||||
|
||||
#ifdef WITH_PROFILE
|
||||
@ -382,8 +372,10 @@ nonop=%u allocated=%u active=%u direct=%u perfect=%u readhits=%u\n",
|
||||
return total_written;
|
||||
}
|
||||
|
||||
DEBUG(9,("write_file (%s)(fd=%d pos=%.0f size=%u) wcp->offset=%.0f wcp->data_size=%u\n",
|
||||
fsp->fsp_name, fsp->fh->fd, (double)pos, (unsigned int)n, (double)wcp->offset, (unsigned int)wcp->data_size));
|
||||
DEBUG(9,("write_file (%s)(fd=%d pos=%.0f size=%u) wcp->offset=%.0f "
|
||||
"wcp->data_size=%u\n", fsp_str_dbg(fsp), fsp->fh->fd,
|
||||
(double)pos, (unsigned int)n, (double)wcp->offset,
|
||||
(unsigned int)wcp->data_size));
|
||||
|
||||
fsp->fh->pos = pos + n;
|
||||
|
||||
@ -828,7 +820,8 @@ void delete_write_cache(files_struct *fsp)
|
||||
SAFE_FREE(wcp->data);
|
||||
SAFE_FREE(fsp->wcp);
|
||||
|
||||
DEBUG(10,("delete_write_cache: File %s deleted write cache\n", fsp->fsp_name ));
|
||||
DEBUG(10,("delete_write_cache: File %s deleted write cache\n",
|
||||
fsp_str_dbg(fsp)));
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -871,7 +864,7 @@ static bool setup_write_cache(files_struct *fsp, SMB_OFF_T file_size)
|
||||
allocated_write_caches++;
|
||||
|
||||
DEBUG(10,("setup_write_cache: File %s allocated write cache size %lu\n",
|
||||
fsp->fsp_name, (unsigned long)wcp->alloc_size ));
|
||||
fsp_str_dbg(fsp), (unsigned long)wcp->alloc_size));
|
||||
|
||||
return True;
|
||||
}
|
||||
@ -888,7 +881,7 @@ void set_filelen_write_cache(files_struct *fsp, SMB_OFF_T file_size)
|
||||
char *msg;
|
||||
if (asprintf(&msg, "set_filelen_write_cache: size change "
|
||||
"on file %s with write cache size = %lu\n",
|
||||
fsp->fsp_name,
|
||||
fsp->fsp_name->base_name,
|
||||
(unsigned long)fsp->wcp->data_size) != -1) {
|
||||
smb_panic(msg);
|
||||
} else {
|
||||
@ -970,7 +963,13 @@ NTSTATUS sync_file(connection_struct *conn, files_struct *fsp, bool write_throug
|
||||
int fsp_stat(files_struct *fsp, SMB_STRUCT_STAT *pst)
|
||||
{
|
||||
if (fsp->fh->fd == -1) {
|
||||
return vfs_stat_smb_fname(fsp->conn, fsp->fsp_name, pst);
|
||||
int ret;
|
||||
|
||||
ret = SMB_VFS_STAT(fsp->conn, fsp->fsp_name);
|
||||
if (ret != -1) {
|
||||
*pst = fsp->fsp_name->st;
|
||||
}
|
||||
return ret;
|
||||
} else {
|
||||
return SMB_VFS_FSTAT(fsp, pst);
|
||||
}
|
||||
|
@ -44,6 +44,7 @@ NTSTATUS file_new(struct smb_request *req, connection_struct *conn,
|
||||
{
|
||||
int i;
|
||||
files_struct *fsp;
|
||||
NTSTATUS status;
|
||||
|
||||
/* we want to give out file handles differently on each new
|
||||
connection because of a common bug in MS clients where they try to
|
||||
@ -100,8 +101,18 @@ NTSTATUS file_new(struct smb_request *req, connection_struct *conn,
|
||||
fsp->fnum = i + FILE_HANDLE_OFFSET;
|
||||
SMB_ASSERT(fsp->fnum < 65536);
|
||||
|
||||
string_set(&fsp->fsp_name,"");
|
||||
|
||||
/*
|
||||
* Create an smb_filename with "" for the base_name. There are very
|
||||
* few NULL checks, so make sure it's initialized with something. to
|
||||
* be safe until an audit can be done.
|
||||
*/
|
||||
status = create_synthetic_smb_fname(fsp, "", NULL, NULL,
|
||||
&fsp->fsp_name);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
TALLOC_FREE(fsp);
|
||||
TALLOC_FREE(fsp->fh);
|
||||
}
|
||||
|
||||
DLIST_ADD(Files, fsp);
|
||||
|
||||
DEBUG(5,("allocated file structure %d, fnum = %d (%d used)\n",
|
||||
@ -241,8 +252,9 @@ void file_dump_open_table(void)
|
||||
files_struct *fsp;
|
||||
|
||||
for (fsp=Files;fsp;fsp=fsp->next,count++) {
|
||||
DEBUG(10,("Files[%d], fnum = %d, name %s, fd = %d, gen = %lu, fileid=%s\n",
|
||||
count, fsp->fnum, fsp->fsp_name, fsp->fh->fd, (unsigned long)fsp->fh->gen_id,
|
||||
DEBUG(10,("Files[%d], fnum = %d, name %s, fd = %d, gen = %lu, "
|
||||
"fileid=%s\n", count, fsp->fnum, fsp_str_dbg(fsp),
|
||||
fsp->fh->fd, (unsigned long)fsp->fh->gen_id,
|
||||
file_id_string_tos(&fsp->file_id)));
|
||||
}
|
||||
}
|
||||
@ -288,8 +300,10 @@ files_struct *file_find_dif(struct file_id id, unsigned long gen_id)
|
||||
if ((fsp->fh->fd == -1) &&
|
||||
(fsp->oplock_type != NO_OPLOCK) &&
|
||||
(fsp->oplock_type != FAKE_LEVEL_II_OPLOCK)) {
|
||||
DEBUG(0,("file_find_dif: file %s file_id = %s, gen = %u \
|
||||
oplock_type = %u is a stat open with oplock type !\n", fsp->fsp_name,
|
||||
DEBUG(0,("file_find_dif: file %s file_id = "
|
||||
"%s, gen = %u oplock_type = %u is a "
|
||||
"stat open with oplock type !\n",
|
||||
fsp_str_dbg(fsp),
|
||||
file_id_string_tos(&fsp->file_id),
|
||||
(unsigned int)fsp->fh->gen_id,
|
||||
(unsigned int)fsp->oplock_type ));
|
||||
@ -390,10 +404,11 @@ bool file_find_subpath(files_struct *dir_fsp)
|
||||
{
|
||||
files_struct *fsp;
|
||||
size_t dlen;
|
||||
char *d_fullname = talloc_asprintf(talloc_tos(),
|
||||
"%s/%s",
|
||||
dir_fsp->conn->connectpath,
|
||||
dir_fsp->fsp_name);
|
||||
char *d_fullname;
|
||||
|
||||
d_fullname = talloc_asprintf(talloc_tos(), "%s/%s",
|
||||
dir_fsp->conn->connectpath,
|
||||
dir_fsp->fsp_name->base_name);
|
||||
|
||||
if (!d_fullname) {
|
||||
return false;
|
||||
@ -411,7 +426,7 @@ bool file_find_subpath(files_struct *dir_fsp)
|
||||
d1_fullname = talloc_asprintf(talloc_tos(),
|
||||
"%s/%s",
|
||||
fsp->conn->connectpath,
|
||||
fsp->fsp_name);
|
||||
fsp->fsp_name->base_name);
|
||||
|
||||
if (strnequal(d_fullname, d1_fullname, dlen)) {
|
||||
TALLOC_FREE(d_fullname);
|
||||
@ -449,8 +464,6 @@ void file_free(struct smb_request *req, files_struct *fsp)
|
||||
{
|
||||
DLIST_REMOVE(Files, fsp);
|
||||
|
||||
string_free(&fsp->fsp_name);
|
||||
|
||||
TALLOC_FREE(fsp->fake_file_handle);
|
||||
|
||||
if (fsp->fh->ref_count == 1) {
|
||||
@ -500,6 +513,7 @@ void file_free(struct smb_request *req, files_struct *fsp)
|
||||
information */
|
||||
ZERO_STRUCTP(fsp);
|
||||
|
||||
/* fsp->fsp_name is a talloc child and is free'd automatically. */
|
||||
TALLOC_FREE(fsp);
|
||||
}
|
||||
|
||||
@ -546,7 +560,7 @@ files_struct *file_fsp(struct smb_request *req, uint16 fid)
|
||||
Duplicate the file handle part for a DOS or FCB open.
|
||||
****************************************************************************/
|
||||
|
||||
void dup_file_fsp(struct smb_request *req, files_struct *from,
|
||||
NTSTATUS dup_file_fsp(struct smb_request *req, files_struct *from,
|
||||
uint32 access_mask, uint32 share_access,
|
||||
uint32 create_options, files_struct *to)
|
||||
{
|
||||
@ -575,5 +589,34 @@ void dup_file_fsp(struct smb_request *req, files_struct *from,
|
||||
to->modified = from->modified;
|
||||
to->is_directory = from->is_directory;
|
||||
to->aio_write_behind = from->aio_write_behind;
|
||||
string_set(&to->fsp_name,from->fsp_name);
|
||||
return fsp_set_smb_fname(to, from->fsp_name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a debug string using the debug_ctx(). This can only be called from
|
||||
* DEBUG() macros due to the debut_ctx().
|
||||
*/
|
||||
const char *fsp_str_dbg(const struct files_struct *fsp)
|
||||
{
|
||||
return smb_fname_str_dbg(fsp->fsp_name);
|
||||
}
|
||||
|
||||
/**
|
||||
* The only way that the fsp->fsp_name field should ever be set.
|
||||
*/
|
||||
NTSTATUS fsp_set_smb_fname(struct files_struct *fsp,
|
||||
const struct smb_filename *smb_fname_in)
|
||||
{
|
||||
NTSTATUS status;
|
||||
struct smb_filename *smb_fname_new;
|
||||
|
||||
status = copy_smb_filename(fsp, smb_fname_in, &smb_fname_new);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
TALLOC_FREE(fsp->fsp_name);
|
||||
fsp->fsp_name = smb_fname_new;
|
||||
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
@ -454,7 +454,7 @@ static void api_fd_reply(connection_struct *conn, uint16 vuid,
|
||||
}
|
||||
|
||||
DEBUG(3,("Got API command 0x%x on pipe \"%s\" (pnum %x)\n",
|
||||
subcommand, fsp->fsp_name, pnum));
|
||||
subcommand, fsp_str_dbg(fsp), pnum));
|
||||
|
||||
DEBUG(10, ("api_fd_reply: p:%p max_trans_reply: %d\n", fsp, mdrcnt));
|
||||
|
||||
|
@ -182,7 +182,7 @@ void change_notify_reply(connection_struct *conn,
|
||||
static void notify_callback(void *private_data, const struct notify_event *e)
|
||||
{
|
||||
files_struct *fsp = (files_struct *)private_data;
|
||||
DEBUG(10, ("notify_callback called for %s\n", fsp->fsp_name));
|
||||
DEBUG(10, ("notify_callback called for %s\n", fsp_str_dbg(fsp)));
|
||||
notify_fsp(fsp, e->action, e->path);
|
||||
}
|
||||
|
||||
@ -200,8 +200,9 @@ NTSTATUS change_notify_create(struct files_struct *fsp, uint32 filter,
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
/* Do notify operations on the base_name. */
|
||||
if (asprintf(&fullpath, "%s/%s", fsp->conn->connectpath,
|
||||
fsp->fsp_name) == -1) {
|
||||
fsp->fsp_name->base_name) == -1) {
|
||||
DEBUG(0, ("asprintf failed\n"));
|
||||
TALLOC_FREE(fsp->notify);
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
@ -236,7 +237,7 @@ NTSTATUS change_notify_add_request(struct smb_request *req,
|
||||
struct smbd_server_connection *sconn = smbd_server_conn;
|
||||
|
||||
DEBUG(10, ("change_notify_add_request: Adding request for %s: "
|
||||
"max_param = %d\n", fsp->fsp_name, (int)max_param));
|
||||
"max_param = %d\n", fsp_str_dbg(fsp), (int)max_param));
|
||||
|
||||
if (!(request = talloc(NULL, struct notify_change_request))
|
||||
|| !(map = talloc(request, struct notify_mid_map))) {
|
||||
|
@ -794,7 +794,7 @@ static NTSTATUS set_sd(files_struct *fsp, uint8 *data, uint32 sd_len,
|
||||
security_acl_map_generic(psd->sacl, &file_generic_mapping);
|
||||
|
||||
if (DEBUGLEVEL >= 10) {
|
||||
DEBUG(10,("set_sd for file %s\n", fsp->fsp_name ));
|
||||
DEBUG(10,("set_sd for file %s\n", fsp_str_dbg(fsp)));
|
||||
NDR_PRINT_DEBUG(security_descriptor, psd);
|
||||
}
|
||||
|
||||
@ -1523,7 +1523,7 @@ static void call_nt_transact_notify_change(connection_struct *conn,
|
||||
|
||||
DEBUG(3,("call_nt_transact_notify_change: notify change "
|
||||
"called on %s, filter = %s, recursive = %d\n",
|
||||
fsp->fsp_name, filter_string, recursive));
|
||||
fsp_str_dbg(fsp), filter_string, recursive));
|
||||
|
||||
TALLOC_FREE(filter_string);
|
||||
}
|
||||
@ -1626,7 +1626,7 @@ static void call_nt_transact_rename(connection_struct *conn,
|
||||
send_nt_replies(conn, req, NT_STATUS_OK, NULL, 0, NULL, 0);
|
||||
|
||||
DEBUG(3,("nt transact rename from = %s, to = %s ignored!\n",
|
||||
fsp->fsp_name, new_name));
|
||||
fsp_str_dbg(fsp), new_name));
|
||||
|
||||
return;
|
||||
}
|
||||
@ -1684,8 +1684,9 @@ static void call_nt_transact_query_security_desc(connection_struct *conn,
|
||||
|
||||
security_info_wanted = IVAL(params,4);
|
||||
|
||||
DEBUG(3,("call_nt_transact_query_security_desc: file = %s, info_wanted = 0x%x\n", fsp->fsp_name,
|
||||
(unsigned int)security_info_wanted ));
|
||||
DEBUG(3,("call_nt_transact_query_security_desc: file = %s, "
|
||||
"info_wanted = 0x%x\n", fsp_str_dbg(fsp),
|
||||
(unsigned int)security_info_wanted));
|
||||
|
||||
params = nttrans_realloc(ppparams, 4);
|
||||
if(params == NULL) {
|
||||
@ -1722,7 +1723,8 @@ static void call_nt_transact_query_security_desc(connection_struct *conn,
|
||||
DEBUG(3,("call_nt_transact_query_security_desc: sd_size = %lu.\n",(unsigned long)sd_size));
|
||||
|
||||
if (DEBUGLEVEL >= 10) {
|
||||
DEBUG(10,("call_nt_transact_query_security_desc for file %s\n", fsp->fsp_name));
|
||||
DEBUG(10,("call_nt_transact_query_security_desc for file %s\n",
|
||||
fsp_str_dbg(fsp)));
|
||||
NDR_PRINT_DEBUG(security_descriptor, psd);
|
||||
}
|
||||
|
||||
@ -1796,8 +1798,8 @@ static void call_nt_transact_set_security_desc(connection_struct *conn,
|
||||
|
||||
security_info_sent = IVAL(params,4);
|
||||
|
||||
DEBUG(3,("call_nt_transact_set_security_desc: file = %s, sent 0x%x\n", fsp->fsp_name,
|
||||
(unsigned int)security_info_sent ));
|
||||
DEBUG(3,("call_nt_transact_set_security_desc: file = %s, sent 0x%x\n",
|
||||
fsp_str_dbg(fsp), (unsigned int)security_info_sent));
|
||||
|
||||
if (data_count == 0) {
|
||||
reply_doserror(req, ERRDOS, ERRnoaccess);
|
||||
@ -2021,7 +2023,7 @@ static void call_nt_transact_ioctl(connection_struct *conn,
|
||||
cur_pdata+=12;
|
||||
|
||||
DEBUG(10,("FSCTL_GET_SHADOW_COPY_DATA: %u volumes for path[%s].\n",
|
||||
shadow_data->num_volumes,fsp->fsp_name));
|
||||
shadow_data->num_volumes, fsp_str_dbg(fsp)));
|
||||
if (labels && shadow_data->labels) {
|
||||
for (i=0;i<shadow_data->num_volumes;i++) {
|
||||
srvstr_push(pdata, req->flags2,
|
||||
|
@ -219,13 +219,13 @@ void change_file_owner_to_parent(connection_struct *conn,
|
||||
if (ret == -1) {
|
||||
DEBUG(0,("change_file_owner_to_parent: failed to fchown "
|
||||
"file %s to parent directory uid %u. Error "
|
||||
"was %s\n", fsp->fsp_name,
|
||||
"was %s\n", fsp_str_dbg(fsp),
|
||||
(unsigned int)smb_fname_parent->st.st_ex_uid,
|
||||
strerror(errno) ));
|
||||
}
|
||||
|
||||
DEBUG(10,("change_file_owner_to_parent: changed new file %s to "
|
||||
"parent directory uid %u.\n", fsp->fsp_name,
|
||||
"parent directory uid %u.\n", fsp_str_dbg(fsp),
|
||||
(unsigned int)smb_fname_parent->st.st_ex_uid));
|
||||
|
||||
TALLOC_FREE(smb_fname_parent);
|
||||
@ -350,7 +350,6 @@ static NTSTATUS open_file(files_struct *fsp,
|
||||
uint32 access_mask, /* client requested access mask. */
|
||||
uint32 open_access_mask) /* what we're actually using in the open. */
|
||||
{
|
||||
char *path = NULL;
|
||||
NTSTATUS status = NT_STATUS_OK;
|
||||
int accmode = (flags & O_ACCMODE);
|
||||
int local_flags = flags;
|
||||
@ -435,7 +434,7 @@ static NTSTATUS open_file(files_struct *fsp,
|
||||
* wildcard characters are allowed in stream names
|
||||
* only test the basefilename
|
||||
*/
|
||||
wild = fsp->base_fsp->fsp_name;
|
||||
wild = fsp->base_fsp->fsp_name->base_name;
|
||||
} else {
|
||||
wild = smb_fname->base_name;
|
||||
}
|
||||
@ -615,16 +614,13 @@ static NTSTATUS open_file(files_struct *fsp,
|
||||
conn->case_sensitive)) {
|
||||
fsp->aio_write_behind = True;
|
||||
}
|
||||
|
||||
status = get_full_smb_filename(talloc_tos(), smb_fname,
|
||||
&path);
|
||||
status = fsp_set_smb_fname(fsp, smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
fd_close(fsp);
|
||||
errno = map_errno_from_nt_status(status);
|
||||
return status;
|
||||
}
|
||||
|
||||
string_set(&fsp->fsp_name, path);
|
||||
TALLOC_FREE(path);
|
||||
|
||||
fsp->wcp = NULL; /* Write cache pointer. */
|
||||
|
||||
DEBUG(2,("%s opened file %s read=%s write=%s (numopen=%d)\n",
|
||||
@ -796,7 +792,8 @@ static void validate_my_share_entries(int num,
|
||||
str = talloc_asprintf(talloc_tos(),
|
||||
"validate_my_share_entries: "
|
||||
"file %s, oplock_type = 0x%x, op_type = 0x%x\n",
|
||||
fsp->fsp_name, (unsigned int)fsp->oplock_type,
|
||||
fsp->fsp_name->base_name,
|
||||
(unsigned int)fsp->oplock_type,
|
||||
(unsigned int)share_entry->op_type );
|
||||
smb_panic(str);
|
||||
}
|
||||
@ -1030,7 +1027,7 @@ static bool delay_for_oplocks(struct share_mode_lock *lck,
|
||||
}
|
||||
|
||||
DEBUG(10,("delay_for_oplocks: oplock type 0x%x on file %s\n",
|
||||
fsp->oplock_type, fsp->fsp_name));
|
||||
fsp->oplock_type, fsp_str_dbg(fsp)));
|
||||
|
||||
/* No delay. */
|
||||
return false;
|
||||
@ -1153,13 +1150,6 @@ NTSTATUS fcb_or_dos_open(struct smb_request *req,
|
||||
uint32 create_options)
|
||||
{
|
||||
files_struct *fsp;
|
||||
char *fname = NULL;
|
||||
NTSTATUS status;
|
||||
|
||||
status = get_full_smb_filename(talloc_tos(), smb_fname, &fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
DEBUG(5,("fcb_or_dos_open: attempting old open semantics for "
|
||||
"file %s.\n", smb_fname_str_dbg(smb_fname)));
|
||||
@ -1169,7 +1159,7 @@ NTSTATUS fcb_or_dos_open(struct smb_request *req,
|
||||
|
||||
DEBUG(10,("fcb_or_dos_open: checking file %s, fd = %d, "
|
||||
"vuid = %u, file_pid = %u, private_options = 0x%x "
|
||||
"access_mask = 0x%x\n", fsp->fsp_name,
|
||||
"access_mask = 0x%x\n", fsp_str_dbg(fsp),
|
||||
fsp->fh->fd, (unsigned int)fsp->vuid,
|
||||
(unsigned int)fsp->file_pid,
|
||||
(unsigned int)fsp->fh->private_options,
|
||||
@ -1181,7 +1171,9 @@ NTSTATUS fcb_or_dos_open(struct smb_request *req,
|
||||
(fsp->fh->private_options & (NTCREATEX_OPTIONS_PRIVATE_DENY_DOS |
|
||||
NTCREATEX_OPTIONS_PRIVATE_DENY_FCB)) &&
|
||||
(fsp->access_mask & FILE_WRITE_DATA) &&
|
||||
strequal(fsp->fsp_name, fname)) {
|
||||
strequal(fsp->fsp_name->base_name, smb_fname->base_name) &&
|
||||
strequal(fsp->fsp_name->stream_name,
|
||||
smb_fname->stream_name)) {
|
||||
DEBUG(10,("fcb_or_dos_open: file match\n"));
|
||||
break;
|
||||
}
|
||||
@ -1199,10 +1191,8 @@ NTSTATUS fcb_or_dos_open(struct smb_request *req,
|
||||
}
|
||||
|
||||
/* We need to duplicate this fsp. */
|
||||
dup_file_fsp(req, fsp, access_mask, share_access,
|
||||
create_options, fsp_to_dup_into);
|
||||
|
||||
return NT_STATUS_OK;
|
||||
return dup_file_fsp(req, fsp, access_mask, share_access,
|
||||
create_options, fsp_to_dup_into);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -2612,8 +2602,10 @@ static NTSTATUS open_directory(connection_struct *conn,
|
||||
fsp->sent_oplock_break = NO_BREAK_SENT;
|
||||
fsp->is_directory = True;
|
||||
fsp->posix_open = (file_attributes & FILE_FLAG_POSIX_SEMANTICS) ? True : False;
|
||||
|
||||
string_set(&fsp->fsp_name, smb_dname->base_name);
|
||||
status = fsp_set_smb_fname(fsp, smb_dname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
mtimespec = smb_dname->st.st_ex_mtime;
|
||||
|
||||
@ -2731,6 +2723,11 @@ void msg_file_was_renamed(struct messaging_context *msg,
|
||||
bn_len = strlen(base_name);
|
||||
stream_name = sharepath + sp_len + 1 + bn_len + 1;
|
||||
|
||||
/* stream_name must always be NULL if there is no stream. */
|
||||
if (stream_name[0] == '\0') {
|
||||
stream_name = NULL;
|
||||
}
|
||||
|
||||
status = create_synthetic_smb_fname(talloc_tos(), base_name,
|
||||
stream_name, NULL, &smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
@ -2744,18 +2741,14 @@ void msg_file_was_renamed(struct messaging_context *msg,
|
||||
|
||||
for(fsp = file_find_di_first(id); fsp; fsp = file_find_di_next(fsp)) {
|
||||
if (memcmp(fsp->conn->connectpath, sharepath, sp_len) == 0) {
|
||||
char *newname = NULL;
|
||||
|
||||
DEBUG(10,("msg_file_was_renamed: renaming file fnum %d from %s -> %s\n",
|
||||
fsp->fnum, fsp->fsp_name,
|
||||
fsp->fnum, fsp_str_dbg(fsp),
|
||||
smb_fname_str_dbg(smb_fname)));
|
||||
status = get_full_smb_filename(talloc_tos(),
|
||||
smb_fname, &newname);
|
||||
status = fsp_set_smb_fname(fsp, smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
goto out;
|
||||
}
|
||||
string_set(&fsp->fsp_name, newname);
|
||||
TALLOC_FREE(newname);
|
||||
} else {
|
||||
/* TODO. JRA. */
|
||||
/* Now we have the complete path we can work out if this is
|
||||
@ -2766,7 +2759,7 @@ void msg_file_was_renamed(struct messaging_context *msg,
|
||||
fsp->conn->connectpath,
|
||||
sharepath,
|
||||
fsp->fnum,
|
||||
fsp->fsp_name,
|
||||
fsp_str_dbg(fsp),
|
||||
smb_fname_str_dbg(smb_fname)));
|
||||
}
|
||||
}
|
||||
@ -2927,7 +2920,7 @@ NTSTATUS open_streams_for_delete(connection_struct *conn,
|
||||
}
|
||||
|
||||
DEBUG(10, ("Closing stream # %d, %s\n", i,
|
||||
streams[i]->fsp_name));
|
||||
fsp_str_dbg(streams[i])));
|
||||
close_file(NULL, streams[i], NORMAL_CLOSE);
|
||||
}
|
||||
|
||||
@ -3327,6 +3320,11 @@ NTSTATUS get_relative_fid_filename(connection_struct *conn,
|
||||
|
||||
dir_fsp = file_fsp(req, root_dir_fid);
|
||||
|
||||
if (is_ntfs_stream_smb_fname(dir_fsp->fsp_name)) {
|
||||
status = NT_STATUS_INVALID_HANDLE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (dir_fsp == NULL) {
|
||||
status = NT_STATUS_INVALID_HANDLE;
|
||||
goto out;
|
||||
@ -3355,7 +3353,7 @@ NTSTATUS get_relative_fid_filename(connection_struct *conn,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (ISDOT(dir_fsp->fsp_name)) {
|
||||
if (ISDOT(dir_fsp->fsp_name->base_name)) {
|
||||
/*
|
||||
* We're at the toplevel dir, the final file name
|
||||
* must not contain ./, as this is filtered out
|
||||
@ -3368,7 +3366,7 @@ NTSTATUS get_relative_fid_filename(connection_struct *conn,
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
size_t dir_name_len = strlen(dir_fsp->fsp_name);
|
||||
size_t dir_name_len = strlen(dir_fsp->fsp_name->base_name);
|
||||
|
||||
/*
|
||||
* Copy in the base directory name.
|
||||
@ -3380,7 +3378,7 @@ NTSTATUS get_relative_fid_filename(connection_struct *conn,
|
||||
status = NT_STATUS_NO_MEMORY;
|
||||
goto out;
|
||||
}
|
||||
memcpy(parent_fname, dir_fsp->fsp_name,
|
||||
memcpy(parent_fname, dir_fsp->fsp_name->base_name,
|
||||
dir_name_len+1);
|
||||
|
||||
/*
|
||||
|
@ -81,7 +81,7 @@ bool set_file_oplock(files_struct *fsp, int oplock_type)
|
||||
|
||||
DEBUG(5,("set_file_oplock: granted oplock on file %s, %s/%lu, "
|
||||
"tv_sec = %x, tv_usec = %x\n",
|
||||
fsp->fsp_name, file_id_string_tos(&fsp->file_id),
|
||||
fsp_str_dbg(fsp), file_id_string_tos(&fsp->file_id),
|
||||
fsp->fh->gen_id, (int)fsp->open_time.tv_sec,
|
||||
(int)fsp->open_time.tv_usec ));
|
||||
|
||||
@ -158,14 +158,15 @@ bool remove_oplock(files_struct *fsp)
|
||||
NULL);
|
||||
if (lck == NULL) {
|
||||
DEBUG(0,("remove_oplock: failed to lock share entry for "
|
||||
"file %s\n", fsp->fsp_name ));
|
||||
"file %s\n", fsp_str_dbg(fsp)));
|
||||
return False;
|
||||
}
|
||||
ret = remove_share_oplock(lck, fsp);
|
||||
if (!ret) {
|
||||
DEBUG(0,("remove_oplock: failed to remove share oplock for "
|
||||
"file %s fnum %d, %s\n",
|
||||
fsp->fsp_name, fsp->fnum, file_id_string_tos(&fsp->file_id)));
|
||||
fsp_str_dbg(fsp), fsp->fnum,
|
||||
file_id_string_tos(&fsp->file_id)));
|
||||
}
|
||||
release_file_oplock(fsp);
|
||||
TALLOC_FREE(lck);
|
||||
@ -184,14 +185,15 @@ bool downgrade_oplock(files_struct *fsp)
|
||||
NULL);
|
||||
if (lck == NULL) {
|
||||
DEBUG(0,("downgrade_oplock: failed to lock share entry for "
|
||||
"file %s\n", fsp->fsp_name ));
|
||||
"file %s\n", fsp_str_dbg(fsp)));
|
||||
return False;
|
||||
}
|
||||
ret = downgrade_share_oplock(lck, fsp);
|
||||
if (!ret) {
|
||||
DEBUG(0,("downgrade_oplock: failed to downgrade share oplock "
|
||||
"for file %s fnum %d, file_id %s\n",
|
||||
fsp->fsp_name, fsp->fnum, file_id_string_tos(&fsp->file_id)));
|
||||
fsp_str_dbg(fsp), fsp->fnum,
|
||||
file_id_string_tos(&fsp->file_id)));
|
||||
}
|
||||
|
||||
downgrade_file_oplock(fsp);
|
||||
@ -294,7 +296,8 @@ static files_struct *initial_break_processing(struct file_id id, unsigned long f
|
||||
|
||||
if(fsp->oplock_type == NO_OPLOCK) {
|
||||
if( DEBUGLVL( 3 ) ) {
|
||||
dbgtext( "initial_break_processing: file %s ", fsp->fsp_name );
|
||||
dbgtext( "initial_break_processing: file %s ",
|
||||
fsp_str_dbg(fsp));
|
||||
dbgtext( "(file_id = %s gen_id = %lu) has no oplock.\n",
|
||||
file_id_string_tos(&id), fsp->fh->gen_id );
|
||||
dbgtext( "Allowing break to succeed regardless.\n" );
|
||||
@ -314,7 +317,8 @@ static void oplock_timeout_handler(struct event_context *ctx,
|
||||
|
||||
/* Remove the timed event handler. */
|
||||
TALLOC_FREE(fsp->oplock_timeout);
|
||||
DEBUG(0, ("Oplock break failed for file %s -- replying anyway\n", fsp->fsp_name));
|
||||
DEBUG(0, ("Oplock break failed for file %s -- replying anyway\n",
|
||||
fsp_str_dbg(fsp)));
|
||||
global_client_failed_oplock_break = True;
|
||||
remove_oplock(fsp);
|
||||
reply_to_oplock_break_requests(fsp);
|
||||
@ -375,7 +379,7 @@ void break_level2_to_none_async(files_struct *fsp)
|
||||
|
||||
DEBUG(10,("process_oplock_async_level2_break_message: sending break "
|
||||
"to none message for fid %d, file %s\n", fsp->fnum,
|
||||
fsp->fsp_name));
|
||||
fsp_str_dbg(fsp)));
|
||||
|
||||
/* Now send a break to none message to our client. */
|
||||
break_msg = new_break_smb_message(NULL, fsp, OPLOCKLEVEL_NONE);
|
||||
@ -506,7 +510,7 @@ static void process_oplock_break_message(struct messaging_context *msg_ctx,
|
||||
!EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) {
|
||||
DEBUG(3, ("Already downgraded oplock on %s: %s\n",
|
||||
file_id_string_tos(&fsp->file_id),
|
||||
fsp->fsp_name));
|
||||
fsp_str_dbg(fsp)));
|
||||
/* We just send the same message back. */
|
||||
messaging_send_buf(msg_ctx, src, MSG_SMB_BREAK_RESPONSE,
|
||||
(uint8 *)data->data,
|
||||
@ -740,7 +744,7 @@ static void contend_level2_oplocks_begin_default(files_struct *fsp,
|
||||
NULL);
|
||||
if (lck == NULL) {
|
||||
DEBUG(0,("release_level_2_oplocks_on_change: failed to lock "
|
||||
"share mode entry for file %s.\n", fsp->fsp_name ));
|
||||
"share mode entry for file %s.\n", fsp_str_dbg(fsp)));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -212,7 +212,8 @@ static bool irix_set_kernel_oplock(struct kernel_oplocks *_ctx,
|
||||
DEBUG(0,("irix_set_kernel_oplock: Unable to get "
|
||||
"kernel oplock on file %s, file_id %s "
|
||||
"gen_id = %ul. Error was %s\n",
|
||||
fsp->fsp_name, file_id_string_tos(&fsp->file_id),
|
||||
fsp_str_dbg(fsp),
|
||||
file_id_string_tos(&fsp->file_id),
|
||||
fsp->fh->gen_id,
|
||||
strerror(errno) ));
|
||||
} else {
|
||||
@ -220,7 +221,7 @@ static bool irix_set_kernel_oplock(struct kernel_oplocks *_ctx,
|
||||
"file %s, fd = %d, file_id = %s, "
|
||||
"gen_id = %ul. Another process had the file "
|
||||
"open.\n",
|
||||
fsp->fsp_name, fsp->fh->fd,
|
||||
fsp_str_dbg(fsp), fsp->fh->fd,
|
||||
file_id_string_tos(&fsp->file_id),
|
||||
fsp->fh->gen_id ));
|
||||
}
|
||||
@ -229,7 +230,7 @@ static bool irix_set_kernel_oplock(struct kernel_oplocks *_ctx,
|
||||
|
||||
DEBUG(10,("irix_set_kernel_oplock: got kernel oplock on file %s, file_id = %s "
|
||||
"gen_id = %ul\n",
|
||||
fsp->fsp_name, file_id_string_tos(&fsp->file_id),
|
||||
fsp_str_dbg(fsp), file_id_string_tos(&fsp->file_id),
|
||||
fsp->fh->gen_id));
|
||||
|
||||
return True;
|
||||
@ -250,7 +251,8 @@ static void irix_release_kernel_oplock(struct kernel_oplocks *_ctx,
|
||||
int state = sys_fcntl_long(fsp->fh->fd, F_OPLKACK, -1);
|
||||
dbgtext("irix_release_kernel_oplock: file %s, file_id = %s"
|
||||
"gen_id = %ul, has kernel oplock state "
|
||||
"of %x.\n", fsp->fsp_name, file_id_string_tos(&fsp->file_id),
|
||||
"of %x.\n", fsp_str_dbg(fsp),
|
||||
file_id_string_tos(&fsp->file_id),
|
||||
fsp->fh->gen_id, state );
|
||||
}
|
||||
|
||||
@ -263,7 +265,8 @@ static void irix_release_kernel_oplock(struct kernel_oplocks *_ctx,
|
||||
"removing kernel oplock on file " );
|
||||
dbgtext("%s, file_id = %s gen_id = %ul. "
|
||||
"Error was %s\n",
|
||||
fsp->fsp_name, file_id_string_tos(&fsp->file_id),
|
||||
fsp_str_dbg(fsp),
|
||||
file_id_string_tos(&fsp->file_id),
|
||||
fsp->fh->gen_id,
|
||||
strerror(errno) );
|
||||
}
|
||||
|
@ -111,7 +111,7 @@ static bool linux_set_kernel_oplock(struct kernel_oplocks *ctx,
|
||||
if ( SMB_VFS_LINUX_SETLEASE(fsp, F_WRLCK) == -1) {
|
||||
DEBUG(3,("linux_set_kernel_oplock: Refused oplock on file %s, "
|
||||
"fd = %d, file_id = %s. (%s)\n",
|
||||
fsp->fsp_name, fsp->fh->fd,
|
||||
fsp_str_dbg(fsp), fsp->fh->fd,
|
||||
file_id_string_tos(&fsp->file_id),
|
||||
strerror(errno)));
|
||||
return False;
|
||||
@ -119,7 +119,7 @@ static bool linux_set_kernel_oplock(struct kernel_oplocks *ctx,
|
||||
|
||||
DEBUG(3,("linux_set_kernel_oplock: got kernel oplock on file %s, "
|
||||
"file_id = %s gen_id = %lu\n",
|
||||
fsp->fsp_name, file_id_string_tos(&fsp->file_id),
|
||||
fsp_str_dbg(fsp), file_id_string_tos(&fsp->file_id),
|
||||
fsp->fh->gen_id));
|
||||
|
||||
return True;
|
||||
@ -140,7 +140,8 @@ static void linux_release_kernel_oplock(struct kernel_oplocks *ctx,
|
||||
int state = fcntl(fsp->fh->fd, F_GETLEASE, 0);
|
||||
dbgtext("linux_release_kernel_oplock: file %s, file_id = %s "
|
||||
"gen_id = %lu has kernel oplock state "
|
||||
"of %x.\n", fsp->fsp_name, file_id_string_tos(&fsp->file_id),
|
||||
"of %x.\n", fsp_str_dbg(fsp),
|
||||
file_id_string_tos(&fsp->file_id),
|
||||
fsp->fh->gen_id, state );
|
||||
}
|
||||
|
||||
@ -152,7 +153,7 @@ static void linux_release_kernel_oplock(struct kernel_oplocks *ctx,
|
||||
dbgtext("linux_release_kernel_oplock: Error when "
|
||||
"removing kernel oplock on file " );
|
||||
dbgtext("%s, file_id = %s, gen_id = %lu. "
|
||||
"Error was %s\n", fsp->fsp_name,
|
||||
"Error was %s\n", fsp_str_dbg(fsp),
|
||||
file_id_string_tos(&fsp->file_id),
|
||||
fsp->fh->gen_id, strerror(errno) );
|
||||
}
|
||||
|
@ -74,7 +74,8 @@ const char *onefs_cb_record_str_dbg(const struct onefs_callback_record *r)
|
||||
switch (r->state) {
|
||||
case ONEFS_OPEN_FILE:
|
||||
result = talloc_asprintf(dbg_ctx(), "cb record %llu for file "
|
||||
"%s", r->id, r->data.fsp->fsp_name);
|
||||
"%s", r->id,
|
||||
fsp_str_dbg(r->data.fsp));
|
||||
case ONEFS_WAITING_FOR_OPLOCK:
|
||||
result = talloc_asprintf(dbg_ctx(), "cb record %llu for "
|
||||
"pending mid %d", r->id,
|
||||
@ -299,7 +300,7 @@ static void oplock_break_to_none_handler(uint64_t id)
|
||||
}
|
||||
|
||||
DEBUG(10, ("oplock_break_to_none_handler called for file %s\n",
|
||||
cb->data.fsp->fsp_name));
|
||||
cb->data.fsp_str_dbg(fsp)));
|
||||
|
||||
init_share_mode_entry(&sme, cb, FORCE_OPLOCK_BREAK_TO_NONE);
|
||||
share_mode_entry_to_message(msg, &sme);
|
||||
@ -336,7 +337,7 @@ static void oplock_break_to_level_two_handler(uint64_t id)
|
||||
}
|
||||
|
||||
DEBUG(10, ("oplock_break_to_level_two_handler called for file %s\n",
|
||||
cb->data.fsp->fsp_name));
|
||||
cb->data.fsp_str_dbg(fsp)));
|
||||
|
||||
init_share_mode_entry(&sme, cb, LEVEL_II_OPLOCK);
|
||||
share_mode_entry_to_message(msg, &sme);
|
||||
@ -377,7 +378,7 @@ static void oplock_revoked_handler(uint64_t id)
|
||||
SMB_ASSERT(fsp->oplock_timeout == NULL);
|
||||
|
||||
DEBUG(0,("Level 1 oplock break failed for file %s. Forcefully "
|
||||
"revoking oplock\n", fsp->fsp_name));
|
||||
"revoking oplock\n", fsp_str_dbg(fsp)));
|
||||
|
||||
global_client_failed_oplock_break = True;
|
||||
remove_oplock(fsp);
|
||||
@ -501,7 +502,7 @@ static void onefs_release_kernel_oplock(struct kernel_oplocks *_ctx,
|
||||
enum oplock_type oplock = onefs_samba_oplock_to_oplock(oplock_type);
|
||||
|
||||
DEBUG(10, ("onefs_release_kernel_oplock: Releasing %s to type %s\n",
|
||||
fsp->fsp_name, onefs_oplock_str(oplock)));
|
||||
fsp_str_dbg(fsp), onefs_oplock_str(oplock)));
|
||||
|
||||
if (fsp->fh->fd == -1) {
|
||||
DEBUG(1, ("no fd\n"));
|
||||
|
@ -37,6 +37,7 @@ NTSTATUS open_np_file(struct smb_request *smb_req, const char *name,
|
||||
{
|
||||
struct connection_struct *conn = smb_req->conn;
|
||||
struct files_struct *fsp;
|
||||
struct smb_filename *smb_fname = NULL;
|
||||
NTSTATUS status;
|
||||
|
||||
status = file_new(smb_req, conn, &fsp);
|
||||
@ -50,7 +51,19 @@ NTSTATUS open_np_file(struct smb_request *smb_req, const char *name,
|
||||
fsp->vuid = smb_req->vuid;
|
||||
fsp->can_lock = false;
|
||||
fsp->access_mask = FILE_READ_DATA | FILE_WRITE_DATA;
|
||||
string_set(&fsp->fsp_name, name);
|
||||
|
||||
status = create_synthetic_smb_fname(talloc_tos(), name, NULL, NULL,
|
||||
&smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
file_free(smb_req, fsp);
|
||||
return status;
|
||||
}
|
||||
status = fsp_set_smb_fname(fsp, smb_fname);
|
||||
TALLOC_FREE(smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
file_free(smb_req, fsp);
|
||||
return status;
|
||||
}
|
||||
|
||||
status = np_open(NULL, name, conn->client_address,
|
||||
conn->server_info, &fsp->fake_file_handle);
|
||||
@ -179,7 +192,7 @@ void reply_pipe_write(struct smb_request *req)
|
||||
data = req->buf + 3;
|
||||
|
||||
DEBUG(6, ("reply_pipe_write: %x name: %s len: %d\n", (int)fsp->fnum,
|
||||
fsp->fsp_name, (int)state->numtowrite));
|
||||
fsp_str_dbg(fsp), (int)state->numtowrite));
|
||||
|
||||
subreq = np_write_send(state, smbd_event_context(),
|
||||
fsp->fake_file_handle, data, state->numtowrite);
|
||||
@ -275,7 +288,7 @@ void reply_pipe_write_and_X(struct smb_request *req)
|
||||
== (PIPE_START_MESSAGE|PIPE_RAW_MODE));
|
||||
|
||||
DEBUG(6, ("reply_pipe_write_and_X: %x name: %s len: %d\n",
|
||||
(int)fsp->fnum, fsp->fsp_name, (int)state->numtowrite));
|
||||
(int)fsp->fnum, fsp_str_dbg(fsp), (int)state->numtowrite));
|
||||
|
||||
data = (uint8_t *)smb_base(req->inbuf) + smb_doff;
|
||||
|
||||
|
@ -256,15 +256,16 @@ static void store_inheritance_attributes(files_struct *fsp,
|
||||
ret = SMB_VFS_FSETXATTR(fsp, SAMBA_POSIX_INHERITANCE_EA_NAME,
|
||||
pai_buf, store_size, 0);
|
||||
} else {
|
||||
ret = SMB_VFS_SETXATTR(fsp->conn,fsp->fsp_name, SAMBA_POSIX_INHERITANCE_EA_NAME,
|
||||
pai_buf, store_size, 0);
|
||||
ret = SMB_VFS_SETXATTR(fsp->conn, fsp->fsp_name->base_name,
|
||||
SAMBA_POSIX_INHERITANCE_EA_NAME,
|
||||
pai_buf, store_size, 0);
|
||||
}
|
||||
|
||||
SAFE_FREE(pai_buf);
|
||||
|
||||
DEBUG(10,("store_inheritance_attribute: type 0x%x for file %s\n",
|
||||
(unsigned int)sd_type,
|
||||
fsp->fsp_name));
|
||||
fsp_str_dbg(fsp)));
|
||||
|
||||
if (ret == -1 && !no_acl_syscall_error(errno)) {
|
||||
DEBUG(1,("store_inheritance_attribute: Error %s\n", strerror(errno) ));
|
||||
@ -599,8 +600,10 @@ static struct pai_val *fload_inherited_info(files_struct *fsp)
|
||||
ret = SMB_VFS_FGETXATTR(fsp, SAMBA_POSIX_INHERITANCE_EA_NAME,
|
||||
pai_buf, pai_buf_size);
|
||||
} else {
|
||||
ret = SMB_VFS_GETXATTR(fsp->conn,fsp->fsp_name,SAMBA_POSIX_INHERITANCE_EA_NAME,
|
||||
pai_buf, pai_buf_size);
|
||||
ret = SMB_VFS_GETXATTR(fsp->conn,
|
||||
fsp->fsp_name->base_name,
|
||||
SAMBA_POSIX_INHERITANCE_EA_NAME,
|
||||
pai_buf, pai_buf_size);
|
||||
}
|
||||
|
||||
if (ret == -1) {
|
||||
@ -618,7 +621,8 @@ static struct pai_val *fload_inherited_info(files_struct *fsp)
|
||||
}
|
||||
} while (ret == -1);
|
||||
|
||||
DEBUG(10,("load_inherited_info: ret = %lu for file %s\n", (unsigned long)ret, fsp->fsp_name));
|
||||
DEBUG(10,("load_inherited_info: ret = %lu for file %s\n",
|
||||
(unsigned long)ret, fsp_str_dbg(fsp)));
|
||||
|
||||
if (ret == -1) {
|
||||
/* No attribute or not supported. */
|
||||
@ -637,8 +641,7 @@ static struct pai_val *fload_inherited_info(files_struct *fsp)
|
||||
|
||||
if (paiv) {
|
||||
DEBUG(10,("load_inherited_info: ACL type is 0x%x for file %s\n",
|
||||
(unsigned int)paiv->sd_type,
|
||||
fsp->fsp_name));
|
||||
(unsigned int)paiv->sd_type, fsp_str_dbg(fsp)));
|
||||
}
|
||||
|
||||
SAFE_FREE(pai_buf);
|
||||
@ -1727,8 +1730,12 @@ static bool create_canon_ace_lists(files_struct *fsp,
|
||||
got_dir_allow = True;
|
||||
|
||||
if ((current_ace->attr == DENY_ACE) && got_dir_allow) {
|
||||
DEBUG(0,("create_canon_ace_lists: malformed ACL in inheritable ACL ! \
|
||||
Deny entry after Allow entry. Failing to set on file %s.\n", fsp->fsp_name ));
|
||||
DEBUG(0,("create_canon_ace_lists: "
|
||||
"malformed ACL in "
|
||||
"inheritable ACL! Deny entry "
|
||||
"after Allow entry. Failing "
|
||||
"to set on file %s.\n",
|
||||
fsp_str_dbg(fsp)));
|
||||
free_canon_ace_list(file_ace);
|
||||
free_canon_ace_list(dir_ace);
|
||||
return False;
|
||||
@ -1785,8 +1792,10 @@ Deny entry after Allow entry. Failing to set on file %s.\n", fsp->fsp_name ));
|
||||
got_file_allow = True;
|
||||
|
||||
if ((current_ace->attr == DENY_ACE) && got_file_allow) {
|
||||
DEBUG(0,("create_canon_ace_lists: malformed ACL in file ACL ! \
|
||||
Deny entry after Allow entry. Failing to set on file %s.\n", fsp->fsp_name ));
|
||||
DEBUG(0,("create_canon_ace_lists: malformed "
|
||||
"ACL in file ACL ! Deny entry after "
|
||||
"Allow entry. Failing to set on file "
|
||||
"%s.\n", fsp_str_dbg(fsp)));
|
||||
free_canon_ace_list(file_ace);
|
||||
free_canon_ace_list(dir_ace);
|
||||
return False;
|
||||
@ -2169,17 +2178,8 @@ static mode_t create_default_mode(files_struct *fsp, bool interitable_mode)
|
||||
mode_t mode;
|
||||
|
||||
if (interitable_mode) {
|
||||
struct smb_filename *smb_fname = NULL;
|
||||
NTSTATUS status;
|
||||
|
||||
status = create_synthetic_smb_fname_split(talloc_tos(),
|
||||
fsp->fsp_name, NULL,
|
||||
&smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return 0;
|
||||
}
|
||||
mode = unix_mode(fsp->conn, FILE_ATTRIBUTE_ARCHIVE, smb_fname,
|
||||
NULL);
|
||||
mode = unix_mode(fsp->conn, FILE_ATTRIBUTE_ARCHIVE,
|
||||
fsp->fsp_name, NULL);
|
||||
} else {
|
||||
mode = S_IRUSR;
|
||||
}
|
||||
@ -2602,14 +2602,9 @@ static bool set_canon_ace_list(files_struct *fsp,
|
||||
SMB_ACL_TYPE_T the_acl_type = (default_ace ? SMB_ACL_TYPE_DEFAULT : SMB_ACL_TYPE_ACCESS);
|
||||
bool needs_mask = False;
|
||||
mode_t mask_perms = 0;
|
||||
struct smb_filename *smb_fname = NULL;
|
||||
NTSTATUS status;
|
||||
|
||||
status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
|
||||
psbuf, &smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
goto fail;
|
||||
}
|
||||
/* Use the psbuf that was passed in. */
|
||||
fsp->fsp_name->st = *psbuf;
|
||||
|
||||
#if defined(POSIX_ACL_NEEDS_MASK)
|
||||
/* HP-UX always wants to have a mask (called "class" there). */
|
||||
@ -2767,7 +2762,7 @@ static bool set_canon_ace_list(files_struct *fsp,
|
||||
*/
|
||||
|
||||
if(default_ace || fsp->is_directory || fsp->fh->fd == -1) {
|
||||
if (SMB_VFS_SYS_ACL_SET_FILE(conn, smb_fname->base_name,
|
||||
if (SMB_VFS_SYS_ACL_SET_FILE(conn, fsp->fsp_name->base_name,
|
||||
the_acl_type, the_acl) == -1) {
|
||||
/*
|
||||
* Some systems allow all the above calls and only fail with no ACL support
|
||||
@ -2777,17 +2772,17 @@ static bool set_canon_ace_list(files_struct *fsp,
|
||||
*pacl_set_support = False;
|
||||
}
|
||||
|
||||
if (acl_group_override(conn, smb_fname)) {
|
||||
if (acl_group_override(conn, fsp->fsp_name)) {
|
||||
int sret;
|
||||
|
||||
DEBUG(5,("set_canon_ace_list: acl group "
|
||||
"control on and current user in file "
|
||||
"%s primary group.\n",
|
||||
smb_fname_str_dbg(smb_fname)));
|
||||
fsp_str_dbg(fsp)));
|
||||
|
||||
become_root();
|
||||
sret = SMB_VFS_SYS_ACL_SET_FILE(conn,
|
||||
smb_fname->base_name, the_acl_type,
|
||||
fsp->fsp_name->base_name, the_acl_type,
|
||||
the_acl);
|
||||
unbecome_root();
|
||||
if (sret == 0) {
|
||||
@ -2801,8 +2796,7 @@ static bool set_canon_ace_list(files_struct *fsp,
|
||||
"file %s (%s).\n",
|
||||
the_acl_type == SMB_ACL_TYPE_DEFAULT ?
|
||||
"directory default" : "file",
|
||||
smb_fname_str_dbg(smb_fname),
|
||||
strerror(errno)));
|
||||
fsp_str_dbg(fsp), strerror(errno)));
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
@ -2816,13 +2810,13 @@ static bool set_canon_ace_list(files_struct *fsp,
|
||||
*pacl_set_support = False;
|
||||
}
|
||||
|
||||
if (acl_group_override(conn, smb_fname)) {
|
||||
if (acl_group_override(conn, fsp->fsp_name)) {
|
||||
int sret;
|
||||
|
||||
DEBUG(5,("set_canon_ace_list: acl group "
|
||||
"control on and current user in file "
|
||||
"%s primary group.\n",
|
||||
smb_fname_str_dbg(smb_fname)));
|
||||
fsp_str_dbg(fsp)));
|
||||
|
||||
become_root();
|
||||
sret = SMB_VFS_SYS_ACL_SET_FD(fsp, the_acl);
|
||||
@ -2836,8 +2830,7 @@ static bool set_canon_ace_list(files_struct *fsp,
|
||||
DEBUG(2,("set_canon_ace_list: "
|
||||
"sys_acl_set_file failed for file %s "
|
||||
"(%s).\n",
|
||||
smb_fname_str_dbg(smb_fname),
|
||||
strerror(errno) ));
|
||||
fsp_str_dbg(fsp), strerror(errno)));
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
@ -2850,7 +2843,6 @@ static bool set_canon_ace_list(files_struct *fsp,
|
||||
if (the_acl != NULL) {
|
||||
SMB_VFS_SYS_ACL_FREE_ACL(conn, the_acl);
|
||||
}
|
||||
TALLOC_FREE(smb_fname);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -2906,8 +2898,9 @@ static bool convert_canon_ace_to_posix_perms( files_struct *fsp, canon_ace *file
|
||||
mode_t or_bits;
|
||||
|
||||
if (ace_count != 3) {
|
||||
DEBUG(3,("convert_canon_ace_to_posix_perms: Too many ACE entries for file %s to convert to \
|
||||
posix perms.\n", fsp->fsp_name ));
|
||||
DEBUG(3,("convert_canon_ace_to_posix_perms: Too many ACE "
|
||||
"entries for file %s to convert to posix perms.\n",
|
||||
fsp_str_dbg(fsp)));
|
||||
return False;
|
||||
}
|
||||
|
||||
@ -2921,8 +2914,8 @@ posix perms.\n", fsp->fsp_name ));
|
||||
}
|
||||
|
||||
if (!owner_ace || !group_ace || !other_ace) {
|
||||
DEBUG(3,("convert_canon_ace_to_posix_perms: Can't get standard entries for file %s.\n",
|
||||
fsp->fsp_name ));
|
||||
DEBUG(3,("convert_canon_ace_to_posix_perms: Can't get "
|
||||
"standard entries for file %s.\n", fsp_str_dbg(fsp)));
|
||||
return False;
|
||||
}
|
||||
|
||||
@ -2956,9 +2949,10 @@ posix perms.\n", fsp->fsp_name ));
|
||||
|
||||
*posix_perms = (((*posix_perms) & and_bits)|or_bits);
|
||||
|
||||
DEBUG(10,("convert_canon_ace_to_posix_perms: converted u=%o,g=%o,w=%o to perm=0%o for file %s.\n",
|
||||
(int)owner_ace->perms, (int)group_ace->perms, (int)other_ace->perms, (int)*posix_perms,
|
||||
fsp->fsp_name ));
|
||||
DEBUG(10,("convert_canon_ace_to_posix_perms: converted u=%o,g=%o,w=%o "
|
||||
"to perm=0%o for file %s.\n", (int)owner_ace->perms,
|
||||
(int)group_ace->perms, (int)other_ace->perms,
|
||||
(int)*posix_perms, fsp_str_dbg(fsp)));
|
||||
|
||||
return True;
|
||||
}
|
||||
@ -3351,11 +3345,12 @@ NTSTATUS posix_fget_nt_acl(struct files_struct *fsp, uint32_t security_info,
|
||||
|
||||
*ppdesc = NULL;
|
||||
|
||||
DEBUG(10,("posix_fget_nt_acl: called for file %s\n", fsp->fsp_name ));
|
||||
DEBUG(10,("posix_fget_nt_acl: called for file %s\n",
|
||||
fsp_str_dbg(fsp)));
|
||||
|
||||
/* can it happen that fsp_name == NULL ? */
|
||||
if (fsp->is_directory || fsp->fh->fd == -1) {
|
||||
return posix_get_nt_acl(fsp->conn, fsp->fsp_name,
|
||||
return posix_get_nt_acl(fsp->conn, fsp->fsp_name->base_name,
|
||||
security_info, ppdesc);
|
||||
}
|
||||
|
||||
@ -3369,8 +3364,9 @@ NTSTATUS posix_fget_nt_acl(struct files_struct *fsp, uint32_t security_info,
|
||||
|
||||
pal = fload_inherited_info(fsp);
|
||||
|
||||
return posix_get_nt_acl_common(fsp->conn, fsp->fsp_name, &sbuf, pal,
|
||||
posix_acl, NULL, security_info, ppdesc);
|
||||
return posix_get_nt_acl_common(fsp->conn, fsp->fsp_name->base_name,
|
||||
&sbuf, pal, posix_acl, NULL,
|
||||
security_info, ppdesc);
|
||||
}
|
||||
|
||||
NTSTATUS posix_get_nt_acl(struct connection_struct *conn, const char *name,
|
||||
@ -3514,7 +3510,8 @@ NTSTATUS append_parent_acl(files_struct *fsp,
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
if (!parent_dirname(mem_ctx, fsp->fsp_name, &parent_name, NULL)) {
|
||||
if (!parent_dirname(mem_ctx, fsp->fsp_name->base_name, &parent_name,
|
||||
NULL)) {
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
@ -3596,7 +3593,7 @@ NTSTATUS append_parent_acl(files_struct *fsp,
|
||||
"ignoring non container "
|
||||
"inherit flags %u on ACE with sid %s "
|
||||
"from parent %s\n",
|
||||
fsp->fsp_name,
|
||||
fsp_str_dbg(fsp),
|
||||
(unsigned int)se->flags,
|
||||
sid_string_dbg(&se->trustee),
|
||||
parent_name));
|
||||
@ -3609,7 +3606,7 @@ NTSTATUS append_parent_acl(files_struct *fsp,
|
||||
"ignoring non object "
|
||||
"inherit flags %u on ACE with sid %s "
|
||||
"from parent %s\n",
|
||||
fsp->fsp_name,
|
||||
fsp_str_dbg(fsp),
|
||||
(unsigned int)se->flags,
|
||||
sid_string_dbg(&se->trustee),
|
||||
parent_name));
|
||||
@ -3633,7 +3630,7 @@ NTSTATUS append_parent_acl(files_struct *fsp,
|
||||
DEBUG(10,("append_parent_acl: path %s "
|
||||
"ignoring ACE with protected sid %s "
|
||||
"from parent %s\n",
|
||||
fsp->fsp_name,
|
||||
fsp_str_dbg(fsp),
|
||||
sid_string_dbg(&se->trustee),
|
||||
parent_name));
|
||||
continue;
|
||||
@ -3671,7 +3668,7 @@ NTSTATUS append_parent_acl(files_struct *fsp,
|
||||
DEBUG(10,("append_parent_acl: path %s "
|
||||
"inheriting ACE with sid %s "
|
||||
"from parent %s\n",
|
||||
fsp->fsp_name,
|
||||
fsp_str_dbg(fsp),
|
||||
sid_string_dbg(&se->trustee),
|
||||
parent_name));
|
||||
}
|
||||
@ -3707,21 +3704,13 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
|
||||
bool set_acl_as_root = false;
|
||||
bool acl_set_support = false;
|
||||
bool ret = false;
|
||||
struct smb_filename *smb_fname = NULL;
|
||||
|
||||
status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
|
||||
NULL, &smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
DEBUG(10,("set_nt_acl: called for file %s\n",
|
||||
smb_fname_str_dbg(smb_fname)));
|
||||
fsp_str_dbg(fsp)));
|
||||
|
||||
if (!CAN_WRITE(conn)) {
|
||||
DEBUG(10,("set acl rejected on read-only share\n"));
|
||||
status = NT_STATUS_MEDIA_WRITE_PROTECTED;
|
||||
goto out;
|
||||
return NT_STATUS_MEDIA_WRITE_PROTECTED;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -3729,19 +3718,17 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
|
||||
*/
|
||||
|
||||
if(fsp->is_directory || fsp->fh->fd == -1) {
|
||||
if(SMB_VFS_STAT(fsp->conn, smb_fname) != 0) {
|
||||
status = map_nt_error_from_unix(errno);
|
||||
goto out;
|
||||
if(SMB_VFS_STAT(fsp->conn, fsp->fsp_name) != 0) {
|
||||
return map_nt_error_from_unix(errno);
|
||||
}
|
||||
} else {
|
||||
if(SMB_VFS_FSTAT(fsp, &smb_fname->st) != 0) {
|
||||
status = map_nt_error_from_unix(errno);
|
||||
goto out;
|
||||
if(SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st) != 0) {
|
||||
return map_nt_error_from_unix(errno);
|
||||
}
|
||||
}
|
||||
|
||||
/* Save the original element we check against. */
|
||||
orig_mode = smb_fname->st.st_ex_mode;
|
||||
orig_mode = fsp->fsp_name->st.st_ex_mode;
|
||||
|
||||
/*
|
||||
* Unpack the user/group/world id's.
|
||||
@ -3749,7 +3736,7 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
|
||||
|
||||
status = unpack_nt_owners( SNUM(conn), &user, &grp, security_info_sent, psd);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
goto out;
|
||||
return status;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -3758,24 +3745,22 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
|
||||
* Noticed by Simo.
|
||||
*/
|
||||
|
||||
if (((user != (uid_t)-1) && (smb_fname->st.st_ex_uid != user)) ||
|
||||
(( grp != (gid_t)-1) && (smb_fname->st.st_ex_gid != grp))) {
|
||||
if (((user != (uid_t)-1) && (fsp->fsp_name->st.st_ex_uid != user)) ||
|
||||
(( grp != (gid_t)-1) && (fsp->fsp_name->st.st_ex_gid != grp))) {
|
||||
|
||||
DEBUG(3,("set_nt_acl: chown %s. uid = %u, gid = %u.\n",
|
||||
smb_fname_str_dbg(smb_fname), (unsigned int)user,
|
||||
(unsigned int)grp ));
|
||||
fsp_str_dbg(fsp), (unsigned int)user,
|
||||
(unsigned int)grp));
|
||||
|
||||
if(try_chown(fsp->conn, smb_fname, user, grp) == -1) {
|
||||
if(try_chown(fsp->conn, fsp->fsp_name, user, grp) == -1) {
|
||||
DEBUG(3,("set_nt_acl: chown %s, %u, %u failed. Error "
|
||||
"= %s.\n", smb_fname_str_dbg(smb_fname),
|
||||
"= %s.\n", fsp_str_dbg(fsp),
|
||||
(unsigned int)user, (unsigned int)grp,
|
||||
strerror(errno)));
|
||||
if (errno == EPERM) {
|
||||
status = NT_STATUS_INVALID_OWNER;
|
||||
goto out;
|
||||
return NT_STATUS_INVALID_OWNER;
|
||||
}
|
||||
status = map_nt_error_from_unix(errno);
|
||||
goto out;
|
||||
return map_nt_error_from_unix(errno);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -3784,25 +3769,24 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
|
||||
*/
|
||||
|
||||
if(fsp->is_directory) {
|
||||
if(SMB_VFS_STAT(fsp->conn, smb_fname) != 0) {
|
||||
status = map_nt_error_from_unix(errno);
|
||||
goto out;
|
||||
if(SMB_VFS_STAT(fsp->conn, fsp->fsp_name) != 0) {
|
||||
return map_nt_error_from_unix(errno);
|
||||
}
|
||||
} else {
|
||||
|
||||
int sret;
|
||||
|
||||
if(fsp->fh->fd == -1)
|
||||
sret = SMB_VFS_STAT(fsp->conn, smb_fname);
|
||||
sret = SMB_VFS_STAT(fsp->conn, fsp->fsp_name);
|
||||
else
|
||||
sret = SMB_VFS_FSTAT(fsp, &smb_fname->st);
|
||||
sret = SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st);
|
||||
|
||||
if(sret != 0)
|
||||
return map_nt_error_from_unix(errno);
|
||||
}
|
||||
|
||||
/* Save the original element we check against. */
|
||||
orig_mode = smb_fname->st.st_ex_mode;
|
||||
orig_mode = fsp->fsp_name->st.st_ex_mode;
|
||||
|
||||
/* If we successfully chowned, we know we must
|
||||
* be able to set the acl, so do it as root.
|
||||
@ -3810,24 +3794,22 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
|
||||
set_acl_as_root = true;
|
||||
}
|
||||
|
||||
create_file_sids(&smb_fname->st, &file_owner_sid, &file_grp_sid);
|
||||
create_file_sids(&fsp->fsp_name->st, &file_owner_sid, &file_grp_sid);
|
||||
|
||||
acl_perms = unpack_canon_ace(fsp, &smb_fname->st, &file_owner_sid,
|
||||
acl_perms = unpack_canon_ace(fsp, &fsp->fsp_name->st, &file_owner_sid,
|
||||
&file_grp_sid, &file_ace_list,
|
||||
&dir_ace_list, security_info_sent, psd);
|
||||
|
||||
/* Ignore W2K traverse DACL set. */
|
||||
if (!file_ace_list && !dir_ace_list) {
|
||||
status = NT_STATUS_OK;
|
||||
goto out;
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
if (!acl_perms) {
|
||||
DEBUG(3,("set_nt_acl: cannot set permissions\n"));
|
||||
free_canon_ace_list(file_ace_list);
|
||||
free_canon_ace_list(dir_ace_list);
|
||||
status = NT_STATUS_ACCESS_DENIED;
|
||||
goto out;
|
||||
return NT_STATUS_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -3837,8 +3819,7 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
|
||||
if(!(security_info_sent & DACL_SECURITY_INFORMATION) || (psd->dacl == NULL)) {
|
||||
free_canon_ace_list(file_ace_list);
|
||||
free_canon_ace_list(dir_ace_list);
|
||||
status = NT_STATUS_OK;
|
||||
goto out;
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -3851,18 +3832,17 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
|
||||
become_root();
|
||||
}
|
||||
ret = set_canon_ace_list(fsp, file_ace_list, false,
|
||||
&smb_fname->st, &acl_set_support);
|
||||
&fsp->fsp_name->st, &acl_set_support);
|
||||
if (set_acl_as_root) {
|
||||
unbecome_root();
|
||||
}
|
||||
if (acl_set_support && ret == false) {
|
||||
DEBUG(3,("set_nt_acl: failed to set file acl on file "
|
||||
"%s (%s).\n", smb_fname_str_dbg(smb_fname),
|
||||
"%s (%s).\n", fsp_str_dbg(fsp),
|
||||
strerror(errno)));
|
||||
free_canon_ace_list(file_ace_list);
|
||||
free_canon_ace_list(dir_ace_list);
|
||||
status = map_nt_error_from_unix(errno);
|
||||
goto out;
|
||||
return map_nt_error_from_unix(errno);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3872,7 +3852,7 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
|
||||
become_root();
|
||||
}
|
||||
ret = set_canon_ace_list(fsp, dir_ace_list, true,
|
||||
&smb_fname->st,
|
||||
&fsp->fsp_name->st,
|
||||
&acl_set_support);
|
||||
if (set_acl_as_root) {
|
||||
unbecome_root();
|
||||
@ -3880,12 +3860,10 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
|
||||
if (ret == false) {
|
||||
DEBUG(3,("set_nt_acl: failed to set default "
|
||||
"acl on directory %s (%s).\n",
|
||||
smb_fname_str_dbg(smb_fname),
|
||||
strerror(errno) ));
|
||||
fsp_str_dbg(fsp), strerror(errno)));
|
||||
free_canon_ace_list(file_ace_list);
|
||||
free_canon_ace_list(dir_ace_list);
|
||||
status = map_nt_error_from_unix(errno);
|
||||
goto out;
|
||||
return map_nt_error_from_unix(errno);
|
||||
}
|
||||
} else {
|
||||
int sret = -1;
|
||||
@ -3898,23 +3876,23 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
|
||||
become_root();
|
||||
}
|
||||
sret = SMB_VFS_SYS_ACL_DELETE_DEF_FILE(conn,
|
||||
smb_fname->base_name);
|
||||
fsp->fsp_name->base_name);
|
||||
if (set_acl_as_root) {
|
||||
unbecome_root();
|
||||
}
|
||||
if (sret == -1) {
|
||||
if (acl_group_override(conn, smb_fname)) {
|
||||
if (acl_group_override(conn, fsp->fsp_name)) {
|
||||
DEBUG(5,("set_nt_acl: acl group "
|
||||
"control on and current user "
|
||||
"in file %s primary group. "
|
||||
"Override delete_def_acl\n",
|
||||
smb_fname_str_dbg(smb_fname)));
|
||||
fsp_str_dbg(fsp)));
|
||||
|
||||
become_root();
|
||||
sret =
|
||||
SMB_VFS_SYS_ACL_DELETE_DEF_FILE(
|
||||
conn,
|
||||
smb_fname->base_name);
|
||||
fsp->fsp_name->base_name);
|
||||
unbecome_root();
|
||||
}
|
||||
|
||||
@ -3922,8 +3900,7 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
|
||||
DEBUG(3,("set_nt_acl: sys_acl_delete_def_file failed (%s)\n", strerror(errno)));
|
||||
free_canon_ace_list(file_ace_list);
|
||||
free_canon_ace_list(dir_ace_list);
|
||||
status = map_nt_error_from_unix(errno);
|
||||
goto out;
|
||||
return map_nt_error_from_unix(errno);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3954,52 +3931,48 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
|
||||
free_canon_ace_list(dir_ace_list);
|
||||
DEBUG(3,("set_nt_acl: failed to convert file acl to "
|
||||
"posix permissions for file %s.\n",
|
||||
smb_fname_str_dbg(smb_fname)));
|
||||
status = NT_STATUS_ACCESS_DENIED;
|
||||
goto out;
|
||||
fsp_str_dbg(fsp)));
|
||||
return NT_STATUS_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
if (orig_mode != posix_perms) {
|
||||
int sret = -1;
|
||||
|
||||
DEBUG(3,("set_nt_acl: chmod %s. perms = 0%o.\n",
|
||||
smb_fname_str_dbg(smb_fname),
|
||||
(unsigned int)posix_perms));
|
||||
fsp_str_dbg(fsp), (unsigned int)posix_perms));
|
||||
|
||||
if (set_acl_as_root) {
|
||||
become_root();
|
||||
}
|
||||
sret = SMB_VFS_CHMOD(conn, smb_fname->base_name,
|
||||
sret = SMB_VFS_CHMOD(conn, fsp->fsp_name->base_name,
|
||||
posix_perms);
|
||||
if (set_acl_as_root) {
|
||||
unbecome_root();
|
||||
}
|
||||
if(sret == -1) {
|
||||
if (acl_group_override(conn, smb_fname)) {
|
||||
if (acl_group_override(conn, fsp->fsp_name)) {
|
||||
DEBUG(5,("set_nt_acl: acl group "
|
||||
"control on and current user "
|
||||
"in file %s primary group. "
|
||||
"Override chmod\n",
|
||||
smb_fname_str_dbg(smb_fname)));
|
||||
fsp_str_dbg(fsp)));
|
||||
|
||||
become_root();
|
||||
sret =
|
||||
SMB_VFS_CHMOD(conn,
|
||||
smb_fname->base_name,
|
||||
posix_perms);
|
||||
sret = SMB_VFS_CHMOD(conn,
|
||||
fsp->fsp_name->base_name,
|
||||
posix_perms);
|
||||
unbecome_root();
|
||||
}
|
||||
|
||||
if (sret == -1) {
|
||||
DEBUG(3,("set_nt_acl: chmod %s, 0%o "
|
||||
"failed. Error = %s.\n",
|
||||
smb_fname_str_dbg(smb_fname),
|
||||
fsp_str_dbg(fsp),
|
||||
(unsigned int)posix_perms,
|
||||
strerror(errno)));
|
||||
free_canon_ace_list(file_ace_list);
|
||||
free_canon_ace_list(dir_ace_list);
|
||||
status = map_nt_error_from_unix(errno);
|
||||
goto out;
|
||||
return map_nt_error_from_unix(errno);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4008,10 +3981,7 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
|
||||
free_canon_ace_list(file_ace_list);
|
||||
free_canon_ace_list(dir_ace_list);
|
||||
|
||||
status = NT_STATUS_OK;
|
||||
out:
|
||||
TALLOC_FREE(smb_fname);
|
||||
return status;
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -4614,6 +4584,7 @@ SEC_DESC *get_nt_acl_no_snum( TALLOC_CTX *ctx, const char *fname)
|
||||
connection_struct *conn;
|
||||
files_struct finfo;
|
||||
struct fd_handle fh;
|
||||
NTSTATUS status;
|
||||
|
||||
conn = TALLOC_ZERO_P(ctx, connection_struct);
|
||||
if (conn == NULL) {
|
||||
@ -4644,16 +4615,24 @@ SEC_DESC *get_nt_acl_no_snum( TALLOC_CTX *ctx, const char *fname)
|
||||
finfo.conn = conn;
|
||||
finfo.fh = &fh;
|
||||
finfo.fh->fd = -1;
|
||||
finfo.fsp_name = CONST_DISCARD(char *,fname);
|
||||
|
||||
status = create_synthetic_smb_fname(talloc_tos(), fname, NULL, NULL,
|
||||
&finfo.fsp_name);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
conn_free_internal( conn );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!NT_STATUS_IS_OK(SMB_VFS_FGET_NT_ACL( &finfo, DACL_SECURITY_INFORMATION, &psd))) {
|
||||
DEBUG(0,("get_nt_acl_no_snum: get_nt_acl returned zero.\n"));
|
||||
TALLOC_FREE(finfo.fsp_name);
|
||||
conn_free_internal( conn );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret_sd = dup_sec_desc( ctx, psd );
|
||||
|
||||
TALLOC_FREE(finfo.fsp_name);
|
||||
conn_free_internal( conn );
|
||||
|
||||
return ret_sd;
|
||||
|
@ -1812,7 +1812,8 @@ void reply_open(struct smb_request *req)
|
||||
mtime = convert_timespec_to_time_t(smb_fname->st.st_ex_mtime);
|
||||
|
||||
if (fattr & aDIR) {
|
||||
DEBUG(3,("attempt to open a directory %s\n",fsp->fsp_name));
|
||||
DEBUG(3,("attempt to open a directory %s\n",
|
||||
fsp_str_dbg(fsp)));
|
||||
close_file(req, fsp, ERROR_CLOSE);
|
||||
reply_doserror(req, ERRDOS,ERRnoaccess);
|
||||
goto out;
|
||||
@ -2313,9 +2314,9 @@ void reply_ctemp(struct smb_request *req)
|
||||
SSVAL(req->outbuf,smb_vwv0,fsp->fnum);
|
||||
|
||||
/* the returned filename is relative to the directory */
|
||||
s = strrchr_m(fsp->fsp_name, '/');
|
||||
s = strrchr_m(fsp->fsp_name->base_name, '/');
|
||||
if (!s) {
|
||||
s = fsp->fsp_name;
|
||||
s = fsp->fsp_name->base_name;
|
||||
} else {
|
||||
s++;
|
||||
}
|
||||
@ -2341,8 +2342,8 @@ void reply_ctemp(struct smb_request *req)
|
||||
CVAL(req->outbuf,smb_flg)|CORE_OPLOCK_GRANTED);
|
||||
}
|
||||
|
||||
DEBUG( 2, ( "reply_ctemp: created temp file %s\n", fsp->fsp_name ) );
|
||||
DEBUG( 3, ( "reply_ctemp %s fd=%d umode=0%o\n", fsp->fsp_name,
|
||||
DEBUG(2, ("reply_ctemp: created temp file %s\n", fsp_str_dbg(fsp)));
|
||||
DEBUG(3, ("reply_ctemp %s fd=%d umode=0%o\n", fsp_str_dbg(fsp),
|
||||
fsp->fh->fd, (unsigned int)smb_fname->st.st_ex_mode));
|
||||
out:
|
||||
TALLOC_FREE(smb_fname);
|
||||
@ -2357,22 +2358,13 @@ void reply_ctemp(struct smb_request *req)
|
||||
static NTSTATUS can_rename(connection_struct *conn, files_struct *fsp,
|
||||
uint16 dirtype, SMB_STRUCT_STAT *pst)
|
||||
{
|
||||
struct smb_filename *smb_fname = NULL;
|
||||
NTSTATUS status;
|
||||
uint32 fmode;
|
||||
|
||||
if (!CAN_WRITE(conn)) {
|
||||
return NT_STATUS_MEDIA_WRITE_PROTECTED;
|
||||
}
|
||||
|
||||
status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
|
||||
pst, &smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
fmode = dos_mode(conn, smb_fname);
|
||||
TALLOC_FREE(smb_fname);
|
||||
fmode = dos_mode(conn, fsp->fsp_name);
|
||||
if ((fmode & ~dirtype) & (aHIDDEN | aSYSTEM)) {
|
||||
return NT_STATUS_NO_SUCH_FILE;
|
||||
}
|
||||
@ -2866,7 +2858,7 @@ static void sendfile_short_send(files_struct *fsp,
|
||||
if (nread < headersize) {
|
||||
DEBUG(0,("sendfile_short_send: sendfile failed to send "
|
||||
"header for file %s (%s). Terminating\n",
|
||||
fsp->fsp_name, strerror(errno) ));
|
||||
fsp_str_dbg(fsp), strerror(errno)));
|
||||
exit_server_cleanly("sendfile_short_send failed");
|
||||
}
|
||||
|
||||
@ -2880,7 +2872,7 @@ static void sendfile_short_send(files_struct *fsp,
|
||||
}
|
||||
|
||||
DEBUG(0,("sendfile_short_send: filling truncated file %s "
|
||||
"with zeros !\n", fsp->fsp_name));
|
||||
"with zeros !\n", fsp_str_dbg(fsp)));
|
||||
|
||||
while (nread < smb_maxcnt) {
|
||||
/*
|
||||
@ -2975,15 +2967,19 @@ static void send_file_readbraw(connection_struct *conn,
|
||||
DEBUG(0,("send_file_readbraw: sendfile not available. Faking..\n"));
|
||||
|
||||
if (fake_sendfile(fsp, startpos, nread) == -1) {
|
||||
DEBUG(0,("send_file_readbraw: fake_sendfile failed for file %s (%s).\n",
|
||||
fsp->fsp_name, strerror(errno) ));
|
||||
DEBUG(0,("send_file_readbraw: "
|
||||
"fake_sendfile failed for "
|
||||
"file %s (%s).\n",
|
||||
fsp_str_dbg(fsp),
|
||||
strerror(errno)));
|
||||
exit_server_cleanly("send_file_readbraw fake_sendfile failed");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
DEBUG(0,("send_file_readbraw: sendfile failed for file %s (%s). Terminating\n",
|
||||
fsp->fsp_name, strerror(errno) ));
|
||||
DEBUG(0,("send_file_readbraw: sendfile failed for "
|
||||
"file %s (%s). Terminating\n",
|
||||
fsp_str_dbg(fsp), strerror(errno)));
|
||||
exit_server_cleanly("send_file_readbraw sendfile failed");
|
||||
} else if (sendfile_read == 0) {
|
||||
/*
|
||||
@ -2995,7 +2991,7 @@ static void send_file_readbraw(connection_struct *conn,
|
||||
*/
|
||||
DEBUG(3, ("send_file_readbraw: sendfile sent zero "
|
||||
"bytes falling back to the normal read: "
|
||||
"%s\n", fsp->fsp_name));
|
||||
"%s\n", fsp_str_dbg(fsp)));
|
||||
goto normal_readbraw;
|
||||
}
|
||||
|
||||
@ -3507,8 +3503,11 @@ static void send_file_readX(connection_struct *conn, struct smb_request *req,
|
||||
nread = fake_sendfile(fsp, startpos,
|
||||
smb_maxcnt);
|
||||
if (nread == -1) {
|
||||
DEBUG(0,("send_file_readX: fake_sendfile failed for file %s (%s).\n",
|
||||
fsp->fsp_name, strerror(errno) ));
|
||||
DEBUG(0,("send_file_readX: "
|
||||
"fake_sendfile failed for "
|
||||
"file %s (%s).\n",
|
||||
fsp_str_dbg(fsp),
|
||||
strerror(errno)));
|
||||
exit_server_cleanly("send_file_readX: fake_sendfile failed");
|
||||
}
|
||||
DEBUG( 3, ( "send_file_readX: fake_sendfile fnum=%d max=%d nread=%d\n",
|
||||
@ -3517,8 +3516,9 @@ static void send_file_readX(connection_struct *conn, struct smb_request *req,
|
||||
goto strict_unlock;
|
||||
}
|
||||
|
||||
DEBUG(0,("send_file_readX: sendfile failed for file %s (%s). Terminating\n",
|
||||
fsp->fsp_name, strerror(errno) ));
|
||||
DEBUG(0,("send_file_readX: sendfile failed for file "
|
||||
"%s (%s). Terminating\n", fsp_str_dbg(fsp),
|
||||
strerror(errno)));
|
||||
exit_server_cleanly("send_file_readX sendfile failed");
|
||||
} else if (nread == 0) {
|
||||
/*
|
||||
@ -3530,7 +3530,7 @@ static void send_file_readX(connection_struct *conn, struct smb_request *req,
|
||||
*/
|
||||
DEBUG(3, ("send_file_readX: sendfile sent zero bytes "
|
||||
"falling back to the normal read: %s\n",
|
||||
fsp->fsp_name));
|
||||
fsp_str_dbg(fsp)));
|
||||
goto normal_read;
|
||||
}
|
||||
|
||||
@ -3560,14 +3560,16 @@ normal_read:
|
||||
/* Send out the header. */
|
||||
if (write_data(smbd_server_fd(), (char *)headerbuf,
|
||||
sizeof(headerbuf)) != sizeof(headerbuf)) {
|
||||
DEBUG(0,("send_file_readX: write_data failed for file %s (%s). Terminating\n",
|
||||
fsp->fsp_name, strerror(errno) ));
|
||||
DEBUG(0,("send_file_readX: write_data failed for file "
|
||||
"%s (%s). Terminating\n", fsp_str_dbg(fsp),
|
||||
strerror(errno)));
|
||||
exit_server_cleanly("send_file_readX sendfile failed");
|
||||
}
|
||||
nread = fake_sendfile(fsp, startpos, smb_maxcnt);
|
||||
if (nread == -1) {
|
||||
DEBUG(0,("send_file_readX: fake_sendfile failed for file %s (%s).\n",
|
||||
fsp->fsp_name, strerror(errno) ));
|
||||
DEBUG(0,("send_file_readX: fake_sendfile failed for "
|
||||
"file %s (%s).\n", fsp_str_dbg(fsp),
|
||||
strerror(errno)));
|
||||
exit_server_cleanly("send_file_readX: fake_sendfile failed");
|
||||
}
|
||||
goto strict_unlock;
|
||||
@ -3914,7 +3916,7 @@ void reply_writebraw(struct smb_request *req)
|
||||
status = sync_file(conn, fsp, write_through);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
DEBUG(5,("reply_writebraw: sync_file for %s returned %s\n",
|
||||
fsp->fsp_name, nt_errstr(status) ));
|
||||
fsp_str_dbg(fsp), nt_errstr(status)));
|
||||
reply_nterror(req, status);
|
||||
error_to_writebrawerr(req);
|
||||
goto strict_unlock;
|
||||
@ -4024,7 +4026,7 @@ void reply_writeunlock(struct smb_request *req)
|
||||
status = sync_file(conn, fsp, False /* write through */);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
DEBUG(5,("reply_writeunlock: sync_file for %s returned %s\n",
|
||||
fsp->fsp_name, nt_errstr(status) ));
|
||||
fsp_str_dbg(fsp), nt_errstr(status)));
|
||||
reply_nterror(req, status);
|
||||
goto strict_unlock;
|
||||
}
|
||||
@ -4158,7 +4160,7 @@ void reply_write(struct smb_request *req)
|
||||
status = sync_file(conn, fsp, False);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
DEBUG(5,("reply_write: sync_file for %s returned %s\n",
|
||||
fsp->fsp_name, nt_errstr(status) ));
|
||||
fsp_str_dbg(fsp), nt_errstr(status)));
|
||||
reply_nterror(req, status);
|
||||
goto strict_unlock;
|
||||
}
|
||||
@ -4441,7 +4443,7 @@ void reply_write_and_X(struct smb_request *req)
|
||||
status = sync_file(conn, fsp, write_through);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
DEBUG(5,("reply_write_and_X: sync_file for %s returned %s\n",
|
||||
fsp->fsp_name, nt_errstr(status) ));
|
||||
fsp_str_dbg(fsp), nt_errstr(status)));
|
||||
reply_nterror(req, status);
|
||||
goto strict_unlock;
|
||||
}
|
||||
@ -4577,7 +4579,7 @@ void reply_flush(struct smb_request *req)
|
||||
NTSTATUS status = sync_file(conn, fsp, True);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
DEBUG(5,("reply_flush: sync_file for %s returned %s\n",
|
||||
fsp->fsp_name, nt_errstr(status) ));
|
||||
fsp_str_dbg(fsp), nt_errstr(status)));
|
||||
reply_nterror(req, status);
|
||||
END_PROFILE(SMBflush);
|
||||
return;
|
||||
@ -4745,8 +4747,8 @@ void reply_writeclose(struct smb_request *req)
|
||||
*/
|
||||
|
||||
if (numtowrite) {
|
||||
DEBUG(3,("reply_writeclose: zero length write doesn't close file %s\n",
|
||||
fsp->fsp_name ));
|
||||
DEBUG(3,("reply_writeclose: zero length write doesn't close "
|
||||
"file %s\n", fsp_str_dbg(fsp)));
|
||||
close_status = close_file(req, fsp, NORMAL_CLOSE);
|
||||
}
|
||||
|
||||
@ -5743,7 +5745,6 @@ static void rename_open_files(connection_struct *conn,
|
||||
{
|
||||
files_struct *fsp;
|
||||
bool did_rename = False;
|
||||
char *fname_dst = NULL;
|
||||
NTSTATUS status;
|
||||
|
||||
for(fsp = file_find_di_first(lck->id); fsp;
|
||||
@ -5757,17 +5758,13 @@ static void rename_open_files(connection_struct *conn,
|
||||
}
|
||||
DEBUG(10, ("rename_open_files: renaming file fnum %d "
|
||||
"(file_id %s) from %s -> %s\n", fsp->fnum,
|
||||
file_id_string_tos(&fsp->file_id), fsp->fsp_name,
|
||||
file_id_string_tos(&fsp->file_id), fsp_str_dbg(fsp),
|
||||
smb_fname_str_dbg(smb_fname_dst)));
|
||||
|
||||
status = get_full_smb_filename(talloc_tos(), smb_fname_dst,
|
||||
&fname_dst);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return;
|
||||
status = fsp_set_smb_fname(fsp, smb_fname_dst);
|
||||
if (NT_STATUS_IS_OK(status)) {
|
||||
did_rename = True;
|
||||
}
|
||||
string_set(&fsp->fsp_name, fname_dst);
|
||||
did_rename = True;
|
||||
TALLOC_FREE(fname_dst);
|
||||
}
|
||||
|
||||
if (!did_rename) {
|
||||
@ -5899,17 +5896,12 @@ NTSTATUS rename_internals_fsp(connection_struct *conn,
|
||||
}
|
||||
|
||||
/* Make a copy of the src and dst smb_fname structs */
|
||||
status = copy_smb_filename(ctx, smb_fname_dst_in, &smb_fname_dst);
|
||||
status = copy_smb_filename(ctx, fsp->fsp_name, &smb_fname_src);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* This will be replaced with copy_smb_filename() when fsp->fsp_name
|
||||
* is converted to store an smb_filename struct.
|
||||
*/
|
||||
status = create_synthetic_smb_fname_split(ctx, fsp->fsp_name, NULL,
|
||||
&smb_fname_src);
|
||||
status = copy_smb_filename(ctx, smb_fname_dst_in, &smb_fname_dst);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
goto out;
|
||||
}
|
||||
@ -7273,7 +7265,7 @@ NTSTATUS smbd_do_locking(struct smb_request *req,
|
||||
(double)e->offset,
|
||||
(double)e->count,
|
||||
(unsigned int)e->smbpid,
|
||||
fsp->fsp_name));
|
||||
fsp_str_dbg(fsp)));
|
||||
|
||||
if (e->brltype != UNLOCK_LOCK) {
|
||||
/* this can only happen with SMB2 */
|
||||
@ -7312,7 +7304,7 @@ NTSTATUS smbd_do_locking(struct smb_request *req,
|
||||
(double)e->offset,
|
||||
(double)e->count,
|
||||
(unsigned int)e->smbpid,
|
||||
fsp->fsp_name,
|
||||
fsp_str_dbg(fsp),
|
||||
(int)timeout));
|
||||
|
||||
if (type & LOCKING_ANDX_CANCEL_LOCK) {
|
||||
@ -7528,7 +7520,8 @@ void reply_lockingX(struct smb_request *req)
|
||||
DEBUG(5,("reply_lockingX: Error : oplock break from "
|
||||
"client for fnum = %d (oplock=%d) and no "
|
||||
"oplock granted on this file (%s).\n",
|
||||
fsp->fnum, fsp->oplock_type, fsp->fsp_name));
|
||||
fsp->fnum, fsp->oplock_type,
|
||||
fsp_str_dbg(fsp)));
|
||||
|
||||
/* if this is a pure oplock break request then don't
|
||||
* send a reply */
|
||||
@ -7551,7 +7544,7 @@ void reply_lockingX(struct smb_request *req)
|
||||
|
||||
if (!result) {
|
||||
DEBUG(0, ("reply_lockingX: error in removing "
|
||||
"oplock on file %s\n", fsp->fsp_name));
|
||||
"oplock on file %s\n", fsp_str_dbg(fsp)));
|
||||
/* Hmmm. Is this panic justified? */
|
||||
smb_panic("internal tdb error");
|
||||
}
|
||||
@ -7708,7 +7701,6 @@ void reply_readbs(struct smb_request *req)
|
||||
void reply_setattrE(struct smb_request *req)
|
||||
{
|
||||
connection_struct *conn = req->conn;
|
||||
struct smb_filename *smb_fname = NULL;
|
||||
struct smb_file_time ft;
|
||||
files_struct *fsp;
|
||||
NTSTATUS status;
|
||||
@ -7728,14 +7720,6 @@ void reply_setattrE(struct smb_request *req)
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* XXX: Remove when fsp->fsp_name is converted to smb_filename. */
|
||||
status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
|
||||
NULL, &smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
reply_nterror(req, status);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert the DOS times into unix times.
|
||||
*/
|
||||
@ -7756,7 +7740,7 @@ void reply_setattrE(struct smb_request *req)
|
||||
|
||||
/* Ensure we have a valid stat struct for the source. */
|
||||
if (fsp->fh->fd != -1) {
|
||||
if (SMB_VFS_FSTAT(fsp, &smb_fname->st) == -1) {
|
||||
if (SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st) == -1) {
|
||||
status = map_nt_error_from_unix(errno);
|
||||
reply_nterror(req, status);
|
||||
goto out;
|
||||
@ -7765,9 +7749,9 @@ void reply_setattrE(struct smb_request *req)
|
||||
int ret = -1;
|
||||
|
||||
if (fsp->posix_open) {
|
||||
ret = SMB_VFS_LSTAT(conn, smb_fname);
|
||||
ret = SMB_VFS_LSTAT(conn, fsp->fsp_name);
|
||||
} else {
|
||||
ret = SMB_VFS_STAT(conn, smb_fname);
|
||||
ret = SMB_VFS_STAT(conn, fsp->fsp_name);
|
||||
}
|
||||
if (ret == -1) {
|
||||
status = map_nt_error_from_unix(errno);
|
||||
@ -7776,7 +7760,7 @@ void reply_setattrE(struct smb_request *req)
|
||||
}
|
||||
}
|
||||
|
||||
status = smb_set_file_time(conn, fsp, smb_fname, &ft, true);
|
||||
status = smb_set_file_time(conn, fsp, fsp->fsp_name, &ft, true);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
reply_doserror(req, ERRDOS, ERRnoaccess);
|
||||
goto out;
|
||||
@ -7836,8 +7820,6 @@ void reply_getattrE(struct smb_request *req)
|
||||
int mode;
|
||||
files_struct *fsp;
|
||||
struct timespec create_ts;
|
||||
struct smb_filename *smb_fname = NULL;
|
||||
NTSTATUS status;
|
||||
|
||||
START_PROFILE(SMBgetattrE);
|
||||
|
||||
@ -7862,16 +7844,9 @@ void reply_getattrE(struct smb_request *req)
|
||||
return;
|
||||
}
|
||||
|
||||
status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
|
||||
&sbuf, &smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
reply_nterror(req, status);
|
||||
END_PROFILE(SMBgetattrE);
|
||||
return;
|
||||
}
|
||||
fsp->fsp_name->st = sbuf;
|
||||
|
||||
mode = dos_mode(conn, smb_fname);
|
||||
TALLOC_FREE(smb_fname);
|
||||
mode = dos_mode(conn, fsp->fsp_name);
|
||||
|
||||
/*
|
||||
* Convert the times into dos times. Set create
|
||||
|
@ -121,7 +121,7 @@ static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
|
||||
status = close_file(smbreq, fsp, NORMAL_CLOSE);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
DEBUG(5,("smbd_smb2_close: close_file[%s]: %s\n",
|
||||
fsp->fsp_name, nt_errstr(status)));
|
||||
fsp_str_dbg(fsp), nt_errstr(status)));
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -259,7 +259,6 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
|
||||
files_struct *result;
|
||||
int info;
|
||||
SMB_STRUCT_STAT sbuf;
|
||||
struct smb_filename *smb_fname = NULL;
|
||||
|
||||
req = tevent_req_create(mem_ctx, &state,
|
||||
struct smbd_smb2_create_state);
|
||||
@ -316,6 +315,8 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
|
||||
}
|
||||
info = FILE_WAS_CREATED;
|
||||
} else {
|
||||
struct smb_filename *smb_fname = NULL;
|
||||
|
||||
/* these are ignored for SMB2 */
|
||||
in_create_options &= ~(0x10);/* NTCREATEX_OPTIONS_SYNC_ALERT */
|
||||
in_create_options &= ~(0x20);/* NTCREATEX_OPTIONS_ASYNC_ALERT */
|
||||
@ -328,6 +329,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
|
||||
NULL);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
tevent_req_nterror(req, status);
|
||||
TALLOC_FREE(smb_fname);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -348,19 +350,11 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
|
||||
&info);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
tevent_req_nterror(req, status);
|
||||
TALLOC_FREE(smb_fname);
|
||||
goto out;
|
||||
}
|
||||
sbuf = smb_fname->st;
|
||||
}
|
||||
|
||||
if (!smb_fname) {
|
||||
status = create_synthetic_smb_fname_split(talloc_tos(),
|
||||
result->fsp_name,
|
||||
&sbuf, &smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
tevent_req_nterror(req, status);
|
||||
goto out;
|
||||
}
|
||||
TALLOC_FREE(smb_fname);
|
||||
}
|
||||
|
||||
smb2req->compat_chain_fsp = smbreq->chain_fsp;
|
||||
@ -379,7 +373,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
|
||||
state->out_allocation_size = sbuf.st_ex_blksize * sbuf.st_ex_blocks;
|
||||
state->out_end_of_file = sbuf.st_ex_size;
|
||||
state->out_file_attributes = dos_mode(result->conn,
|
||||
smb_fname);
|
||||
result->fsp_name);
|
||||
if (state->out_file_attributes == 0) {
|
||||
state->out_file_attributes = FILE_ATTRIBUTE_NORMAL;
|
||||
}
|
||||
@ -387,7 +381,6 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
|
||||
|
||||
tevent_req_done(req);
|
||||
out:
|
||||
TALLOC_FREE(smb_fname);
|
||||
return tevent_req_post(req, ev);
|
||||
}
|
||||
|
||||
|
@ -176,7 +176,7 @@ static struct tevent_req *smbd_smb2_flush_send(TALLOC_CTX *mem_ctx,
|
||||
status = sync_file(smbreq->conn, fsp, true);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
DEBUG(5,("smbd_smb2_flush: sync_file for %s returned %s\n",
|
||||
fsp->fsp_name, nt_errstr(status)));
|
||||
fsp_str_dbg(fsp), nt_errstr(status)));
|
||||
tevent_req_nterror(req, status);
|
||||
return tevent_req_post(req, ev);
|
||||
}
|
||||
|
@ -244,7 +244,6 @@ static struct tevent_req *smbd_smb2_getinfo_send(TALLOC_CTX *mem_ctx,
|
||||
uint16_t file_info_level;
|
||||
char *data = NULL;
|
||||
unsigned int data_size = 0;
|
||||
struct smb_filename *smb_fname = NULL;
|
||||
bool delete_pending = false;
|
||||
struct timespec write_time_ts;
|
||||
struct file_id fileid;
|
||||
@ -271,15 +270,6 @@ static struct tevent_req *smbd_smb2_getinfo_send(TALLOC_CTX *mem_ctx,
|
||||
break;
|
||||
}
|
||||
|
||||
status = create_synthetic_smb_fname_split(state,
|
||||
fsp->fsp_name,
|
||||
NULL,
|
||||
&smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
tevent_req_nterror(req, status);
|
||||
return tevent_req_post(req, ev);
|
||||
}
|
||||
|
||||
if (fsp->fake_file_handle) {
|
||||
/*
|
||||
* This is actually for the QUOTA_FAKE_FILE --metze
|
||||
@ -296,34 +286,34 @@ static struct tevent_req *smbd_smb2_getinfo_send(TALLOC_CTX *mem_ctx,
|
||||
|
||||
if (INFO_LEVEL_IS_UNIX(file_info_level)) {
|
||||
/* Always do lstat for UNIX calls. */
|
||||
if (SMB_VFS_LSTAT(conn, smb_fname)) {
|
||||
if (SMB_VFS_LSTAT(conn, fsp->fsp_name)) {
|
||||
DEBUG(3,("smbd_smb2_getinfo_send: "
|
||||
"SMB_VFS_LSTAT of %s failed "
|
||||
"(%s)\n",
|
||||
smb_fname_str_dbg(smb_fname),
|
||||
"(%s)\n", fsp_str_dbg(fsp),
|
||||
strerror(errno)));
|
||||
status = map_nt_error_from_unix(errno);
|
||||
tevent_req_nterror(req, status);
|
||||
return tevent_req_post(req, ev);
|
||||
}
|
||||
} else if (SMB_VFS_STAT(conn, smb_fname)) {
|
||||
} else if (SMB_VFS_STAT(conn, fsp->fsp_name)) {
|
||||
DEBUG(3,("smbd_smb2_getinfo_send: "
|
||||
"SMB_VFS_STAT of %s failed (%s)\n",
|
||||
smb_fname_str_dbg(smb_fname),
|
||||
fsp_str_dbg(fsp),
|
||||
strerror(errno)));
|
||||
status = map_nt_error_from_unix(errno);
|
||||
tevent_req_nterror(req, status);
|
||||
return tevent_req_post(req, ev);
|
||||
}
|
||||
|
||||
fileid = vfs_file_id_from_sbuf(conn, &smb_fname->st);
|
||||
fileid = vfs_file_id_from_sbuf(conn,
|
||||
&fsp->fsp_name->st);
|
||||
get_file_infos(fileid, &delete_pending, &write_time_ts);
|
||||
} else {
|
||||
/*
|
||||
* Original code - this is an open file.
|
||||
*/
|
||||
|
||||
if (SMB_VFS_FSTAT(fsp, &smb_fname->st) != 0) {
|
||||
if (SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st) != 0) {
|
||||
DEBUG(3, ("smbd_smb2_getinfo_send: "
|
||||
"fstat of fnum %d failed (%s)\n",
|
||||
fsp->fnum, strerror(errno)));
|
||||
@ -331,14 +321,15 @@ static struct tevent_req *smbd_smb2_getinfo_send(TALLOC_CTX *mem_ctx,
|
||||
tevent_req_nterror(req, status);
|
||||
return tevent_req_post(req, ev);
|
||||
}
|
||||
fileid = vfs_file_id_from_sbuf(conn, &smb_fname->st);
|
||||
fileid = vfs_file_id_from_sbuf(conn,
|
||||
&fsp->fsp_name->st);
|
||||
get_file_infos(fileid, &delete_pending, &write_time_ts);
|
||||
}
|
||||
|
||||
status = smbd_do_qfilepathinfo(conn, state,
|
||||
file_info_level,
|
||||
fsp,
|
||||
smb_fname,
|
||||
fsp->fsp_name,
|
||||
delete_pending,
|
||||
write_time_ts,
|
||||
ms_dfs_link,
|
||||
|
@ -231,7 +231,7 @@ static struct tevent_req *smbd_smb2_notify_send(TALLOC_CTX *mem_ctx,
|
||||
|
||||
DEBUG(3,("smbd_smb2_notify_send: notify change "
|
||||
"called on %s, filter = %s, recursive = %d\n",
|
||||
fsp->fsp_name, filter_string, recursive));
|
||||
fsp_str_dbg(fsp), filter_string, recursive));
|
||||
|
||||
TALLOC_FREE(filter_string);
|
||||
}
|
||||
|
@ -281,13 +281,13 @@ static struct tevent_req *smbd_smb2_read_send(TALLOC_CTX *mem_ctx,
|
||||
|
||||
if (nread < 0) {
|
||||
DEBUG(5,("smbd_smb2_read: read_file[%s] nread[%lld]\n",
|
||||
fsp->fsp_name, (long long)nread));
|
||||
fsp_str_dbg(fsp), (long long)nread));
|
||||
tevent_req_nterror(req, NT_STATUS_ACCESS_DENIED);
|
||||
return tevent_req_post(req, ev);
|
||||
}
|
||||
if (nread == 0 && in_length != 0) {
|
||||
DEBUG(5,("smbd_smb2_read: read_file[%s] end of file\n",
|
||||
fsp->fsp_name));
|
||||
fsp_str_dbg(fsp)));
|
||||
tevent_req_nterror(req, NT_STATUS_END_OF_FILE);
|
||||
return tevent_req_post(req, ev);
|
||||
}
|
||||
|
@ -209,7 +209,6 @@ static struct tevent_req *smbd_smb2_setinfo_send(TALLOC_CTX *mem_ctx,
|
||||
case 0x01:/* SMB2_SETINFO_FILE */
|
||||
{
|
||||
uint16_t file_info_level;
|
||||
struct smb_filename *smb_fname = NULL;
|
||||
char *data;
|
||||
int data_size;
|
||||
int ret_size = 0;
|
||||
@ -221,15 +220,6 @@ static struct tevent_req *smbd_smb2_setinfo_send(TALLOC_CTX *mem_ctx,
|
||||
file_info_level = 0xFF00 + in_file_info_class;
|
||||
}
|
||||
|
||||
status = create_synthetic_smb_fname_split(state,
|
||||
fsp->fsp_name,
|
||||
NULL,
|
||||
&smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
tevent_req_nterror(req, status);
|
||||
return tevent_req_post(req, ev);
|
||||
}
|
||||
|
||||
if (fsp->is_directory || fsp->fh->fd == -1) {
|
||||
/*
|
||||
* This is actually a SETFILEINFO on a directory
|
||||
@ -238,21 +228,20 @@ static struct tevent_req *smbd_smb2_setinfo_send(TALLOC_CTX *mem_ctx,
|
||||
*/
|
||||
if (INFO_LEVEL_IS_UNIX(file_info_level)) {
|
||||
/* Always do lstat for UNIX calls. */
|
||||
if (SMB_VFS_LSTAT(conn, smb_fname)) {
|
||||
if (SMB_VFS_LSTAT(conn, fsp->fsp_name)) {
|
||||
DEBUG(3,("smbd_smb2_setinfo_send: "
|
||||
"SMB_VFS_LSTAT of %s failed "
|
||||
"(%s)\n",
|
||||
smb_fname_str_dbg(smb_fname),
|
||||
"(%s)\n", fsp_str_dbg(fsp),
|
||||
strerror(errno)));
|
||||
status = map_nt_error_from_unix(errno);
|
||||
tevent_req_nterror(req, status);
|
||||
return tevent_req_post(req, ev);
|
||||
}
|
||||
} else {
|
||||
if (SMB_VFS_STAT(conn, smb_fname) != 0) {
|
||||
if (SMB_VFS_STAT(conn, fsp->fsp_name) != 0) {
|
||||
DEBUG(3,("smbd_smb2_setinfo_send: "
|
||||
"fileinfo of %s failed (%s)\n",
|
||||
smb_fname_str_dbg(smb_fname),
|
||||
fsp_str_dbg(fsp),
|
||||
strerror(errno)));
|
||||
status = map_nt_error_from_unix(errno);
|
||||
tevent_req_nterror(req, status);
|
||||
@ -270,7 +259,7 @@ static struct tevent_req *smbd_smb2_setinfo_send(TALLOC_CTX *mem_ctx,
|
||||
|
||||
DEBUG(3,("smbd_smb2_setinfo_send: "
|
||||
"Cancelling print job (%s)\n",
|
||||
fsp->fsp_name));
|
||||
fsp_str_dbg(fsp)));
|
||||
|
||||
tevent_req_done(req);
|
||||
return tevent_req_post(req, ev);
|
||||
@ -284,7 +273,7 @@ static struct tevent_req *smbd_smb2_setinfo_send(TALLOC_CTX *mem_ctx,
|
||||
* Original code - this is an open file.
|
||||
*/
|
||||
|
||||
if (SMB_VFS_FSTAT(fsp, &smb_fname->st) != 0) {
|
||||
if (SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st) != 0) {
|
||||
DEBUG(3,("smbd_smb2_setinfo_send: fstat "
|
||||
"of fnum %d failed (%s)\n", fsp->fnum,
|
||||
strerror(errno)));
|
||||
@ -307,7 +296,7 @@ static struct tevent_req *smbd_smb2_setinfo_send(TALLOC_CTX *mem_ctx,
|
||||
status = smbd_do_setfilepathinfo(conn, smbreq, state,
|
||||
file_info_level,
|
||||
fsp,
|
||||
smb_fname,
|
||||
fsp->fsp_name,
|
||||
&data,
|
||||
data_size,
|
||||
&ret_size);
|
||||
|
@ -272,14 +272,14 @@ static struct tevent_req *smbd_smb2_write_send(TALLOC_CTX *mem_ctx,
|
||||
|
||||
if (((nwritten == 0) && (in_data.length != 0)) || (nwritten < 0)) {
|
||||
DEBUG(5,("smbd_smb2_write: write_file[%s] disk full\n",
|
||||
fsp->fsp_name));
|
||||
fsp_str_dbg(fsp)));
|
||||
SMB_VFS_STRICT_UNLOCK(conn, fsp, &lock);
|
||||
tevent_req_nterror(req, NT_STATUS_DISK_FULL);
|
||||
return tevent_req_post(req, ev);
|
||||
}
|
||||
|
||||
DEBUG(3,("smbd_smb2_write: fnum=[%d/%s] length=%d offset=%d wrote=%d\n",
|
||||
fsp->fnum, fsp->fsp_name, (int)in_data.length,
|
||||
fsp->fnum, fsp_str_dbg(fsp), (int)in_data.length,
|
||||
(int)in_offset, (int)nwritten));
|
||||
|
||||
if (in_flags & 0x00000001) {
|
||||
@ -289,7 +289,7 @@ static struct tevent_req *smbd_smb2_write_send(TALLOC_CTX *mem_ctx,
|
||||
status = sync_file(conn, fsp, write_through);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
DEBUG(5,("smbd_smb2_write: sync_file for %s returned %s\n",
|
||||
fsp->fsp_name, nt_errstr(status)));
|
||||
fsp_str_dbg(fsp), nt_errstr(status)));
|
||||
SMB_VFS_STRICT_UNLOCK(conn, fsp, &lock);
|
||||
tevent_req_nterror(req, status);
|
||||
return tevent_req_post(req, ev);
|
||||
|
@ -502,8 +502,9 @@ NTSTATUS set_ea(connection_struct *conn, files_struct *fsp,
|
||||
if (ea_list->ea.value.length == 0) {
|
||||
/* Remove the attribute. */
|
||||
if (fsp && (fsp->fh->fd != -1)) {
|
||||
DEBUG(10,("set_ea: deleting ea name %s on file %s by file descriptor.\n",
|
||||
unix_ea_name, fsp->fsp_name));
|
||||
DEBUG(10,("set_ea: deleting ea name %s on "
|
||||
"file %s by file descriptor.\n",
|
||||
unix_ea_name, fsp_str_dbg(fsp)));
|
||||
ret = SMB_VFS_FREMOVEXATTR(fsp, unix_ea_name);
|
||||
} else {
|
||||
DEBUG(10,("set_ea: deleting ea name %s on file %s.\n",
|
||||
@ -520,8 +521,9 @@ NTSTATUS set_ea(connection_struct *conn, files_struct *fsp,
|
||||
#endif
|
||||
} else {
|
||||
if (fsp && (fsp->fh->fd != -1)) {
|
||||
DEBUG(10,("set_ea: setting ea name %s on file %s by file descriptor.\n",
|
||||
unix_ea_name, fsp->fsp_name));
|
||||
DEBUG(10,("set_ea: setting ea name %s on file "
|
||||
"%s by file descriptor.\n",
|
||||
unix_ea_name, fsp_str_dbg(fsp)));
|
||||
ret = SMB_VFS_FSETXATTR(fsp, unix_ea_name,
|
||||
ea_list->ea.value.data, ea_list->ea.value.length, 0);
|
||||
} else {
|
||||
@ -1148,7 +1150,8 @@ static void call_trans2open(connection_struct *conn,
|
||||
SIVAL(params,20,inode);
|
||||
SSVAL(params,24,0); /* Padding. */
|
||||
if (flags & 8) {
|
||||
uint32 ea_size = estimate_ea_size(conn, fsp, fsp->fsp_name);
|
||||
uint32 ea_size = estimate_ea_size(conn, fsp,
|
||||
fsp->fsp_name->base_name);
|
||||
SIVAL(params, 26, ea_size);
|
||||
} else {
|
||||
SIVAL(params, 26, 0);
|
||||
@ -4584,7 +4587,11 @@ NTSTATUS smbd_do_qfilepathinfo(connection_struct *conn,
|
||||
|
||||
if (S_ISDIR(sbuf.st_ex_mode)) {
|
||||
if (fsp && fsp->is_directory) {
|
||||
def_acl = SMB_VFS_SYS_ACL_GET_FILE(conn, fsp->fsp_name, SMB_ACL_TYPE_DEFAULT);
|
||||
def_acl =
|
||||
SMB_VFS_SYS_ACL_GET_FILE(
|
||||
conn,
|
||||
fsp->fsp_name->base_name,
|
||||
SMB_ACL_TYPE_DEFAULT);
|
||||
} else {
|
||||
def_acl = SMB_VFS_SYS_ACL_GET_FILE(conn, fname, SMB_ACL_TYPE_DEFAULT);
|
||||
}
|
||||
@ -4791,14 +4798,8 @@ static void call_trans2qfilepathinfo(connection_struct *conn,
|
||||
return;
|
||||
}
|
||||
|
||||
fname = talloc_strdup(talloc_tos(),fsp->fsp_name);
|
||||
if (!fname) {
|
||||
reply_nterror(req, NT_STATUS_NO_MEMORY);
|
||||
return;
|
||||
}
|
||||
|
||||
status = create_synthetic_smb_fname_split(talloc_tos(), fname,
|
||||
NULL, &smb_fname);
|
||||
status = copy_smb_filename(talloc_tos(), fsp->fsp_name,
|
||||
&smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
reply_nterror(req, status);
|
||||
return;
|
||||
@ -5524,8 +5525,9 @@ static NTSTATUS smb_file_position_information(connection_struct *conn,
|
||||
}
|
||||
#endif /* LARGE_SMB_OFF_T */
|
||||
|
||||
DEBUG(10,("smb_file_position_information: Set file position information for file %s to %.0f\n",
|
||||
fsp->fsp_name, (double)position_information ));
|
||||
DEBUG(10,("smb_file_position_information: Set file position "
|
||||
"information for file %s to %.0f\n", fsp_str_dbg(fsp),
|
||||
(double)position_information));
|
||||
fsp->fh->position_information = position_information;
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
@ -5736,8 +5738,8 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn,
|
||||
|
||||
/* Create an smb_fname to call rename_internals_fsp() with. */
|
||||
status = create_synthetic_smb_fname(talloc_tos(),
|
||||
fsp->base_fsp->fsp_name,
|
||||
newname, NULL, &smb_fname);
|
||||
fsp->base_fsp->fsp_name->base_name, newname, NULL,
|
||||
&smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
goto out;
|
||||
}
|
||||
@ -5754,7 +5756,7 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn,
|
||||
|
||||
/* Create a char * to call rename_internals() with. */
|
||||
base_name = talloc_asprintf(ctx, "%s%s",
|
||||
fsp->base_fsp->fsp_name,
|
||||
fsp->base_fsp->fsp_name->base_name,
|
||||
newname);
|
||||
if (!base_name) {
|
||||
status = NT_STATUS_NO_MEMORY;
|
||||
@ -5811,13 +5813,15 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn,
|
||||
}
|
||||
|
||||
if (fsp) {
|
||||
DEBUG(10,("smb_file_rename_information: SMB_FILE_RENAME_INFORMATION (fnum %d) %s -> %s\n",
|
||||
fsp->fnum, fsp->fsp_name, base_name ));
|
||||
DEBUG(10,("smb_file_rename_information: "
|
||||
"SMB_FILE_RENAME_INFORMATION (fnum %d) %s -> %s\n",
|
||||
fsp->fnum, fsp_str_dbg(fsp), base_name));
|
||||
status = rename_internals_fsp(conn, fsp, smb_fname, 0,
|
||||
overwrite);
|
||||
} else {
|
||||
DEBUG(10,("smb_file_rename_information: SMB_FILE_RENAME_INFORMATION %s -> %s\n",
|
||||
fname, base_name ));
|
||||
DEBUG(10,("smb_file_rename_information: "
|
||||
"SMB_FILE_RENAME_INFORMATION %s -> %s\n",
|
||||
fname, base_name));
|
||||
status = rename_internals(ctx, conn, req, fname, base_name, 0,
|
||||
overwrite, False, dest_has_wcard,
|
||||
FILE_WRITE_ATTRIBUTES);
|
||||
@ -5872,7 +5876,7 @@ static NTSTATUS smb_set_posix_acl(connection_struct *conn,
|
||||
}
|
||||
|
||||
DEBUG(10,("smb_set_posix_acl: file %s num_file_acls = %u, num_def_acls = %u\n",
|
||||
fname ? fname : fsp->fsp_name,
|
||||
fname ? fname : fsp_str_dbg(fsp),
|
||||
(unsigned int)num_file_acls,
|
||||
(unsigned int)num_def_acls));
|
||||
|
||||
@ -5959,7 +5963,7 @@ static NTSTATUS smb_set_posix_lock(connection_struct *conn,
|
||||
|
||||
DEBUG(10,("smb_set_posix_lock: file %s, lock_type = %u,"
|
||||
"lock_pid = %u, count = %.0f, offset = %.0f\n",
|
||||
fsp->fsp_name,
|
||||
fsp_str_dbg(fsp),
|
||||
(unsigned int)lock_type,
|
||||
(unsigned int)lock_pid,
|
||||
(double)count,
|
||||
@ -7033,7 +7037,7 @@ static NTSTATUS smb_posix_unlink(connection_struct *conn,
|
||||
NULL);
|
||||
if (lck == NULL) {
|
||||
DEBUG(0, ("smb_posix_unlink: Could not get share mode "
|
||||
"lock for file %s\n", fsp->fsp_name));
|
||||
"lock for file %s\n", fsp_str_dbg(fsp)));
|
||||
close_file(req, fsp, NORMAL_CLOSE);
|
||||
return NT_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
@ -7370,14 +7374,8 @@ static void call_trans2setfilepathinfo(connection_struct *conn,
|
||||
}
|
||||
info_level = SVAL(params,2);
|
||||
|
||||
fname = talloc_strdup(talloc_tos(),fsp->fsp_name);
|
||||
if (!fname) {
|
||||
reply_nterror(req, NT_STATUS_NO_MEMORY);
|
||||
return;
|
||||
}
|
||||
|
||||
status = create_synthetic_smb_fname_split(talloc_tos(), fname,
|
||||
NULL, &smb_fname);
|
||||
status = copy_smb_filename(talloc_tos(), fsp->fsp_name,
|
||||
&smb_fname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
reply_nterror(req, status);
|
||||
return;
|
||||
@ -7417,7 +7415,9 @@ static void call_trans2setfilepathinfo(connection_struct *conn,
|
||||
if ((info_level == SMB_SET_FILE_DISPOSITION_INFO) && CVAL(pdata,0)) {
|
||||
fsp->fh->private_options |= FILE_DELETE_ON_CLOSE;
|
||||
|
||||
DEBUG(3,("call_trans2setfilepathinfo: Cancelling print job (%s)\n", fsp->fsp_name ));
|
||||
DEBUG(3,("call_trans2setfilepathinfo: "
|
||||
"Cancelling print job (%s)\n",
|
||||
fsp_str_dbg(fsp)));
|
||||
|
||||
SSVAL(params,0,0);
|
||||
send_trans2_replies(conn, req, params, 2,
|
||||
|
@ -487,10 +487,12 @@ int vfs_allocate_file_space(files_struct *fsp, uint64_t len)
|
||||
* Actually try and commit the space on disk....
|
||||
*/
|
||||
|
||||
DEBUG(10,("vfs_allocate_file_space: file %s, len %.0f\n", fsp->fsp_name, (double)len ));
|
||||
DEBUG(10,("vfs_allocate_file_space: file %s, len %.0f\n",
|
||||
fsp_str_dbg(fsp), (double)len));
|
||||
|
||||
if (((SMB_OFF_T)len) < 0) {
|
||||
DEBUG(0,("vfs_allocate_file_space: %s negative len requested.\n", fsp->fsp_name ));
|
||||
DEBUG(0,("vfs_allocate_file_space: %s negative len "
|
||||
"requested.\n", fsp_str_dbg(fsp)));
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
@ -505,8 +507,9 @@ int vfs_allocate_file_space(files_struct *fsp, uint64_t len)
|
||||
if (len < (uint64_t)st.st_ex_size) {
|
||||
/* Shrink - use ftruncate. */
|
||||
|
||||
DEBUG(10,("vfs_allocate_file_space: file %s, shrink. Current size %.0f\n",
|
||||
fsp->fsp_name, (double)st.st_ex_size ));
|
||||
DEBUG(10,("vfs_allocate_file_space: file %s, shrink. Current "
|
||||
"size %.0f\n", fsp_str_dbg(fsp),
|
||||
(double)st.st_ex_size));
|
||||
|
||||
contend_level2_oplocks_begin(fsp, LEVEL2_CONTEND_ALLOC_SHRINK);
|
||||
|
||||
@ -530,13 +533,16 @@ int vfs_allocate_file_space(files_struct *fsp, uint64_t len)
|
||||
|
||||
len -= st.st_ex_size;
|
||||
len /= 1024; /* Len is now number of 1k blocks needed. */
|
||||
space_avail = get_dfree_info(conn,fsp->fsp_name,False,&bsize,&dfree,&dsize);
|
||||
space_avail = get_dfree_info(conn, fsp->fsp_name->base_name, false,
|
||||
&bsize, &dfree, &dsize);
|
||||
if (space_avail == (uint64_t)-1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
DEBUG(10,("vfs_allocate_file_space: file %s, grow. Current size %.0f, needed blocks = %.0f, space avail = %.0f\n",
|
||||
fsp->fsp_name, (double)st.st_ex_size, (double)len, (double)space_avail ));
|
||||
DEBUG(10,("vfs_allocate_file_space: file %s, grow. Current size %.0f, "
|
||||
"needed blocks = %.0f, space avail = %.0f\n",
|
||||
fsp_str_dbg(fsp), (double)st.st_ex_size, (double)len,
|
||||
(double)space_avail));
|
||||
|
||||
if (len > space_avail) {
|
||||
errno = ENOSPC;
|
||||
@ -558,14 +564,15 @@ int vfs_set_filelen(files_struct *fsp, SMB_OFF_T len)
|
||||
|
||||
contend_level2_oplocks_begin(fsp, LEVEL2_CONTEND_SET_FILE_LEN);
|
||||
|
||||
DEBUG(10,("vfs_set_filelen: ftruncate %s to len %.0f\n", fsp->fsp_name, (double)len));
|
||||
DEBUG(10,("vfs_set_filelen: ftruncate %s to len %.0f\n",
|
||||
fsp_str_dbg(fsp), (double)len));
|
||||
flush_write_cache(fsp, SIZECHANGE_FLUSH);
|
||||
if ((ret = SMB_VFS_FTRUNCATE(fsp, len)) != -1) {
|
||||
set_filelen_write_cache(fsp, len);
|
||||
notify_fname(fsp->conn, NOTIFY_ACTION_MODIFIED,
|
||||
FILE_NOTIFY_CHANGE_SIZE
|
||||
| FILE_NOTIFY_CHANGE_ATTRIBUTES,
|
||||
fsp->fsp_name);
|
||||
fsp->fsp_name->base_name);
|
||||
}
|
||||
|
||||
contend_level2_oplocks_end(fsp, LEVEL2_CONTEND_SET_FILE_LEN);
|
||||
@ -600,8 +607,10 @@ int vfs_fill_sparse(files_struct *fsp, SMB_OFF_T len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEBUG(10,("vfs_fill_sparse: write zeros in file %s from len %.0f to len %.0f (%.0f bytes)\n",
|
||||
fsp->fsp_name, (double)st.st_ex_size, (double)len, (double)(len - st.st_ex_size)));
|
||||
DEBUG(10,("vfs_fill_sparse: write zeros in file %s from len %.0f to "
|
||||
"len %.0f (%.0f bytes)\n", fsp_str_dbg(fsp),
|
||||
(double)st.st_ex_size, (double)len,
|
||||
(double)(len - st.st_ex_size)));
|
||||
|
||||
contend_level2_oplocks_begin(fsp, LEVEL2_CONTEND_FILL_SPARSE);
|
||||
|
||||
@ -625,8 +634,9 @@ int vfs_fill_sparse(files_struct *fsp, SMB_OFF_T len)
|
||||
|
||||
pwrite_ret = SMB_VFS_PWRITE(fsp, sparse_buf, curr_write_size, offset + total);
|
||||
if (pwrite_ret == -1) {
|
||||
DEBUG(10,("vfs_fill_sparse: SMB_VFS_PWRITE for file %s failed with error %s\n",
|
||||
fsp->fsp_name, strerror(errno) ));
|
||||
DEBUG(10,("vfs_fill_sparse: SMB_VFS_PWRITE for file "
|
||||
"%s failed with error %s\n",
|
||||
fsp_str_dbg(fsp), strerror(errno)));
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user