entered into RCS
authorroland <roland>
Sun, 10 Jul 1994 23:49:14 +0000 (23:49 +0000)
committerroland <roland>
Sun, 10 Jul 1994 23:49:14 +0000 (23:49 +0000)
hurd/hurd.h
hurd/invoke-trans.c [new file with mode: 0644]
sysdeps/mach/hurd/bind.c

index a82f965..b0dfbb3 100644 (file)
@@ -146,6 +146,25 @@ extern error_t hurd_path_lookup (file_t crdir, file_t cwdir,
                                 int flags, mode_t mode,
                                 file_t *port);
 
+/* Process the values returned by `dir_pathtrans' et al, and loop doing
+   `dir_pathtrans' calls until one returns FS_RETRY_NONE.  CRDIR is the
+   root directory used for things like symlinks to absolute file names; the
+   other arguments should be those just passed to and/or returned from
+   `dir_pathtrans', `fsys_getroot', or `file_invoke_translator'.  This
+   function consumes the reference in *RESULT even if it returns an error.  */
+
+extern error_t __hurd_path_lookup_retry (file_t crdir,
+                                        enum retry_type doretry,
+                                        char retryname[1024],
+                                        int flags, mode_t mode,
+                                        file_t *result);
+extern error_t hurd_path_lookup_retry (file_t crdir,
+                                      enum retry_type doretry,
+                                      char retryname[1024],
+                                      int flags, mode_t mode,
+                                      file_t *result);
+
+
 /* Split FILE into a directory and a name within the directory.  The
    directory lookup uses the current root and working directory.  If
    successful, stores in *NAME a pointer into FILE where the name
@@ -163,8 +182,21 @@ extern file_t path_split (const char *file, char **name);
 extern file_t __path_lookup (const char *file, int flags, mode_t mode);
 extern file_t path_lookup (const char *file, int flags, mode_t mode);
 
+/* Invoke any translator set on the node FILE represents, and return in
+   *TRANSLATED a port to the translated node.  FLAGS are as for
+   `dir_pathtrans' et al, but the returned port will not necessarily have
+   any more access rights than FILE does.  */
+
+extern error_t __hurd_invoke_translator (file_t file, int flags,
+                                        file_t *translated);
+extern error_t hurd_invoke_translator (file_t file, int flags,
+                                      file_t *translated);
+
 
-/* Open a file descriptor on a port.  FLAGS are as for `open'.  */
+/* Open a file descriptor on a port.  FLAGS are as for `open'; flags
+   affected by io_set_openmodes are not changed by this.  If successful,
+   this consumes a user reference for PORT (which will be deallocated on
+   close).  */
 
 extern int openport (io_t port, int flags);
 
diff --git a/hurd/invoke-trans.c b/hurd/invoke-trans.c
new file mode 100644 (file)
index 0000000..908a5e0
--- /dev/null
@@ -0,0 +1,36 @@
+/* Copyright (C) 1994 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 <hurd/fs.h>
+
+error_t
+__hurd_invoke_translator (file_t file, int flags, file_t *newport)
+{
+  error_t err;
+  enum retry_type doretry;
+  char retryname[1024];                /* XXX string_t LOSES! */
+
+  err = __file_invoke_translator (file, flags, &doretry, retryname, newport);
+
+  if (! err)
+    err = __USEPORT (CRDIR, __hurd_path_lookup_retry (port, doretry, retryname,
+                                                     flags, 0, newport));
+
+  return err;
+}
index 63d8b37..6fbc74c 100644 (file)
@@ -62,7 +62,7 @@ DEFUN(bind, (fd, addr, len),
                                       MACH_MSG_TYPE_COPY_SEND);
          if (! err)
            /* Get a port to the ifsock translator.  */
-           err = __file_invoke_translator (node, &ifsock); /* XXX */
+           err = __hurd_invoke_translator (node, 0, &ifsock);
          if (! err)
            /* Get the address port.  */
            err = __ifsock_getsockaddr (ifsock, &aport);