From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.spocom.com (mail.spocom.com [206.63.224.240]) by sourceware.org (Postfix) with ESMTP id 6C754385780E for ; Mon, 15 Nov 2021 22:18:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6C754385780E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=spocom.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=spocom.com DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; d=spocom.com; s=mail; h=received:date:from:to:subject:message-id:mail-followup-to :references:mime-version:content-type:content-disposition :content-transfer-encoding:in-reply-to:x-operating-system :user-agent; b=e2MtsJMEjhdbQAJT/u4Z2eujpfzmWPS/5JdozXgFEuxPQhVP5xir0gGk8GZojDafA vkBwPPbIbOfjV+BSBD27A== Received: from localhost (174-31-125-213.spkn.qwest.net [174.31.125.213]) by mail.spocom.com with SMTP; Mon, 15 Nov 2021 14:17:56 -0800 Date: Mon, 15 Nov 2021 14:18:18 -0800 From: Gary Johnson To: cygwin@cygwin.com Subject: Re: Editing with vim clears Windows 10 file system archive bit. Message-ID: <20211115221818.GA12715@phoenix> Mail-Followup-To: cygwin@cygwin.com References: <305aedc4-9bb2-02b8-f5ab-f88aba39e9cf@t-online.de> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: X-Operating-System: Linux 2.6.32-74-generic GNU/Linux User-Agent: Mutt/1.5.20 (2009-06-14) X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: cygwin@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: General Cygwin discussions and problem reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 15 Nov 2021 22:18:21 -0000 On 2021-11-15, Corinna Vinschen via Cygwin wrote: > On Nov 15 19:54, Christian Franke wrote: > > Steve Ward via Cygwin wrote: > > > Description of problem: > > > While using vim 8.2 on cygwin 3.3 (x86_64) on Windows 10, > > > when editing an existing file with vim and saving it, the Window’s > > > file system archive bit is always left cleared (not modified state). > > > This happens, whether the archive bit was set (is modified) or > > > clear (not modified) initially. > > > > The problem also occurs with 'cp' command: > > > > $ touch file1 > > > > $ /bin/cp file1 file2 > > > > $ /bin/cp --preserve=mode file1 file3 > > > > $ lsattr file? > > ---a-------- file1 > > ---a-------- file2 > > ------------ file3 > > > > Some Cygwin functions apparently clear the archive attribute unexpectedly, > > for example: > > > > int fd = open(filename, O_CREAT|O_TRUNC|O_WRONLY, 0644); > > write(fd, "Test\n", 5); > > fchmod(fd, 0644); // clears archive attribute > > close(fd); > > > > Same with facl(., SETACL, ...). The variants chmod() and acl() are not > > affected. > > It's funny that it took so long that somebody actually noticed this. > This behaviour is present at least since 2004. Cygwin *never* actually > cared for the ARCHIVE attribute explicitely. The reason for the above > observation is the open call containing the O_CREAT flag. When Cygwin > creates files, it sets the attributes to FILE_ATTRIBUTE_NORMAL only, not > adding the FILE_ATTRIBUTE_ARCHIVE flag. > > Changing that is actually pretty simple, just set FILE_ATTRIBUTE_ARCHIVE > as soon as the underlying NtCreateFile is called for an open(O_CREAT). > > Fixed in current git. I had thought that this might be a bug in Vim, so did a git bisect to find the offending commit. For the record, it was this one: commit cd142e3369db8888163a511dbe9907bcd138829c Author: Bram Moolenaar Date: Thu Nov 16 17:03:45 2017 +0100 patch 8.0.1300: file permissions may end up wrong when writing Problem: File permissions may end up wrong when writing. Solution: Use fchmod() instead of chmod() when possible. Don't truncate until we know we can change the file. src/auto/configure | 4 +-- src/config.h.in | 4 ++- src/configure.ac | 4 +-- src/fileio.c | 80 ++++++++++++++++++++++++++++++++++++++++----------- src/os_unix.c | 17 +++++++++-- src/proto/os_unix.pro | 1 + src/version.c | 2 ++ 7 files changed, 88 insertions(+), 24 deletions(-) The only change I see to an open() call was removing O_TRUNC on systems with ftruncate() and adding a later call to ftruncate() on systems that have it. There were also some changes to the setting of permissions (fchown(), fchmod() and chmod()). These changes were all in the buf_write() function in fileio.c. That open() call had the O_CREAT flag before and after the change. Regards, Gary