GNU bug report logs - #24218
25.1.50; server-name, server-socket-dir and daemon start through systemd socket

Previous Next

Package: emacs;

Reported by: Vladimir Lomov <lomov.vl <at> gmail.com>

Date: Sat, 13 Aug 2016 16:37:02 UTC

Severity: normal

Found in version 25.1.50

Done: Paul Eggert <eggert <at> cs.ucla.edu>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 24218 in the body.
You can then email your comments to 24218 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#24218; Package emacs. (Sat, 13 Aug 2016 16:37:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Vladimir Lomov <lomov.vl <at> gmail.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Sat, 13 Aug 2016 16:37:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Vladimir Lomov <lomov.vl <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: 25.1.50;
 server-name, server-socket-dir and daemon start through systemd socket
Date: Sun, 14 Aug 2016 00:35:57 +0800
Hello,
first of all I not sure if this is a bug report or more likely it is a
feature request.

Recently Emacs got code to start daemon by means of systemd. For this
one needs to create two files: `emacs.socket` and `emacs.service`, for
example, the content of these files can be found in the manual.

The problem is that when emacs daemon is started this way any it's
client doesn't have correct values for `server-name` and
`server-socket-dir` variables. Moreover, attemp to set these variables
manually in `.emacs` triggers (that is not surprise, I think) failure in
emacs daemon start.

I think it should be possible to set these variables to correct values
in `.emacs` that don't cause failure in emacs daemon start, especially
taking into account that there is `:use-external-socket` variable.

To illustrate the situation consider the following `emacs.socket` file

    [Socket]
    ListenStream=%t/emacs

    [Install]
    WantedBy=sockets.target

almost litteraly copied from Emacs manual and following `emacs.service`
file

    [Unit]
    Description=Emacs

    [Service]
    Type=forking
    ExecStart=/path/to/emacs --daemon
    ExecStop=/path/to/emacsclient --eval "(kill-emacs)"
    Restart=always

    [Install]
    WantedBy=default.target

If one starts `emacs.socket` file

    $ systemctl --user start emacs.socket

and connect to the daemon (which is not started yet) by means of the
socket file assuming that `.emacs` is empty

    $ emacsclient -c -s /run/user/1000/emacs

then all is Ok except the values of `server-name` and
`server-socket-dir`: they are wrong (they have "default" values:
`server` and `/tmp/emacs1000`).

If one would use `.emacs` with settings of these variables

    (setq server-name "emacs" server-socket-dir "/run/user/1000")

and run the same command for `emacsclient` in clean conditions (this
means that `service` and `socket` must be stopped before that and
`socket` must be started again) one finds that daemon is not started.

P.S. Sorry if this description isn't clean enough.


In GNU Emacs 25.1.50.1 (x86_64-unknown-linux-gnu, GTK+ Version 3.20.8)
 of 2016-08-11 built on smoon6-1.vl-lomov.ru
Repository revision: cd3524061346dec4ec820c98b6ca8046eda290c3
Windowing system distributor 'The X.Org Foundation', version 11.0.11804000
Recent messages:
Auto-saving...done
Saving file /home/vladimir/works/org/.git/COMMIT_EDITMSG...
bzip2ing .COMMIT_EDITMSG.~undo-tree~.bz2...done
Wrote /home/vladimir/works/org/.git/.COMMIT_EDITMSG.~undo-tree~.bz2
Wrote /home/vladimir/works/org/.git/COMMIT_EDITMSG
Git finished [2 times]
Type C-h i to view popup manual, ? to describe an argument or action.
Running git push -v origin master:refs/heads/master [2 times]
Git finished [2 times]
When done with this frame, type C-x 5 0

Configured using:
 'configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
 --libexecdir=/usr/lib --with-x-toolkit=gtk3 --without-gconf
 'CFLAGS=-march=x86-64 -mtune=native -O2 -pipe -fstack-protector-strong'
 LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro
 CPPFLAGS=-D_FORTIFY_SOURCE=2'

Configured features:
XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND GPM DBUS GSETTINGS NOTIFY
ACL GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB TOOLKIT_SCROLL_BARS
GTK3 X11 LIBSYSTEMD

Important settings:
  value of $LC_COLLATE: C
  value of $LANG: ru_RU.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
  global-undo-tree-mode: t
  undo-tree-mode: t
  diff-auto-refine-mode: t
  magit-auto-revert-mode: t
  global-git-commit-mode: t
  global-auto-complete-mode: t
  auto-complete-mode: t
  pdf-occur-global-minor-mode: t
  shell-dirtrack-mode: t
  ido-everywhere: t
  display-time-mode: t
  show-paren-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t

