Author: jra
Date: 2007-02-07 02:39:43 +0000 (Wed, 07 Feb 2007)
New Revision: 21210

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=21210

Log:
Fix POSIX open to return an info level.
Jeremy.

Modified:
   branches/SAMBA_3_0/source/smbd/trans2.c
   branches/SAMBA_3_0_25/source/smbd/trans2.c


Changeset:
Modified: branches/SAMBA_3_0/source/smbd/trans2.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/trans2.c     2007-02-07 01:24:12 UTC (rev 
21209)
+++ branches/SAMBA_3_0/source/smbd/trans2.c     2007-02-07 02:39:43 UTC (rev 
21210)
@@ -2865,6 +2865,61 @@
 #endif
 
 /****************************************************************************
+ Store the FILE_UNIX_BASIC info.
+****************************************************************************/
+
+static char *store_file_unix_basic(char *pdata,
+                               files_struct *fsp,
+                               SMB_STRUCT_STAT *psbuf)
+{
+       DEBUG(10,("store_file_unix_basic: SMB_QUERY_FILE_UNIX_BASIC\n"));
+       DEBUG(4,("store_file_unix_basic: st_mode=%o\n",(int)psbuf->st_mode));
+
+       SOFF_T(pdata,0,get_file_size(*psbuf));             /* File size 64 Bit 
*/
+       pdata += 8;
+
+       SOFF_T(pdata,0,get_allocation_size(fsp->conn,fsp,psbuf)); /* Number of 
bytes used on disk - 64 Bit */
+       pdata += 8;
+
+       put_long_date_timespec(pdata,get_ctimespec(psbuf));       /* Creation 
Time 64 Bit */
+       put_long_date_timespec(pdata+8,get_atimespec(psbuf));     /* Last 
access time 64 Bit */
+       put_long_date_timespec(pdata+16,get_mtimespec(psbuf));    /* Last 
modification time 64 Bit */
+       pdata += 24;
+
+       SIVAL(pdata,0,psbuf->st_uid);               /* user id for the owner */
+       SIVAL(pdata,4,0);
+       pdata += 8;
+
+       SIVAL(pdata,0,psbuf->st_gid);               /* group id of owner */
+       SIVAL(pdata,4,0);
+       pdata += 8;
+
+       SIVAL(pdata,0,unix_filetype(psbuf->st_mode));
+       pdata += 4;
+
+       SIVAL(pdata,0,unix_dev_major(psbuf->st_rdev));   /* Major device number 
if type is device */
+       SIVAL(pdata,4,0);
+       pdata += 8;
+
+       SIVAL(pdata,0,unix_dev_minor(psbuf->st_rdev));   /* Minor device number 
if type is device */
+       SIVAL(pdata,4,0);
+       pdata += 8;
+
+       SINO_T_VAL(pdata,0,(SMB_INO_T)psbuf->st_ino);   /* inode number */
+       pdata += 8;
+                               
+       SIVAL(pdata,0, unix_perms_to_wire(psbuf->st_mode));     /* Standard 
UNIX file permissions */
+       SIVAL(pdata,4,0);
+       pdata += 8;
+
+       SIVAL(pdata,0,psbuf->st_nlink);             /* number of hard links */
+       SIVAL(pdata,4,0);
+       pdata += 8;
+
+       return pdata;
+}
+
+/****************************************************************************
  Reply to a TRANS2_QFILEPATHINFO or TRANSACT2_QFILEINFO (query file info by
  file name or file id).
 ****************************************************************************/
@@ -3469,49 +3524,7 @@
 
                case SMB_QUERY_FILE_UNIX_BASIC:
 
