Back to index

glibc  2.9
fchroot.c
Go to the documentation of this file.
00001 /* Copyright (C) 1999, 2001 Free Software Foundation, Inc.
00002    This file is part of the GNU C Library.
00003 
00004    The GNU C Library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Lesser General Public
00006    License as published by the Free Software Foundation; either
00007    version 2.1 of the License, or (at your option) any later version.
00008 
00009    The GNU C Library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Lesser General Public License for more details.
00013 
00014    You should have received a copy of the GNU Lesser General Public
00015    License along with the GNU C Library; if not, write to the Free
00016    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00017    02111-1307 USA.  */
00018 
00019 #include <unistd.h>
00020 
00021 #include <hurd.h>
00022 #include <hurd/fd.h>
00023 #include <hurd/port.h>
00024 
00025 /* Change the current root directory to FD.  */
00026 int
00027 fchroot (int fd)
00028 {
00029   error_t err;
00030   file_t dir;
00031 
00032   err = HURD_DPORT_USE (fd,
00033                      ({
00034                        dir = __file_name_lookup_under (port, ".", 0, 0);
00035                        dir == MACH_PORT_NULL ? errno : 0;
00036                      }));
00037 
00038   if (! err)
00039     {
00040       file_t root;
00041 
00042       /* Prevent going through DIR's ..  */
00043       err = __file_reparent (dir, MACH_PORT_NULL, &root);
00044       __mach_port_deallocate (__mach_task_self (), dir);
00045       if (! err)
00046        _hurd_port_set (&_hurd_ports[INIT_PORT_CRDIR], root);
00047     }
00048 
00049   return err ? __hurd_fail (err) : 0;
00050 }