Fix some cases where file_set_dosmode was being passed
authorJeremy Allison <jra@samba.org>
Wed, 31 Oct 2007 22:45:45 +0000 (15:45 -0700)
committerJeremy Allison <jra@samba.org>
Wed, 31 Oct 2007 22:45:45 +0000 (15:45 -0700)
False instead of NULL. Fix more of the notifications to
be correct for Samba4 RAW-NOTIFY torture (we had missed
one when calling set_ea_dos_attribute().
Jeremy.

source/script/tests/selftest.sh
source/smbd/dosmode.c
source/smbd/fileio.c
source/smbd/nttrans.c
source/smbd/open.c
source/smbd/reply.c
source/smbd/trans2.c

index 8de6420b10abf4bfdef62b2644e8e55ec13ee97d..30355a829d4e25ef4b556f72271c1238e6ebe264 100755 (executable)
@@ -139,6 +139,8 @@ cat >$SERVERCONFFILE<<EOF
        printing = bsd
        printcap name = /dev/null
 
+#      min receivefile size = 4000
+
 [tmp]
        path = $PREFIX_ABS/tmp
        read only = no
index ed622d3730e3a7269d5f7c378c82da880ed52456..18e6439be452f64e5c1f1577e735008dc94e33ab 100644 (file)
@@ -425,7 +425,8 @@ uint32 dos_mode(connection_struct *conn, const char *path,SMB_STRUCT_STAT *sbuf)
 
 int file_set_dosmode(connection_struct *conn, const char *fname,
                     uint32 dosmode, SMB_STRUCT_STAT *st,
-                    const char *parent_dir)
+                    const char *parent_dir,
+                    bool newfile)
 {
        SMB_STRUCT_STAT st1;
        int mask=0;
@@ -455,6 +456,10 @@ int file_set_dosmode(connection_struct *conn, const char *fname,
 
        /* Store the DOS attributes in an EA by preference. */
        if (set_ea_dos_attribute(conn, fname, st, dosmode)) {
+               if (!newfile) {
+                       notify_fname(conn, NOTIFY_ACTION_MODIFIED,
+                               FILE_NOTIFY_CHANGE_ATTRIBUTES, fname);
+               }
                return 0;
        }
 
@@ -491,8 +496,10 @@ int file_set_dosmode(connection_struct *conn, const char *fname,
        }
 
        if ((ret = SMB_VFS_CHMOD(conn,fname,unixmode)) == 0) {
-               notify_fname(conn, NOTIFY_ACTION_MODIFIED,
-                            FILE_NOTIFY_CHANGE_ATTRIBUTES, fname);
+               if (!newfile) {
+                       notify_fname(conn, NOTIFY_ACTION_MODIFIED,
+                               FILE_NOTIFY_CHANGE_ATTRIBUTES, fname);
+               }
                return 0;
        }
 
@@ -523,8 +530,10 @@ int file_set_dosmode(connection_struct *conn, const char *fname,
                ret = SMB_VFS_FCHMOD(fsp, fsp->fh->fd, unixmode);
                unbecome_root();
                close_file_fchmod(fsp);
-               notify_fname(conn, NOTIFY_ACTION_MODIFIED,
-                            FILE_NOTIFY_CHANGE_ATTRIBUTES, fname);
+               if (!newfile) {
+                       notify_fname(conn, NOTIFY_ACTION_MODIFIED,
+                               FILE_NOTIFY_CHANGE_ATTRIBUTES, fname);
+               }
        }
 
        return( ret );
index 9e296f2204ed7e0945d31abb4f85723e476c0f7f..74f2c6774f9e04a298642d4425036d560e7268e1 100644 (file)
@@ -230,8 +230,13 @@ ssize_t write_file(struct smb_request *req,
 
                if (SMB_VFS_FSTAT(fsp,fsp->fh->fd,&st) == 0) {
                        int dosmode = dos_mode(fsp->conn,fsp->fsp_name,&st);
-                       if ((lp_store_dos_attributes(SNUM(fsp->conn)) || MAP_ARCHIVE(fsp->conn)) && !IS_DOS_ARCHIVE(dosmode)) {
-                               file_set_dosmode(fsp->conn,fsp->fsp_name,dosmode | aARCH,&st, False);
+                       if ((lp_store_dos_attributes(SNUM(fsp->conn)) ||
+                                       MAP_ARCHIVE(fsp->conn)) &&
+                                       !IS_DOS_ARCHIVE(dosmode)) {
+                               file_set_dosmode(fsp->conn,fsp->fsp_name,
+                                               dosmode | aARCH,&st,
+                                               NULL,
+                                               false);
                        }
 
                        /*
index bbbde066194c09ccae46b8c50bc6d35ace031fb8..da926d1bce97245f3b73b50b10c81f82e69758c5 100644 (file)
@@ -1971,7 +1971,7 @@ static NTSTATUS copy_internals(TALLOC_CTX *ctx,
           creates the file. This isn't the correct thing to do in the copy
           case. JRA */
        file_set_dosmode(conn, newname, fattr, &sbuf2,
-                        parent_dirname(newname));
+                        parent_dirname(newname),false);
 
        if (ret < (SMB_OFF_T)sbuf1.st_size) {
                return NT_STATUS_DISK_FULL;
index 4ed3a70411f9952f12e98d4a426c73381b569a3e..53fc1be586b6bd22abf94600c7310771fddee402 100644 (file)
@@ -1866,7 +1866,8 @@ NTSTATUS open_file_ntcreate(connection_struct *conn,
                        if (!posix_open) {
                                file_set_dosmode(conn, fname,
                                         new_dos_attributes | aARCH, NULL,
-                                        parent_dir);
+                                        parent_dir,
+                                        true);
                        }
                }
        }
@@ -2035,7 +2036,8 @@ static NTSTATUS mkdir_internal(connection_struct *conn,
                if (!posix_open) {
                        file_set_dosmode(conn, name,
                                 file_attributes | aDIR, NULL,
-                                parent_dir);
+                                parent_dir,
+                                true);
                }
        }
 
index 531e71fe73a377781d4856cb8a310b2bb44091bd..d2aa6c692995e42212eb79c3f2a513c4a49e0e00 100644 (file)
@@ -1114,7 +1114,7 @@ void reply_setatr(connection_struct *conn, struct smb_request *req)
                else
                        mode &= ~aDIR;
 
-               if (file_set_dosmode(conn,fname,mode,&sbuf,False) != 0) {
+               if (file_set_dosmode(conn,fname,mode,&sbuf,NULL,false) != 0) {
                        reply_unixerror(req, ERRDOS, ERRnoaccess);
                        END_PROFILE(SMBsetatr);
                        return;
index d75f6a29fd645ce8128569b252940d16c5c4fe35..58d44a856b566c48701b677503bd3853f13869e0 100644 (file)
@@ -4563,7 +4563,7 @@ static NTSTATUS smb_set_file_dosmode(connection_struct *conn,
                DEBUG(10,("smb_set_file_dosmode: file %s : setting dos mode 0x%x\n",
                                        fname, (unsigned int)dosmode ));
 
-               if(file_set_dosmode(conn, fname, dosmode, psbuf, False)) {
+               if(file_set_dosmode(conn, fname, dosmode, psbuf, NULL, false)) {
                        DEBUG(2,("smb_set_file_dosmode: file_set_dosmode of %s failed (%s)\n",
                                                fname, strerror(errno)));
                        return map_nt_error_from_unix(errno);