]>
git.ipfire.org Git - thirdparty/glibc.git/blob - sysdeps/mach/hurd/access.c
1 /* Copyright (C) 1991-2018 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <http://www.gnu.org/licenses/>. */
20 #include <hurd/port.h>
22 #include <hurd/lookup.h>
26 hurd_fail_seterrno (error_t err
)
28 return __hurd_fail (err
);
32 hurd_fail_noerrno (error_t err
)
38 access_common (const char *file
, int type
, int (*errfunc
) (error_t
))
41 file_t rcrdir
, rcwdir
, io
;
44 error_t
reauthenticate (int which
, file_t
*result
)
46 /* Get a port to our root directory, authenticated with the real IDs. */
49 ref
= __mach_reply_port ();
53 err
= __io_reauthenticate (port
, ref
, MACH_MSG_TYPE_MAKE_SEND
);
55 err
= __auth_user_authenticate (_hurd_id
.rid_auth
,
56 ref
, MACH_MSG_TYPE_MAKE_SEND
,
60 __mach_port_destroy (__mach_task_self (), ref
);
64 error_t
init_port (int which
, error_t (*operate
) (mach_port_t
))
69 return (*operate
) (_hurd_id
.rid_auth
);
71 return (reauthenticate (INIT_PORT_CRDIR
, &rcrdir
) ?:
74 return (reauthenticate (INIT_PORT_CWDIR
, &rcwdir
) ?:
77 return _hurd_ports_use (which
, operate
);
81 rcrdir
= rcwdir
= MACH_PORT_NULL
;
85 __mutex_lock (&_hurd_id
.lock
);
86 /* Get _hurd_id up to date. */
87 if (err
= _hurd_check_ids ())
90 if (_hurd_id
.rid_auth
== MACH_PORT_NULL
)
92 /* Set up _hurd_id.rid_auth. This is a special auth server port
93 which uses the real uid and gid (the first aux uid and gid) as
94 the only effective uid and gid. */
96 if (_hurd_id
.aux
.nuids
< 1 || _hurd_id
.aux
.ngids
< 1)
98 /* We do not have a real UID and GID. Lose, lose, lose! */
103 /* Create a new auth port using our real UID and GID (the first
104 auxiliary UID and GID) as the only effective IDs. */
105 if (err
= __USEPORT (AUTH
,
106 __auth_makeauth (port
,
107 NULL
, MACH_MSG_TYPE_COPY_SEND
, 0,
108 _hurd_id
.aux
.uids
, 1,
111 _hurd_id
.aux
.gids
, 1,
114 &_hurd_id
.rid_auth
)))
119 /* Look up the file name using the modified init ports. */
120 err
= __hurd_file_name_lookup (&init_port
, &__getdport
, 0,
123 /* We are done with _hurd_id.rid_auth now. */
125 __mutex_unlock (&_hurd_id
.lock
);
129 if (rcrdir
!= MACH_PORT_NULL
)
130 __mach_port_deallocate (__mach_task_self (), rcrdir
);
131 if (rcwdir
!= MACH_PORT_NULL
)
132 __mach_port_deallocate (__mach_task_self (), rcwdir
);
134 return errfunc (err
);
136 /* Find out what types of access we are allowed to this file. */
137 err
= __file_check_access (io
, &allowed
);
138 __mach_port_deallocate (__mach_task_self (), io
);
140 return errfunc (err
);
150 if (flags
& ~allowed
)
151 /* We are not allowed all the requested types of access. */
152 return errfunc (EACCES
);
157 /* Test for access to FILE by our real user and group IDs without setting
158 errno. This may be unsafe to run during initialization of tunables
159 since access_common calls __hurd_file_name_lookup, which calls
160 __hurd_file_name_lookup_retry, which can set errno. */
162 __access_noerrno (const char *file
, int type
)
164 return access_common (file
, type
, hurd_fail_noerrno
);
167 /* Test for access to FILE by our real user and group IDs. */
169 __access (const char *file
, int type
)
171 return access_common (file
, type
, hurd_fail_seterrno
);
173 weak_alias (__access
, access
)