Subject: Re: bug#44644: /tmp/emacs0/ not cleaned up upon exit

From: Eli Zaretskii <[email-masked]>
Date: Tue, 24 Nov 2020 17:28:09 +0200

> From: Lars Ingebrigtsen <[email-masked]>
> Cc: [email-masked],  [email-masked]
> Date: Tue, 24 Nov 2020 06:42:47 +0100
> 
> Eli Zaretskii <[email-masked]> writes:
> 
> >> True.  Looking at the code, it looks like having `server-start' add
> >> `server-force-delete' to `kill-emacs-query-functions' would do the
> >> trick?
> >> 
> >> Does anybody see any downsides to doing that?
> >
> > What if the Emacs that's being killed is not the one that created the
> > server file?
> 
> I didn't read the code closely enough -- emacs-server already does this,
> but only deletes the /tmp/emacs0/server socket, but leaves the directory
> behind.  As you say, there may be more than one server (with different
> names), so deleting the directory may fail, but the final Emacs that
> exits should successfully delete directory, at least, and I've added
> that to Emacs 28.

Wait a moment: we are deleting the _directory_ of the server file?
Sorry, I was confused and thought you were talking about the server
file itself.

The directory thing is different.  First, its place and purpose
depends on whether server-use-tcp is nil (Posix platforms) or not
(MS-Windows or when the user of a Posix host connects from another
system).  If this is non-nil, the directory of the server file is
server-auth-dir, which is:

  (defcustom server-auth-dir (locate-user-emacs-file "server/")

Since this is a defcustom, I don't think we can delete that directory
behind user's back, even if it is empty.

If server-use-tcp is nil (the default), then the directory of
server-file is computed thusly:

  (defvar server-socket-dir
    (if internal--daemon-sockname
	(file-name-directory internal--daemon-sockname)
      (and (featurep 'make-network-process '(:family local))
	   (let ((xdg_runtime_dir (getenv "XDG_RUNTIME_DIR")))
	     (if xdg_runtime_dir
		 (format "%s/emacs" xdg_runtime_dir)
	       (format "%s/emacs%d" (or (getenv "TMPDIR") "/tmp") (user-uid))))))

I don't think it's kosher to delete $XDG_RUNTIME_DIR, even if it's
empty, since it is probably used by more than the server?  And if
XDG_RUNTIME_DIR is not defined, and we use a directory under /tmp,
then the system cleans that up from time to time, doesn't it?

So bottom line, I don't think we should do this, at least not
unconditionally.