Commit f9acac75 authored by Paul Eggert's avatar Paul Eggert

system-name's returned value can vary

Also, the system-name variable is now obsolete.
Fixes Bug#19438.
* doc/lispref/os.texi (System Environment):
* etc/NEWS: Document this.
* doc/misc/efaq.texi:
(Displaying the current file name in the titlebar):
* lisp/desktop.el (desktop-save-frameset):
* lisp/dnd.el (dnd-get-local-file-uri):
* lisp/gnus/message.el (message-make-fqdn):
* lisp/gnus/nnvirtual.el (nnvirtual-retrieve-headers)
(nnvirtual-update-xref-header):
* lisp/nxml/rng-uri.el (rng-uri-file-name-1):
* lisp/org/org-clock.el (org-clock-save):
* src/filelock.c (current_lock_owner):
* src/xrdb.c (get_environ_db):
* src/xterm.c (same_x_server):
* src/xterm.c (x_term_init):
Prefer (system-name) to system-name, and avoid naming
locals 'system-name'.
* doc/misc/smtpmail.texi (Server workarounds): Fix grammar.
* lisp/startup.el (system-name): Now an obsolete variable.
* src/editfns.c (cached_system_name): New static var.
(init_and_cache_system_name): New function.
(init_editfns, Fsystem_name): Use it.
(syms_of_editfns): Initialize it and Vsystem_name to the same value.
* src/sysdep.c [HAVE_SOCKETS]: Don't include <sys/socket.h>, <netdb.h>.
(h_errno) [TRY_AGAIN && !HAVE_H_ERRNO]: Remove decl.
(init_system_name) [HAVE_SOCKETS]: Don't canonicalize the name.
Don't create a new string if the current value is already correct.
parent ce1ebdf1
2014-12-29 Paul Eggert <eggert@cs.ucla.edu>
system-name's returned value can vary
Fixes Bug#19438.
* doc/lispref/os.texi (System Environment):
* etc/NEWS: Document this.
* doc/misc/efaq.texi:
(Displaying the current file name in the titlebar):
* lisp/desktop.el (desktop-save-frameset):
* lisp/dnd.el (dnd-get-local-file-uri):
* lisp/gnus/nnvirtual.el (nnvirtual-retrieve-headers)
(nnvirtual-update-xref-header):
* lisp/nxml/rng-uri.el (rng-uri-file-name-1):
* lisp/org/org-clock.el (org-clock-save):
* src/filelock.c (current_lock_owner):
* src/xrdb.c (get_environ_db):
* src/xterm.c (same_x_server):
* src/xterm.c (x_term_init):
Prefer (system-name) to system-name.
* doc/misc/smtpmail.texi (Server workarounds): Fix grammar.
* src/editfns.c (cached_system_name): New static var.
(init_and_cache_system_name): New function.
(init_editfns, Fsystem_name): Use it.
(syms_of_editfns): Initialize it and Vsystem_name to the same value.
* src/sysdep.c (init_system_name): Don't create a new string if
the current value is already correct.
2014-12-28 Paul Eggert <eggert@cs.ucla.edu>
* build-aux/git-hooks/commit-msg: Allow tabs.
......
......@@ -918,10 +918,15 @@ string.
@end defun
The symbol @code{system-name} is a variable as well as a function. In
fact, the function returns whatever value the variable
fact, the function normally returns whatever value the variable
@code{system-name} currently holds. Thus, you can set the variable
@code{system-name} in case Emacs is confused about the name of your
system. The variable is also useful for constructing frame titles
system. If you do not set the variable, the function updates
the variable to the current system name; this behavior can be useful
if your Emacs process has changed systems or if the system has changed
names.
The @code{system-name} variable is also useful for constructing frame titles
(@pxref{Frame Titles}).
@c FIXME seems like this section is not the best place for this option?
......
......@@ -1469,7 +1469,7 @@ machine at which Emacs was invoked. This is done by setting
@code{frame-title-format} to the default value of
@lisp
(multiple-frames "%b" ("" invocation-name "@@" system-name))
(multiple-frames "%b" ("" invocation-name "@@" (system-name)))
@end lisp
To modify the behavior such that frame titlebars contain the buffer's
......
......@@ -368,7 +368,7 @@ implement support for common requirements.
@vindex smtpmail-local-domain
The variable @code{smtpmail-local-domain} controls the hostname sent
in the first @code{EHLO} or @code{HELO} command sent to the server.
It should only be set if the @code{system-name} function returns a
It should be set only if the @code{system-name} function returns a
name that isn't accepted by the server. Do not set this variable
unless your server complains.
......
......@@ -541,6 +541,9 @@ optional repeat-count argument.
** Function `sort' can deal with vectors.
** Function `system-name' now returns an updated value if the current
system's name has changed, or if the Emacs process has changed systems.
---
** New utilities in subr-x.el:
*** New macros `if-let' and `when-let' allow defining bindings and to
......
......@@ -940,7 +940,7 @@ Frames with a non-nil `desktop-dont-save' parameter are not saved."
(and desktop-restore-frames
(frameset-save nil
:app desktop--app-id
:name (concat user-login-name "@" system-name)
:name (concat user-login-name "@" (system-name))
:predicate #'desktop--check-dont-save))))
;;;###autoload
......
......@@ -122,17 +122,18 @@ Return nil if URI is not a local file."
;; The hostname may be our hostname, in that case, convert to a local
;; file. Otherwise return nil. TODO: How about an IP-address as hostname?
(let ((hostname (when (string-match "^file://\\([^/]*\\)" uri)
(let ((system-name (system-name)))
(let ((hostname (when (string-match "^file://\\([^/]*\\)" uri)
(downcase (match-string 1 uri))))
(system-name-no-dot
(downcase (if (string-match "^[^\\.]+" system-name)
(match-string 0 system-name)
system-name))))
(when (and hostname
(or (string-equal "localhost" hostname)
(string-equal (downcase system-name) hostname)
(string-equal system-name-no-dot hostname)))
(concat "file://" (substring uri (+ 7 (length hostname)))))))
(system-name-no-dot
(downcase (if (string-match "^[^\\.]+" system-name)
(match-string 0 system-name)
system-name))))
(when (and hostname
(or (string-equal "localhost" hostname)
(string-equal (downcase system-name) hostname)
(string-equal system-name-no-dot hostname)))
(concat "file://" (substring uri (+ 7 (length hostname))))))))
(defsubst dnd-unescape-uri (uri)
(replace-regexp-in-string
......
......@@ -151,7 +151,7 @@ component group will show up when you enter the virtual group.")
;; and clean up the xrefs.
(princ article nntp-server-buffer)
(nnvirtual-update-xref-header cgroup carticle
prefix system-name)
prefix (system-name))
(forward-line 1))
)
......@@ -393,7 +393,7 @@ component group will show up when you enter the virtual group.")
(forward-char -1)
(delete-char 1))
(insert "Xref: " system-name " " group ":")
(insert "Xref: " (system-name) " " group ":")
(princ article (current-buffer))
(insert " ")
......
......@@ -85,7 +85,7 @@ Signal an error if URI is not a valid file URL."
((not (string= (downcase scheme) "file"))
(rng-uri-error "URI `%s' does not use the `file:' scheme" uri)))
(when (not (member authority
(cons system-name '(nil "" "localhost"))))
(cons (system-name) '(nil "" "localhost"))))
(rng-uri-error "URI `%s' does not start with `file:///' or `file://localhost/'"
uri))
(when query
......
......@@ -2811,8 +2811,8 @@ The details of what will be saved are regulated by the variable
(delete-region (point-min) (point-max))
;;Store clock
(insert (format ";; org-persist.el - %s at %s\n"
system-name (format-time-string
(cdr org-time-stamp-formats))))
(system-name) (format-time-string
(cdr org-time-stamp-formats))))
(if (and (memq org-clock-persist '(t clock))
(setq b (org-clocking-buffer))
(setq b (or (buffer-base-buffer b) b))
......
......@@ -93,6 +93,17 @@ static char const *initial_tz;
It is OK (though a bit slower) if the user chooses this value. */
static char dump_tz_string[] = "TZ=UtC0";
/* The cached value of Vsystem_name. This is used only to compare it
to Vsystem_name, so it need not be visible to the GC. */
static Lisp_Object cached_system_name;
static void
init_and_cache_system_name (void)
{
init_system_name ();
cached_system_name = Vsystem_name;
}
void
init_editfns (void)
{
......@@ -102,7 +113,7 @@ init_editfns (void)
Lisp_Object tem;
/* Set up system_name even when dumping. */
init_system_name ();
init_and_cache_system_name ();
#ifndef CANNOT_DUMP
/* When just dumping out, set the time zone to a known unlikely value
......@@ -1365,6 +1376,8 @@ DEFUN ("system-name", Fsystem_name, Ssystem_name, 0, 0, 0,
doc: /* Return the host name of the machine you are running on, as a string. */)
(void)
{
if (EQ (Vsystem_name, cached_system_name))
init_and_cache_system_name ();
return Vsystem_name;
}
......@@ -4965,6 +4978,7 @@ functions if all the text being accessed has this property. */);
DEFVAR_LISP ("system-name", Vsystem_name,
doc: /* The host name of the machine Emacs is running on. */);
Vsystem_name = cached_system_name = Qnil;
DEFVAR_LISP ("user-full-name", Vuser_full_name,
doc: /* The full name of the user logged in. */);
......
......@@ -592,9 +592,10 @@ current_lock_owner (lock_info_type *owner, char *lfname)
return -1;
/* On current host? */
if (STRINGP (Vsystem_name)
&& dot - (at + 1) == SBYTES (Vsystem_name)
&& memcmp (at + 1, SSDATA (Vsystem_name), SBYTES (Vsystem_name)) == 0)
Lisp_Object system_name = Fsystem_name ();
if (STRINGP (system_name)
&& dot - (at + 1) == SBYTES (system_name)
&& memcmp (at + 1, SSDATA (system_name), SBYTES (system_name)) == 0)
{
if (pid == getpid ())
ret = 2; /* We own it. */
......
......@@ -1420,15 +1420,16 @@ extern int h_errno;
void
init_system_name (void)
{
char *hostname_alloc = NULL;
char *hostname;
#ifndef HAVE_GETHOSTNAME
struct utsname uts;
uname (&uts);
Vsystem_name = build_string (uts.nodename);
hostname = uts.nodename;
#else /* HAVE_GETHOSTNAME */
char *hostname_alloc = NULL;
char hostname_buf[256];
ptrdiff_t hostname_size = sizeof hostname_buf;
char *hostname = hostname_buf;
hostname = hostname_buf;
/* Try to get the host name; if the buffer is too short, try
again. Apparently, the only indication gethostname gives of
......@@ -1541,15 +1542,15 @@ init_system_name (void)
#endif /* !HAVE_GETADDRINFO */
}
#endif /* HAVE_SOCKETS */
Vsystem_name = build_string (hostname);
xfree (hostname_alloc);
#endif /* HAVE_GETHOSTNAME */
{
char *p;
for (p = SSDATA (Vsystem_name); *p; p++)
if (*p == ' ' || *p == '\t')
*p = '-';
}
char *p;
for (p = hostname; *p; p++)
if (*p == ' ' || *p == '\t')
*p = '-';
if (! (STRINGP (Vsystem_name) && SBYTES (Vsystem_name) == p - hostname
&& strcmp (SSDATA (Vsystem_name), hostname) == 0))
Vsystem_name = build_string (hostname);
xfree (hostname_alloc);
}
sigset_t empty_mask;
......
......@@ -385,10 +385,11 @@ get_environ_db (void)
{
char *home = gethomedir ();
ptrdiff_t homelen = strlen (home);
Lisp_Object system_name = Fsystem_name ();
ptrdiff_t filenamesize = (homelen + sizeof xdefaults
+ SBYTES (Vsystem_name));
+ SBYTES (system_name));
p = filename = xrealloc (home, filenamesize);
lispstpcpy (stpcpy (filename + homelen, xdefaults), Vsystem_name);
lispstpcpy (stpcpy (filename + homelen, xdefaults), system_name);
}
db = XrmGetFileDatabase (p);
......
......@@ -10497,8 +10497,9 @@ static bool
same_x_server (const char *name1, const char *name2)
{
bool seen_colon = false;
const char *system_name = SSDATA (Vsystem_name);
ptrdiff_t system_name_length = SBYTES (Vsystem_name);
Lisp_Object sysname = Fsystem_name ();
const char *system_name = SSDATA (sysname);
ptrdiff_t system_name_length = SBYTES (sysname);
ptrdiff_t length_until_period = 0;
while (system_name[length_until_period] != 0
......@@ -10890,14 +10891,15 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name)
#endif
lim = min (PTRDIFF_MAX, SIZE_MAX) - sizeof "@";
if (lim - SBYTES (Vinvocation_name) < SBYTES (Vsystem_name))
Lisp_Object system_name = Fsystem_name ();
if (lim - SBYTES (Vinvocation_name) < SBYTES (system_name))
memory_full (SIZE_MAX);
dpyinfo->x_id = ++x_display_id;
dpyinfo->x_id_name = xmalloc (SBYTES (Vinvocation_name)
+ SBYTES (Vsystem_name) + 2);
+ SBYTES (system_name) + 2);
char *nametail = lispstpcpy (dpyinfo->x_id_name, Vinvocation_name);
*nametail++ = '@';
lispstpcpy (nametail, Vsystem_name);
lispstpcpy (nametail, system_name);
/* Figure out which modifier bits mean what. */
x_find_modifier_meanings (dpyinfo);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment