Sat Jun 15 18:13:43 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
authorroland <roland>
Sun, 16 Jun 1996 03:48:48 +0000 (03:48 +0000)
committerroland <roland>
Sun, 16 Jun 1996 03:48:48 +0000 (03:48 +0000)
* hurd/Makefile (routines): Add get-host, set-host.
(distribute): Add hurdhost.h.
* hurd/hurdhost.h: New file.
* sysdeps/mach/hurd/gethostname.c: Use _hurd_get_host_config.
* sysdeps/mach/hurd/gethostid.c: Likewise.
* sysdeps/mach/hurd/sethostname.c: Use _hurd_set_host_config.
* sysdeps/mach/hurd/sethostid.c: Likewise.
* hurd/get-host.c: New file.
* hurd/set-host.c: New file.

hurd/Makefile
hurd/get-host.c [new file with mode: 0644]
hurd/hurdhost.h [new file with mode: 0644]
hurd/set-host.c [new file with mode: 0644]
sysdeps/mach/hurd/gethostid.c
sysdeps/mach/hurd/gethostname.c
sysdeps/mach/hurd/sethostid.c
sysdeps/mach/hurd/sethostname.c

index 4f1f22c..1484ad5 100644 (file)
@@ -40,6 +40,7 @@ server-interfaces     := hurd/msg faultexc
 
 routines = hurdstartup hurdinit \
           hurdid hurdlookup hurdpid hurdrlimit hurdprio hurdexec \
+          get-host set-host \
           path-lookup \
           setauth \
           pid2task task2pid \
@@ -57,7 +58,8 @@ sig   = hurdsig hurdfault siginfo hurd-raise preempt-sig \
 dtable = dtable port2fd new-fd alloc-fd intern-fd \
          getdport openport \
          fd-close fd-read fd-write hurdioctl ctty-input ctty-output
-distribute = hurdstartup.h hurdfault.h faultexc.defs intr-rpc.defs intr-rpc.h
+distribute = hurdstartup.h hurdfault.h hurdhost.h \
+            faultexc.defs intr-rpc.defs intr-rpc.h
 
 # XXX this is a temporary hack; see hurdmalloc.h
 routines += hurdmalloc
diff --git a/hurd/get-host.c b/hurd/get-host.c
new file mode 100644 (file)
index 0000000..231ee59
--- /dev/null
@@ -0,0 +1,57 @@
+/* Get a host configuration item kept as the whole contents of a file.
+Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <hurd.h>
+#include "hurdhost.h"
+
+ssize_t
+_hurd_get_host_config (const char *item, char *buf, size_t buflen)
+{
+  error_t err;
+  char *data;
+  mach_msg_type_number_t nread, more;
+  file_t config = __file_name_lookup (item, O_RDONLY, 0);
+  if (config == MACH_PORT_NULL)
+    return -1;
+
+  data = buf;
+  err = __io_read (config, &data, &nread, -1, buflen);
+  if (! err)
+    /* Check if there is more in the file we didn't read.  */
+    err = __io_readable (config, &more);
+  __mach_port_deallocate (__mach_task_self (), config);
+  if (err)
+    return __hurd_fail (err);
+  if (data != buf)
+    {
+      memcpy (buf, data, nread);
+      __vm_deallocate (__mach_task_self (), (vm_address_t) data, nread);
+    }
+
+  /* Remove newlines in case someone wrote the file by hand.  */
+  while (buf[nread - 1] == '\n')
+    buf[--nread] = '\0';
+
+  if (more)
+    /* If we didn't read the whole file, tell the caller to use a bigger
+       buffer next time.  */
+    return __hurd_fail (ENAMETOOLONG);
+
+  return nread;
+}
diff --git a/hurd/hurdhost.h b/hurd/hurdhost.h
new file mode 100644 (file)
index 0000000..7a826eb
--- /dev/null
@@ -0,0 +1,28 @@
+/* Host configuration items kept as the whole contents of a file.
+Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/* Fetch and atomically store the contents of the file ITEM.
+   Returns the size read or written, or -1 for errors.
+   If BUFLEN is not big enough to contain the whole contents,
+   BUFLEN bytes of BUF are filled in and we fail with ENAMETOOLONG.  */
+
+ssize_t _hurd_get_host_config (const char *item,
+                              char *buf, size_t buflen);
+ssize_t _hurd_set_host_config (const char *item,
+                              const char *value, size_t valuelen);
diff --git a/hurd/set-host.c b/hurd/set-host.c
new file mode 100644 (file)
index 0000000..e9af697
--- /dev/null
@@ -0,0 +1,48 @@
+/* Set a host configuration item kept as the whole contents of a file.
+Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <hurd.h>
+#include "hurdhost.h"
+
+ssize_t
+_hurd_set_host_config (const char *item, const char *value, size_t valuelen)
+{
+  error_t err;
+  mach_msg_type_number_t nwrote;
+  file_t new, dir;
+
+  dir = __file_name_split (item, &item);
+  if (dir == MACH_PORT_NULL)
+    return -1;
+
+  /* Create a new node.  */
+  err = __dir_mkfile (dir, O_CREAT|O_TRUNC, 0600, &new);
+  if (! err)
+    {
+      /* Write the contents.  */
+      err = __io_write (new, value, valuelen, 0, &nwrote);
+      if (! err)
+       /* Atomically link the new node onto the name.  */
+       err = __dir_link (dir, item, 0);
+      __mach_port_deallocate (__mach_task_self (), new);
+    }
+  __mach_port_deallocate (__mach_task_self (), dir);
+
+  return nread;
+}
index 5a33092..a413a50 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 96 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -17,17 +17,19 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 Cambridge, MA 02139, USA.  */
 
 #include <ansidecl.h>
