unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* error in server-running-p on M$
@ 2008-11-22 11:44 dhruva
  2008-11-22 11:58 ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: dhruva @ 2008-11-22 11:44 UTC (permalink / raw)
  To: Emacs Devel

Hi,
 I get the following error when I run emacs built with MSVC on WXP
(M$) and execute 'server-running-p' function.

;; in .emacs
(require 'server)
(server-running-p)


Debugger entered--Lisp error: (error "Unknown address family")
  make-network-process(:name "server-client-test" :family local
:server nil :noquery t :service "e:/users/dhruva/server")
  byte-code("            \b	\"&\n! ˇ" [name server-socket-dir
delete-process make-network-process :name "server-client-test" :family
local :server nil :noquery t :service expand-file-name] 14)
  server-running-p()
  eval((server-running-p))
  eval-last-sexp-1(nil)
  eval-last-sexp(nil)
  call-interactively(eval-last-sexp nil nil)

-dhruva

-- 
Contents reflect my personal views only!

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

* Re: error in server-running-p on M$
  2008-11-22 11:44 error in server-running-p on M$ dhruva
@ 2008-11-22 11:58 ` Juanma Barranquero
  2008-11-22 12:51   ` Eli Zaretskii
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-22 11:58 UTC (permalink / raw)
  To: dhruva; +Cc: Emacs Devel

2008/11/22 dhruva <dhruvakm@gmail.com>:

>  I get the following error when I run emacs built with MSVC on WXP
> (M$) and execute 'server-running-p' function.

Yes. `server-running-p' does not work for TCP sockets.

You can read some discussion at this thread:

http://lists.gnu.org/archive/html/emacs-devel/2008-11/msg00106.html

  Juanma




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

* Re: error in server-running-p on M$
  2008-11-22 11:58 ` Juanma Barranquero
@ 2008-11-22 12:51   ` Eli Zaretskii
  2008-11-22 13:00     ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: Eli Zaretskii @ 2008-11-22 12:51 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: emacs-devel

> Date: Sat, 22 Nov 2008 12:58:09 +0100
> From: "Juanma Barranquero" <lekktu@gmail.com>
> Cc: Emacs Devel <emacs-devel@gnu.org>
> 
> 2008/11/22 dhruva <dhruvakm@gmail.com>:
> 
> >  I get the following error when I run emacs built with MSVC on WXP
> > (M$) and execute 'server-running-p' function.
> 
> Yes. `server-running-p' does not work for TCP sockets.
> 
> You can read some discussion at this thread:
> 
> http://lists.gnu.org/archive/html/emacs-devel/2008-11/msg00106.html

I don't see any practical conclusions reached in that thread.  Am I
missing something?

How about if we fix server-running-p now, to DTRT for TCP sockets?




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

* Re: error in server-running-p on M$
  2008-11-22 12:51   ` Eli Zaretskii
@ 2008-11-22 13:00     ` Juanma Barranquero
  2008-11-22 13:20       ` Eli Zaretskii
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-22 13:00 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

On Sat, Nov 22, 2008 at 13:51, Eli Zaretskii <eliz@gnu.org> wrote:

> I don't see any practical conclusions reached in that thread.  Am I
> missing something?

No. As it happens in many other discussions, there was no practical
conclusion reached.

> How about if we fix server-running-p now, to DTRT for TCP sockets?

Someone would have to answer my question, which is: what is the stated
purpose of `server-running-p'?

The changes I proposed would allow simple detection of running TCP
servers on the same machine (without using net services, which could
cause delays), as long as they are using the same configuration
(specifically, server-name). Do we want to do something about

  emacs --eval "(progn (setq server-name \"one\") (server-mode 1))"
  emacs --eval "(progn (setq server-name \"two\") (server-mode 1))"

?

  Juanma




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

* Re: error in server-running-p on M$
  2008-11-22 13:00     ` Juanma Barranquero
@ 2008-11-22 13:20       ` Eli Zaretskii
  2008-11-22 13:37         ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: Eli Zaretskii @ 2008-11-22 13:20 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: emacs-devel

> Date: Sat, 22 Nov 2008 14:00:16 +0100
> From: "Juanma Barranquero" <lekktu@gmail.com>
> Cc: dhruvakm@gmail.com, emacs-devel@gnu.org
> 
> On Sat, Nov 22, 2008 at 13:51, Eli Zaretskii <eliz@gnu.org> wrote:
> 
> > I don't see any practical conclusions reached in that thread.  Am I
> > missing something?
> 
> No. As it happens in many other discussions, there was no practical
> conclusion reached.

Perhaps we should use the bug tracker for tracking issues as well, not
just bug reports.

> > How about if we fix server-running-p now, to DTRT for TCP sockets?
> 
> Someone would have to answer my question, which is: what is the stated
> purpose of `server-running-p'?

In that thread, Stefan answered it.

> The changes I proposed would allow simple detection of running TCP
> servers on the same machine (without using net services, which could
> cause delays), as long as they are using the same configuration
> (specifically, server-name).

Can you point me to these changes, or post them?  I don't think I saw
any diffs in that thread.

> Do we want to do something about
> 
>   emacs --eval "(progn (setq server-name \"one\") (server-mode 1))"
>   emacs --eval "(progn (setq server-name \"two\") (server-mode 1))"
> 
> ?

Sorry, I don't follow: how is this related to the issue at hand?




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

* Re: error in server-running-p on M$
  2008-11-22 13:20       ` Eli Zaretskii
@ 2008-11-22 13:37         ` Juanma Barranquero
  2008-11-22 13:53           ` Eli Zaretskii
  2008-11-23  3:59           ` Stefan Monnier
  0 siblings, 2 replies; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-22 13:37 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

On Sat, Nov 22, 2008 at 14:20, Eli Zaretskii <eliz@gnu.org> wrote:

> Perhaps we should use the bug tracker for tracking issues as well, not
> just bug reports.

I think so.

> In that thread, Stefan answered it.

He said: "Currently it's not used (except in some people's .emacs).
The intended use is in start-server to try and prevent hijacking the
socket of a pre-existing server."  But that is just part of the
answer, I think.

> Can you point me to these changes, or post them?  I don't think I saw
> any diffs in that thread.

I didn't send any diffs, just posted a little snippet of code, because
the change is almost trivial. See the attached patch, which
illustrates the problem I'm talking about.

> Sorry, I don't follow: how is this related to the issue at hand?

Because, if the only intent of `server-running-p' is to "prevent
hijacking the socket" of another server, the name is quite misleading.
It does not detect (even now, for local sockets) whether another
instance is running; it only detects whether another instance is
running _with_the_same_server_setup_ (presumably because the intention
is not disturbing it).

That's why I ask about two consecutive instances of Emacs using
different names, or switching from local to TCP sockets.
`server-running-p' won't detect the first one. If that is the intended
effect, then the function should be called
`is-server-socket-available-p'.

             Juanma


Index: lisp/server.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/server.el,v
retrieving revision 1.173
diff -u -2 -r1.173 server.el
--- lisp/server.el	5 Nov 2008 21:16:17 -0000	1.173
+++ lisp/server.el	7 Nov 2008 15:37:36 -0000
@@ -537,5 +537,15 @@
   (unless name (setq name server-name))
   (condition-case nil
-      (progn
+      (if server-use-tcp
+	  (with-temp-buffer
+	    (insert-file-contents-literally
+	     (expand-file-name server-name server-auth-dir))
+	    (and (looking-at "127\.0\.0\.1:[0-9]+ \\([0-9]+\\)")
+		 (let ((case-fold-search t)
+		       (proc (assq 'comm
+				   (system-process-attributes
+				    (string-to-number (match-string 1))))))
+		   (and proc
+			(string-match-p "emacs" (cdr proc))))))
 	(delete-process
 	 (make-network-process




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

* Re: error in server-running-p on M$
  2008-11-22 13:37         ` Juanma Barranquero
@ 2008-11-22 13:53           ` Eli Zaretskii
  2008-11-22 14:13             ` Ulrich Mueller
  2008-11-23  3:59           ` Stefan Monnier
  1 sibling, 1 reply; 58+ messages in thread
From: Eli Zaretskii @ 2008-11-22 13:53 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: emacs-devel

> Date: Sat, 22 Nov 2008 14:37:02 +0100
> From: "Juanma Barranquero" <lekktu@gmail.com>
> Cc: emacs-devel@gnu.org
> 
> He said: "Currently it's not used (except in some people's .emacs).
> The intended use is in start-server to try and prevent hijacking the
> socket of a pre-existing server."  But that is just part of the
> answer, I think.

I'm okay with going with this partial answer.

> Index: lisp/server.el
> ===================================================================
> RCS file: /sources/emacs/emacs/lisp/server.el,v
> retrieving revision 1.173
> diff -u -2 -r1.173 server.el
> --- lisp/server.el	5 Nov 2008 21:16:17 -0000	1.173
> +++ lisp/server.el	7 Nov 2008 15:37:36 -0000
> @@ -537,5 +537,15 @@
>    (unless name (setq name server-name))
>    (condition-case nil
> -      (progn
> +      (if server-use-tcp
> +	  (with-temp-buffer
> +	    (insert-file-contents-literally
> +	     (expand-file-name server-name server-auth-dir))
> +	    (and (looking-at "127\.0\.0\.1:[0-9]+ \\([0-9]+\\)")
> +		 (let ((case-fold-search t)
> +		       (proc (assq 'comm
> +				   (system-process-attributes
> +				    (string-to-number (match-string 1))))))
> +		   (and proc
> +			(string-match-p "emacs" (cdr proc))))))
>  	(delete-process
>  	 (make-network-process
> 

Does anyone see any problems with this change?  If not, I suggest to
install it.




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

* Re: error in server-running-p on M$
  2008-11-22 13:53           ` Eli Zaretskii
@ 2008-11-22 14:13             ` Ulrich Mueller
  2008-11-22 14:17               ` Juanma Barranquero
  2008-11-23  3:58               ` Stefan Monnier
  0 siblings, 2 replies; 58+ messages in thread
From: Ulrich Mueller @ 2008-11-22 14:13 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Juanma Barranquero, emacs-devel

>>>>> On Sat, 22 Nov 2008, Eli Zaretskii wrote:

>> Index: lisp/server.el
>> ===================================================================
>> RCS file: /sources/emacs/emacs/lisp/server.el,v
>> retrieving revision 1.173
>> diff -u -2 -r1.173 server.el
>> --- lisp/server.el	5 Nov 2008 21:16:17 -0000	1.173
>> +++ lisp/server.el	7 Nov 2008 15:37:36 -0000
>> @@ -537,5 +537,15 @@
>> (unless name (setq name server-name))
>> (condition-case nil
>> -      (progn
>> +      (if server-use-tcp
>> +	  (with-temp-buffer
>> +	    (insert-file-contents-literally
>> +	     (expand-file-name server-name server-auth-dir))
>> +	    (and (looking-at "127\.0\.0\.1:[0-9]+ \\([0-9]+\\)")
>> +		 (let ((case-fold-search t)
>> +		       (proc (assq 'comm
>> +				   (system-process-attributes
>> +				    (string-to-number (match-string 1))))))
>> +		   (and proc
>> +			(string-match-p "emacs" (cdr proc))))))
>> (delete-process
>> (make-network-process
>> 

> Does anyone see any problems with this change?  If not, I suggest to
> install it.

Shouldn't it try to actually connect to the socket (in the
server-use-tcp case), to find out if the server is functional?
That would also be consistent with the behaviour for local sockets.

Ulrich




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

* Re: error in server-running-p on M$
  2008-11-22 14:13             ` Ulrich Mueller
@ 2008-11-22 14:17               ` Juanma Barranquero
  2008-11-22 14:29                 ` Ulrich Mueller
  2008-11-23  4:02                 ` error in server-running-p on M$ Stefan Monnier
  2008-11-23  3:58               ` Stefan Monnier
  1 sibling, 2 replies; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-22 14:17 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: Eli Zaretskii, emacs-devel

On Sat, Nov 22, 2008 at 15:13, Ulrich Mueller <ulm@kph.uni-mainz.de> wrote:

> Shouldn't it try to actually connect to the socket (in the
> server-use-tcp case), to find out if the server is functional?
> That would also be consistent with the behaviour for local sockets.

The idea is to run a simple test, that does not have the risk of
incurring in a timeout.

Also, if the server authentication file says that Emacs process PID is
using port P, and there's really an Emacs of pid PID but it is no
longer answering to requests on port P, that is PID's problem, not the
current instance's.

  Juanma




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

* Re: error in server-running-p on M$
  2008-11-22 14:17               ` Juanma Barranquero
@ 2008-11-22 14:29                 ` Ulrich Mueller
  2008-11-22 14:36                   ` Juanma Barranquero
  2008-11-23  4:02                 ` error in server-running-p on M$ Stefan Monnier
  1 sibling, 1 reply; 58+ messages in thread
From: Ulrich Mueller @ 2008-11-22 14:29 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, emacs-devel

>>>>> On Sat, 22 Nov 2008, Juanma Barranquero wrote:

>> Shouldn't it try to actually connect to the socket (in the
>> server-use-tcp case), to find out if the server is functional?
>> That would also be consistent with the behaviour for local sockets.

> The idea is to run a simple test, that does not have the risk of
> incurring in a timeout.

This doesn't catch all cases. For example, the server process could be
running on a remote machine, with the port tunnelled over ssh.

> Also, if the server authentication file says that Emacs process PID is
> using port P, and there's really an Emacs of pid PID but it is no
> longer answering to requests on port P, that is PID's problem, not the
> current instance's.

I think that the false positives are not the problem, but the false
negatives (i.e. port is in use, but server-running-p returns nil) are.

Ulrich




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

* Re: error in server-running-p on M$
  2008-11-22 14:29                 ` Ulrich Mueller
@ 2008-11-22 14:36                   ` Juanma Barranquero
  2008-11-22 15:35                     ` Ulrich Mueller
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-22 14:36 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: Eli Zaretskii, emacs-devel

On Sat, Nov 22, 2008 at 15:29, Ulrich Mueller <ulm@kph.uni-mainz.de> wrote:

> This doesn't catch all cases.

Of course it doesn't.

> I think that the false positives are not the problem, but the false
> negatives (i.e. port is in use, but server-running-p returns nil) are.

Ports are assigned at random. The new instance is not going to reuse
the port in the authentication file; we're starting the server with
:server t.

  Juanma




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

* Re: error in server-running-p on M$
  2008-11-22 14:36                   ` Juanma Barranquero
@ 2008-11-22 15:35                     ` Ulrich Mueller
  2008-11-22 16:04                       ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: Ulrich Mueller @ 2008-11-22 15:35 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, emacs-devel

>>>>> On Sat, 22 Nov 2008, Juanma Barranquero wrote:

>> I think that the false positives are not the problem, but the false
>> negatives (i.e. port is in use, but server-running-p returns nil)
>> are.

> Ports are assigned at random. The new instance is not going to reuse
> the port in the authentication file; we're starting the server with
> :server t.

As an example: The auth file is on an NFS mounted filesystem, and the
Emacs server is running on the machine of the NFS server. How would
assigning a random port number help here?

With the proposed test, server-running-p will return nil in this case,
since it will find an auth file but no associated Emacs process.

Ulrich




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

* Re: error in server-running-p on M$
  2008-11-22 15:35                     ` Ulrich Mueller
@ 2008-11-22 16:04                       ` Juanma Barranquero
  2008-11-22 16:52                         ` Ulrich Mueller
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-22 16:04 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: Eli Zaretskii, emacs-devel

On Sat, Nov 22, 2008 at 16:35, Ulrich Mueller <ulm@kph.uni-mainz.de> wrote:

> As an example: The auth file is on an NFS mounted filesystem, and the
> Emacs server is running on the machine of the NFS server.

You're approaching my original question: what is the intended use of
`server-running-p', and how do we want it to work when different
instances of Emacs use different server setups. Of course there is no
problem in having several servers, even on the same machine. The
problem is one hiding the other.

For your case to be a problem, you must be starting a server in the
local machine set up such its authentication file clobbers the one on
the NFS server. That is one instance of the problem I discussed, but
you don't need such a complicate setup. Just start a local TCP server,
and then another with the same server name. Lo, you just rendered the
first one inaccessible.

> How would assigning a random port number help here?

> With the proposed test, server-running-p will return nil in this case,
> since it will find an auth file but no associated Emacs process.

It only will do that if the current, local server is trying to write
an authentication file in the NFS server. Else, it won't even *find*
the authentication file, so it will write its own, and start a new,
local server with a random port that won't collide with the NFS
server's Emacs server.

Still, the point is, either we try to do a complicate,
potentially-network-delaying check, or we opt for a simple,
not-totally-reliable check. I don't mind one way or the other (though
I won't be writing the complex one), but we should bear in mind that
even if the check fails, consequences are hardly catastrophic.
Currently we don't even check, just clobber the auth file. So any
partial fix is a net benefit, as long as we rename the function and/or
write a clear docstring stating that it cannot be assumed to be a
reliable indicator of the presence of another Emacs instance.

             Juanma




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

* Re: error in server-running-p on M$
  2008-11-22 16:04                       ` Juanma Barranquero
@ 2008-11-22 16:52                         ` Ulrich Mueller
  2008-11-22 21:47                           ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: Ulrich Mueller @ 2008-11-22 16:52 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, emacs-devel

>>>>> On Sat, 22 Nov 2008, Juanma Barranquero wrote:

>> With the proposed test, server-running-p will return nil in this case,
>> since it will find an auth file but no associated Emacs process.

> It only will do that if the current, local server is trying to write
> an authentication file in the NFS server.

If you assume that the user's home directory is NFS mounted, then this
is the normal case.

> Still, the point is, either we try to do a complicate,
> potentially-network-delaying check, or we opt for a simple,
> not-totally-reliable check.

Yeah, I see the problem that one wouldn't like to have network
timeouts here ...

> I don't mind one way or the other (though I won't be writing the
> complex one), but we should bear in mind that even if the check
> fails, consequences are hardly catastrophic. Currently we don't even
> check, just clobber the auth file. So any partial fix is a net
> benefit, as long as we rename the function and/or write a clear
> docstring stating that it cannot be assumed to be a reliable
> indicator of the presence of another Emacs instance.

Agreed, of course a partial fix is better than not checking at all.
And I would vote against renaming the function, since I think its
intention is to find out if a server is running. Even if the
implementation (at the time being?) uses some heuristic that doesn't
cover 100% of all cases.

Another question, is the plan now to call server-running-p from
server-start (and refuse to start if it is returning non-nil)?

Ulrich




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

* Re: error in server-running-p on M$
  2008-11-22 16:52                         ` Ulrich Mueller
@ 2008-11-22 21:47                           ` Juanma Barranquero
  2008-11-23  3:56                             ` dhruva
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-22 21:47 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: Eli Zaretskii, emacs-devel

On Sat, Nov 22, 2008 at 17:52, Ulrich Mueller <ulm@kph.uni-mainz.de> wrote:

> If you assume that the user's home directory is NFS mounted, then this
> is the normal case.

It would be the normal case that the user, on the local machine, would
have the home directory in a NFS server, and at the same time, there
would be an Emacs on the NFS server using an authentication file on
the user's home directory? (That's the case you mentioned before, if I
understand it correctly.) If that really happens, that should be fixed
at another level...

> Agreed, of course a partial fix is better than not checking at all.

OK.

> And I would vote against renaming the function, since I think its
> intention is to find out if a server is running.

I don't really care, as long as the user isn't mislead. But I'm not
sure the intention of the function is know whether a server is
running; more like a helper to avoid two or more Emacs to trample one
onto another, I think.

> Another question, is the plan now to call server-running-p from
> server-start (and refuse to start if it is returning non-nil)?

That's what Stefan said: "Another option is for server-start to try
and detect that there's already an active socket (using
server-running-p) and refuse to start."

             Juanma




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

* Re: error in server-running-p on M$
  2008-11-22 21:47                           ` Juanma Barranquero
@ 2008-11-23  3:56                             ` dhruva
  2008-11-23  3:59                               ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: dhruva @ 2008-11-23  3:56 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

Hi,

On Sun, Nov 23, 2008 at 3:17 AM, Juanma Barranquero <lekktu@gmail.com> wrote:
> On Sat, Nov 22, 2008 at 17:52, Ulrich Mueller <ulm@kph.uni-mainz.de> wrote:
>
>> If you assume that the user's home directory is NFS mounted, then this
>> is the normal case.
>
> It would be the normal case that the user, on the local machine, would
> have the home directory in a NFS server, and at the same time, there
> would be an Emacs on the NFS server using an authentication file on
> the user's home directory? (That's the case you mentioned before, if I
> understand it correctly.) If that really happens, that should be fixed
> at another level...

How about storing the machine IP address and the port in the file for
each successful emacs server instance. The file name itself can be
machine IP DOT port. This will handle the case of NFS mounted home
folders.
Another option, how about having a user defined fixed port for running
emacs server. This might lead to a DOS attack but the port is defined
by the user and hence not something that can be guessed easily.

-dhruva

-- 
Contents reflect my personal views only!




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

* Re: error in server-running-p on M$
  2008-11-22 14:13             ` Ulrich Mueller
  2008-11-22 14:17               ` Juanma Barranquero
@ 2008-11-23  3:58               ` Stefan Monnier
  1 sibling, 0 replies; 58+ messages in thread
From: Stefan Monnier @ 2008-11-23  3:58 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: Juanma Barranquero, Eli Zaretskii, emacs-devel

> Shouldn't it try to actually connect to the socket (in the
> server-use-tcp case), to find out if the server is functional?
> That would also be consistent with the behaviour for local sockets.

Yes, I think so.  It's the whole point of restricting it to 127.0.0.1
(so that trying to connect to it doesn't risk suffering a timeout).


        Stefan





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

* Re: error in server-running-p on M$
  2008-11-23  3:56                             ` dhruva
@ 2008-11-23  3:59                               ` Juanma Barranquero
  2008-11-23  4:01                                 ` dhruva
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-23  3:59 UTC (permalink / raw)
  To: dhruva; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

On Sun, Nov 23, 2008 at 04:56, dhruva <dhruvakm@gmail.com> wrote:

> How about storing the machine IP address and the port in the file for
> each successful emacs server instance. The file name itself can be
> machine IP DOT port. This will handle the case of NFS mounted home
> folders.

I don't understand. What do you gain with this? How does emacsclient
know with which instance must connect?

> Another option, how about having a user defined fixed port for running
> emacs server. This might lead to a DOS attack but the port is defined
> by the user and hence not something that can be guessed easily.

That was explicitly rejected while designing the TCP support for
emacsclient/server.

  Juanma




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

* Re: error in server-running-p on M$
  2008-11-22 13:37         ` Juanma Barranquero
  2008-11-22 13:53           ` Eli Zaretskii
@ 2008-11-23  3:59           ` Stefan Monnier
  2008-11-23  4:12             ` Juanma Barranquero
  1 sibling, 1 reply; 58+ messages in thread
From: Stefan Monnier @ 2008-11-23  3:59 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, emacs-devel

> It does not detect (even now, for local sockets) whether another
> instance is running; it only detects whether another instance is
> running _with_the_same_server_setup_ (presumably because the intention
> is not disturbing it).

All of the server-* functions take server-name as an implicit argument
(that's what a global variable is, after all).
server-running-p is no exception and is not special in this respect.


        Stefan




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

* Re: error in server-running-p on M$
  2008-11-23  3:59                               ` Juanma Barranquero
@ 2008-11-23  4:01                                 ` dhruva
  2008-11-23  4:03                                   ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: dhruva @ 2008-11-23  4:01 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

Hi,

On Sun, Nov 23, 2008 at 9:29 AM, Juanma Barranquero <lekktu@gmail.com> wrote:
> On Sun, Nov 23, 2008 at 04:56, dhruva <dhruvakm@gmail.com> wrote:
>
>> How about storing the machine IP address and the port in the file for
>> each successful emacs server instance. The file name itself can be
>> machine IP DOT port. This will handle the case of NFS mounted home
>> folders.
>
> I don't understand. What do you gain with this? How does emacsclient
> know with which instance must connect?

The host on which emacsclient is executed will look for a file with
the machine's IP. If the file exists, it picks the port from the file
extension part.

-dhruva

-- 
Contents reflect my personal views only!




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

* Re: error in server-running-p on M$
  2008-11-22 14:17               ` Juanma Barranquero
  2008-11-22 14:29                 ` Ulrich Mueller
@ 2008-11-23  4:02                 ` Stefan Monnier
  2008-11-23  4:10                   ` Juanma Barranquero
  1 sibling, 1 reply; 58+ messages in thread
From: Stefan Monnier @ 2008-11-23  4:02 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

> Also, if the server authentication file says that Emacs process PID is
> using port P, and there's really an Emacs of pid PID but it is no
> longer answering to requests on port P, that is PID's problem, not the
> current instance's.

I prefer determining the liveness of the server by connecting to the
port rather than by looking at the list of running processes.

But, yes, it's true that there's a risk that the server died a while ago
and port P got reassigned in the mean time to something
completely different.  Hmmm.... so maybe it's better to check the PID is
still live :-( ?

        Stefan




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

* Re: error in server-running-p on M$
  2008-11-23  4:01                                 ` dhruva
@ 2008-11-23  4:03                                   ` Juanma Barranquero
  2008-11-23  4:10                                     ` dhruva
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-23  4:03 UTC (permalink / raw)
  To: dhruva; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

On Sun, Nov 23, 2008 at 05:01, dhruva <dhruvakm@gmail.com> wrote:

> The host on which emacsclient is executed will look for a file with
> the machine's IP. If the file exists, it picks the port from the file
> extension part.

Why do you suppose that when I run emacsclient on machine A I want to
connect to an Emacs server running on A with preference to another
running on B?

  Juanma




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

* Re: error in server-running-p on M$
  2008-11-23  4:02                 ` error in server-running-p on M$ Stefan Monnier
@ 2008-11-23  4:10                   ` Juanma Barranquero
  2008-11-23  5:21                     ` Stefan Monnier
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-23  4:10 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

On Sun, Nov 23, 2008 at 05:02, Stefan Monnier <monnier@iro.umontreal.ca> wrote:

> But, yes, it's true that there's a risk that the server died a while ago
> and port P got reassigned in the mean time to something
> completely different.  Hmmm.... so maybe it's better to check the PID is
> still live :-( ?

Not just that, but, if Emacs instance 1 is really running, why do we
want to check from instance 2? To be sure that instance 1 still has a
valid server accessible from emacsclient, or to avoid clobbering 1's
auth file? IMHO, it's no business of 2 to verify that 1 is still
answering, but just to be sure that it is not it, 2, the one
responsible of leaving 1 incommunicado.

  Juanma




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

* Re: error in server-running-p on M$
  2008-11-23  4:03                                   ` Juanma Barranquero
@ 2008-11-23  4:10                                     ` dhruva
  2008-11-23  4:15                                       ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: dhruva @ 2008-11-23  4:10 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

On Sun, Nov 23, 2008 at 9:33 AM, Juanma Barranquero <lekktu@gmail.com> wrote:
> On Sun, Nov 23, 2008 at 05:01, dhruva <dhruvakm@gmail.com> wrote:
>
>> The host on which emacsclient is executed will look for a file with
>> the machine's IP. If the file exists, it picks the port from the file
>> extension part.
>
> Why do you suppose that when I run emacsclient on machine A I want to
> connect to an Emacs server running on A with preference to another
> running on B?

emacsclient needs to use the '-f' option if it wants to use a specific
server. An automatic fallback would be to use local IP or local
machine IP. Does current emacs support running server that can accept
remote connections?

-dhruva

-- 
Contents reflect my personal views only!




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

* Re: error in server-running-p on M$
  2008-11-23  3:59           ` Stefan Monnier
@ 2008-11-23  4:12             ` Juanma Barranquero
  2008-11-23  5:19               ` Stefan Monnier
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-23  4:12 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, emacs-devel

> All of the server-* functions take server-name as an implicit argument
> (that's what a global variable is, after all).
> server-running-p is no exception and is not special in this respect.

I'm not sure that contradicts what I'm saying: that Emacs, when run
twice with the same setup, clobbers the auth file. Of course if the
user takes care of passing the right server-name he can make it all
work fine.

             Juanma




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

* Re: error in server-running-p on M$
  2008-11-23  4:10                                     ` dhruva
@ 2008-11-23  4:15                                       ` Juanma Barranquero
  2008-11-23  4:17                                         ` dhruva
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-23  4:15 UTC (permalink / raw)
  To: dhruva; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

On Sun, Nov 23, 2008 at 05:10, dhruva <dhruvakm@gmail.com> wrote:

> emacsclient needs to use the '-f' option if it wants to use a specific
> server.

Yes, unless the server is called "server" and the server
authentication file is at its default location, ~/.emacs.d/server/

> An automatic fallback would be to use local IP or local
> machine IP.

That "automatic fallback" is the one above: defaulting to "server".

> Does current emacs support running server that can accept
> remote connections?

  server-host is a variable defined in `server.el'.
  Its value is nil

  Documentation:
  The name or IP address to use as host address of the server process.
  If set, the server accepts remote connections; otherwise it is local.

Juanma




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

* Re: error in server-running-p on M$
  2008-11-23  4:15                                       ` Juanma Barranquero
@ 2008-11-23  4:17                                         ` dhruva
  2008-11-23  4:19                                           ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: dhruva @ 2008-11-23  4:17 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

Hi,

On Sun, Nov 23, 2008 at 9:45 AM, Juanma Barranquero <lekktu@gmail.com> wrote:
> On Sun, Nov 23, 2008 at 05:10, dhruva <dhruvakm@gmail.com> wrote:
>  server-host is a variable defined in `server.el'.
>  Its value is nil
>
>  Documentation:
>  The name or IP address to use as host address of the server process.
>  If set, the server accepts remote connections; otherwise it is local.

Thanks, I should have read the doc first before asking and I apologize
for that, just after sending the mail, I saw the server.el and
realized. Let me explore further if there is a simpler way to handle
this.

-dhruva

-- 
Contents reflect my personal views only!




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

* Re: error in server-running-p on M$
  2008-11-23  4:17                                         ` dhruva
@ 2008-11-23  4:19                                           ` Juanma Barranquero
  2008-11-23  8:14                                             ` Server protocol (was: Re: error in server-running-p on M$) Ulrich Mueller
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-23  4:19 UTC (permalink / raw)
  To: dhruva; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

On Sun, Nov 23, 2008 at 05:17, dhruva <dhruvakm@gmail.com> wrote:

> Let me explore further if there is a simpler way to handle this.

If you want to propose changes to the way the TCP connections and
authentication files are used, please do it in a way compatible with
22.X...

  Juanma




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

* Re: error in server-running-p on M$
  2008-11-23  4:12             ` Juanma Barranquero
@ 2008-11-23  5:19               ` Stefan Monnier
  0 siblings, 0 replies; 58+ messages in thread
From: Stefan Monnier @ 2008-11-23  5:19 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, emacs-devel

> I'm not sure that contradicts what I'm saying: that Emacs, when run
> twice with the same setup, clobbers the auth file. Of course if the

Assuming that server-start is changed to signal an error if
server-running-p returns non-nil, could you show us again the scenario
where the auth file is clobbered and in what way it's clobbered?


        Stefan




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

* Re: error in server-running-p on M$
  2008-11-23  4:10                   ` Juanma Barranquero
@ 2008-11-23  5:21                     ` Stefan Monnier
  2008-11-23  5:32                       ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: Stefan Monnier @ 2008-11-23  5:21 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

> Not just that, but, if Emacs instance 1 is really running, why do we
> want to check from instance 2? To be sure that instance 1 still has a
> valid server accessible from emacsclient, or to avoid clobbering 1's
> auth file?

To avoid clobbering 1's auth file.


        Stefan




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

* Re: error in server-running-p on M$
  2008-11-23  5:21                     ` Stefan Monnier
@ 2008-11-23  5:32                       ` Juanma Barranquero
  2008-11-23  5:57                         ` Stefan Monnier
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-23  5:32 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

On Sun, Nov 23, 2008 at 06:21, Stefan Monnier <monnier@iro.umontreal.ca> wrote:

> To avoid clobbering 1's auth file.

Then, it is not really necessary to connect with 1's server. Just the
fact that there's a local Emacs with the same PID that the one saved
in the authentication file, and acting as a local server, should be
reason enough for 2 to refuse overwriting the auth file.

> Assuming that server-start is changed to signal an error if
> server-running-p returns non-nil, could you show us again the scenario
> where the auth file is clobbered and in what way it's clobbered?

No, I've never claimed that. If server-start signals an error when
`server-running-p' returns non-nil, the auth file won't be clobbered.
(At least, in normal configurations; I'm not sure that is impossible
for some combination of non local servers, remote home user
directories, etc. That's left as an exercise for the people who
usually works in such environments ;-)

But we're trying to fix the easy, common problem first, aren't we?

             Juanma




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

* Re: error in server-running-p on M$
  2008-11-23  5:32                       ` Juanma Barranquero
@ 2008-11-23  5:57                         ` Stefan Monnier
  2008-11-23 11:26                           ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: Stefan Monnier @ 2008-11-23  5:57 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

>> To avoid clobbering 1's auth file.
> Then, it is not really necessary to connect with 1's server. Just the
> fact that there's a local Emacs with the same PID that the one saved
> in the authentication file, and acting as a local server, should be
> reason enough for 2 to refuse overwriting the auth file.

As explained earlier, I thought it would be better to try and connect
than to try and check the PID, but I now think you're right: checking
the PID is probably a simpler solution (at least if stopping the server
properly removes the entry from the file).

>> Assuming that server-start is changed to signal an error if
>> server-running-p returns non-nil, could you show us again the scenario
>> where the auth file is clobbered and in what way it's clobbered?
> No, I've never claimed that.

Great.


        Stefan




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

* Server protocol (was: Re: error in server-running-p on M$)
  2008-11-23  4:19                                           ` Juanma Barranquero
@ 2008-11-23  8:14                                             ` Ulrich Mueller
  2008-11-23 11:33                                               ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: Ulrich Mueller @ 2008-11-23  8:14 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, emacs-devel

>>>>> On Sun, 23 Nov 2008, Juanma Barranquero wrote:

>> Let me explore further if there is a simpler way to handle this.

> If you want to propose changes to the way the TCP connections and
> authentication files are used, please do it in a way compatible with
> 22.X...

It is incompatible already:

Client 22 connecting to server 23:

   $ emacsclient-emacs-22 foo
   Waiting for Emacs...
   -error Unknown&_command:&_/local/home/ulm/foo

Client 23 connecting to server 22:

   $ emacsclient-emacs-23 foo
   Waiting for Emacs...
   *ERROR*: Unknown message: Authentication failed

The above is with TCP. With Unix sockets it is much worse, because
the connection succeeds but the information sent by the client is
misinterpreted by the server, resulting in several garbage buffers
(the following is for client 23 connecting to server 22):

,----
| CRM Buffer                Size  Mode              File
| .%  -current-frame           0  Fundamental       /dev/pts/-current-frame
|     *scratch*                0  Lisp Interaction
|   * *Messages*             302  Fundamental
|     foo                      6  Fundamental       ~/foo
|     -file                    0  Fundamental       ~/-file
|     xterm                    0  Fundamental       ~/xterm
|  %  2                        0  Fundamental       /dev/pts/2
|  %  -tty                     0  Fundamental       /dev/pts/-tty
`----

This makes me wonder if the client shouldn't send some token
identifying the protocol version, which would be checked by the
server.

Ulrich




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

* Re: error in server-running-p on M$
  2008-11-23  5:57                         ` Stefan Monnier
@ 2008-11-23 11:26                           ` Juanma Barranquero
  2008-11-23 12:46                             ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-23 11:26 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

On Sun, Nov 23, 2008 at 06:57, Stefan Monnier <monnier@iro.umontreal.ca> wrote:

> but I now think you're right: checking
> the PID is probably a simpler solution (at least if stopping the server
> properly removes the entry from the file).

Stopping the server removes the file.

  Juanma




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

* Re: Server protocol (was: Re: error in server-running-p on M$)
  2008-11-23  8:14                                             ` Server protocol (was: Re: error in server-running-p on M$) Ulrich Mueller
@ 2008-11-23 11:33                                               ` Juanma Barranquero
  2008-11-23 16:33                                                 ` dhruva
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-23 11:33 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: Eli Zaretskii, emacs-devel

On Sun, Nov 23, 2008 at 09:14, Ulrich Mueller <ulm@kph.uni-mainz.de> wrote:

> It is incompatible already:

Yes, unfortunately. The multi-tty code changed emacsclient's protocol
considerably.

I was talking about the user perspective. I have, for example, a bunch
of code that depends on the server auth file and its relation with
server-name. That would be invalidated if suddenly we switched to
other kind of authentication method. Not the end of the world, but
there should be clear benefits before doing that.

> This makes me wonder if the client shouldn't send some token
> identifying the protocol version, which would be checked by the
> server.

Perhaps.

             Juanma




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

* Re: error in server-running-p on M$
  2008-11-23 11:26                           ` Juanma Barranquero
@ 2008-11-23 12:46                             ` Juanma Barranquero
  2008-11-23 13:13                               ` Ulrich Mueller
  2008-11-24  2:55                               ` Stefan Monnier
  0 siblings, 2 replies; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-23 12:46 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

On Sun, Nov 23, 2008 at 12:26, Juanma Barranquero <lekktu@gmail.com> wrote:

> Stopping the server removes the file.

Ah, no, it doesn't, because IIRC you opposed to it:

  ;; Delete the associated connection file, if applicable.
  ;; This is actually problematic: the file may have been overwritten by
  ;; another Emacs server in the mean time, so it's not ours any more.
  ;; (and (process-contact proc :server)
  ;;      (eq (process-status proc) 'closed)
  ;;      (ignore-errors (delete-file (process-get proc :server-file))))

I was mistaken because my .emacs includes code to delete it.

But it *should* be deleted.

  Juanma




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

* Re: error in server-running-p on M$
  2008-11-23 12:46                             ` Juanma Barranquero
@ 2008-11-23 13:13                               ` Ulrich Mueller
  2008-11-24  2:55                               ` Stefan Monnier
  1 sibling, 0 replies; 58+ messages in thread
From: Ulrich Mueller @ 2008-11-23 13:13 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel

>>>>> On Sun, 23 Nov 2008, Juanma Barranquero wrote:

>> Stopping the server removes the file.

> Ah, no, it doesn't, because IIRC you opposed to it:

>   ;; Delete the associated connection file, if applicable.
>   ;; This is actually problematic: the file may have been overwritten by
>   ;; another Emacs server in the mean time, so it's not ours any more.
>   ;; (and (process-contact proc :server)
>   ;;      (eq (process-status proc) 'closed)
>   ;;      (ignore-errors (delete-file (process-get proc :server-file))))

Read the file back and only delete it if it contains our own process
id? Of course there is a race condition ...

Ulrich




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

* Re: Server protocol (was: Re: error in server-running-p on M$)
  2008-11-23 11:33                                               ` Juanma Barranquero
@ 2008-11-23 16:33                                                 ` dhruva
  2008-11-23 17:48                                                   ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: dhruva @ 2008-11-23 16:33 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

Hi,

On Sun, Nov 23, 2008 at 5:03 PM, Juanma Barranquero <lekktu@gmail.com> wrote:
> On Sun, Nov 23, 2008 at 09:14, Ulrich Mueller <ulm@kph.uni-mainz.de> wrote:
>
>> It is incompatible already:
>
> Yes, unfortunately. The multi-tty code changed emacsclient's protocol
> considerably.

Would daemon option replace the need for server mode from the
functionality perspective or there is nothing related between them?
 The only reason I use server mode is to open files in a single
running instance of emacs. I can do the same using daemon option on
non M$ platform though.

-dhruva

-- 
Contents reflect my personal views only!




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

* Re: Server protocol (was: Re: error in server-running-p on M$)
  2008-11-23 16:33                                                 ` dhruva
@ 2008-11-23 17:48                                                   ` Juanma Barranquero
  0 siblings, 0 replies; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-23 17:48 UTC (permalink / raw)
  To: dhruva; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

On Sun, Nov 23, 2008 at 17:33, dhruva <dhruvakm@gmail.com> wrote:

> Would daemon option replace the need for server mode from the
> functionality perspective or there is nothing related between them?

The daemon option *uses* server.el / emacsclient. And it is perfectly
reasonable to use server/emacsclient even if you're not interested in
having a daemonized Emacs.

             Juanma




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

* Re: error in server-running-p on M$
  2008-11-23 12:46                             ` Juanma Barranquero
  2008-11-23 13:13                               ` Ulrich Mueller
@ 2008-11-24  2:55                               ` Stefan Monnier
  2008-11-24 14:46                                 ` Juanma Barranquero
  1 sibling, 1 reply; 58+ messages in thread
From: Stefan Monnier @ 2008-11-24  2:55 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

>> Stopping the server removes the file.
> Ah, no, it doesn't, because IIRC you opposed to it:

>   ;; Delete the associated connection file, if applicable.
>   ;; This is actually problematic: the file may have been overwritten by
>   ;; another Emacs server in the mean time, so it's not ours any more.

That's OK: when we add server-running-p to server-start this objection
will disappear so we can change the code at the same time to remove the
entry when stopping the server.


        Stefan




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

* Re: error in server-running-p on M$
  2008-11-24  2:55                               ` Stefan Monnier
@ 2008-11-24 14:46                                 ` Juanma Barranquero
  2008-11-24 15:10                                   ` Ulrich Mueller
  2008-12-09 20:46                                   ` Stefan Monnier
  0 siblings, 2 replies; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-24 14:46 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

On Mon, Nov 24, 2008 at 03:55, Stefan Monnier <monnier@iro.umontreal.ca> wrote:

> That's OK: when we add server-running-p to server-start this objection
> will disappear so we can change the code at the same time to remove the
> entry when stopping the server.

WDYT about the following patch?

  Juanma



2008-11-24  Juanma Barranquero  <lekktu@gmail.com>

	* server.el (server-sentinel): Uncomment code to delete connection file.
	(server-running-p): Return t for TCP servers if the auth file says
	there's a local server and we find an Emacs process with the right PID.
	Doc fix.
	(server-start): Save the connection file in the process' property list.
	Delete it only when we are reasonably convinced that it is not owned by
	a running server.


Index: lisp/server.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/server.el,v
retrieving revision 1.175
diff -u -2 -b -r1.175 server.el
--- lisp/server.el	18 Nov 2008 16:27:09 -0000	1.175
+++ lisp/server.el	24 Nov 2008 14:40:52 -0000
@@ -326,9 +326,7 @@
     (set-process-query-on-exit-flag proc nil))
   ;; Delete the associated connection file, if applicable.
-  ;; This is actually problematic: the file may have been overwritten by
-  ;; another Emacs server in the mean time, so it's not ours any more.
-  ;; (and (process-contact proc :server)
-  ;;      (eq (process-status proc) 'closed)
-  ;;      (ignore-errors (delete-file (process-get proc :server-file))))
+  (and (process-contact proc :server)
+       (eq (process-status proc) 'closed)
+       (ignore-errors (delete-file (process-get proc :server-file))))
   (server-log (format "Status changed to %s: %s" (process-status
proc) msg) proc)
   (server-delete-client proc))
@@ -465,12 +463,14 @@
 	 (yes-or-no-p
 	  "The current server still has clients; delete them? "))
+    (let* ((server-dir (if server-use-tcp server-auth-dir server-socket-dir))
+	   (server-file (expand-file-name server-name server-dir)))
     (when server-process
       ;; kill it dead!
       (ignore-errors (delete-process server-process)))
     ;; Delete the socket files made by previous server invocations.
-    (when server-socket-dir
-      (condition-case ()
-	  (delete-file (expand-file-name server-name server-socket-dir))
-	(error nil)))
+      (if (not (server-running-p server-name))
+	  (ignore-errors (delete-file server-file))
+	(setq server-mode nil)  ;; already set by the minor mode code
+	(error "Server %S is already running" server-name))
     ;; If this Emacs already had a server, clear out associated status.
     (while server-clients
@@ -481,6 +481,4 @@
 	  (server-log (message "Server stopped"))
 	  (setq server-process nil))
-      (let* ((server-dir (if server-use-tcp server-auth-dir server-socket-dir))
-	     (server-file (expand-file-name server-name server-dir)))
 	;; Make sure there is a safe directory in which to place the socket.
 	(server-ensure-safe-dir server-dir)
@@ -517,4 +515,5 @@
 			       :plist '(:authenticated t)))))
 	  (unless server-process (error "Could not start server process"))
+	  (process-put server-process :server-file server-file)
 	  (when server-use-tcp
 	    (let ((auth-key
@@ -535,5 +534,7 @@

 (defun server-running-p (&optional name)
-  "Test whether server NAME is running."
+  "Test whether server NAME is running.
+NOTE: This function is intended to be called from `server-start'
+and it is NOT 100% reliable."
   (interactive
    (list (if current-prefix-arg
@@ -541,5 +542,15 @@
   (unless name (setq name server-name))
   (condition-case nil
-      (progn
+      (if server-use-tcp
+	  (with-temp-buffer
+	    (insert-file-contents-literally
+	     (expand-file-name name server-auth-dir))
+	    (and (looking-at "127\.0\.0\.1:[0-9]+ \\([0-9]+\\)")
+		 (let ((case-fold-search t)
+		       (proc (assq 'comm
+				   (system-process-attributes
+				    (string-to-number (match-string 1))))))
+		   (and proc
+			(string-match-p "emacs" (cdr proc))))))
 	(delete-process
 	 (make-network-process




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

* Re: error in server-running-p on M$
  2008-11-24 14:46                                 ` Juanma Barranquero
@ 2008-11-24 15:10                                   ` Ulrich Mueller
  2008-11-24 15:16                                     ` Juanma Barranquero
  2008-12-09 20:46                                   ` Stefan Monnier
  1 sibling, 1 reply; 58+ messages in thread
From: Ulrich Mueller @ 2008-11-24 15:10 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel

>>>>> On Mon, 24 Nov 2008, Juanma Barranquero wrote:

> WDYT about the following patch?

> +      (if (not (server-running-p server-name))
> +          (ignore-errors (delete-file server-file))
> +        (setq server-mode nil)  ;; already set by the minor mode code
> +        (error "Server %S is already running" server-name))

Instead of a hard error, maybe you could add a yes-or-no-p
confirmation here? Or an additional (prefix?) argument to override the
test, since we know that server-running-p is not 100% reliable.

Ulrich




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

* Re: error in server-running-p on M$
  2008-11-24 15:10                                   ` Ulrich Mueller
@ 2008-11-24 15:16                                     ` Juanma Barranquero
  2008-11-24 15:34                                       ` Ulrich Mueller
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-24 15:16 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel

On Mon, Nov 24, 2008 at 16:10, Ulrich Mueller <ulm@kph.uni-mainz.de> wrote:

> Instead of a hard error, maybe you could add a yes-or-no-p
> confirmation here?

No objection here.

> Or an additional (prefix?) argument to override the
> test, since we know that server-running-p is not 100% reliable.

For server-start, you mean? It already has a prefix arg (as does
server-mode, obviously).

  Juanma




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

* Re: error in server-running-p on M$
  2008-11-24 15:16                                     ` Juanma Barranquero
@ 2008-11-24 15:34                                       ` Ulrich Mueller
  2008-11-24 15:45                                         ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: Ulrich Mueller @ 2008-11-24 15:34 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel

>>>>> On Mon, 24 Nov 2008, Juanma Barranquero wrote:

>> Instead of a hard error, maybe you could add a yes-or-no-p
>> confirmation here?

> No objection here.

>> Or an additional (prefix?) argument to override the
>> test, since we know that server-running-p is not 100% reliable.

> For server-start, you mean?

Yes. My thought was that in daemon mode server-start is called
non-interactively, so an interactive confirmation is useless there.

> It already has a prefix arg (as does server-mode, obviously).

So another optional argument might be needed, with three possible
values for "override", "don't override", "ask for confirmation".

Ulrich




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

* Re: error in server-running-p on M$
  2008-11-24 15:34                                       ` Ulrich Mueller
@ 2008-11-24 15:45                                         ` Juanma Barranquero
  0 siblings, 0 replies; 58+ messages in thread
From: Juanma Barranquero @ 2008-11-24 15:45 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel

On Mon, Nov 24, 2008 at 16:34, Ulrich Mueller <ulm@kph.uni-mainz.de> wrote:

> Yes. My thought was that in daemon mode server-start is called
> non-interactively, so an interactive confirmation is useless there.

That's not a prefix argument, then. You're not going to call
`server-start' or `server-mode' interactively from a daemonized Emacs;
the call happens in startup.el. Perhaps a variable (or defcustom)?

> So another optional argument might be needed, with three possible
> values for "override", "don't override", "ask for confirmation".

I think that's a bit messy.

  Juanma




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

* Re: error in server-running-p on M$
  2008-11-24 14:46                                 ` Juanma Barranquero
  2008-11-24 15:10                                   ` Ulrich Mueller
@ 2008-12-09 20:46                                   ` Stefan Monnier
  2008-12-10  7:05                                     ` Chetan Pandya
  2008-12-10 12:59                                     ` Juanma Barranquero
  1 sibling, 2 replies; 58+ messages in thread
From: Stefan Monnier @ 2008-12-09 20:46 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

> WDYT about the following patch?

Looks good, tho see comment below.

>    ;; Delete the associated connection file, if applicable.
> -  ;; This is actually problematic: the file may have been overwritten by
> -  ;; another Emacs server in the mean time, so it's not ours any more.
> -  ;; (and (process-contact proc :server)
> -  ;;      (eq (process-status proc) 'closed)
> -  ;;      (ignore-errors (delete-file (process-get proc :server-file))))
> +  (and (process-contact proc :server)
> +       (eq (process-status proc) 'closed)
> +       (ignore-errors (delete-file (process-get proc :server-file))))
>    (server-log (format "Status changed to %s: %s" (process-status

It would be good to keep some comment about the fact that we don't know
for sure that the file is ours.

> +      (if (not (server-running-p server-name))
> +	  (ignore-errors (delete-file server-file))
> +	(setq server-mode nil)  ;; already set by the minor mode code
> +	(error "Server %S is already running" server-name))

As Ulrich points out, we should make sure that we can always somehow
start a server.

> -  "Test whether server NAME is running."
> +  "Test whether server NAME is running.
> +NOTE: This function is intended to be called from `server-start'
> +and it is NOT 100% reliable."

Just saying it's unreliable is not sufficient.  We need to give some
guarantee about what kind of incorrect result we may get.  E.g. it could
return t, nil, or `not-sure'.
Also we should describe the reason for the unreliability: we prefer
giving an immediate response over risking non-termination.

Finally, for the purpose of server-start, we don't necessarily care if
there is a server named "foo" running on some other machine, so maybe in
the server-use-tcp case, if the IP is not 127.0.0.1, server-running-p
might return a special value like `remote' and server-start might treat
it like "not running" (i.e. it will remove the server-file).


        Stefan




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

* Re: error in server-running-p on M$
  2008-12-09 20:46                                   ` Stefan Monnier
@ 2008-12-10  7:05                                     ` Chetan Pandya
  2008-12-10 12:59                                     ` Juanma Barranquero
  1 sibling, 0 replies; 58+ messages in thread
From: Chetan Pandya @ 2008-12-10  7:05 UTC (permalink / raw)
  To: Juanma Barranquero, Stefan Monnier; +Cc: emacs-devel

I haven't seen earlier messages, but I am glad something is being done here.



--- On Tue, 12/9/08, Stefan Monnier <monnier@IRO.UMontreal.CA> wrote:


> Looks good, tho see comment below.
> 
> > +  (and (process-contact proc :server)
> > +       (eq (process-status proc) 'closed)
> > +       (ignore-errors (delete-file (process-get proc
> :server-file))))
> >    (server-log (format "Status changed to %s:
> %s" (process-status
> 
> It would be good to keep some comment about the fact that we don't know
> for sure that the file is ours.

It isn't too difficult to check that. Here is a version that checks that the file has the same pid.

(let ((server-file (process-get proc :server-file)))
  (with-temp-buffer
    (set-buffer-multibyte nil)
    (insert-file server-file)
    (beginning-of-buffer)
    (end-of-line)
    (skip-chars-backward "0-9")
    (if (eq (read (current-buffer)) (emacs-pid))
	(ignore-errors (delete-file server-file)))))


> > +      (if (not (server-running-p server-name))
> > +	  (ignore-errors (delete-file server-file))
> > +	(setq server-mode nil)  ;; already set by the minor
> mode code
> > +	(error "Server %S is already running"
> server-name))
 
> Finally, for the purpose of server-start, we don't
> necessarily care if
> there is a server named "foo" running on some
> other machine, so maybe in
> the server-use-tcp case, if the IP is not 127.0.0.1,
> server-running-p
> might return a special value like `remote' and
> server-start might treat
> it like "not running" (i.e. it will remove the
> server-file).

It is possible for the IP to be 127.0.0.1 and still the server be running on another system.

Chetan




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

* Re: error in server-running-p on M$
  2008-12-09 20:46                                   ` Stefan Monnier
  2008-12-10  7:05                                     ` Chetan Pandya
@ 2008-12-10 12:59                                     ` Juanma Barranquero
  2008-12-10 18:30                                       ` Stefan Monnier
  1 sibling, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-12-10 12:59 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

On Tue, Dec 9, 2008 at 21:46, Stefan Monnier <monnier@iro.umontreal.ca> wrote:

> As Ulrich points out, we should make sure that we can always somehow
> start a server.

OK, but how do you want to do this? Another argument to server-start?
A configuration variable? What about interactive use?

> [...] E.g. it could
> return t, nil, or `not-sure'.
> [...]
> Finally, for the purpose of server-start, we don't necessarily care if
> there is a server named "foo" running on some other machine, so maybe in
> the server-use-tcp case, if the IP is not 127.0.0.1, server-running-p
> might return a special value like `remote' and server-start might treat
> it like "not running" (i.e. it will remove the server-file).

So you're saying:

 t -> the server file cannot be deleted; there's a running server
 nil -> the server file can be deleted; there's no running server
 remote -> the server file can be deleted; ignore any possible remote TCP server
 not-sure -> ????

This is getting confusing, so let's sort the cases:

 1) local socket, client process works => sure, server -> t
 2) local socket, client process fails => sure, no server -> nil
 3) TCP sockets, no server file => sure, no server -> nil
 4) TCP sockets, not 127.0.0.1 => not sure -> remote
 5) TCP sockets, 127.0.0.1, no process with PID => not sure (could be
shared dir) -> not-sure
 6) TCP sockets, 127.0.0.1, process PID, no "emacs" -> not sure (like
above) -> not-sure
 7) TCP sockets, 127.0.0.1, process PID, "emacs" -> sure (sort of) -> t

Now the `t' cases are clear and safe (don't delete the server file),
and the `nil' ones are too (delete the file, if exists).

You're suggesting that 4 should return `remote' and be treated like
`nil' (delete). But 5 and 6 could also be remote, and they must also
be treated like `nil' (delete), or they won't be useful at all. So,
there's no real distinction between `remote' and `not-sure', and
`remote' does not even carry useful information (we could return
not-sure for some remote servers).

Now, to be really safe, 5) should be not-sure, but delete, and 6)
should be not-sure, and don't delete (because Emacs could be running
with another name).

Thoughts?

    Juanma




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

* Re: error in server-running-p on M$
  2008-12-10 12:59                                     ` Juanma Barranquero
@ 2008-12-10 18:30                                       ` Stefan Monnier
  2008-12-10 18:47                                         ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: Stefan Monnier @ 2008-12-10 18:30 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

>> As Ulrich points out, we should make sure that we can always somehow
>> start a server.
> OK, but how do you want to do this? Another argument to server-start?
> A configuration variable? What about interactive use?

A config var doesn't sound right.  Programmatically, there's no need to
do anything special.  The problem is for interactive use.  I don't have
a good solution to propose just now, we could just say "to force-start
a sever first do M-x server-force-delete and then M-x server-mode".

> This is getting confusing, so let's sort the cases:

>  1) local socket, client process works => sure, server -> t
>  2) local socket, client process fails => sure, no server -> nil
>  3) TCP sockets, no server file => sure, no server -> nil
>  4) TCP sockets, not 127.0.0.1 => not sure -> remote
>  5) TCP sockets, 127.0.0.1, no process with PID => not sure (could be
> shared dir) -> not-sure
>  6) TCP sockets, 127.0.0.1, process PID, no "emacs" -> not sure (like
> above) -> not-sure
>  7) TCP sockets, 127.0.0.1, process PID, "emacs" -> sure (sort of) -> t

> Now the `t' cases are clear and safe (don't delete the server file),
> and the `nil' ones are too (delete the file, if exists).

> You're suggesting that 4 should return `remote' and be treated like
> `nil' (delete). But 5 and 6 could also be remote, and they must also
> be treated like `nil' (delete), or they won't be useful at all. So,
> there's no real distinction between `remote' and `not-sure', and
> `remote' does not even carry useful information (we could return
> not-sure for some remote servers).

> Now, to be really safe, 5) should be not-sure, but delete, and 6)
> should be not-sure, and don't delete (because Emacs could be running
> with another name).

> Thoughts?

That sounds about right.  The doc could simply say "t, nil, other" where
"other" means that we're not sure and the value returned might give
a hint about why we're not sure.

As for process name, I'd rather not check the name of the process.


        Stefan




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

* Re: error in server-running-p on M$
  2008-12-10 18:30                                       ` Stefan Monnier
@ 2008-12-10 18:47                                         ` Juanma Barranquero
  2008-12-11  2:07                                           ` Stefan Monnier
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-12-10 18:47 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

On Wed, Dec 10, 2008 at 19:30, Stefan Monnier <monnier@iro.umontreal.ca> wrote:

> A config var doesn't sound right.  Programmatically, there's no need to
> do anything special.  The problem is for interactive use. I don't have
> a good solution to propose just now, we could just say "to force-start
> a sever first do M-x server-force-delete and then M-x server-mode".

If you're not going to worry about the non-interactive use, there's no
need of using another command. Ulrich's original proposal, asking the
user, would be better IMHO.  (Of course, noninteractive == t would
turn it off.)

> That sounds about right.  The doc could simply say "t, nil, other" where
> "other" means that we're not sure and the value returned might give
> a hint about why we're not sure.

Sorry, I don't understand. Do you mean that the documentation would
say "t, nil, other", but we would return t, nil, and other values that
give a hint (like not-sure, or remote), or do you mean that we return
t, nil, other, and the caller must know what to do? I prefer the
second option.

> As for process name, I'd rather not check the name of the process.

I'd guess (out of the blue sky) than in a heavily used system the
probability of a process ID collision between a long-dead process and
a new one is significant. I'd feel safer checking the name and adding
a note to the docstring about the dangers of running Emacs servers
with atypical names. But it is your call, I'll implement what you
decide.

    Juanma




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

* Re: error in server-running-p on M$
  2008-12-10 18:47                                         ` Juanma Barranquero
@ 2008-12-11  2:07                                           ` Stefan Monnier
  2008-12-11 16:30                                             ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: Stefan Monnier @ 2008-12-11  2:07 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

>> A config var doesn't sound right.  Programmatically, there's no need to
>> do anything special.  The problem is for interactive use. I don't have
>> a good solution to propose just now, we could just say "to force-start
>> a sever first do M-x server-force-delete and then M-x server-mode".

> If you're not going to worry about the non-interactive use, there's no
> need of using another command. Ulrich's original proposal, asking the
> user, would be better IMHO.  (Of course, noninteractive == t would
> turn it off.)

I usually prefer it if the command just fails and lets the user run some
other command to do what she wants.  Sometimes asking the question is
a better option, but here I don't thinkg that its worth it.  The main
problem with asking a question is that it's modal.

>> That sounds about right.  The doc could simply say "t, nil, other" where
>> "other" means that we're not sure and the value returned might give
>> a hint about why we're not sure.

> Sorry, I don't understand. Do you mean that the documentation would
> say "t, nil, other", but we would return t, nil, and other values that
> give a hint (like not-sure, or remote), or do you mean that we return
> t, nil, other, and the caller must know what to do? I prefer the
> second option.

Second option is fine.

>> As for process name, I'd rather not check the name of the process.
> I'd guess (out of the blue sky) than in a heavily used system the
> probability of a process ID collision between a long-dead process and
> a new one is significant. I'd feel safer checking the name and adding
> a note to the docstring about the dangers of running Emacs servers
> with atypical names. But it is your call, I'll implement what you
> decide.

Most/all Unix locks based on process-ids (like the ones used by Emacs,
for example) don't pay attention to the process name.  So experience
shows it's usually good enough.
We can also reduce the likelihood of leaving behind some obsolete
socket/file using kill-emacs-hook.


        Stefan




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

* Re: error in server-running-p on M$
  2008-12-11  2:07                                           ` Stefan Monnier
@ 2008-12-11 16:30                                             ` Juanma Barranquero
  2008-12-11 18:47                                               ` Stefan Monnier
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-12-11 16:30 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

On Thu, Dec 11, 2008 at 03:07, Stefan Monnier <monnier@iro.umontreal.ca> wrote:

> I usually prefer it if the command just fails and lets the user run some
> other command to do what she wants.  Sometimes asking the question is
> a better option, but here I don't thinkg that its worth it.  The main
> problem with asking a question is that it's modal.

I've implemented `server-force-delete', as you suggested.

> Most/all Unix locks based on process-ids (like the ones used by Emacs,
> for example) don't pay attention to the process name.  So experience
> shows it's usually good enough.

OK. Now `server-running-p' will return t for a matching PID process,
and does not check the name. It is the safer behavior anyway.

> We can also reduce the likelihood of leaving behind some obsolete
> socket/file using kill-emacs-hook.

When the server is running, `kill-emacs-hook' already contains code to
turn the server off; (with the patch) that deletes the connection
file.

Please, take a look at the attached patch.

    Juanma



2008-12-11  Juanma Barranquero  <lekktu@gmail.com>

	* server.el (server-sentinel): Uncomment code to delete connection file.
	(server-start): Save the connection file in the server property list.
	Delete it only when we are reasonably convinced that it is not owned by
	a running server.
	(server-force-delete): New command to force-delete the connection file.
	(server-running-p): Return t also for local TCP servers when we find a
	process with a matching PID, and :other for undecided cases.



Index: lisp/server.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/server.el,v
retrieving revision 1.175
diff -u -3 -b -r1.175 server.el
--- lisp/server.el	18 Nov 2008 16:27:09 -0000	1.175
+++ lisp/server.el	11 Dec 2008 16:15:17 -0000
@@ -327,9 +327,9 @@
   ;; Delete the associated connection file, if applicable.
   ;; This is actually problematic: the file may have been overwritten by
   ;; another Emacs server in the mean time, so it's not ours any more.
-  ;; (and (process-contact proc :server)
-  ;;      (eq (process-status proc) 'closed)
-  ;;      (ignore-errors (delete-file (process-get proc :server-file))))
+  (and (process-contact proc :server)
+       (eq (process-status proc) 'closed)
+       (ignore-errors (delete-file (process-get proc :server-file))))
   (server-log (format "Status changed to %s: %s" (process-status
proc) msg) proc)
   (server-delete-client proc))

@@ -458,20 +458,26 @@
 Emacs distribution as your standard \"editor\".

 Optional argument LEAVE-DEAD (interactively, a prefix arg) means just
-kill any existing server communications subprocess."
+kill any existing server communications subprocess.
+
+If `server-running-p' returns t, the server is not started.
+To force-start a server, do \\[server-force-delete] and then
+\\[server-start]."
   (interactive "P")
   (when (or
 	 (not server-clients)
 	 (yes-or-no-p
 	  "The current server still has clients; delete them? "))
+    (let* ((server-dir (if server-use-tcp server-auth-dir server-socket-dir))
+	   (server-file (expand-file-name server-name server-dir)))
     (when server-process
       ;; kill it dead!
       (ignore-errors (delete-process server-process)))
     ;; Delete the socket files made by previous server invocations.
-    (when server-socket-dir
-      (condition-case ()
-	  (delete-file (expand-file-name server-name server-socket-dir))
-	(error nil)))
+      (if (memq (server-running-p server-name) '(nil :other))
+	  (ignore-errors (delete-file server-file))
+	(setq server-mode nil) ;; already set by the minor mode code
+	(error "Server %S is already running" server-name))
     ;; If this Emacs already had a server, clear out associated status.
     (while server-clients
       (server-delete-client (car server-clients)))
@@ -480,12 +486,8 @@
 	(progn
 	  (server-log (message "Server stopped"))
 	  (setq server-process nil))
-      (let* ((server-dir (if server-use-tcp server-auth-dir server-socket-dir))
-	     (server-file (expand-file-name server-name server-dir)))
 	;; Make sure there is a safe directory in which to place the socket.
 	(server-ensure-safe-dir server-dir)
-	;; Remove any leftover socket or authentication file.
-	(ignore-errors (delete-file server-file))
 	(when server-process
 	  (server-log (message "Restarting server")))
 	(letf (((default-file-modes) ?\700))
@@ -516,6 +518,7 @@
 			       :service server-file
 			       :plist '(:authenticated t)))))
 	  (unless server-process (error "Could not start server process"))
+	  (process-put server-process :server-file server-file)
 	  (when server-use-tcp
 	    (let ((auth-key
 		   (loop
@@ -533,14 +536,43 @@
 			" " (int-to-string (emacs-pid))
 			"\n" auth-key)))))))))

+;;;###autoload
+(defun server-force-delete (&optional name)
+  "Unconditionally delete connection file for server NAME.
+NAME defaults to `server-name'.  With argument, ask for NAME."
+  (interactive
+   (list (if current-prefix-arg
+	     (read-string "Server name: " nil nil server-name))))
+  (let ((file (expand-file-name (or name server-name)
+				(if server-use-tcp
+				    server-auth-dir
+				  server-socket-dir))))
+    (condition-case nil
+	(progn
+	  (delete-file file)
+	  (message "Connection file %S deleted" file))
+      (file-error
+       (message "Connection file %S not found or not deleted" file)))))
+
 (defun server-running-p (&optional name)
-  "Test whether server NAME is running."
+  "Test whether server NAME is running.
+
+NOTE: This function is designed to return immediately, rather than
+risking non-termination.  In some cases it returns `:other' when it
+cannot completely determine whether there's a server running or not."
   (interactive
    (list (if current-prefix-arg
 	     (read-string "Server name: " nil nil server-name))))
   (unless name (setq name server-name))
   (condition-case nil
-      (progn
+      (if server-use-tcp
+	  (with-temp-buffer
+	    (insert-file-contents-literally (expand-file-name name server-auth-dir))
+	    (or (and (looking-at "127\.0\.0\.1:[0-9]+ \\([0-9]+\\)")
+		     (assq 'comm
+			   (system-process-attributes
+			    (string-to-number (match-string 1)))))
+		:other))
 	(delete-process
 	 (make-network-process
 	  :name "server-client-test" :family 'local :server nil :noquery t




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

* Re: error in server-running-p on M$
  2008-12-11 16:30                                             ` Juanma Barranquero
@ 2008-12-11 18:47                                               ` Stefan Monnier
  2008-12-12  0:40                                                 ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: Stefan Monnier @ 2008-12-11 18:47 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

>> I usually prefer it if the command just fails and lets the user run some
>> other command to do what she wants.  Sometimes asking the question is
>> a better option, but here I don't thinkg that its worth it.  The main
>> problem with asking a question is that it's modal.

> I've implemented `server-force-delete', as you suggested.

>> Most/all Unix locks based on process-ids (like the ones used by Emacs,
>> for example) don't pay attention to the process name.  So experience
>> shows it's usually good enough.

> OK. Now `server-running-p' will return t for a matching PID process,
> and does not check the name. It is the safer behavior anyway.

>> We can also reduce the likelihood of leaving behind some obsolete
>> socket/file using kill-emacs-hook.

> When the server is running, `kill-emacs-hook' already contains code to
> turn the server off; (with the patch) that deletes the connection
> file.

> Please, take a look at the attached patch.

Looks good.  I've added some more nitpicks, with which you can install it.

>    ;; Delete the associated connection file, if applicable.
>    ;; This is actually problematic: the file may have been overwritten by
>    ;; another Emacs server in the mean time, so it's not ours any more.
> -  ;; (and (process-contact proc :server)
> -  ;;      (eq (process-status proc) 'closed)
> -  ;;      (ignore-errors (delete-file (process-get proc :server-file))))
> +  (and (process-contact proc :server)
> +       (eq (process-status proc) 'closed)
> +       (ignore-errors (delete-file (process-get proc :server-file))))

I didn't mean to leave the comment as is.  Please update the comment to
say that the file *should* be ours thanks to the server-wunning-p check
in server-start.

> +If `server-running-p' returns t, the server is not started.

I'd just write it as "If a server is already running, the server is not
started".

> +      (if (memq (server-running-p server-name) '(nil :other))

Better check (not (eq t (server-running-p server-name))).

> -	;; Remove any leftover socket or authentication file.

You've moved the subsequent line but left out this comment that goes
with it.

> +;;;###autoload
> +(defun server-force-delete (&optional name)
> +  "Unconditionally delete connection file for server NAME.
> +NAME defaults to `server-name'.  With argument, ask for NAME."
> +  (interactive
> +   (list (if current-prefix-arg
> +	     (read-string "Server name: " nil nil server-name))))
> +  (let ((file (expand-file-name (or name server-name)
> +				(if server-use-tcp
> +				    server-auth-dir
> +				  server-socket-dir))))
> +    (condition-case nil
> +	(progn
> +	  (delete-file file)
> +	  (message "Connection file %S deleted" file))
> +      (file-error
> +       (message "Connection file %S not found or not deleted" file)))))

This should first stop our own server.  The user will usually not run
it when our server is running, but she might do it occasionally.

>  (defun server-running-p (&optional name)
> -  "Test whether server NAME is running."
> +  "Test whether server NAME is running.
> +
> +NOTE: This function is designed to return immediately, rather than
> +risking non-termination.  In some cases it returns `:other' when it
> +cannot completely determine whether there's a server running or not."

The docstring should say:
nil => the server is definitely not running.
t   => the server seems to be running.
something else => we cannot determine whether it's running without
    using commands which may have to wait for a long time.

No need to document the :other value.

> +	    (or (and (looking-at "127\.0\.0\.1:[0-9]+ \\([0-9]+\\)")
> +		     (assq 'comm
> +			   (system-process-attributes
> +			    (string-to-number (match-string 1))))

                     t)

> +		:other))

-- Stefan




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

* Re: error in server-running-p on M$
  2008-12-11 18:47                                               ` Stefan Monnier
@ 2008-12-12  0:40                                                 ` Juanma Barranquero
  2008-12-12  4:51                                                   ` Stefan Monnier
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-12-12  0:40 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

On Thu, Dec 11, 2008 at 19:47, Stefan Monnier <monnier@iro.umontreal.ca> wrote:

> I didn't mean to leave the comment as is.  Please update the comment to
> say that the file *should* be ours thanks to the server-wunning-p check
> in server-start.

I was trying to weasel out of writing it, but you caught me ;-)

>> -     ;; Remove any leftover socket or authentication file.
>
> You've moved the subsequent line but left out this comment that goes
> with it.

It was not an oversight, I didn't think it was needed. I've moved it, though.

> This should first stop our own server.  The user will usually not run
> it when our server is running, but she might do it occasionally.

I've done that, and now I still dislike `server-force-delete' even
more. I strongly think that a simple question on server-start would
have been cleaner.

Currently the function must do

  (server-mode -1)  ;; which deletes the connection file, because of
the process sentinel
  (condition-case nil
      (delete-file ...)
      ...)

which is kind of redundant. It almost should be

  (if server-mode
       (server-mode -1)
     (condition-case nil
         ...))

but the name of the current server could be different of the one for
the connection file we're trying to delete.

Ugly IMHO.

>> +         (or (and (looking-at "127\.0\.0\.1:[0-9]+ \\([0-9]+\\)")
>> +                  (assq 'comm
>> +                        (system-process-attributes
>> +                         (string-to-number (match-string 1))))
>
>                     t)

Yes, a silly oversight. Thanks.

The code is now committed.

    Juanma




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

* Re: error in server-running-p on M$
  2008-12-12  0:40                                                 ` Juanma Barranquero
@ 2008-12-12  4:51                                                   ` Stefan Monnier
  2008-12-12  8:19                                                     ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: Stefan Monnier @ 2008-12-12  4:51 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

>> This should first stop our own server.  The user will usually not run
>> it when our server is running, but she might do it occasionally.

> I've done that, and now I still dislike `server-force-delete' even
> more. I strongly think that a simple question on server-start would
> have been cleaner.

For a function that's likely to be called from .emacs, I think it's
better to avoid asking questions as far as possible.

> which is kind of redundant. It almost should be

>   (if server-mode
>        (server-mode -1)
>      (condition-case nil
>          ...))

I don't see why it's a problem.

> but the name of the current server could be different of the one for
> the connection file we're trying to delete.
> Ugly IMHO.

BTW, another option is to let server-stop ask the question, so
C-u -1 M-x server-mode would provide the functionality  of
server-force-delete: if server is running, turn it off, if it's not
running and there's no socker/server file, don't do anything, and if
there is some file ask the user whether to force-delete it.

> The code is now committed.

Thanks,


        Stefan




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

* Re: error in server-running-p on M$
  2008-12-12  4:51                                                   ` Stefan Monnier
@ 2008-12-12  8:19                                                     ` Juanma Barranquero
  2008-12-12 18:49                                                       ` Stefan Monnier
  0 siblings, 1 reply; 58+ messages in thread
From: Juanma Barranquero @ 2008-12-12  8:19 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

On Fri, Dec 12, 2008 at 05:51, Stefan Monnier <monnier@iro.umontreal.ca> wrote:

> BTW, another option is to let server-stop ask the question, so
> C-u -1 M-x server-mode would provide the functionality  of
> server-force-delete: if server is running, turn it off, if it's not
> running and there's no socker/server file, don't do anything, and if
> there is some file ask the user whether to force-delete it.

Let's see what people thinks of the current interface. I'm sure if
there is a better one (perhaps the one you're suggesting) we will know
soon enough.

    Juanma




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

* Re: error in server-running-p on M$
  2008-12-12  8:19                                                     ` Juanma Barranquero
@ 2008-12-12 18:49                                                       ` Stefan Monnier
  2008-12-12 20:20                                                         ` Juanma Barranquero
  0 siblings, 1 reply; 58+ messages in thread
From: Stefan Monnier @ 2008-12-12 18:49 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

>> BTW, another option is to let server-stop ask the question, so
>> C-u -1 M-x server-mode would provide the functionality  of
>> server-force-delete: if server is running, turn it off, if it's not
>> running and there's no socker/server file, don't do anything, and if
>> there is some file ask the user whether to force-delete it.

> Let's see what people thinks of the current interface. I'm sure if
> there is a better one (perhaps the one you're suggesting) we will know
> soon enough.

Actually, it seems like a sufficiently rarely-used functionality that it
probably won't show up until much later,


        Stefan




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

* Re: error in server-running-p on M$
  2008-12-12 18:49                                                       ` Stefan Monnier
@ 2008-12-12 20:20                                                         ` Juanma Barranquero
  0 siblings, 0 replies; 58+ messages in thread
From: Juanma Barranquero @ 2008-12-12 20:20 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, Ulrich Mueller, emacs-devel

On Fri, Dec 12, 2008 at 19:49, Stefan Monnier <monnier@iro.umontreal.ca> wrote:


> Actually, it seems like a sufficiently rarely-used functionality that it
> probably won't show up until much later,

We haven't started pretest yet. Your "much later" is my "soon enough" :-)

    Juanma




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

end of thread, other threads:[~2008-12-12 20:20 UTC | newest]

Thread overview: 58+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-11-22 11:44 error in server-running-p on M$ dhruva
2008-11-22 11:58 ` Juanma Barranquero
2008-11-22 12:51   ` Eli Zaretskii
2008-11-22 13:00     ` Juanma Barranquero
2008-11-22 13:20       ` Eli Zaretskii
2008-11-22 13:37         ` Juanma Barranquero
2008-11-22 13:53           ` Eli Zaretskii
2008-11-22 14:13             ` Ulrich Mueller
2008-11-22 14:17               ` Juanma Barranquero
2008-11-22 14:29                 ` Ulrich Mueller
2008-11-22 14:36                   ` Juanma Barranquero
2008-11-22 15:35                     ` Ulrich Mueller
2008-11-22 16:04                       ` Juanma Barranquero
2008-11-22 16:52                         ` Ulrich Mueller
2008-11-22 21:47                           ` Juanma Barranquero
2008-11-23  3:56                             ` dhruva
2008-11-23  3:59                               ` Juanma Barranquero
2008-11-23  4:01                                 ` dhruva
2008-11-23  4:03                                   ` Juanma Barranquero
2008-11-23  4:10                                     ` dhruva
2008-11-23  4:15                                       ` Juanma Barranquero
2008-11-23  4:17                                         ` dhruva
2008-11-23  4:19                                           ` Juanma Barranquero
2008-11-23  8:14                                             ` Server protocol (was: Re: error in server-running-p on M$) Ulrich Mueller
2008-11-23 11:33                                               ` Juanma Barranquero
2008-11-23 16:33                                                 ` dhruva
2008-11-23 17:48                                                   ` Juanma Barranquero
2008-11-23  4:02                 ` error in server-running-p on M$ Stefan Monnier
2008-11-23  4:10                   ` Juanma Barranquero
2008-11-23  5:21                     ` Stefan Monnier
2008-11-23  5:32                       ` Juanma Barranquero
2008-11-23  5:57                         ` Stefan Monnier
2008-11-23 11:26                           ` Juanma Barranquero
2008-11-23 12:46                             ` Juanma Barranquero
2008-11-23 13:13                               ` Ulrich Mueller
2008-11-24  2:55                               ` Stefan Monnier
2008-11-24 14:46                                 ` Juanma Barranquero
2008-11-24 15:10                                   ` Ulrich Mueller
2008-11-24 15:16                                     ` Juanma Barranquero
2008-11-24 15:34                                       ` Ulrich Mueller
2008-11-24 15:45                                         ` Juanma Barranquero
2008-12-09 20:46                                   ` Stefan Monnier
2008-12-10  7:05                                     ` Chetan Pandya
2008-12-10 12:59                                     ` Juanma Barranquero
2008-12-10 18:30                                       ` Stefan Monnier
2008-12-10 18:47                                         ` Juanma Barranquero
2008-12-11  2:07                                           ` Stefan Monnier
2008-12-11 16:30                                             ` Juanma Barranquero
2008-12-11 18:47                                               ` Stefan Monnier
2008-12-12  0:40                                                 ` Juanma Barranquero
2008-12-12  4:51                                                   ` Stefan Monnier
2008-12-12  8:19                                                     ` Juanma Barranquero
2008-12-12 18:49                                                       ` Stefan Monnier
2008-12-12 20:20                                                         ` Juanma Barranquero
2008-11-23  3:58               ` Stefan Monnier
2008-11-23  3:59           ` Stefan Monnier
2008-11-23  4:12             ` Juanma Barranquero
2008-11-23  5:19               ` Stefan Monnier

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

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).