includes.h: AIX fix.
authorJeremy Allison <jra@samba.org>
Wed, 1 Jul 1998 21:49:49 +0000 (21:49 +0000)
committerJeremy Allison <jra@samba.org>
Wed, 1 Jul 1998 21:49:49 +0000 (21:49 +0000)
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 ce2503fddd7ef9eed89e1a63fd834f13432a9cd6)

source3/include/includes.h
source3/include/smb.h
source3/smbd/nttrans.c
source3/smbd/trans2.c

index ea09dcb3676689d45b93414c51f9e33fbf96f9a5..6eab1a164135ee845b238b2c877bd1503870df90 100644 (file)
@@ -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
index 734dddff147d4a58eb055cebca033750566beca3..9cedc890b8b373477c6001326e8fc00cf0ff9013 100644 (file)
@@ -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)
 
index 9d6f0d402185c524ea39d509c550be43b4fb2759..1cde27a9ff2ea4228137a81ecf14fb9123d29032 100644 (file)
@@ -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,12 +46,46 @@ static char *known_nt_pipes[] = {
   NULL
 };
 
+static BOOL saved_case_sensitive;
+static BOOL saved_case_preserve;
+static BOOL saved_short_case_preserve;
+
 /****************************************************************************
-  reply to an NT create and X call.
+ 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.
 ****************************************************************************/
 
-THIS IS JUST CRIBBED FROM REPLY.C AT PRESENT AND IS A WORK
-IN PROGRESS. JRA.
+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.
+****************************************************************************/
 
 int reply_ntcreate_and_X(char *inbuf,char *outbuf,int length,int bufsize)
 {  
@@ -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;
-  } 
-  
-  if(core_oplock_request && fsp->granted_oplock) {
-    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;
   
-  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!
index 4fefb4b39ce9cee0b832e2500d859f0dc49fc0f5..6cf7dd39493f84081493486713e4b0142f288f60 100644 (file)
@@ -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);