-                       DEBUG(10,("call_trans2qfilepathinfo: 
SMB_QUERY_FILE_UNIX_BASIC\n"));
-                       DEBUG(4,("call_trans2qfilepathinfo: 
st_mode=%o\n",(int)sbuf.st_mode));
-
-                       SOFF_T(pdata,0,get_file_size(sbuf));             /* 
File size 64 Bit */
-                       pdata += 8;
-
-                       SOFF_T(pdata,0,get_allocation_size(conn,fsp,&sbuf)); /* 
Number of bytes used on disk - 64 Bit */
-                       pdata += 8;
-
-                       put_long_date_timespec(pdata,get_ctimespec(&sbuf));     
  /* Creation Time 64 Bit */
-                       put_long_date_timespec(pdata+8,get_atimespec(&sbuf));   
  /* Last access time 64 Bit */
-                       put_long_date_timespec(pdata+16,get_mtimespec(&sbuf));  
  /* Last modification time 64 Bit */
-                       pdata += 24;
-
-                       SIVAL(pdata,0,sbuf.st_uid);               /* user id 
for the owner */
-                       SIVAL(pdata,4,0);
-                       pdata += 8;
-
-                       SIVAL(pdata,0,sbuf.st_gid);               /* group id 
of owner */
-                       SIVAL(pdata,4,0);
-                       pdata += 8;
-
-                       SIVAL(pdata,0,unix_filetype(sbuf.st_mode));
-                       pdata += 4;
-
-                       SIVAL(pdata,0,unix_dev_major(sbuf.st_rdev));   /* Major 
device number if type is device */
-                       SIVAL(pdata,4,0);
-                       pdata += 8;
-
-                       SIVAL(pdata,0,unix_dev_minor(sbuf.st_rdev));   /* Minor 
device number if type is device */
-                       SIVAL(pdata,4,0);
-                       pdata += 8;
-
-                       SINO_T_VAL(pdata,0,(SMB_INO_T)sbuf.st_ino);   /* inode 
number */
-                       pdata += 8;
-                               
-                       SIVAL(pdata,0, unix_perms_to_wire(sbuf.st_mode));     
/* Standard UNIX file permissions */
-                       SIVAL(pdata,4,0);
-                       pdata += 8;
-
-                       SIVAL(pdata,0,sbuf.st_nlink);             /* number of 
hard links */
-                       SIVAL(pdata,4,0);
-                       pdata += 8;
+                       pdata = store_file_unix_basic(pdata, fsp, &sbuf);
                        data_size = PTR_DIFF(pdata,(*ppdata));
 
                        {
@@ -4863,12 +4876,13 @@
                                SMB_STRUCT_STAT *psbuf,
                                int *pdata_return_size)
 {
-       NTSTATUS status;
-       uint32 raw_unixmode;
-       uint32 mod_unixmode;
-       mode_t unixmode;
-       files_struct *fsp;
-       const char *pdata = *ppdata;
+       NTSTATUS status = NT_STATUS_OK;
+       uint32 raw_unixmode = 0;
+       uint32 mod_unixmode = 0;
+       mode_t unixmode = (mode_t)0;
+       files_struct *fsp = NULL;
+       uint16 info_level_return = 0;
+       char *pdata = *ppdata;
 
        if (total_data < 10) {
                return NT_STATUS_INVALID_PARAMETER;
@@ -4897,17 +4911,31 @@
                 close_file(fsp, NORMAL_CLOSE);
         }
 
-       *pdata_return_size = 6;
+       info_level_return = SVAL(pdata,12);
+ 
+       if (info_level_return == SMB_QUERY_FILE_UNIX_BASIC) {
+               *pdata_return_size = 6;
+       } else {
+               *pdata_return_size = 6;
+       }
+
        /* Realloc the data size */
        *ppdata = (char *)SMB_REALLOC(*ppdata,*pdata_return_size);
        if (*ppdata == NULL) {
+               *pdata_return_size = 0;
                return NT_STATUS_NO_MEMORY;
        }
 
        SSVAL(pdata,0,NO_OPLOCK_RETURN);
        SSVAL(pdata,2,0);
-       SSVAL(pdata,4,SMB_NO_INFO_LEVEL_RETURNED);
 
+       if (info_level_return == SMB_QUERY_FILE_UNIX_BASIC) {
+               SSVAL(pdata,4,SMB_QUERY_FILE_UNIX_BASIC);
+               store_file_unix_basic(pdata + 6, fsp, psbuf);
+       } else {
+               SSVAL(pdata,4,SMB_NO_INFO_LEVEL_RETURNED);
+       }
+
        return status;
 }
 
@@ -4923,7 +4951,7 @@
                                int *pdata_return_size)
 {
        BOOL extended_oplock_granted = False;
-       const char *pdata = *ppdata;
+       char *pdata = *ppdata;
        uint32 flags = 0;
        uint32 wire_open_mode = 0;
        uint32 raw_unixmode = 0;
@@ -4936,6 +4964,7 @@
        files_struct *fsp = NULL;
        int oplock_request = 0;
        int info = 0;
+       uint16 info_level_return = 0;
 
        if (total_data < 14) {
                return NT_STATUS_INVALID_PARAMETER;
@@ -5035,11 +5064,19 @@
                extended_oplock_granted = True;
        }
 
-       *pdata_return_size = 6;
+       info_level_return = SVAL(pdata,12);
+ 
+       if (info_level_return == SMB_QUERY_FILE_UNIX_BASIC) {
+               *pdata_return_size = 6;
+       } else {
+               *pdata_return_size = 6;
+       }
+
        /* Realloc the data size */
        *ppdata = (char *)SMB_REALLOC(*ppdata,*pdata_return_size);
        if (*ppdata == NULL) {
                close_file(fsp,ERROR_CLOSE);
+               *pdata_return_size = 0;
                return NT_STATUS_NO_MEMORY;
        }
 
@@ -5056,7 +5093,12 @@
        }
 
        SSVAL(pdata,2,fsp->fnum);
-       SSVAL(pdata,4,SMB_NO_INFO_LEVEL_RETURNED);
+       if (info_level_return == SMB_QUERY_FILE_UNIX_BASIC) {
+               SSVAL(pdata,4,SMB_QUERY_FILE_UNIX_BASIC);
+               store_file_unix_basic(pdata + 6, fsp, psbuf);
+       } else {
+               SSVAL(pdata,4,SMB_NO_INFO_LEVEL_RETURNED);
+       }
        return NT_STATUS_OK;
 }
 

Modified: branches/SAMBA_3_0_25/source/smbd/trans2.c
===================================================================
--- branches/SAMBA_3_0_25/source/smbd/trans2.c  2007-02-07 01:24:12 UTC (rev 
21209)
+++ branches/SAMBA_3_0_25/source/smbd/trans2.c  2007-02-07 02:39:43 UTC (rev 
21210)
@@ -2865,6 +2865,61 @@
 #endif
 
 /****************************************************************************
+ Store the FILE_UNIX_BASIC info.
+****************************************************************************/
+
+static char *store_file_unix_basic(char *pdata,
+                               files_struct *fsp,
+                               SMB_STRUCT_STAT *psbuf)
+{
+       DEBUG(10,("store_file_unix_basic: SMB_QUERY_FILE_UNIX_BASIC\n"));
+       DEBUG(4,("store_file_unix_basic: st_mode=%o\n",(int)psbuf->st_mode));
+
+       SOFF_T(pdata,0,get_file_size(*psbuf));             /* File size 64 Bit 
*/
+       pdata += 8;
+
+       SOFF_T(pdata,0,get_allocation_size(fsp->conn,fsp,psbuf)); /* Number of 
bytes used on disk - 64 Bit */
+       pdata += 8;
+
+       put_long_date_timespec(pdata,get_ctimespec(psbuf));       /* Creation 
Time 64 Bit */
+       put_long_date_timespec(pdata+8,get_atimespec(psbuf));     /* Last 
access time 64 Bit */
+       put_long_date_timespec(pdata+16,get_mtimespec(psbuf));    /* Last 
modification time 64 Bit */
+       pdata += 24;
+
+       SIVAL(pdata,0,psbuf->st_uid);               /* user id for the owner */
+       SIVAL(pdata,4,0);
+       pdata += 8;
+
+       SIVAL(pdata,0,psbuf->st_gid);               /* group id of owner */
+       SIVAL(pdata,4,0);
+       pdata += 8;
+
+       SIVAL(pdata,0,unix_filetype(psbuf->st_mode));
+       pdata += 4;
+
+       SIVAL(pdata,0,unix_dev_major(psbuf->st_rdev));   /* Major device number 
if type is device */
+       SIVAL(pdata,4,0);
+       pdata += 8;
+
+       SIVAL(pdata,0,unix_dev_minor(psbuf->st_rdev));   /* Minor device number 
if type is device */
+       SIVAL(pdata,4,0);
+       pdata += 8;
+
+       SINO_T_VAL(pdata,0,(SMB_INO_T)psbuf->st_ino);   /* inode number */
+       pdata += 8;
+                               
+       SIVAL(pdata,0, unix_perms_to_wire(psbuf->st_mode));     /* Standard 
UNIX file permissions */
+       SIVAL(pdata,4,0);
+       pdata += 8;
+
+       SIVAL(pdata,0,psbuf->st_nlink);             /* number of hard links */
+       SIVAL(pdata,4,0);
+       pdata += 8;
+
+       return pdata;
+}
+
+/****************************************************************************
  Reply to a TRANS2_QFILEPATHINFO or TRANSACT2_QFILEINFO (query file info by
  file name or file id).
 ****************************************************************************/
@@ -3469,49 +3524,7 @@
 
                case SMB_QUERY_FILE_UNIX_BASIC:
 
-                       DEBUG(10,("call_trans2qfilepathinfo: 
SMB_QUERY_FILE_UNIX_BASIC\n"));
-                       DEBUG(4,("call_trans2qfilepathinfo: 
st_mode=%o\n",(int)sbuf.st_mode));
-
-                       SOFF_T(pdata,0,get_file_size(sbuf));             /* 
File size 64 Bit */
-                       pdata += 8;
-
-                       SOFF_T(pdata,0,get_allocation_size(conn,fsp,&sbuf)); /* 
Number of bytes used on disk - 64 Bit */
-                       pdata += 8;
-
-                       put_long_date_timespec(pdata,get_ctimespec(&sbuf));     
  /* Creation Time 64 Bit */
-                       put_long_date_timespec(pdata+8,get_atimespec(&sbuf));   
  /* Last access time 64 Bit */
-                       put_long_date_timespec(pdata+16,get_mtimespec(&sbuf));  
  /* Last modification time 64 Bit */
-                       pdata += 24;
-
-                       SIVAL(pdata,0,sbuf.st_uid);               /* user id 
for the owner */
-                       SIVAL(pdata,4,0);
-                       pdata += 8;
-
-                       SIVAL(pdata,0,sbuf.st_gid);               /* group id 
of owner */
-                       SIVAL(pdata,4,0);
-                       pdata += 8;
-
-                       SIVAL(pdata,0,unix_filetype(sbuf.st_mode));
-                       pdata += 4;
-
-                       SIVAL(pdata,0,unix_dev_major(sbuf.st_rdev));   /* Major 
device number if type is device */
-                       SIVAL(pdata,4,0);
-                       pdata += 8;
-
-                       SIVAL(pdata,0,unix_dev_minor(sbuf.st_rdev));   /* Minor 
device number if type is device */
-                       SIVAL(pdata,4,0);
-                       pdata += 8;
-
-                       SINO_T_VAL(pdata,0,(SMB_INO_T)sbuf.st_ino);   /* inode 
number */
-                       pdata += 8;
-                               
-                       SIVAL(pdata,0, unix_perms_to_wire(sbuf.st_mode));     
/* Standard UNIX file permissions */
-                       SIVAL(pdata,4,0);
-                       pdata += 8;
-
-                       SIVAL(pdata,0,sbuf.st_nlink);             /* number of 
hard links */
-                       SIVAL(pdata,4,0);
-                       pdata += 8;
+                       pdata = store_file_unix_basic(pdata, fsp, &sbuf);
                        data_size = PTR_DIFF(pdata,(*ppdata));
 
                        {
@@ -4857,12 +4870,13 @@
                                SMB_STRUCT_STAT *psbuf,
                                int *pdata_return_size)
 {
-       NTSTATUS status;
-       uint32 raw_unixmode;
-       uint32 mod_unixmode;
-       mode_t unixmode;
-       files_struct *fsp;
-       const char *pdata = *ppdata;
+       NTSTATUS status = NT_STATUS_OK;
+       uint32 raw_unixmode = 0;
+       uint32 mod_unixmode = 0;
+       mode_t unixmode = (mode_t)0;
+       files_struct *fsp = NULL;
+       uint16 info_level_return = 0;
+       char *pdata = *ppdata;
 
        if (total_data < 10) {
                return NT_STATUS_INVALID_PARAMETER;
@@ -4891,17 +4905,31 @@
                 close_file(fsp, NORMAL_CLOSE);
         }
 
-       *pdata_return_size = 6;
+       info_level_return = SVAL(pdata,12);
+ 
+       if (info_level_return == SMB_QUERY_FILE_UNIX_BASIC) {
+               *pdata_return_size = 6;
+       } else {
+               *pdata_return_size = 6;
+       }
+
        /* Realloc the data size */
        *ppdata = (char *)SMB_REALLOC(*ppdata,*pdata_return_size);
        if (*ppdata == NULL) {
+               *pdata_return_size = 0;
                return NT_STATUS_NO_MEMORY;
        }
 
        SSVAL(pdata,0,NO_OPLOCK_RETURN);
        SSVAL(pdata,2,0);
-       SSVAL(pdata,4,SMB_NO_INFO_LEVEL_RETURNED);
 
+       if (info_level_return == SMB_QUERY_FILE_UNIX_BASIC) {
+               SSVAL(pdata,4,SMB_QUERY_FILE_UNIX_BASIC);
+               store_file_unix_basic(pdata + 6, fsp, psbuf);
+       } else {
+               SSVAL(pdata,4,SMB_NO_INFO_LEVEL_RETURNED);
+       }
+
        return status;
 }
 
@@ -4917,7 +4945,7 @@
                                int *pdata_return_size)
 {
        BOOL extended_oplock_granted = False;
-       const char *pdata = *ppdata;
+       char *pdata = *ppdata;
        uint32 flags = 0;
        uint32 wire_open_mode = 0;
        uint32 raw_unixmode = 0;
@@ -4930,6 +4958,7 @@
        files_struct *fsp = NULL;
        int oplock_request = 0;
        int info = 0;
+       uint16 info_level_return = 0;
 
        if (total_data < 14) {
                return NT_STATUS_INVALID_PARAMETER;
@@ -5029,11 +5058,19 @@
                extended_oplock_granted = True;
        }
 
-       *pdata_return_size = 6;
+       info_level_return = SVAL(pdata,12);
+ 
+       if (info_level_return == SMB_QUERY_FILE_UNIX_BASIC) {
+               *pdata_return_size = 6;
+       } else {
+               *pdata_return_size = 6;
+       }
+
        /* Realloc the data size */
        *ppdata = (char *)SMB_REALLOC(*ppdata,*pdata_return_size);
        if (*ppdata == NULL) {
                close_file(fsp,ERROR_CLOSE);
+               *pdata_return_size = 0;
                return NT_STATUS_NO_MEMORY;
        }
 
@@ -5050,7 +5087,12 @@
        }
 
        SSVAL(pdata,2,fsp->fnum);
-       SSVAL(pdata,4,SMB_NO_INFO_LEVEL_RETURNED);
+       if (info_level_return == SMB_QUERY_FILE_UNIX_BASIC) {
+               SSVAL(pdata,4,SMB_QUERY_FILE_UNIX_BASIC);
+               store_file_unix_basic(pdata + 6, fsp, psbuf);
+       } else {
+               SSVAL(pdata,4,SMB_NO_INFO_LEVEL_RETURNED);
+       }
        return NT_STATUS_OK;
 }
 

Reply via email to