summaryrefslogtreecommitdiff
path: root/libfshelp/fetch-root.c
blob: b4a88e122835bc17e8e711e5944a649eef4c27af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/* 
   Copyright (C) 1994 Free Software Foundation, Inc.
   Written by Michael I. Bushnell.

   This file is part of the GNU Hurd.

   The GNU Hurd is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License as
   published by the Free Software Foundation; either version 2, or (at
   your option) any later version.

   The GNU Hurd 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
   General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */

#include "trans.h"

/* Implement fshelp_fetch_root; see <hurd/fshelp.h> for the description. */
error_t
fshelp_fetch_root (struct trans_link *link, mach_port_t *cntl,
		   int passive, error_t (*passive_fn) (char **, u_int *),
		    void *dirpt, void *nodept, 
		    mach_port_t (*genpt_fn) (mach_port_t),
		    struct mutex *unlock, uid_t uid, gid_t gid)
{
  mach_port_t cwdirpt, nodept;
  char buf[1000];
  char *bufp = buf;
  u_int buflen = 1000;

  mutex_lock (&link->lock);

  if (!passive && link->control == MACH_PORT_NULL)
    {
      mutex_unlock (&link->lock);
      return 0;
    }
  
  cwdirpt = (*genpt_fn)(dirpt);

  if (link->control == MACH_PORT_NULL)
    {  
      /* Start passive translator */
      nodept = (*genpt_fn)(nodept);
      error = (*passive_fn) (&bufp, buflen);

      if (error)
	{
	  mutex_unlock (&link->lock);
	  return error;
	}
      
      mutex_unlock (unlock);
  
      error = fshelp_start_translator (link, bufp, buflen, cwdirpt,
				       nodept, uid, gid);
      
      if (bufp != buf)
	vm_deallocate (mach_task_self (), (vm_address_t) bufp, buflen);

      if (error)
	return error;
    }