unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* Execute permission on Windows XP emacs 22.1
@ 2007-07-09  9:14 Pete Gillin
  2007-07-09 12:19 ` Eli Zaretskii
  0 siblings, 1 reply; 5+ messages in thread
From: Pete Gillin @ 2007-07-09  9:14 UTC (permalink / raw)
  To: help-gnu-emacs

OS: Windows XP Pro / SP2
Emacs: This is GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02
on RELEASE

Can anyone explain to me why emacs refuses to create files without
"Read and Execute" permission set (for the creating user)? I tried
things like the following in my startup file, to set the value and
allow me to inspect it immediately after setting (by looking at the
variable) and at runtime (by running the insert function).

(set-default-file-modes ?\644)

(setq my-default-file-modes (number-to-string (default-file-modes)))

(defun insert-default-file-modes ()
  "inserts current value of default-file-modes"
  (interactive)
  (insert (number-to-string (default-file-modes))))

Both ways of checking the value agree, and suggest that the value I
have tried to set has been immediately ORed with 177 (octal). In the
above case, when I've tried to set 644, the value actually set is 777.
And looking at the file properties confirms that "Read and Execute" is
set for the creating user whatever modes I've asked for. Which is
unhelpful, frankly.

Thanks,

Pete.

P.S. I know that the normal behaviour on Windows is to make everything
executable by default --- but I don't see why emacs should insist on
doing this when I've explicitly asked it not to. The reason this
bothers me (if you're curious) is that I'm using the Subversion
version control system (the cygwin client) and when I add a file which
has "Read and Execute" locally, it automatically sets the repository
property svn:executable and so (if I forget to unset it) we get the
executable bit set on all working copies (including linux where it
matters more).

P.P.S. The behaviour seemed to be even odder on emacs 21.3, but I
didn't investigate thoroughly.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Execute permission on Windows XP emacs 22.1
  2007-07-09  9:14 Execute permission on Windows XP emacs 22.1 Pete Gillin
@ 2007-07-09 12:19 ` Eli Zaretskii
  2007-07-09 13:46   ` Pete Gillin
  0 siblings, 1 reply; 5+ messages in thread
From: Eli Zaretskii @ 2007-07-09 12:19 UTC (permalink / raw)
  To: help-gnu-emacs

> Date: Mon, 9 Jul 2007 10:14:27 +0100
> From: Pete Gillin <pete@void.printf.net>
> 
> OS: Windows XP Pro / SP2
> Emacs: This is GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02
> on RELEASE
> 
> Can anyone explain to me why emacs refuses to create files without
> "Read and Execute" permission set (for the creating user)?

I don't see this, or maybe I don't understand how exactly did you try
this.  Would you please show a step-by-step recipe, starting with
"emacs -Q", to reproduce this problem?

On my machine (also an XP SP2), Emacs by default creates files that
have only Read and Write permissions set; no Execute permission.  I
look at the permission bits by running Dired on the parent directory.
How did you look at the permission bits in your case?

> I tried
> things like the following in my startup file, to set the value and
> allow me to inspect it immediately after setting (by looking at the
> variable) and at runtime (by running the insert function).
> 
> (set-default-file-modes ?\644)
> 
> (setq my-default-file-modes (number-to-string (default-file-modes)))
> 
> (defun insert-default-file-modes ()
>   "inserts current value of default-file-modes"
>   (interactive)
>   (insert (number-to-string (default-file-modes))))
> 
> Both ways of checking the value agree, and suggest that the value I
> have tried to set has been immediately ORed with 177 (octal). In the
> above case, when I've tried to set 644, the value actually set is 777.

Is the problem only with default-file-modes and set-default-file-modes? 
Or do you really see files created with wrong permissions?

If the problem is with default-file-modes and set-default-file-modes,
then it could be a bug with just these two functions, or it could be a
problem with your usage of them (or both).  In particular, you need to
be aware that the Windows implementation of the `umask' library
function, which is what these two Lisp functions call, does not
support the Execute bit (it masks it off, as if you never set it in
the argument to `umask'), and it also zeroes out the lower 6 bits of
the mask, i.e. it uses only the owner's bits, because the Windows
filesystem has only one set of permissions, not 3 sets as on Unix.
(Well, actually, the last part is not 100% true: NTFS volumes do
support much more elaborate access permissions on Windows NT and its
descendants, but Emacs does not call the APIs necessary to make use of
these features.)

> And looking at the file properties confirms that "Read and Execute" is
> set for the creating user whatever modes I've asked for.

Please describe how did you look at them, exactly.

> P.S. I know that the normal behaviour on Windows is to make everything
> executable by default

No, it isn't.  The default is to make files with read and write
permissions.  The executable permission isn't maintained as part of
the bits returned by `stat' and similar functions.

> P.P.S. The behaviour seemed to be even odder on emacs 21.3

I see the same behavior there, but again, I might be using a wrong
sequence of commands, not the one you used.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Execute permission on Windows XP emacs 22.1
  2007-07-09 12:19 ` Eli Zaretskii
@ 2007-07-09 13:46   ` Pete Gillin
  2007-07-09 14:42     ` Eli Zaretskii
  0 siblings, 1 reply; 5+ messages in thread
From: Pete Gillin @ 2007-07-09 13:46 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: help-gnu-emacs

On Mon, Jul 09, 2007 at 03:19:52PM +0300, Eli Zaretskii wrote:
> > Date: Mon, 9 Jul 2007 10:14:27 +0100
> > From: Pete Gillin <pete@void.printf.net>
> > 
> > OS: Windows XP Pro / SP2
> > Emacs: This is GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600) of 2007-06-02
> > on RELEASE
> > 
> > Can anyone explain to me why emacs refuses to create files without
> > "Read and Execute" permission set (for the creating user)?
> 
> I don't see this, or maybe I don't understand how exactly did you try
> this.  Would you please show a step-by-step recipe, starting with
> "emacs -Q", to reproduce this problem?

See below for two procedures showing what I tried.

> On my machine (also an XP SP2), Emacs by default creates files that
> have only Read and Write permissions set; no Execute permission.  I
> look at the permission bits by running Dired on the parent directory.
> How did you look at the permission bits in your case?

Using the Security tab of the Properties panel of Windows Explorer.

[snip]
> Is the problem only with default-file-modes and set-default-file-modes? 
> Or do you really see files created with wrong permissions?

As I show below, I see two parts to this problem.
(1) When I call set-default-file-modes, the value returned by
default-file-modes is not what I set (apparently ORed with 177).
(2) When I create a file with emacs, dired shows no execute bit, but
Windows shows a checkmark under Allow for Read & Execute. This happens
whether I create the file with runemacs -Q, or using a load file which
does set-default-file-modes \?644.

The second of these is the one that I really care about.

> If the problem is with default-file-modes and set-default-file-modes,
> then it could be a bug with just these two functions, or it could be a
> problem with your usage of them (or both).  In particular, you need to
> be aware that the Windows implementation of the `umask' library
> function, which is what these two Lisp functions call, does not
> support the Execute bit (it masks it off, as if you never set it in
> the argument to `umask'), and it also zeroes out the lower 6 bits of
> the mask, i.e. it uses only the owner's bits, because the Windows
> filesystem has only one set of permissions, not 3 sets as on Unix.
> (Well, actually, the last part is not 100% true: NTFS volumes do
> support much more elaborate access permissions on Windows NT and its
> descendants, but Emacs does not call the APIs necessary to make use of
> these features.)

That might well be the cause of the problem I'm seeing. If emacs is
using the basic API which does not include the "more elaborate access
permissions" you mention, Windows will be filling in the default
values, and the default value for Read & Execute is Allow. It would
also explain the disparity between what dired shows and what the
Windows Explorer Property pane shows, because dired isn't reading the
"more elaborate access permissions" either.

This wouldn't directly explain why there's a discrepancy between the
the value given to I set-default-file-modes and the value returned by
default-file-modes, but maybe emacs doesn't bother maintaining an
execute bit or group/other bits which it knows it can do nothing with
(using the basic API, as it does).

> > And looking at the file properties confirms that "Read and Execute" is
> > set for the creating user whatever modes I've asked for.
> Please describe how did you look at them, exactly.

I used the Security tab of the Properties panel of Windows Explorer.

> > P.S. I know that the normal behaviour on Windows is to make everything
> > executable by default
> No, it isn't.  The default is to make files with read and write
> permissions.  The executable permission isn't maintained as part of
> the bits returned by `stat' and similar functions.

Sorry, I didn't mean the normal behaviour of emacs, I meant the common
behaviour of Windows applications. I created a file with WordPad, to
see what would happen, and it did have Read & Execute set to Allow.

Thanks for helping look into this.

Pete.

PROCEDURE A (simple)

On the command line, I do 'runemacs -Q myfile'.

I make an edit and save the file.

I inspect the current directory with dired (M-x dired). It shows
myfile with permissions of -rw-rw-rw-, in line with what you suggest.

I open Windows Explorer. On myfile, I right click and open Properties.
I go to the Security tab. For all users, there are checkmarks under
Allow for the Read & Execute permission.

PROCEDURE B (using a load file)

I have the following in dfm_stuff:

-----begin dfm_stuff-----

(set-default-file-modes ?\644)

(setq my-default-file-modes (number-to-string (default-file-modes)))

(defun insert-default-file-modes ()
  "Insert current default-file-modes"
  (interactive)
  (insert (number-to-string (default-file-modes))))

-----end dfm_stuff-----

On the command line, I do 'runemacs -Q --load=dfm_stuff myfile2'. (I
realise that reproducing with -Q is easier, but in this case I had to
do the set-default-file-modes in a load file because it is not
available interactively --- please let me know if there's a better way
to do this.)

Note that the first line above tries to set to 644 octal.

I check the value of default-file-modes immediately after it was set,
stored in a variable by the second line above. I typed 'C-h v
my-default-file-modes'. It showed a value of 511, which is 777 octal.

I check the current value of default-file-modes using the function
defined in the third line above. I typed 'M-x
insert-default-file-modes'. It inserted 511, which is 777 octal.

I inspect the current directory with dired (M-x dired). It shows
myfile2 with permissions of -rw-rw-rw-, in line with what you suggest.

I open Windows Explorer. On myfile2, I right click and open Properties.
I go to the Security tab. For all users, there are checkmarks under
Allow for the Read & Execute permission.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Execute permission on Windows XP emacs 22.1
  2007-07-09 13:46   ` Pete Gillin
@ 2007-07-09 14:42     ` Eli Zaretskii
  2007-07-09 15:03       ` Pete Gillin
  0 siblings, 1 reply; 5+ messages in thread
From: Eli Zaretskii @ 2007-07-09 14:42 UTC (permalink / raw)
  To: help-gnu-emacs

> Date: Mon, 9 Jul 2007 14:46:53 +0100
> From: Pete Gillin <pete@void.printf.net>
> Cc: help-gnu-emacs@gnu.org
> 
> > How did you look at the permission bits in your case?
> 
> Using the Security tab of the Properties panel of Windows Explorer.

In that case, it's expected: as you wrote (and I misunderstood), this
is the default for files created on Windows, and Emacs uses the
defaults here.

> (1) When I call set-default-file-modes, the value returned by
> default-file-modes is not what I set (apparently ORed with 177).

This is also expected: the Windows version of `umask' supports only
Read and Write bits for the owner, everything else is stripped away.
So 644 is equivalent to 777, which would explain the apparent ORing
with 177.

> That might well be the cause of the problem I'm seeing. If emacs is
> using the basic API which does not include the "more elaborate access
> permissions" you mention, Windows will be filling in the default
> values, and the default value for Read & Execute is Allow.

Yes.

> It would
> also explain the disparity between what dired shows and what the
> Windows Explorer Property pane shows, because dired isn't reading the
> "more elaborate access permissions" either.

Yes.

> This wouldn't directly explain why there's a discrepancy between the
> the value given to I set-default-file-modes and the value returned by
> default-file-modes, but maybe emacs doesn't bother maintaining an
> execute bit or group/other bits which it knows it can do nothing with
> (using the basic API, as it does).

Emacs doesn't maintain any of these bits, it just calls the `umask' in
the Windows library.  It's `umask' that maintains the bits, and as
explained above, the Windows implementation only maintains two bits:
200 and 400.

So now that we established the reasons for what you saw, is there some
real problem where this (mis)behavior gets in your way?  If the
problem is the Cygwin port of SVN client, then either it has some
workaround for this, or it really means you to use only Cygwin
programs (which presumably manipulate the permissions through the
Windows Security API).  Or maybe you can find a native Windows port of
SVN client, that will not pay attention to the security information.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Execute permission on Windows XP emacs 22.1
  2007-07-09 14:42     ` Eli Zaretskii
@ 2007-07-09 15:03       ` Pete Gillin
  0 siblings, 0 replies; 5+ messages in thread
From: Pete Gillin @ 2007-07-09 15:03 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: help-gnu-emacs

On Mon, Jul 09, 2007 at 05:42:24PM +0300, Eli Zaretskii wrote:
> Emacs doesn't maintain any of these bits, it just calls the `umask'
> in the Windows library. It's `umask' that maintains the bits, and as
> explained above, the Windows implementation only maintains two bits:
> 200 and 400.

Okay, that makes sense.

> So now that we established the reasons for what you saw, is there
> some real problem where this (mis)behavior gets in your way? If the
> problem is the Cygwin port of SVN client, then either it has some
> workaround for this, or it really means you to use only Cygwin
> programs (which presumably manipulate the permissions through the
> Windows Security API). Or maybe you can find a native Windows port
> of SVN client, that will not pay attention to the security
> information.

Adding new files using the cygwin port of svn is the only time this
causes a problem for me. It's not a big deal, so if the only fix is
for emacs to start using the more advanced API and that's not likely
to happen soon then I'll live with it.

(I could use the native Windows svn client, but (for various reasons)
the convenience of the cygwin version outweighs the minor
inconvenience of having to unset the executable bit on new files. Or I
guess I could try the cygwin port of emacs which might go through
cygwin and so control the full permissions properly, but I don't
always use emacs from cygwin and I don't want to confuse myself with
two different versions.)

Glad we've cleared that up. Thank you.

Pete.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2007-07-09 15:03 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-07-09  9:14 Execute permission on Windows XP emacs 22.1 Pete Gillin
2007-07-09 12:19 ` Eli Zaretskii
2007-07-09 13:46   ` Pete Gillin
2007-07-09 14:42     ` Eli Zaretskii
2007-07-09 15:03       ` Pete Gillin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).