mirror of
https://github.com/samba-team/samba.git
synced 2025-01-12 09:18:10 +03:00
includes.h: AIX fix.
nttrans.c: More NT SMB work.
smb.h: More NT SMB defines.
trans2.c: Change call response as I now have docs
on what the flags mean. #ifdef it with JRATEST
until I'm sure it's ok though.
Jeremy.
(This used to be commit ce2503fddd
)
This commit is contained in:
parent
1829528d1f
commit
139a34157e
@ -600,6 +600,8 @@ char *mktemp(char *); /* No standard include */
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <locale.h>
|
||||
#include <grp.h>
|
||||
#define HAVE_GETGRNAM 1
|
||||
#define SYSV
|
||||
#define USE_WAITPID
|
||||
#define USE_SIGBLOCK
|
||||
|
@ -1090,6 +1090,8 @@ struct parm_struct
|
||||
#define FILE_ATTRIBUTE_NORMAL 0x80L
|
||||
#define FILE_ATTRIBUTE_TEMPORARY 0x100L
|
||||
#define FILE_ATTRIBUTE_COMPRESSED 0x800L
|
||||
#define SAMBA_ATTRIBUTES_MASK 0x7F
|
||||
|
||||
/* Flags - combined with attributes. */
|
||||
#define FILE_FLAG_WRITE_THROUGH 0x80000000L
|
||||
#define FILE_FLAG_NO_BUFFERING 0x20000000L
|
||||
@ -1106,6 +1108,12 @@ struct parm_struct
|
||||
#define OPEN_ALWAYS 4
|
||||
#define TRUNCATE_EXISTING 5
|
||||
|
||||
/* Filesystem Attributes. */
|
||||
#define FILE_CASE_SENSITIVE_SEARCH 0x1
|
||||
#define FILE_CASE_PRESERVED_NAMES 0x2
|
||||
#define FILE_UNICODE_ON_DISK 0x4
|
||||
#define FILE_PERISITANT_ACLS 0x8
|
||||
|
||||
/* where to find the base of the SMB packet proper */
|
||||
#define smb_base(buf) (((char *)(buf))+4)
|
||||
|
||||
|
@ -29,6 +29,9 @@ extern int Client;
|
||||
extern int oplock_sock;
|
||||
extern int smb_read_error;
|
||||
extern int global_oplock_break;
|
||||
extern BOOL case_sensitive;
|
||||
extern BOOL case_preserve;
|
||||
extern BOOL short_case_preserve;
|
||||
|
||||
static char *known_nt_pipes[] = {
|
||||
"\\LANMAN",
|
||||
@ -43,13 +46,47 @@ static char *known_nt_pipes[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
static BOOL saved_case_sensitive;
|
||||
static BOOL saved_case_preserve;
|
||||
static BOOL saved_short_case_preserve;
|
||||
|
||||
/****************************************************************************
|
||||
Save case semantics.
|
||||
****************************************************************************/
|
||||
|
||||
static void set_posix_case_semantics(uint32 file_attributes)
|
||||
{
|
||||
if(!(file_attributes & FILE_FLAG_POSIX_SEMANTICS))
|
||||
return;
|
||||
|
||||
saved_case_sensitive = case_sensitive;
|
||||
saved_case_preserve = case_preserve;
|
||||
saved_short_case_preserve = short_case_preserve;
|
||||
|
||||
/* Set to POSIX. */
|
||||
case_sensitive = True;
|
||||
case_preserve = True;
|
||||
short_case_preserve = True;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Restore case semantics.
|
||||
****************************************************************************/
|
||||
|
||||
static void restore_case_semantics(uint32 file_attributes)
|
||||
{
|
||||
if(!(file_attributes & FILE_FLAG_POSIX_SEMANTICS))
|
||||
return;
|
||||
|
||||
case_sensitive = saved_case_sensitive;
|
||||
case_preserve = saved_case_preserve;
|
||||
short_case_preserve = saved_short_case_preserve;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
reply to an NT create and X call.
|
||||
****************************************************************************/
|
||||
|
||||
THIS IS JUST CRIBBED FROM REPLY.C AT PRESENT AND IS A WORK
|
||||
IN PROGRESS. JRA.
|
||||
|
||||
int reply_ntcreate_and_X(char *inbuf,char *outbuf,int length,int bufsize)
|
||||
{
|
||||
pstring fname;
|
||||
@ -60,29 +97,29 @@ int reply_ntcreate_and_X(char *inbuf,char *outbuf,int length,int bufsize)
|
||||
uint32 file_attributes = SIVAL(inbuf,smb_ntcreate_FileAttributes);
|
||||
uint32 share_access = SIVAL(inbuf,smb_ntcreate_ShareAccess);
|
||||
uint32 create_disposition = SIVAL(inbuf,smb_ntcreate_CreateDisposition);
|
||||
|
||||
uint32 fname_len = MIN(((uint32)SSVAL(inbuf,smb_ntcreate_NameLength)),
|
||||
((uint32)sizeof(fname)-1));
|
||||
int smb_ofun;
|
||||
int smb_open_mode;
|
||||
int smb_attr = SVAL(inbuf,smb_vwv5);
|
||||
int smb_attr = file_attributes & SAMBA_ATTRIBUTES_MASK;
|
||||
/* Breakout the oplock request bits so we can set the
|
||||
reply bits separately. */
|
||||
BOOL ex_oplock_request = flags &
|
||||
BOOL core_oplock_request = CORE_OPLOCK_REQUEST(inbuf);
|
||||
BOOL oplock_request = ex_oplock_request | core_oplock_request;
|
||||
int oplock_request = flags & (REQUEST_OPLOCK|REQUEST_BATCH_OPLOCK);
|
||||
int unixmode;
|
||||
int size=0,fmode=0,mtime=0,rmode=0;
|
||||
struct stat sbuf;
|
||||
int smb_action = 0;
|
||||
BOOL bad_path = False;
|
||||
files_struct *fsp;
|
||||
|
||||
char *p = NULL;
|
||||
|
||||
/* If it's an IPC, pass off the pipe handler. */
|
||||
if (IS_IPC(cnum))
|
||||
return nt_open_pipe_and_X(inbuf,outbuf,length,bufsize);
|
||||
|
||||
/* If it's a request for a directory open, fail it. */
|
||||
if(flags & OPEN_DIRECTORY)
|
||||
return(ERROR(ERRSRV,ERRfilespecs));
|
||||
return(ERROR(ERRDOS,ERRnoaccess));
|
||||
|
||||
/*
|
||||
* We need to construct the open_and_X ofun value from the
|
||||
@ -159,12 +196,22 @@ int reply_ntcreate_and_X(char *inbuf,char *outbuf,int length,int bufsize)
|
||||
if(file_attributes & FILE_FLAG_WRITE_THROUGH)
|
||||
smb_open_mode |= (1<<14);
|
||||
|
||||
pstrcpy(fname,smb_buf(inbuf));
|
||||
/*
|
||||
* Check if POSIX semantics are wanted.
|
||||
*/
|
||||
|
||||
set_posix_case_semantics(file_attributes);
|
||||
|
||||
StrnCpy(fname,smb_buf(inbuf),fname_len);
|
||||
unix_convert(fname,cnum,0,&bad_path);
|
||||
|
||||
fnum = find_free_file();
|
||||
if (fnum < 0)
|
||||
{
|
||||
restore_case_semantics(file_attributes);
|
||||
return(ERROR(ERRSRV,ERRnofids));
|
||||
}
|
||||
|
||||
if (!check_name(fname,cnum))
|
||||
{
|
||||
if((errno == ENOENT) && bad_path)
|
||||
@ -173,6 +220,9 @@ int reply_ntcreate_and_X(char *inbuf,char *outbuf,int length,int bufsize)
|
||||
unix_ERR_code = ERRbadpath;
|
||||
}
|
||||
Files[fnum].reserved = False;
|
||||
|
||||
restore_case_semantics(file_attributes);
|
||||
|
||||
return(UNIXERROR(ERRDOS,ERRnoaccess));
|
||||
}
|
||||
|
||||
@ -191,11 +241,17 @@ int reply_ntcreate_and_X(char *inbuf,char *outbuf,int length,int bufsize)
|
||||
unix_ERR_code = ERRbadpath;
|
||||
}
|
||||
Files[fnum].reserved = False;
|
||||
|
||||
restore_case_semantics(file_attributes);
|
||||
|
||||
return(UNIXERROR(ERRDOS,ERRnoaccess));
|
||||
}
|
||||
|
||||
if (fstat(fsp->fd_ptr->fd,&sbuf) != 0) {
|
||||
close_file(fnum,False);
|
||||
|
||||
restore_case_semantics(file_attributes);
|
||||
|
||||
return(ERROR(ERRDOS,ERRnoaccess));
|
||||
}
|
||||
|
||||
@ -204,6 +260,9 @@ int reply_ntcreate_and_X(char *inbuf,char *outbuf,int length,int bufsize)
|
||||
mtime = sbuf.st_mtime;
|
||||
if (fmode & aDIR) {
|
||||
close_file(fnum,False);
|
||||
|
||||
restore_case_semantics(file_attributes);
|
||||
|
||||
return(ERROR(ERRDOS,ERRnoaccess));
|
||||
}
|
||||
|
||||
@ -212,29 +271,45 @@ int reply_ntcreate_and_X(char *inbuf,char *outbuf,int length,int bufsize)
|
||||
correct bit for extended oplock reply.
|
||||
*/
|
||||
|
||||
if (ex_oplock_request && lp_fake_oplocks(SNUM(cnum))) {
|
||||
if (oplock_request && lp_fake_oplocks(SNUM(cnum))) {
|
||||
smb_action |= EXTENDED_OPLOCK_GRANTED;
|
||||
}
|
||||
|
||||
if(ex_oplock_request && fsp->granted_oplock) {
|
||||
if(oplock_request && fsp->granted_oplock) {
|
||||
smb_action |= EXTENDED_OPLOCK_GRANTED;
|
||||
}
|
||||
|
||||
/* If the caller set the core oplock request bit
|
||||
and we granted one (by whatever means) - set the
|
||||
correct bit for core oplock reply.
|
||||
*/
|
||||
|
||||
if (core_oplock_request && lp_fake_oplocks(SNUM(cnum))) {
|
||||
CVAL(outbuf,smb_flg) |= CORE_OPLOCK_GRANTED;
|
||||
}
|
||||
set_message(outbuf,34,0,True);
|
||||
|
||||
p = outbuf + smb_vwv2;
|
||||
|
||||
SCVAL(p,0, (smb_action & EXTENDED_OPLOCK_GRANTED ? );
|
||||
p++;
|
||||
SSVAL(p,0,fnum);
|
||||
p += 2;
|
||||
SIVAL(p,0,smb_action);
|
||||
p += 4;
|
||||
|
||||
if(core_oplock_request && fsp->granted_oplock) {
|
||||
CVAL(outbuf,smb_flg) |= CORE_OPLOCK_GRANTED;
|
||||
}
|
||||
|
||||
set_message(outbuf,15,0,True);
|
||||
SSVAL(outbuf,smb_vwv2,fnum);
|
||||
CreationTime
|
||||
p += 8;
|
||||
LastAccessTime;
|
||||
p += 8;
|
||||
LastWriteTime;
|
||||
p += 8;
|
||||
ChangeTime;
|
||||
p += 8;
|
||||
FileAttributes;
|
||||
p += 4;
|
||||
AllocationSize;
|
||||
p += 8;
|
||||
EndOfFile;
|
||||
p += 8;
|
||||
SSVAL(p,0,0); /* File Type */
|
||||
p += 2;
|
||||
SSVAL(p,0,0); /* Device State */
|
||||
p += 1;
|
||||
SCVAL(p,0,0); /* Not Directory. */
|
||||
|
||||
SSVAL(outbuf,smb_vwv3,fmode);
|
||||
if(lp_dos_filetime_resolution(SNUM(cnum)) )
|
||||
put_dos_date3(outbuf,smb_vwv4,mtime & ~1);
|
||||
@ -246,8 +321,10 @@ int reply_ntcreate_and_X(char *inbuf,char *outbuf,int length,int bufsize)
|
||||
|
||||
chain_fnum = fnum;
|
||||
|
||||
restore_case_semantics(file_attributes);
|
||||
|
||||
return chain_reply(inbuf,outbuf,length,bufsize);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
reply to an unsolicited SMBNTtranss - just ignore it!
|
||||
|
@ -1069,7 +1069,11 @@ static int call_trans2qfsinfo(char *inbuf, char *outbuf, int length, int bufsize
|
||||
}
|
||||
case SMB_QUERY_FS_ATTRIBUTE_INFO:
|
||||
data_len = 12 + 2*strlen(FSTYPE_STRING);
|
||||
#if 1 /* JRATEST */
|
||||
SIVAL(pdata,0,FILE_CASE_PRESERVED_NAMES); /* FS ATTRIBUTES */
|
||||
#else /* JRATEST */
|
||||
SIVAL(pdata,0,0x4006); /* FS ATTRIBUTES == long filenames supported? */
|
||||
#endif /* JRATEST */
|
||||
SIVAL(pdata,4,128); /* Max filename component length */
|
||||
SIVAL(pdata,8,2*strlen(FSTYPE_STRING));
|
||||
PutUniCode(pdata+12,FSTYPE_STRING);
|
||||
|
Loading…
Reference in New Issue
Block a user