]> git.eshelyaron.com Git - emacs.git/commitdiff
system-name's returned value can vary
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 29 Dec 2014 20:37:53 +0000 (12:37 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 29 Dec 2014 20:38:58 +0000 (12:38 -0800)
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.

15 files changed:
ChangeLog
doc/lispref/os.texi
doc/misc/efaq.texi
doc/misc/smtpmail.texi
etc/NEWS
lisp/desktop.el
lisp/dnd.el
lisp/gnus/nnvirtual.el
lisp/nxml/rng-uri.el
lisp/org/org-clock.el
src/editfns.c
src/filelock.c
src/sysdep.c
src/xrdb.c
src/xterm.c

index 00775edf52490b7ccda7b70627fde7372156a076..1fc7d66c88347f97b81cbf7b0c0f2c623cc0653d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,30 @@
+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.
index 1a6a031d013372937c7b593d408bd91f96a5bcad..1300bc70d9a49561d09925cfb4c470cf59993b92 100644 (file)
@@ -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?
index 0159101916ddad9667f46539e469f2e5bd1c3180..71c5ae0a6c28cf1202af63394aa762d46d2361a9 100644 (file)
@@ -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
index f539cd0e2247ecabeb86da10a01c1e92ec717c78..9cddbfaf68a654f1f9b2edecab8bf6aa3da2b5d5 100644 (file)
@@ -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.
 
index 548f409348a0ef528c3afacc26c8e8aa29bd1ad2..e5c988beaadcbe32805f0a0554ad2b0802b82c3c 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -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
index bad0073fbbab4dbf961f5ded557c11ca3e396553..bcf038762da1e7ea647150d1fe604c516840e875 100644 (file)
@@ -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
index 73b531dfd16538a16178d90c1d4e03c6ec1e85ff..2b68b025ac16fb58210218b2dedf432bb4765c96 100644 (file)
@@ -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
index f67943a336a1e5639988367f2c471103d07d3077..d13b492ddb3e4a87a5900e6833638e2ac4d4f642 100644 (file)
@@ -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 " ")
 
index b93624a4f22ad0be430ffed2e33f4fbff5ca4c4b..43218ec7c88358eb72769131fa894b1008de1f80 100644 (file)
@@ -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
index 51c87892a9c6a5e83a695b36aa7cb699f3d46083..c9287586e4e9b675a804c3a4594837f65e2cb7be 100644 (file)
@@ -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))
index 430c4c91fb3b175841afbe101217619e028e1d62..2a7dd9209aed56cb230e62600b3489ae2b851bc9 100644 (file)
@@ -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.  */);
index f857c48814359a7e070b013947fe16dc07db44ef..99215f215e71702619eed193ea4035d923a32d0d 100644 (file)
@@ -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.  */
index 24cc5cb0b40eee8868359f73ba448f7ac295efd1..b4a9be1eb1afc9e9994e8a54ba53911ca496a40f 100644 (file)
@@ -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);
 }
 \f
 sigset_t empty_mask;
index e21206d0800044fd7e7d862cd01294a12bb1e276..8500fb1095b875a933e24f5d811384d522735f86 100644 (file)
@@ -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);
index 130174dff19427bff58ce5cc87303a41eecdded4..892562bd612b39c6c1b9c713756c6f9b69f9f2ae 100644 (file)
@@ -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);