Load-path shadows:
/usr/share/emacs/site-lisp/org/org-list hides /usr/share/emacs/25.1.50/lisp/org/org-list
/usr/share/emacs/site-lisp/org/org-element hides /usr/share/emacs/25.1.50/lisp/org/org-element
/usr/share/emacs/site-lisp/org/org-mouse hides /usr/share/emacs/25.1.50/lisp/org/org-mouse
/usr/share/emacs/site-lisp/org/org-attach hides /usr/share/emacs/25.1.50/lisp/org/org-attach
/usr/share/emacs/site-lisp/org/org-agenda hides /usr/share/emacs/25.1.50/lisp/org/org-agenda
/usr/share/emacs/site-lisp/org/ob-screen hides /usr/share/emacs/25.1.50/lisp/org/ob-screen
/usr/share/emacs/site-lisp/org/ox-html hides /usr/share/emacs/25.1.50/lisp/org/ox-html
/usr/share/emacs/site-lisp/org/ob-sass hides /usr/share/emacs/25.1.50/lisp/org/ob-sass
/usr/share/emacs/site-lisp/org/ob-ditaa hides /usr/share/emacs/25.1.50/lisp/org/ob-ditaa
/usr/share/emacs/site-lisp/org/ob-keys hides /usr/share/emacs/25.1.50/lisp/org/ob-keys
/usr/share/emacs/site-lisp/org/ob-core hides /usr/share/emacs/25.1.50/lisp/org/ob-core
/usr/share/emacs/site-lisp/org/ob-ocaml hides /usr/share/emacs/25.1.50/lisp/org/ob-ocaml
/usr/share/emacs/site-lisp/org/ob-comint hides /usr/share/emacs/25.1.50/lisp/org/ob-comint
/usr/share/emacs/site-lisp/org/ob-ruby hides /usr/share/emacs/25.1.50/lisp/org/ob-ruby
/usr/share/emacs/site-lisp/org/ob-calc hides /usr/share/emacs/25.1.50/lisp/org/ob-calc
/usr/share/emacs/site-lisp/org/ob-plantuml hides /usr/share/emacs/25.1.50/lisp/org/ob-plantuml
/usr/share/emacs/site-lisp/org/org-macro hides /usr/share/emacs/25.1.50/lisp/org/org-macro
/usr/share/emacs/site-lisp/org/org-irc hides /usr/share/emacs/25.1.50/lisp/org/org-irc
/usr/share/emacs/site-lisp/org/org-inlinetask hides /usr/share/emacs/25.1.50/lisp/org/org-inlinetask
/usr/share/emacs/site-lisp/org/ox-beamer hides /usr/share/emacs/25.1.50/lisp/org/ox-beamer
/usr/share/emacs/site-lisp/org/org-info hides /usr/share/emacs/25.1.50/lisp/org/org-info
/usr/share/emacs/site-lisp/org/org-indent hides /usr/share/emacs/25.1.50/lisp/org/org-indent
/usr/share/emacs/site-lisp/org/ox-ascii hides /usr/share/emacs/25.1.50/lisp/org/ox-ascii
/usr/share/emacs/site-lisp/org/org-id hides /usr/share/emacs/25.1.50/lisp/org/org-id
/usr/share/emacs/site-lisp/org/org-habit hides /usr/share/emacs/25.1.50/lisp/org/org-habit
/usr/share/emacs/site-lisp/org/org-gnus hides /usr/share/emacs/25.1.50/lisp/org/org-gnus
/usr/share/emacs/site-lisp/org/org-footnote hides /usr/share/emacs/25.1.50/lisp/org/org-footnote
/usr/share/emacs/site-lisp/org/org-timer hides /usr/share/emacs/25.1.50/lisp/org/org-timer
/usr/share/emacs/site-lisp/org/org-feed hides /usr/share/emacs/25.1.50/lisp/org/org-feed
/usr/share/emacs/site-lisp/org/ox hides /usr/share/emacs/25.1.50/lisp/org/ox
/usr/share/emacs/site-lisp/org/org-faces hides /usr/share/emacs/25.1.50/lisp/org/org-faces
/usr/share/emacs/site-lisp/org/ox-texinfo hides /usr/share/emacs/25.1.50/lisp/org/ox-texinfo
/usr/share/emacs/site-lisp/org/org-eshell hides /usr/share/emacs/25.1.50/lisp/org/org-eshell
/usr/share/emacs/site-lisp/org/org-table hides /usr/share/emacs/25.1.50/lisp/org/org-table
/usr/share/emacs/site-lisp/org/org-entities hides /usr/share/emacs/25.1.50/lisp/org/org-entities
/usr/share/emacs/site-lisp/org/org-src hides /usr/share/emacs/25.1.50/lisp/org/org-src
/usr/share/emacs/site-lisp/org/org-rmail hides /usr/share/emacs/25.1.50/lisp/org/org-rmail
/usr/share/emacs/site-lisp/org/org-docview hides /usr/share/emacs/25.1.50/lisp/org/org-docview
/usr/share/emacs/site-lisp/org/org-protocol hides /usr/share/emacs/25.1.50/lisp/org/org-protocol
/usr/share/emacs/site-lisp/org/org-datetree hides /usr/share/emacs/25.1.50/lisp/org/org-datetree
/usr/share/emacs/site-lisp/org/org-plot hides /usr/share/emacs/25.1.50/lisp/org/org-plot
/usr/share/emacs/site-lisp/org/org-ctags hides /usr/share/emacs/25.1.50/lisp/org/org-ctags
/usr/share/emacs/site-lisp/org/ox-publish hides /usr/share/emacs/25.1.50/lisp/org/ox-publish
/usr/share/emacs/site-lisp/org/org-crypt hides /usr/share/emacs/25.1.50/lisp/org/org-crypt
/usr/share/emacs/site-lisp/org/ox-org hides /usr/share/emacs/25.1.50/lisp/org/ox-org
/usr/share/emacs/site-lisp/org/org-compat hides /usr/share/emacs/25.1.50/lisp/org/org-compat
/usr/share/emacs/site-lisp/org/org-pcomplete hides /usr/share/emacs/25.1.50/lisp/org/org-pcomplete
/usr/share/emacs/site-lisp/org/org-colview hides /usr/share/emacs/25.1.50/lisp/org/org-colview
/usr/share/emacs/site-lisp/org/org-clock hides /usr/share/emacs/25.1.50/lisp/org/org-clock
/usr/share/emacs/site-lisp/org/ox-odt hides /usr/share/emacs/25.1.50/lisp/org/ox-odt
/usr/share/emacs/site-lisp/org/org-capture hides /usr/share/emacs/25.1.50/lisp/org/org-capture
/usr/share/emacs/site-lisp/org/org-mobile hides /usr/share/emacs/25.1.50/lisp/org/org-mobile
/usr/share/emacs/site-lisp/org/org-bibtex hides /usr/share/emacs/25.1.50/lisp/org/org-bibtex
/usr/share/emacs/site-lisp/org/org-mhe hides /usr/share/emacs/25.1.50/lisp/org/org-mhe
/usr/share/emacs/site-lisp/org/org-bbdb hides /usr/share/emacs/25.1.50/lisp/org/org-bbdb
/usr/share/emacs/site-lisp/org/ox-md hides /usr/share/emacs/25.1.50/lisp/org/ox-md
/usr/share/emacs/site-lisp/org/org-macs hides /usr/share/emacs/25.1.50/lisp/org/org-macs
/usr/share/emacs/site-lisp/org/org-archive hides /usr/share/emacs/25.1.50/lisp/org/org-archive
/usr/share/emacs/site-lisp/org/org-w3m hides /usr/share/emacs/25.1.50/lisp/org/org-w3m
/usr/share/emacs/site-lisp/org/org hides /usr/share/emacs/25.1.50/lisp/org/org
/usr/share/emacs/site-lisp/org/ob hides /usr/share/emacs/25.1.50/lisp/org/ob
/usr/share/emacs/site-lisp/org/ob-tangle hides /usr/share/emacs/25.1.50/lisp/org/ob-tangle
/usr/share/emacs/site-lisp/org/ox-man hides /usr/share/emacs/25.1.50/lisp/org/ox-man
/usr/share/emacs/site-lisp/org/ob-table hides /usr/share/emacs/25.1.50/lisp/org/ob-table
/usr/share/emacs/site-lisp/org/ox-latex hides /usr/share/emacs/25.1.50/lisp/org/ox-latex
/usr/share/emacs/site-lisp/org/ob-sqlite hides /usr/share/emacs/25.1.50/lisp/org/ob-sqlite
/usr/share/emacs/site-lisp/org/ox-icalendar hides /usr/share/emacs/25.1.50/lisp/org/ox-icalendar
/usr/share/emacs/site-lisp/org/ob-sql hides /usr/share/emacs/25.1.50/lisp/org/ob-sql
/usr/share/emacs/site-lisp/org/ob-shen hides /usr/share/emacs/25.1.50/lisp/org/ob-shen
/usr/share/emacs/site-lisp/org/ob-scheme hides /usr/share/emacs/25.1.50/lisp/org/ob-scheme
/usr/share/emacs/site-lisp/org/ob-scala hides /usr/share/emacs/25.1.50/lisp/org/ob-scala
/usr/share/emacs/site-lisp/org/ob-python hides /usr/share/emacs/25.1.50/lisp/org/ob-python
/usr/share/emacs/site-lisp/org/ob-ref hides /usr/share/emacs/25.1.50/lisp/org/ob-ref
/usr/share/emacs/site-lisp/org/ob-lisp hides /usr/share/emacs/25.1.50/lisp/org/ob-lisp
/usr/share/emacs/site-lisp/org/ob-fortran hides /usr/share/emacs/25.1.50/lisp/org/ob-fortran
/usr/share/emacs/site-lisp/org/ob-exp hides /usr/share/emacs/25.1.50/lisp/org/ob-exp
/usr/share/emacs/site-lisp/org/ob-perl hides /usr/share/emacs/25.1.50/lisp/org/ob-perl
/usr/share/emacs/site-lisp/org/ob-lilypond hides /usr/share/emacs/25.1.50/lisp/org/ob-lilypond
/usr/share/emacs/site-lisp/org/ob-eval hides /usr/share/emacs/25.1.50/lisp/org/ob-eval
/usr/share/emacs/site-lisp/org/ob-org hides /usr/share/emacs/25.1.50/lisp/org/ob-org
/usr/share/emacs/site-lisp/org/ob-ledger hides /usr/share/emacs/25.1.50/lisp/org/ob-ledger
/usr/share/emacs/site-lisp/org/ob-emacs-lisp hides /usr/share/emacs/25.1.50/lisp/org/ob-emacs-lisp
/usr/share/emacs/site-lisp/org/ob-maxima hides /usr/share/emacs/25.1.50/lisp/org/ob-maxima
/usr/share/emacs/site-lisp/org/ob-haskell hides /usr/share/emacs/25.1.50/lisp/org/ob-haskell
/usr/share/emacs/site-lisp/org/ob-dot hides /usr/share/emacs/25.1.50/lisp/org/ob-dot
/usr/share/emacs/site-lisp/org/ob-mscgen hides /usr/share/emacs/25.1.50/lisp/org/ob-mscgen
/usr/share/emacs/site-lisp/org/ob-js hides /usr/share/emacs/25.1.50/lisp/org/ob-js
/usr/share/emacs/site-lisp/org/ob-matlab hides /usr/share/emacs/25.1.50/lisp/org/ob-matlab
/usr/share/emacs/site-lisp/org/ob-java hides /usr/share/emacs/25.1.50/lisp/org/ob-java
/usr/share/emacs/site-lisp/org/ob-css hides /usr/share/emacs/25.1.50/lisp/org/ob-css
/usr/share/emacs/site-lisp/org/ob-octave hides /usr/share/emacs/25.1.50/lisp/org/ob-octave
/usr/share/emacs/site-lisp/org/ob-latex hides /usr/share/emacs/25.1.50/lisp/org/ob-latex
/usr/share/emacs/site-lisp/org/ob-lob hides /usr/share/emacs/25.1.50/lisp/org/ob-lob
/usr/share/emacs/site-lisp/org/ob-io hides /usr/share/emacs/25.1.50/lisp/org/ob-io
/usr/share/emacs/site-lisp/org/ob-clojure hides /usr/share/emacs/25.1.50/lisp/org/ob-clojure
/usr/share/emacs/site-lisp/org/ob-makefile hides /usr/share/emacs/25.1.50/lisp/org/ob-makefile
/usr/share/emacs/site-lisp/org/ob-gnuplot hides /usr/share/emacs/25.1.50/lisp/org/ob-gnuplot
/usr/share/emacs/site-lisp/org/ob-R hides /usr/share/emacs/25.1.50/lisp/org/ob-R
/usr/share/emacs/site-lisp/org/ob-awk hides /usr/share/emacs/25.1.50/lisp/org/ob-awk
/usr/share/emacs/site-lisp/org/ob-C hides /usr/share/emacs/25.1.50/lisp/org/ob-C
/usr/share/emacs/site-lisp/org/ob-picolisp hides /usr/share/emacs/25.1.50/lisp/org/ob-picolisp
/usr/share/emacs/site-lisp/org/ob-asymptote hides /usr/share/emacs/25.1.50/lisp/org/ob-asymptote
/usr/share/emacs/site-lisp/org/org-loaddefs hides /usr/share/emacs/25.1.50/lisp/org/org-loaddefs
/usr/share/emacs/site-lisp/org/org-version hides /usr/share/emacs/25.1.50/lisp/org/org-version
/usr/share/emacs/site-lisp/org/org-install hides /usr/share/emacs/25.1.50/lisp/org/org-install

Features:
(shadow sort spook cookie1 mail-extr emacsbug sendmail linum cal-move
parse-time calc-map calc-stat calc-vec calc-ext calc-menu calc-aent calc
calc-loaddefs calc-macs org-table cdlatex texmathp org-annotate-file
org-id org-habit org-info org-docview doc-view org-bibtex bibtex
org-bbdb vc-git thingatpt flymake magit-version undo-tree diff
magit-blame magit-stash magit-bisect magit-remote magit-commit
magit-sequence magit package url-handlers magit-apply magit-wip
magit-log magit-diff smerge-mode diff-mode magit-core magit-autorevert
autorevert filenotify magit-process magit-popup magit-mode magit-git crm
magit-section magit-utils git-commit help-fns radix-tree log-edit
message subr-x puny rfc822 mml mml-sec epa epg epg-config gnus-util
rmail rmail-loaddefs mm-decode mm-bodies mm-encode mail-parse rfc2231
rfc2047 rfc2045 mm-util ietf-drums mail-prsvr mailabbrev mail-utils
gmm-utils mailheader pcvs-util add-log with-editor tramp-sh server dash
auto-complete-config auto-complete popup calfw-ical url url-proxy
url-privacy url-expand url-methods url-history url-cookie url-domsuf
url-util url-parse url-vars mailcap icalendar diary-lib diary-loaddefs
calfw-org org-capture org-agenda calfw holidays hol-loaddefs cl ob-shell
ob-R ob-perl ob-latex ob-asymptote ob-gnuplot ox-odt rng-loc rng-uri
rng-parse rng-match rng-dt rng-util rng-pttrn nxml-parse nxml-ns
nxml-enc xmltok nxml-util ox-latex ox-icalendar ox-html table ox-ascii
ox-publish ox preview-latex tex-site auto-loads pdf-sync pdf-outline
pdf-occur ibuf-ext ibuffer ibuffer-loaddefs pdf-links pdf-isearch
let-alist pdf-history pdf-annot tablist tablist-filter
semantic/wisent/comp semantic/wisent semantic/wisent/wisent
semantic/util-modes semantic/util semantic semantic/tag semantic/lex
semantic/fw mode-local cedet org-element avl-tree org org-macro
org-footnote org-pcomplete org-list org-faces org-entities noutline
outline org-version ob-emacs-lisp ob ob-tangle org-src ob-ref ob-lob
ob-table ob-keys ob-exp ob-comint tramp tramp-compat tramp-loaddefs
trampver ucs-normalize shell pcomplete auth-source cl-seq eieio
eieio-core cl-macs eieio-loaddefs password-cache ob-core ob-eval
org-compat org-macs org-loaddefs find-func cal-menu calendar
cal-loaddefs pdf-misc imenu pdf-tools compile comint ansi-color ring
cus-edit cus-start cus-load wid-edit pdf-view jka-compr pdf-cache
pdf-info tq pdf-util image-mode dired+ image-dired format-spec
image-file dired-aux bookmark+ bookmark+-key edmacro kmacro easy-mmode
advice derived dired-x dired dired-loaddefs bookmark+-1 bookmark+-bmu
bookmark+-lit bookmark pp ido seq byte-opt gv bytecomp byte-compile
cl-extra cconv quail help-mode easymenu cl-loaddefs pcase cl-lib time
flyspell ispell time-date paren mule-util cyril-util tooltip eldoc
electric uniquify ediff-hook vc-hooks lisp-float-type mwheel term/x-win
x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe
tabulated-list newcomment elisp-mode lisp-mode prog-mode register page
menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock font-lock
syntax facemenu font-core term/tty-colors frame cl-generic cham georgian
utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean
japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european
ethiopic indian cyrillic chinese charscript case-table epa-hook
jka-cmpr-hook help simple abbrev obarray minibuffer cl-preloaded nadvice
loaddefs button faces cus-face macroexp files text-properties overlay
sha1 md5 base64 format env code-pages mule custom widget
hashtable-print-readable backquote dbusbind inotify dynamic-setting
system-font-setting font-render-setting move-toolbar gtk x-toolkit x
multi-tty make-network-process emacs)

Memory information:
((conses 16 496832 58236)
 (symbols 48 50535 0)
 (miscs 40 177 481)
 (strings 32 118385 14977)
 (string-bytes 1 3804225)
 (vectors 16 78228)
 (vector-slots 8 1869287 211061)
 (floats 8 507 374)
 (intervals 56 1311 69)
 (buffers 976 23))


--
WBR, Vladimir Lomov

SUN Microsystems:
	The Network IS the Load Average.

EuroFed ASPIC Attorney General Pipe bomb undercover Leuken-Baden Federal
Aviation Administration Reflection Palestine Liberation Organization
Chemical burn Incident SWS 22nd SAS Sugar Grove Dirty bomb

-- 




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24218; Package emacs. (Mon, 15 Aug 2016 02:26:02 GMT) Full text and rfc822 format available.

Message #8 received at 24218 <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Matthew Leach <matthew <at> mattleach.net>
Cc: 24218 <at> debbugs.gnu.org, Vladimir Lomov <lomov.vl <at> gmail.com>
Subject: Re: 25.1.50; server-name, server-socket-dir and daemon start through
 systemd socket
Date: Sun, 14 Aug 2016 19:25:49 -0700
Matthew, can you please look at:

http://bugs.gnu.org/24218

and follow up as seems appropriate? You can reply to this email to add to the 
bug-report log. Thanks.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24218; Package emacs. (Sun, 07 Jan 2018 21:56:01 GMT) Full text and rfc822 format available.

Message #11 received at 24218 <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Matthew Leach <matthew <at> mattleach.net>
Cc: 24218 <at> debbugs.gnu.org, Vladimir Lomov <lomov.vl <at> gmail.com>
Subject: Re: 25.1.50; server-name, server-socket-dir and daemon start through,
 systemd socket
Date: Sun, 7 Jan 2018 13:55:04 -0800
[Message part 1 (text/plain, inline)]
Matthew proposed a patch for this here:

https://lists.gnu.org/r/emacs-devel/2017-12/msg00903.html

which I am attaching in git form (see first attached patch). I also 
propose the second attached patch as a followup. It makes some of the 
newly-added features "private" (since they don't seem to be generally 
useful) and moves the low-level initialization code from emacs.c to 
process.c which is a more-natural home for it.