-#include <errno.h>
 #include <unistd.h>
 #include <hurd.h>
+#include "hurdhost.h"
 
 /* Return the current machine's Internet number.  */
 long int
 DEFUN_VOID(gethostid)
 {
-  int hostid;
-  error_t err;
-  if (err = __USEPORT (PROC, __proc_gethostid (port, &hostid)))
-    return __hurd_fail (err);
-  return hostid;
+  /* The hostid is just the contents of the file /etc/hostid,
+     kept as text of hexadecimal digits.  */
+  char buf[8];
+  ssize_t n = _hurd_get_host_config ("/etc/hostid", buf, sizeof buf);
+  if (n < 0)
+    return -1;
+  return strtol (buf, NULL, 16);
 }
index 94a0537..06703ea 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -17,11 +17,8 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 Cambridge, MA 02139, USA.  */
 
 #include <ansidecl.h>
-#include <errno.h>
 #include <unistd.h>
-#include <hurd.h>
-#include <hurd/port.h>
-#include <string.h>
+#include "hurdhost.h"
 
 /* Put the name of the current host in no more than LEN bytes of NAME.
    The result is null-terminated if LEN is large enough for the full
@@ -30,19 +27,9 @@ int
 DEFUN(__gethostname, (name, len),
       char *name AND size_t len)
 {
-  error_t err;
-  char *buf = name;
-  mach_msg_type_number_t buflen = len;
-  if (err = __USEPORT (PROC, __proc_gethostname (port, &buf, &buflen)))
-    return __hurd_fail (err);
-  if (buf != name)
-    {
-      memcpy (name, buf, len < buflen ? len : buflen);
-      __vm_deallocate (__mach_task_self (), (vm_address_t) buf, buflen);
-    }
-  if (buflen > len)
-    return __hurd_fail (ENAMETOOLONG);
-  return 0;
+  /* The host name is just the contents of the file /etc/hostname.  */
+  ssize_t n = _hurd_get_host_config ("/etc/hostname", name, len);
+  return n < 0 ? -1 : 0;
 }
 
 weak_alias (__gethostname, gethostname)
index dc8153c..64f5e0c 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -17,15 +17,26 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 Cambridge, MA 02139, USA.  */
 
 #include <ansidecl.h>
-#include <errno.h>
 #include <unistd.h>
 #include <hurd.h>
+#include "hurdhost.h"
+#include "../stdio-common/_itoa.h"
 
 /* Set the current machine's Internet number to ID.
    This call is restricted to the super-user.  */
 int
 DEFUN(sethostid, (id), long int id)
 {
-  error_t err = __USEPORT (PROC, __proc_sethostid (port, id));
-  return err ? __hurd_fail (err) : 0;
+  char buf[8], *bp;
+  ssize_t n;
+
+  /* The hostid is kept in the file /etc/hostid,
+     eight characters of upper-case hexadecimal.  */
+
+  bp = _itoa_word (id, &buf[sizeof buf], 16, 1);
+  while (bp > buf)
+    *--bp = '0';
+
+  n = _hurd_set_host_config ("/etc/hostid", buf, sizeof buf);
+  return n < 0 ? -1 : 0;
 }
index 2c019cf..d07e69d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 96 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -17,9 +17,8 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 Cambridge, MA 02139, USA.  */
 
 #include <ansidecl.h>
-#include <errno.h>
 #include <unistd.h>
-#include <hurd.h>
+#include "hurdhost.h"
 
 /* Set the name of the current host to NAME, which is LEN bytes long.
    This call is restricted to the super-user.  */
@@ -27,8 +26,7 @@ int
 DEFUN(sethostname, (name, len),
       CONST char *name AND size_t len)
 {
-  error_t err = __USEPORT (PROC, __proc_sethostname (port, name, len));
-  if (err)
-    return __hurd_fail (err);
-  return 0;
+  /* The host name is just the contents of the file /etc/hostname.  */
+  ssize_t n = _hurd_set_host_config ("/etc/hostname", name, len);
+  return n < 0 ? -1 : 0;
 }