From b88f446352b27d71a71d61a7151694c468cfe609 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 24 Feb 2004 00:06:08 +0000 Subject: Added NTrename SMB (0xA5) - how did we miss this.... ? Jeremy. (This used to be commit dfd7d1c2b7b577a084a94926abfce82c91f20b7e) --- source3/include/smb.h | 1 + source3/include/smbprofile.h | 4 +++- source3/smbd/nttrans.c | 50 ++++++++++++++++++++++++++++++++++++++++++++ source3/smbd/process.c | 2 +- 4 files changed, 55 insertions(+), 2 deletions(-) (limited to 'source3') diff --git a/source3/include/smb.h b/source3/include/smb.h index 37a2833d97..c5284751d3 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -871,6 +871,7 @@ struct bitmap { #define SMBnttranss 0xA1 /* NT transact secondary */ #define SMBntcreateX 0xA2 /* NT create and X */ #define SMBntcancel 0xA4 /* NT cancel */ +#define SMBntrename 0xA5 /* NT rename */ /* These are the trans subcommands */ #define TRANSACT_SETNAMEDPIPEHANDLESTATE 0x01 diff --git a/source3/include/smbprofile.h b/source3/include/smbprofile.h index c29a630fe5..e494faf7da 100644 --- a/source3/include/smbprofile.h +++ b/source3/include/smbprofile.h @@ -34,7 +34,7 @@ enum flush_reason_enum { SEEK_FLUSH, READ_FLUSH, WRITE_FLUSH, READRAW_FLUSH, #define PROF_SHMEM_KEY ((key_t)0x07021999) #define PROF_SHM_MAGIC 0x6349985 -#define PROF_SHM_VERSION 8 +#define PROF_SHM_VERSION 9 /* time values in the following structure are in microseconds */ @@ -259,6 +259,8 @@ struct profile_stats { unsigned SMBntcreateX_time; unsigned SMBntcancel_count; /* NT cancel */ unsigned SMBntcancel_time; + unsigned SMBntrename_count; /* NT rename file */ + unsigned SMBntrename_time; unsigned SMBsplopen_count; /* open print spool file */ unsigned SMBsplopen_time; unsigned SMBsplwr_count; /* write to print spool file */ diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index 3127134458..2831f75933 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -1488,6 +1488,56 @@ int reply_ntcancel(connection_struct *conn, return(-1); } +/**************************************************************************** + Reply to a NT rename request. +****************************************************************************/ + +int reply_ntrename(connection_struct *conn, + char *inbuf,char *outbuf,int length,int bufsize) +{ + int outsize = 0; + pstring name; + pstring newname; + char *p; + NTSTATUS status; + + START_PROFILE(SMBntrename); + + p = smb_buf(inbuf) + 1; + p += srvstr_get_path(inbuf, name, p, sizeof(name), STR_TERMINATE,&status); + if (!NT_STATUS_IS_OK(status)) { + END_PROFILE(SMBntrename); + return ERROR_NT(status); + } + p++; + p += srvstr_get_path(inbuf, newname, p, sizeof(newname), STR_TERMINATE,&status); + if (!NT_STATUS_IS_OK(status)) { + END_PROFILE(SMBntrename); + return ERROR_NT(status); + } + + RESOLVE_DFSPATH(name, conn, inbuf, outbuf); + RESOLVE_DFSPATH(newname, conn, inbuf, outbuf); + + DEBUG(3,("reply_ntrename : %s -> %s\n",name,newname)); + + status = rename_internals(conn, name, newname, False); + if (!NT_STATUS_IS_OK(status)) { + END_PROFILE(SMBntrename); + return ERROR_NT(status); + } + + /* + * Win2k needs a changenotify request response before it will + * update after a rename.. + */ + process_pending_change_notify_queue((time_t)0); + outsize = set_message(outbuf,0,0,True); + + END_PROFILE(SMBntrename); + return(outsize); +} + /**************************************************************************** Reply to an unsolicited SMBNTtranss - just ignore it! ****************************************************************************/ diff --git a/source3/smbd/process.c b/source3/smbd/process.c index 5206dc70f8..718d1bb67b 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -521,7 +521,7 @@ static const struct smb_message_struct { /* 0xa2 */ { "SMBntcreateX", reply_ntcreate_and_X, AS_USER | CAN_IPC | QUEUE_IN_OPLOCK }, /* 0xa3 */ { NULL, NULL, 0 }, /* 0xa4 */ { "SMBntcancel", reply_ntcancel, 0 }, -/* 0xa5 */ { NULL, NULL, 0 }, +/* 0xa5 */ { "SMBntrename", reply_ntrename, AS_USER | NEED_WRITE | QUEUE_IN_OPLOCK }, /* 0xa6 */ { NULL, NULL, 0 }, /* 0xa7 */ { NULL, NULL, 0 }, /* 0xa8 */ { NULL, NULL, 0 }, -- cgit