[0001-Fix-server-name-and-server-socket-dir-for-Bug-24218.patch (text/x-patch, attachment)]
[0002-Minor-cleanups-for-server-name-fix-Bug-24218.patch (text/x-patch, attachment)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24218; Package emacs. (Mon, 08 Jan 2018 03:51:01 GMT) Full text and rfc822 format available.

Message #14 received at 24218 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: 24218 <at> debbugs.gnu.org, matthew <at> mattleach.net, lomov.vl <at> gmail.com
Subject: Re: bug#24218: 25.1.50;
 server-name, server-socket-dir and daemon start through, systemd
 socket
Date: Mon, 08 Jan 2018 05:50:25 +0200
> From: Paul Eggert <eggert <at> cs.ucla.edu>
> Date: Sun, 7 Jan 2018 13:55:04 -0800
> Cc: 24218 <at> debbugs.gnu.org, Vladimir Lomov <lomov.vl <at> gmail.com>
> 
> Matthew proposed a patch for this here:
> 
> https://lists.gnu.org/r/emacs-devel/2017-12/msg00903.html
> 
> which I am attaching in git form (see first attached patch). I also 
> propose the second attached patch as a followup. It makes some of the 
> newly-added features "private" (since they don't seem to be generally 
> useful) and moves the low-level initialization code from emacs.c to 
> process.c which is a more-natural home for it.

Thanks.  I'm not an expert on this stuff, so I have only minor
comments:

  . Please update the :version tag of server-name, to reflect the fact
    that its default value changes
  . This needs a NEWS entry, and I think the description of
    server-name in the manual should be updated to mention this
    facility
  . internal--external-sockname should be documented in the ELisp
    manual (a better name that doesn't use both "internal" and
    "external" will be appreciated)




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24218; Package emacs. (Mon, 08 Jan 2018 04:26:01 GMT) Full text and rfc822 format available.

Message #17 received at 24218 <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 24218 <at> debbugs.gnu.org, matthew <at> mattleach.net, lomov.vl <at> gmail.com
Subject: Re: bug#24218: 25.1.50; server-name, server-socket-dir and daemon
 start through, systemd socket
Date: Sun, 7 Jan 2018 20:24:57 -0800
Eli Zaretskii wrote:
>    . internal--external-sockname should be documented in the ELisp
>      manual (a better name that doesn't use both "internal" and
>      "external" will be appreciated)

The "internal--" prefix is intended to mean "for Emacs internal use only", i.e., 
that it should not be documented in the manual.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24218; Package emacs. (Mon, 08 Jan 2018 18:34:01 GMT) Full text and rfc822 format available.

Message #20 received at 24218 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: 24218 <at> debbugs.gnu.org, matthew <at> mattleach.net, lomov.vl <at> gmail.com
Subject: Re: bug#24218: 25.1.50; server-name, server-socket-dir and daemon
 start through, systemd socket
Date: Mon, 08 Jan 2018 20:33:04 +0200
> Cc: matthew <at> mattleach.net, 24218 <at> debbugs.gnu.org, lomov.vl <at> gmail.com
> From: Paul Eggert <eggert <at> cs.ucla.edu>
> Date: Sun, 7 Jan 2018 20:24:57 -0800
> 
> Eli Zaretskii wrote:
> >    . internal--external-sockname should be documented in the ELisp
> >      manual (a better name that doesn't use both "internal" and
> >      "external" will be appreciated)
> 
> The "internal--" prefix is intended to mean "for Emacs internal use only"

That's exactly why I made the comment about the name: IMO, this
variable's purpose is inconsistent with its being for internal use
only.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24218; Package emacs. (Mon, 08 Jan 2018 18:43:02 GMT) Full text and rfc822 format available.

Message #23 received at 24218 <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 24218 <at> debbugs.gnu.org, matthew <at> mattleach.net, lomov.vl <at> gmail.com
Subject: Re: bug#24218: 25.1.50; server-name, server-socket-dir and daemon
 start through, systemd socket
Date: Mon, 8 Jan 2018 10:42:28 -0800
On 01/08/2018 10:33 AM, Eli Zaretskii wrote:
> this
> variable's purpose is inconsistent with its being for internal use
> only.

What purpose do you see for the variable, other than its use in Emacs's 
own Lisp code?





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24218; Package emacs. (Mon, 08 Jan 2018 19:16:02 GMT) Full text and rfc822 format available.

Message #26 received at 24218 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: 24218 <at> debbugs.gnu.org, matthew <at> mattleach.net, lomov.vl <at> gmail.com
Subject: Re: bug#24218: 25.1.50; server-name, server-socket-dir and daemon
 start through, systemd socket
Date: Mon, 08 Jan 2018 21:14:53 +0200
> Cc: matthew <at> mattleach.net, 24218 <at> debbugs.gnu.org, lomov.vl <at> gmail.com
> From: Paul Eggert <eggert <at> cs.ucla.edu>
> Date: Mon, 8 Jan 2018 10:42:28 -0800
> 
> On 01/08/2018 10:33 AM, Eli Zaretskii wrote:
> > this
> > variable's purpose is inconsistent with its being for internal use
> > only.
> 
> What purpose do you see for the variable, other than its use in Emacs's 
> own Lisp code?

How many seconds do you think it will take Emacs hackers (in the good
meaning of the word) to discover this variable and start (ab)using it?




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24218; Package emacs. (Mon, 08 Jan 2018 19:24:01 GMT) Full text and rfc822 format available.

Message #29 received at 24218 <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 24218 <at> debbugs.gnu.org, matthew <at> mattleach.net, lomov.vl <at> gmail.com
Subject: Re: bug#24218: 25.1.50; server-name, server-socket-dir and daemon
 start through, systemd socket
Date: Mon, 8 Jan 2018 11:23:32 -0800
On 01/08/2018 11:14 AM, Eli Zaretskii wrote:
> How many seconds do you think it will take Emacs hackers (in the good
> meaning of the word) to discover this variable and start (ab)using it?

I don't think they'll need to use the variable, which is why I suggested 
that it be labeled as internal.





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24218; Package emacs. (Tue, 09 Jan 2018 19:56:02 GMT) Full text and rfc822 format available.

Message #32 received at 24218 <at> debbugs.gnu.org (full text, mbox):

From: Matthew Leach <matthew <at> mattleach.net>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 24218 <at> debbugs.gnu.org, lomov.vl <at> gmail.com, Paul Eggert <eggert <at> cs.ucla.edu>
Subject: Re: bug#24218: 25.1.50;
 server-name, server-socket-dir and daemon start through, systemd
 socket
Date: Tue, 09 Jan 2018 19:53:03 +0000
[Message part 1 (text/plain, inline)]
Eli Zaretskii <eliz <at> gnu.org> writes:

>> From: Paul Eggert <eggert <at> cs.ucla.edu>
>> Date: Sun, 7 Jan 2018 13:55:04 -0800
>> Cc: 24218 <at> debbugs.gnu.org, Vladimir Lomov <lomov.vl <at> gmail.com>
>> 
>> Matthew proposed a patch for this here:
>> 
>> https://lists.gnu.org/r/emacs-devel/2017-12/msg00903.html
>> 
>> which I am attaching in git form (see first attached patch). I also 
>> propose the second attached patch as a followup. It makes some of the 
>> newly-added features "private" (since they don't seem to be generally 
>> useful) and moves the low-level initialization code from emacs.c to 
>> process.c which is a more-natural home for it.

Thanks for the cleanup patch Paul!

>
> Thanks.  I'm not an expert on this stuff, so I have only minor
> comments:
>
>   . Please update the :version tag of server-name, to reflect the fact
>     that its default value changes
>   . This needs a NEWS entry, and I think the description of
>     server-name in the manual should be updated to mention this
>     facility

Please see the attached patch that should address these points.

>   
>   . internal--external-sockname should be documented in the ELisp
>   manual (a better name that doesn't use both "internal" and
>   "external" will be appreciated)

May I suggest `internal--daemon-sockname'?

Thanks,
-- 
Matt

[0001-Update-server-name-version-tag-and-document-sockname.patch (text/x-patch, inline)]
From 5dc51350e7e744f26236e0018112d2eed2dbcc93 Mon Sep 17 00:00:00 2001
From: Matthew Leach <matthew <at> mattleach.net>
Date: Tue, 9 Jan 2018 19:45:30 +0000
Subject: [PATCH] Update `server-name' :version tag and document sockname
 support

* lisp/server.el: (server-name): Update :version tag.
* etc/NEWS: Document that `server-name' and `server-socket-dir'
  automatically update.
* doc/misc.texi: (Emacs Server): Likewise.
---
 doc/emacs/misc.texi | 5 +++++
 etc/NEWS            | 3 +++
 lisp/server.el      | 2 +-
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/doc/emacs/misc.texi b/doc/emacs/misc.texi
index 633e1e881d..c9b8f08252 100644
--- a/doc/emacs/misc.texi
+++ b/doc/emacs/misc.texi
@@ -1654,6 +1654,11 @@ Emacs Server
 @samp{foo}.  The @code{emacsclient} program can specify a server by
 name, using the @samp{-s} option (@pxref{emacsclient Options}).
 
+  If Emacs is passed a socket by an external program --- for example
+by systemd socket activation --- the value of @code{server-name} and
+@code{server-socket-dir} is automatically updated to reflect the name
+and path of the socket.
+
   If you want to run multiple Emacs daemons (@pxref{Initial Options}),
 you can give each daemon its own server name like this:
 
diff --git a/etc/NEWS b/etc/NEWS
index f6f36dfc85..66cb0834c5 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -194,6 +194,9 @@ as new-style, bind the new variable 'force-new-style-backquotes' to t.
 
 * Lisp Changes in Emacs 27.1
 
+** The `server-name' and `server-socket-dir' variables are set when a
+socket has been pased to Emacs (Bug#24218).
+
 ** Internal parsing commands now use syntax-ppss and disregard
 open-paren-in-column-0-is-defun-start.  This affects mostly things like
 forward-comment, scan-sexps, and forward-sexp when parsing backward.
diff --git a/lisp/server.el b/lisp/server.el
index c867fde832..16b3f8e4e2 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -266,7 +266,7 @@ server-name
 changed while a server is running."
   :group 'server
   :type 'string
-  :version "23.1")
+  :version "27.1")
 
 ;; We do not use `temporary-file-directory' here, because emacsclient
 ;; does not read the init file.
-- 
2.15.1


Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24218; Package emacs. (Wed, 24 Jan 2018 23:01:02 GMT) Full text and rfc822 format available.

Message #35 received at 24218 <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Matthew Leach <matthew <at> mattleach.net>, Eli Zaretskii <eliz <at> gnu.org>
Cc: 24218 <at> debbugs.gnu.org, lomov.vl <at> gmail.com
Subject: Re: bug#24218: 25.1.50; server-name, server-socket-dir and daemon
 start through, systemd socket
Date: Wed, 24 Jan 2018 15:00:13 -0800
On 01/09/2018 11:53 AM, Matthew Leach wrote:
> May I suggest `internal--daemon-sockname'?

