summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/smbd/trans2.c89
1 files changed, 55 insertions, 34 deletions
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 1d577f8183..90365348a0 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -3745,8 +3745,7 @@ NTSTATUS hardlink_internals(connection_struct *conn, char *oldname, char *newnam
Deal with SMB_INFO_SET_EA.
****************************************************************************/
-static int smb_info_set_ea(
- connection_struct *conn,
+static int smb_info_set_ea(connection_struct *conn,
char *outbuf,
int bufsize,
char *params,
@@ -3826,12 +3825,12 @@ static int smb_set_file_disposition_info(connection_struct *conn,
return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
}
- delete_on_close = (CVAL(pdata,0) ? True : False);
-
if (fsp == NULL) {
return(UNIXERROR(ERRDOS,ERRbadfid));
}
+ delete_on_close = (CVAL(pdata,0) ? True : False);
+
status = can_set_delete_on_close(fsp, delete_on_close, dosmode);
if (!NT_STATUS_IS_OK(status)) {
@@ -3849,6 +3848,47 @@ static int smb_set_file_disposition_info(connection_struct *conn,
}
/****************************************************************************
+ Deal with SMB_FILE_POSITION_INFORMATION.
+****************************************************************************/
+
+static int smb_file_position_information(connection_struct *conn,
+ char *outbuf,
+ int bufsize,
+ char *params,
+ int total_params,
+ char *pdata,
+ int total_data,
+ unsigned int max_data_bytes,
+ files_struct *fsp)
+{
+ SMB_BIG_UINT position_information;
+
+ if (total_data < 8) {
+ return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ }
+
+ position_information = (SMB_BIG_UINT)IVAL(pdata,0);
+#ifdef LARGE_SMB_OFF_T
+ position_information |= (((SMB_BIG_UINT)IVAL(pdata,4)) << 32);
+#else /* LARGE_SMB_OFF_T */
+ if (IVAL(pdata,4) != 0) {
+ /* more than 32 bits? */
+ return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+ }
+#endif /* LARGE_SMB_OFF_T */
+ if (fsp) {
+ DEBUG(10,("call_trans2setfilepathinfo: Set file position information for file %s to %.0f\n",
+ fsp->fsp_name, (double)position_information ));
+ fsp->fh->position_information = position_information;
+ }
+
+ /* We're done. We only set position info in this call. */
+ SSVAL(params,0,0);
+ send_trans2_replies(outbuf, bufsize, params, 2, pdata, 0, max_data_bytes);
+ return -1;
+}
+
+/****************************************************************************
Reply to a TRANS2_SETFILEINFO (set file info by fileid or pathname).
****************************************************************************/
@@ -4152,15 +4192,12 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
case SMB_FILE_DISPOSITION_INFORMATION:
case SMB_SET_FILE_DISPOSITION_INFO: /* Set delete on close for open file. */
{
- if (total_data < 1) {
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
- }
-
+#if 0 /* JRA - should we just ignore this on a path ? */
/* Just ignore this set on a path. */
if (tran_call != TRANSACT2_SETFILEINFO) {
break;
}
-
+#endif
return smb_set_file_disposition_info(conn,
outbuf,
bufsize,
@@ -4175,31 +4212,15 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
case SMB_FILE_POSITION_INFORMATION:
{
- SMB_BIG_UINT position_information;
-
- if (total_data < 8) {
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
- }
-
- position_information = (SMB_BIG_UINT)IVAL(pdata,0);
-#ifdef LARGE_SMB_OFF_T
- position_information |= (((SMB_BIG_UINT)IVAL(pdata,4)) << 32);
-#else /* LARGE_SMB_OFF_T */
- if (IVAL(pdata,4) != 0) {
- /* more than 32 bits? */
- return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
- }
-#endif /* LARGE_SMB_OFF_T */
- DEBUG(10,("call_trans2setfilepathinfo: Set file position information for file %s to %.0f\n",
- fname, (double)position_information ));
- if (fsp) {
- fsp->fh->position_information = position_information;
- }
-
- /* We're done. We only get position info in this call. */
- SSVAL(params,0,0);
- send_trans2_replies(outbuf, bufsize, params, 2, *ppdata, 0, max_data_bytes);
- return(-1);
+ return smb_file_position_information(conn,
+ outbuf,
+ bufsize,
+ params,
+ total_params,
+ *ppdata,
+ total_data,
+ max_data_bytes,
+ fsp);
}
/* From tridge Samba4 :