entered into RCS
authorroland <roland>
Fri, 4 Feb 1994 02:06:29 +0000 (02:06 +0000)
committerroland <roland>
Fri, 4 Feb 1994 02:06:29 +0000 (02:06 +0000)
hurd/fchroot.c

index b09c839..7f176f7 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1993, 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
@@ -17,10 +17,9 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 Cambridge, MA 02139, USA.  */
 
 #include <ansidecl.h>
-#include <errno.h>
-#include <stddef.h>
 #include <unistd.h>
 #include <hurd.h>
+#include <hurd/fd.h>
 
 /* Change the current directory root to FD.  */
 int
@@ -29,13 +28,21 @@ DEFUN(fchroot, (fd), int fd)
   error_t err;
   file_t crdir;
 
-  /* XXX check that's it's a directory */
-
-  if (err = _HURD_DPORT_USE (fd,
-                            __mach_port_mod_refs (__mach_task_self (),
-                                                  (crdir = port),
-                                                  MACH_PORT_RIGHT_SEND, 1)))
-    return err;
+  err = HURD_DPORT_USE
+    (fd,
+     ({ struct stat st;
+       crdir = port;
+       err = __io_stat (crdir, &st);
+       if (! err && ! S_ISDIR (st.st_mode))
+         err = ENOTDIR;
+       if (! err)
+         __mach_port_mod_refs (__mach_task_self (),
+                               crdir, MACH_PORT_RIGHT_SEND, 1);
+       err;
+      }));
+
+  if (err)
+    return __hurd_fail (err);
 
   _hurd_port_set (&_hurd_ports[INIT_PORT_CRDIR], crdir);