Yes, that sounds good. Can you prepare a patch along those lines? Sorry, 
I lost track of this bug report. It'd be nice if you could re-propose a 
self-contained set of patches that address all the issues raised so far. 
Thanks.





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24218; Package emacs. (Thu, 25 Jan 2018 19:59:01 GMT) Full text and rfc822 format available.

Message #38 received at 24218 <at> debbugs.gnu.org (full text, mbox):

From: Matthew Leach <matthew <at> 1e0.co.uk>
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: 24218 <at> debbugs.gnu.org, lomov.vl <at> gmail.com, Eli Zaretskii <eliz <at> gnu.org>
Subject: Re: bug#24218: 25.1.50;
 server-name, server-socket-dir and daemon start through, systemd
 socket
Date: Thu, 25 Jan 2018 19:34:03 +0000
[Message part 1 (text/plain, inline)]
Paul Eggert <eggert <at> cs.ucla.edu> writes:

> On 01/09/2018 11:53 AM, Matthew Leach wrote:
>> May I suggest `internal--daemon-sockname'?
>
> Yes, that sounds good. Can you prepare a patch along those lines?
> Sorry, I lost track of this bug report. It'd be nice if you could
> re-propose a self-contained set of patches that address all the issues
> raised so far. Thanks.

Sure, please see the attached patch series.

Thanks,
-- 
Matt
[0001-Fix-server-name-and-server-socket-dir-for-Bug-24218.patch (text/x-patch, inline)]
From e098a2dd17bf9a0701a58f2321c369380d81254e Mon Sep 17 00:00:00 2001
From: Matthew Leach <matthew <at> mattleach.net>
Date: Sun, 7 Jan 2018 13:47:12 -0800
Subject: [PATCH 1/4] Fix `server-name' and `server-socket-dir' for (Bug#24218)

* lisp/server.el: (server-external-socket-initialised): New
(server-name): Compute server name from `get-external-sockname'.
(server-socket-dir): Compute socket dir from
`get-external-sockname'.
(server-start): Don't check for existing server when an
uninitialised external socket has been passed to Emacs.
* src/emacs.c: (main): Obtain socket name via getsockname and pass
to `init_process_emacs'.
* src/lisp.h: (init_process_emacs): Add second parameter.
* src/process.c: (external_sock_name): New.
(get-external-sockname): New.
(init_process_emacs): Set `external_sock_name' to `sockname'
parameter.
---
 lisp/server.el | 56 ++++++++++++++++++++++++++++++++++++--------------------
 src/emacs.c    | 16 +++++++++++++---
 src/lisp.h     |  2 +-
 src/process.c  | 19 ++++++++++++++++++-
 4 files changed, 68 insertions(+), 25 deletions(-)

diff --git a/lisp/server.el b/lisp/server.el
index ac0d701851..e8b53530c9 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -251,8 +251,16 @@ server-existing-buffer
 are done with it in the server.")
 (make-variable-buffer-local 'server-existing-buffer)
 
-;;;###autoload
-(defcustom server-name "server"
+(defvar server-external-socket-initialised nil
+  "When an external socket is passed into Emacs, we need to call
+`server-start' in order to initialise the connection.  This flag
+prevents multiple initialisations when an external socket has
+been consumed.")
+
+(defcustom server-name
+  (if (get-external-sockname)
+      (file-name-nondirectory (get-external-sockname))
+    "server")
   "The name of the Emacs server, if this Emacs process creates one.
 The command `server-start' makes use of this.  It should not be
 changed while a server is running."
@@ -263,8 +271,10 @@ server-name
 ;; We do not use `temporary-file-directory' here, because emacsclient
 ;; does not read the init file.
 (defvar server-socket-dir
-  (and (featurep 'make-network-process '(:family local))
-       (format "%s/emacs%d" (or (getenv "TMPDIR") "/tmp") (user-uid)))
+  (if (get-external-sockname)
+      (file-name-directory (get-external-sockname))
+    (and (featurep 'make-network-process '(:family local))
+         (format "%s/emacs%d" (or (getenv "TMPDIR") "/tmp") (user-uid))))
   "The directory in which to place the server socket.
 If local sockets are not supported, this is nil.")
 
@@ -618,23 +628,29 @@ server-start
       (when server-process
 	;; kill it dead!
 	(ignore-errors (delete-process server-process)))
-      ;; Delete the socket files made by previous server invocations.
-      (if (not (eq t (server-running-p server-name)))
-	  ;; Remove any leftover socket or authentication file
-	  (ignore-errors
-	    (let (delete-by-moving-to-trash)
-	      (delete-file server-file)))
-	(setq server-mode nil) ;; already set by the minor mode code
-	(display-warning
-	 'server
-	 (concat "Unable to start the Emacs server.\n"
-		 (format "There is an existing Emacs server, named %S.\n"
-			 server-name)
-		 (substitute-command-keys
-                  "To start the server in this Emacs process, stop the existing
+      ;; Check to see if an uninitialised external socket has been
+      ;; passed in, if that is the case, skip checking
+      ;; `server-running-p' as this will return the wrong result.
+      (if (and (get-external-sockname)
+               (not server-external-socket-initialised))
+          (setq server-external-socket-initialised t)
+        ;; Delete the socket files made by previous server invocations.
+        (if (not (eq t (server-running-p server-name)))
+           ;; Remove any leftover socket or authentication file
+           (ignore-errors
+             (let (delete-by-moving-to-trash)
+               (delete-file server-file)))
+         (setq server-mode nil) ;; already set by the minor mode code
+         (display-warning
+          'server
+          (concat "Unable to start the Emacs server.\n"
+                  (format "There is an existing Emacs server, named %S.\n"
+                          server-name)
+                  (substitute-command-keys
+                    "To start the server in this Emacs process, stop the existing
 server or call `\\[server-force-delete]' to forcibly disconnect it."))
-	 :warning)
-	(setq leave-dead t))
+          :warning)
+         (setq leave-dead t)))
       ;; If this Emacs already had a server, clear out associated status.
       (while server-clients
 	(server-delete-client (car server-clients)))
diff --git a/src/emacs.c b/src/emacs.c
index 20ced26283..1af09166b6 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -60,6 +60,7 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #ifdef HAVE_LIBSYSTEMD
 # include <systemd/sd-daemon.h>
 # include <sys/socket.h>
+# include <sys/un.h>
 #endif
 
 #ifdef HAVE_WINDOW_SYSTEM
@@ -1002,6 +1003,7 @@ main (int argc, char **argv)
 
 
   int sockfd = -1;
+  char *sockname = NULL;
 
   if (argmatch (argv, argc, "-fg-daemon", "--fg-daemon", 10, NULL, &skip_args)
       || argmatch (argv, argc, "-fg-daemon", "--fg-daemon", 10, &dname_arg, &skip_args))
@@ -1061,8 +1063,16 @@ main (int argc, char **argv)
 		  "Try 'Accept=false' in the Emacs socket unit file.\n"));
       else if (systemd_socket == 1
 	       && (0 < sd_is_socket (SD_LISTEN_FDS_START,
-				     AF_UNSPEC, SOCK_STREAM, 1)))
-	sockfd = SD_LISTEN_FDS_START;
+				    AF_UNIX, SOCK_STREAM, 1)))
+	{
+	  struct sockaddr_un sockaddr;
+	  socklen_t sockaddr_sz = sizeof(sockaddr);
+
+	  sockfd = SD_LISTEN_FDS_START;
+
+	  if (!getsockname(sockfd, &sockaddr, &sockaddr_sz))
+	    sockname = strdup(sockaddr.sun_path);
+	}
 #endif /* HAVE_LIBSYSTEMD */
 
 #ifdef USE_GTK
@@ -1656,7 +1666,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem
   /* This can create a thread that may call getenv, so it must follow
      all calls to putenv and setenv.  Also, this sets up
      add_keyboard_wait_descriptor, which init_display uses.  */
-  init_process_emacs (sockfd);
+  init_process_emacs (sockfd, sockname);
 
   init_keyboard ();	/* This too must precede init_sys_modes.  */
   if (!noninteractive)
diff --git a/src/lisp.h b/src/lisp.h
index 3eb6e0d3c1..2e9002a226 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -4313,7 +4313,7 @@ extern void delete_keyboard_wait_descriptor (int);
 extern void add_gpm_wait_descriptor (int);
 extern void delete_gpm_wait_descriptor (int);
 #endif
-extern void init_process_emacs (int);
+extern void init_process_emacs (int, char *);
 extern void syms_of_process (void);
 extern void setup_process_coding_systems (Lisp_Object);
 
diff --git a/src/process.c b/src/process.c
index d4440e472d..da8e5714b0 100644
--- a/src/process.c
+++ b/src/process.c
@@ -276,6 +276,10 @@ static int max_desc;
    the file descriptor of a socket that is already bound.  */
 static int external_sock_fd;
 
+/* The name (path) of the socket that was passed to Emacs, when
+   `external_sock_fd' is not -1.  */
+static const char *external_sock_name = NULL;
+
 /* Indexed by descriptor, gives the process (if any) for that descriptor.  */
 static Lisp_Object chan_process[FD_SETSIZE];
 static void wait_for_socket_fds (Lisp_Object, char const *);
@@ -7974,10 +7978,21 @@ restore_nofile_limit (void)
 }
 
 
+DEFUN ("get-external-sockname", Fget_external_sockname, Sget_external_sockname, 0, 0, 0,
+       doc: /* Return the path of an external socket passed to Emacs.
+Otherwise return nil.  */)
+     (void)
+{
+    if (external_sock_name)
+        return make_string(external_sock_name, strlen(external_sock_name));
+    else
+        return Qnil;
+}
+
 /* This is not called "init_process" because that is the name of a
    Mach system call, so it would cause problems on Darwin systems.  */
 void
-init_process_emacs (int sockfd)
+init_process_emacs (int sockfd, char *sockname)
 {
 #ifdef subprocesses
   int i;
@@ -8012,6 +8027,7 @@ init_process_emacs (int sockfd)
 #endif
 
   external_sock_fd = sockfd;
+  external_sock_name = sockname;
   max_desc = -1;
   memset (fd_callback_info, 0, sizeof (fd_callback_info));
 
@@ -8306,4 +8322,5 @@ returns non-`nil'.  */);
   defsubr (&Sprocess_inherit_coding_system_flag);
   defsubr (&Slist_system_processes);
   defsubr (&Sprocess_attributes);
+  defsubr (&Sget_external_sockname);
 }
-- 
2.16.1

[0002-Minor-cleanups-for-server-name-fix-Bug-24218.patch (text/x-patch, inline)]
From a4872a8e24027a0c8cc925140c3d3cda95c096e1 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert <at> cs.ucla.edu>
Date: Sun, 7 Jan 2018 13:47:12 -0800
Subject: [PATCH 2/4] Minor cleanups for server-name fix (Bug#24218)

* lisp/server.el (server--external-socket-initialized): Rename
from server-external-socket-initialised, since it should be
private and Emacs uses American spelling.  All uses changed.
* src/emacs.c, src/lisp.h: Revert previous changes, as the
initialization is now done in src/process.c, which already
includes the relevant files.
* src/process.c (union u_sockaddr): Move decl to top level.
(external_sock_name, Fget_external_sockname): Remove, replacing
with Vinternal__external_sockname.  All uses changed.
(init_process_emacs): Deduce socket name ourselves rather than
have main.c do it.  Use conv_sockaddr_to_lisp instead of doing
it by hand.  Conditionalize it on HAVE_GETSOCKNAME.
---
 lisp/server.el | 24 ++++++++++++------------
 src/emacs.c    | 16 +++-------------
 src/lisp.h     |  2 +-
 src/process.c  | 58 ++++++++++++++++++++++++++++++----------------------------
 4 files changed, 46 insertions(+), 54 deletions(-)

diff --git a/lisp/server.el b/lisp/server.el
index e8b53530c9..c867fde832 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -251,15 +251,15 @@ server-existing-buffer
 are done with it in the server.")
 (make-variable-buffer-local 'server-existing-buffer)
 
-(defvar server-external-socket-initialised nil
+(defvar server--external-socket-initialized nil
   "When an external socket is passed into Emacs, we need to call
-`server-start' in order to initialise the connection.  This flag
-prevents multiple initialisations when an external socket has
+`server-start' in order to initialize the connection.  This flag
+prevents multiple initializations when an external socket has
 been consumed.")
 
 (defcustom server-name
-  (if (get-external-sockname)
-      (file-name-nondirectory (get-external-sockname))
+  (if internal--external-sockname
+      (file-name-nondirectory internal--external-sockname)
     "server")
   "The name of the Emacs server, if this Emacs process creates one.
 The command `server-start' makes use of this.  It should not be
@@ -271,8 +271,8 @@ server-name
 ;; We do not use `temporary-file-directory' here, because emacsclient
 ;; does not read the init file.
 (defvar server-socket-dir
-  (if (get-external-sockname)
-      (file-name-directory (get-external-sockname))
+  (if internal--external-sockname
+      (file-name-directory internal--external-sockname)
     (and (featurep 'make-network-process '(:family local))
          (format "%s/emacs%d" (or (getenv "TMPDIR") "/tmp") (user-uid))))
   "The directory in which to place the server socket.
@@ -628,15 +628,15 @@ server-start
       (when server-process
 	;; kill it dead!
 	(ignore-errors (delete-process server-process)))
-      ;; Check to see if an uninitialised external socket has been
+      ;; Check to see if an uninitialized external socket has been
       ;; passed in, if that is the case, skip checking
       ;; `server-running-p' as this will return the wrong result.
-      (if (and (get-external-sockname)
-               (not server-external-socket-initialised))
-          (setq server-external-socket-initialised t)
+      (if (and internal--external-sockname
+               (not server--external-socket-initialized))
+          (setq server--external-socket-initialized t)
         ;; Delete the socket files made by previous server invocations.
         (if (not (eq t (server-running-p server-name)))
-           ;; Remove any leftover socket or authentication file
+           ;; Remove any leftover socket or authentication file.
            (ignore-errors
              (let (delete-by-moving-to-trash)
                (delete-file server-file)))
diff --git a/src/emacs.c b/src/emacs.c
index 1af09166b6..20ced26283 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -60,7 +60,6 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #ifdef HAVE_LIBSYSTEMD
 # include <systemd/sd-daemon.h>
 # include <sys/socket.h>
-# include <sys/un.h>
 #endif
 
 #ifdef HAVE_WINDOW_SYSTEM
@@ -1003,7 +1002,6 @@ main (int argc, char **argv)
 
 
   int sockfd = -1;
-  char *sockname = NULL;
 
   if (argmatch (argv, argc, "-fg-daemon", "--fg-daemon", 10, NULL, &skip_args)
       || argmatch (argv, argc, "-fg-daemon", "--fg-daemon", 10, &dname_arg, &skip_args))
@@ -1063,16 +1061,8 @@ main (int argc, char **argv)
 		  "Try 'Accept=false' in the Emacs socket unit file.\n"));
       else if (systemd_socket == 1
 	       && (0 < sd_is_socket (SD_LISTEN_FDS_START,
-				    AF_UNIX, SOCK_STREAM, 1)))
-	{
-	  struct sockaddr_un sockaddr;
-	  socklen_t sockaddr_sz = sizeof(sockaddr);
-
-	  sockfd = SD_LISTEN_FDS_START;
-
-	  if (!getsockname(sockfd, &sockaddr, &sockaddr_sz))
-	    sockname = strdup(sockaddr.sun_path);
-	}
+				     AF_UNSPEC, SOCK_STREAM, 1)))
+	sockfd = SD_LISTEN_FDS_START;
 #endif /* HAVE_LIBSYSTEMD */
 
 #ifdef USE_GTK
@@ -1666,7 +1656,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem
   /* This can create a thread that may call getenv, so it must follow
      all calls to putenv and setenv.  Also, this sets up
      add_keyboard_wait_descriptor, which init_display uses.  */
-  init_process_emacs (sockfd, sockname);
+  init_process_emacs (sockfd);
 
   init_keyboard ();	/* This too must precede init_sys_modes.  */
   if (!noninteractive)
diff --git a/src/lisp.h b/src/lisp.h
index 2e9002a226..3eb6e0d3c1 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -4313,7 +4313,7 @@ extern void delete_keyboard_wait_descriptor (int);
 extern void add_gpm_wait_descriptor (int);
 extern void delete_gpm_wait_descriptor (int);
 #endif
-extern void init_process_emacs (int, char *);
+extern void init_process_emacs (int);
 extern void syms_of_process (void);
 extern void setup_process_coding_systems (Lisp_Object);
 
diff --git a/src/process.c b/src/process.c
index da8e5714b0..2613dd2be0 100644
--- a/src/process.c
+++ b/src/process.c
@@ -160,6 +160,18 @@ static bool kbd_is_on_hold;
    when exiting.  */
 bool inhibit_sentinels;
 
+union u_sockaddr
+{
+  struct sockaddr sa;
+  struct sockaddr_in in;
+#ifdef AF_INET6
+  struct sockaddr_in6 in6;
+#endif
+#ifdef HAVE_LOCAL_SOCKETS
+  struct sockaddr_un un;
+#endif
+};
+
 #ifdef subprocesses
 
 #ifndef SOCK_CLOEXEC
@@ -276,10 +288,6 @@ static int max_desc;
    the file descriptor of a socket that is already bound.  */
 static int external_sock_fd;
 
-/* The name (path) of the socket that was passed to Emacs, when
-   `external_sock_fd' is not -1.  */
-static const char *external_sock_name = NULL;
-
 /* Indexed by descriptor, gives the process (if any) for that descriptor.  */
 static Lisp_Object chan_process[FD_SETSIZE];
 static void wait_for_socket_fds (Lisp_Object, char const *);
@@ -4679,16 +4687,7 @@ server_accept_connection (Lisp_Object server, int channel)
   struct Lisp_Process *ps = XPROCESS (server);
   struct Lisp_Process *p;
   int s;
-  union u_sockaddr {
-    struct sockaddr sa;
-    struct sockaddr_in in;
-#ifdef AF_INET6
-    struct sockaddr_in6 in6;
-#endif
-#ifdef HAVE_LOCAL_SOCKETS
-    struct sockaddr_un un;
-#endif
-  } saddr;
+  union u_sockaddr saddr;
   socklen_t len = sizeof saddr;
   ptrdiff_t count;
 
@@ -7978,21 +7977,10 @@ restore_nofile_limit (void)
 }
 
 
-DEFUN ("get-external-sockname", Fget_external_sockname, Sget_external_sockname, 0, 0, 0,
-       doc: /* Return the path of an external socket passed to Emacs.
-Otherwise return nil.  */)
-     (void)
-{
-    if (external_sock_name)
-        return make_string(external_sock_name, strlen(external_sock_name));
-    else
-        return Qnil;
-}
-
 /* This is not called "init_process" because that is the name of a
    Mach system call, so it would cause problems on Darwin systems.  */
 void
-init_process_emacs (int sockfd, char *sockname)
+init_process_emacs (int sockfd)
 {
 #ifdef subprocesses
   int i;
@@ -8027,7 +8015,18 @@ init_process_emacs (int sockfd, char *sockname)
 #endif
 
   external_sock_fd = sockfd;
-  external_sock_name = sockname;
+  Lisp_Object sockname = Qnil;
+# if HAVE_GETSOCKNAME
+  if (0 <= sockfd)
+    {
+      union u_sockaddr sa;
+      socklen_t salen = sizeof sa;
+      if (getsockname (sockfd, &sa.sa, &salen) == 0)
+	sockname = conv_sockaddr_to_lisp (&sa.sa, salen);
+    }
+# endif
+  Vinternal__external_sockname = sockname;
+
   max_desc = -1;
   memset (fd_callback_info, 0, sizeof (fd_callback_info));
 
@@ -8220,6 +8219,10 @@ These functions are called in the order of the list, until one of them
 returns non-`nil'.  */);
   Vinterrupt_process_functions = list1 (Qinternal_default_interrupt_process);
 
+  DEFVAR_LISP ("internal--external-sockname", Vinternal__external_sockname,
+	       doc: /* Name of external socket passed to Emacs, or nil if none.  */);
+  Vinternal__external_sockname = Qnil;
+
   DEFSYM (Qinternal_default_interrupt_process,
 	  "internal-default-interrupt-process");
   DEFSYM (Qinterrupt_process_functions, "interrupt-process-functions");
@@ -8322,5 +8325,4 @@ returns non-`nil'.  */);
   defsubr (&Sprocess_inherit_coding_system_flag);
   defsubr (&Slist_system_processes);
   defsubr (&Sprocess_attributes);
-  defsubr (&Sget_external_sockname);
 }
-- 
2.16.1

[0003-Update-server-name-version-document-sockname-Bug-242.patch (text/x-patch, inline)]
From 6a82f66d62e2669335419815504a276facfe0bf2 Mon Sep 17 00:00:00 2001
From: Matthew Leach <matthew <at> mattleach.net>
Date: Tue, 9 Jan 2018 19:45:30 +0000
Subject: [PATCH 3/4] Update `server-name' :version & document sockname
 (Bug#24218)

* lisp/server.el: (server-name): Update :version tag.
* etc/NEWS: Document that `server-name' and `server-socket-dir'
  automatically update.
* doc/misc.texi: (Emacs Server): Likewise.
---
 doc/emacs/misc.texi | 5 +++++
 etc/NEWS            | 3 +++
 lisp/server.el      | 2 +-
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/doc/emacs/misc.texi b/doc/emacs/misc.texi
index 633e1e881d..c9b8f08252 100644
--- a/doc/emacs/misc.texi
+++ b/doc/emacs/misc.texi
@@ -1654,6 +1654,11 @@ Emacs Server
 @samp{foo}.  The @code{emacsclient} program can specify a server by
 name, using the @samp{-s} option (@pxref{emacsclient Options}).
 
+  If Emacs is passed a socket by an external program --- for example
+by systemd socket activation --- the value of @code{server-name} and
+@code{server-socket-dir} is automatically updated to reflect the name
+and path of the socket.
+
   If you want to run multiple Emacs daemons (@pxref{Initial Options}),
 you can give each daemon its own server name like this:
 
diff --git a/etc/NEWS b/etc/NEWS
index f6f36dfc85..66cb0834c5 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -194,6 +194,9 @@ as new-style, bind the new variable 'force-new-style-backquotes' to t.
 
 * Lisp Changes in Emacs 27.1
 
+** The `server-name' and `server-socket-dir' variables are set when a
+socket has been pased to Emacs (Bug#24218).
+
 ** Internal parsing commands now use syntax-ppss and disregard
 open-paren-in-column-0-is-defun-start.  This affects mostly things like
 forward-comment, scan-sexps, and forward-sexp when parsing backward.
diff --git a/lisp/server.el b/lisp/server.el
index c867fde832..16b3f8e4e2 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -266,7 +266,7 @@ server-name
 changed while a server is running."
   :group 'server
   :type 'string
-  :version "23.1")
+  :version "27.1")
 
 ;; We do not use `temporary-file-directory' here, because emacsclient
 ;; does not read the init file.
-- 
2.16.1

[0004-Rename-internal-external-sockname-and-document-Bug-2.patch (text/x-patch, inline)]
From 6bc1562dfc674df50f4947653be6e1a4cd436ccf Mon Sep 17 00:00:00 2001
From: Matthew Leach <matthew <at> mattleach.net>
Date: Thu, 25 Jan 2018 19:24:14 +0000
Subject: [PATCH 4/4] Rename internal--external-sockname and document
 (Bug#24218)

* lisp/server.el: Rename `internal--external-sockname' to
  `internal-daemon-sockname'.
* src/process.c: Likewise.
* doc/lispref/processes.texi: Document `internal-daemon-sockname'.
---
 doc/lispref/processes.texi | 17 ++++++++++++++---
 lisp/server.el             | 10 +++++-----
 src/process.c              |  6 +++---
 3 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/doc/lispref/processes.texi b/doc/lispref/processes.texi
index 8a8425cb84..7f078e950f 100644
--- a/doc/lispref/processes.texi
+++ b/doc/lispref/processes.texi
@@ -2860,9 +2860,9 @@ Network Feature Testing
 @node Misc Network
 @section Misc Network Facilities
 
-  These additional functions are useful for creating and operating
-on network connections.  Note that they are supported only on some
-systems.
+  These additional functions and variables are useful for creating and
+operating on network connections.  Note that they are supported only
+on some systems.
 
 @defun network-interface-list
 This function returns a list describing the network interfaces
@@ -2911,6 +2911,17 @@ Misc Network
 @code{:@var{p}} suffix.
 @end defun
 
+@defvar internal--daemon-sockname
+This variable is set to the full path of the socket that has been
+passed to Emacs during socket activation.  This is then used to update
+the @code{server-name} and @code{server-socket-dir} variables to
+reflect the name and path of the socket that was used to launch the
+Emacs daemon process.
+
+If Emacs wasn't started with socket activation, the value of this
+variable is @code{nil}.
+@end defvar
+
 @node Serial Ports
 @section Communicating with Serial Ports
 @cindex @file{/dev/tty}
diff --git a/lisp/server.el b/lisp/server.el
index 16b3f8e4e2..4e0afa26f9 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -258,8 +258,8 @@ server--external-socket-initialized
 been consumed.")
 
 (defcustom server-name
-  (if internal--external-sockname
-      (file-name-nondirectory internal--external-sockname)
+  (if internal-daemon-sockname
+      (file-name-nondirectory internal-daemon-sockname)
     "server")
   "The name of the Emacs server, if this Emacs process creates one.
 The command `server-start' makes use of this.  It should not be
@@ -271,8 +271,8 @@ server-name
 ;; We do not use `temporary-file-directory' here, because emacsclient
 ;; does not read the init file.
 (defvar server-socket-dir
-  (if internal--external-sockname
-      (file-name-directory internal--external-sockname)
+  (if internal-daemon-sockname
+      (file-name-directory internal-daemon-sockname)
     (and (featurep 'make-network-process '(:family local))
          (format "%s/emacs%d" (or (getenv "TMPDIR") "/tmp") (user-uid))))
   "The directory in which to place the server socket.
@@ -631,7 +631,7 @@ server-start
       ;; Check to see if an uninitialized external socket has been
       ;; passed in, if that is the case, skip checking
       ;; `server-running-p' as this will return the wrong result.
-      (if (and internal--external-sockname
+      (if (and internal-daemon-sockname
                (not server--external-socket-initialized))
           (setq server--external-socket-initialized t)
         ;; Delete the socket files made by previous server invocations.
diff --git a/src/process.c b/src/process.c
index 2613dd2be0..48854e24b4 100644
--- a/src/process.c
+++ b/src/process.c
@@ -8025,7 +8025,7 @@ init_process_emacs (int sockfd)
 	sockname = conv_sockaddr_to_lisp (&sa.sa, salen);
     }
 # endif
-  Vinternal__external_sockname = sockname;
+  Vinternal_daemon_sockname = sockname;
 
   max_desc = -1;
   memset (fd_callback_info, 0, sizeof (fd_callback_info));
@@ -8219,9 +8219,9 @@ These functions are called in the order of the list, until one of them
 returns non-`nil'.  */);
   Vinterrupt_process_functions = list1 (Qinternal_default_interrupt_process);
 
-  DEFVAR_LISP ("internal--external-sockname", Vinternal__external_sockname,
+  DEFVAR_LISP ("internal-daemon-sockname", Vinternal_daemon_sockname,
 	       doc: /* Name of external socket passed to Emacs, or nil if none.  */);
-  Vinternal__external_sockname = Qnil;
+  Vinternal_daemon_sockname = Qnil;
 
   DEFSYM (Qinternal_default_interrupt_process,
 	  "internal-default-interrupt-process");
-- 
2.16.1


Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24218; Package emacs. (Sat, 10 Feb 2018 16:09:02 GMT) Full text and rfc822 format available.

Message #41 received at 24218 <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Matthew Leach <matthew <at> 1e0.co.uk>
Cc: 24218 <at> debbugs.gnu.org, lomov.vl <at> gmail.com, Eli Zaretskii <eliz <at> gnu.org>
Subject: Re: bug#24218: 25.1.50; server-name, server-socket-dir and daemon
 start through, systemd socket
Date: Sat, 10 Feb 2018 08:07:47 -0800
[Message part 1 (text/plain, inline)]
Matthew Leach wrote:
> Paul Eggert <eggert <at> cs.ucla.edu> writes:
> 
>> On 01/09/2018 11:53 AM, Matthew Leach wrote:
>>> May I suggest `internal--daemon-sockname'?
>>
>> Yes, that sounds good. Can you prepare a patch along those lines?
> 
> Sure, please see the attached patch series.

Thanks, but aren't there some more places where the variable needs to be renamed 
to internal--daemon-sockname? Also, I would rather not document it in the Emacs 
Lisp reference manual, as it is an internal detail that outside code shouldn't 
depend on. Proposed further patch attached (it's the last of the attachments, 
which contain all the patches for this bug).


[0001-Fix-server-name-and-server-socket-dir-for-Bug-24218.patch (text/x-patch, attachment)]
[0002-Minor-cleanups-for-server-name-fix-Bug-24218.patch (text/x-patch, attachment)]
[0003-Update-server-name-version-document-sockname-Bug-242.patch (text/x-patch, attachment)]
[0004-Rename-internal-external-sockname-and-document-Bug-2.patch (text/x-patch, attachment)]
[0005-Finish-renaming-to-internal-daemon-sockname.patch (text/x-patch, attachment)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24218; Package emacs. (Mon, 12 Feb 2018 14:28:02 GMT) Full text and rfc822 format available.

Message #44 received at 24218 <at> debbugs.gnu.org (full text, mbox):

From: Matthew Leach <matthew <at> mattleach.net>
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: 24218 <at> debbugs.gnu.org, lomov.vl <at> gmail.com
Subject: Re: bug#24218: 25.1.50;
 server-name, server-socket-dir and daemon start through, systemd
 socket
Date: Mon, 12 Feb 2018 14:24:06 +0000
Paul Eggert <eggert <at> cs.ucla.edu> writes:

> Matthew Leach wrote:
>> Paul Eggert <eggert <at> cs.ucla.edu> writes:
>>
>>> On 01/09/2018 11:53 AM, Matthew Leach wrote:
>>>> May I suggest `internal--daemon-sockname'?
>>>
>>> Yes, that sounds good. Can you prepare a patch along those lines?
>>
>> Sure, please see the attached patch series.
>
> Thanks, but aren't there some more places where the variable needs to
> be renamed to internal--daemon-sockname?

Oops - I missed an additional `-' on the variable name.

> Also, I would rather not document it in the Emacs Lisp reference
> manual, as it is an internal detail that outside code shouldn't depend
> on. 

That sounds fine; I wasn't aware that internal variables shouldn't be
documented in the Emacs List Reference Manual.

> Proposed further patch attached (it's the last of the attachments,
> which contain all the patches for this bug).

This last patch looks good to me.

Thanks,
-- 
Matt




Reply sent to Paul Eggert <eggert <at> cs.ucla.edu>:
You have taken responsibility. (Mon, 12 Feb 2018 20:59:02 GMT) Full text and rfc822 format available.

Notification sent to Vladimir Lomov <lomov.vl <at> gmail.com>:
bug acknowledged by developer. (Mon, 12 Feb 2018 20:59:02 GMT) Full text and rfc822 format available.

Message #49 received at 24218-done <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Matthew Leach <matthew <at> mattleach.net>
Cc: 24218-done <at> debbugs.gnu.org, lomov.vl <at> gmail.com
Subject: Re: bug#24218: 25.1.50; server-name, server-socket-dir and daemon
 start through, systemd socket
Date: Mon, 12 Feb 2018 12:58:33 -0800
On 02/12/2018 06:24 AM, Matthew Leach wrote:
> This last patch looks good to me.

Thanks for checking; I installed the patches into 'master' and am 
marking this bug as done.





bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Tue, 13 Mar 2018 11:24:04 GMT) Full text and rfc822 format available.

This bug report was last modified 6 years and 45 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.