mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-09 23:00:07 +00:00
* sysdeps/mach/hurd/faccessat.c: New file.
* sysdeps/mach/hurd/fchmodat.c: New file. * sysdeps/mach/hurd/fchownat.c: New file. * sysdeps/mach/hurd/fxstatat.c: New file. * sysdeps/mach/hurd/fxstatat64.c: New file. * sysdeps/mach/hurd/linkat.c: New file. * sysdeps/mach/hurd/mkdirat.c: New file. * sysdeps/mach/hurd/openat.c: New file. * sysdeps/mach/hurd/openat64.c: New file. * sysdeps/mach/hurd/symlinkat.c: New file. * sysdeps/mach/hurd/unlinkat.c: New file. * sysdeps/mach/hurd/xmknod.c (__xmknod): Just call __xmknodat. Guts move to ... * sysdeps/mach/hurd/xmknodat.c: ... here, new file. * hurd/lookup-at.c: New file. * hurd/Makefile (routines): Add it. * hurd/hurd/fd.h: Declare __file_name_lookup_at, __file_name_split_at and __directory_name_split_at. * hurd/hurd/lookup.h: Declare {,__}hurd_directory_name_split. * hurd/hurdlookup.c (__hurd_directory_name_split): Use __memrchr unconditionally. * sysdeps/mach/hurd/open.c: Define {,__,__libc_,}open64 as aliases. * sysdeps/mach/hurd/open64.c: New file.
This commit is contained in:
parent
7d013a64de
commit
16a1046837
28
ChangeLog
28
ChangeLog
@ -13,6 +13,34 @@
|
|||||||
|
|
||||||
2006-03-05 Roland McGrath <roland@frob.com>
|
2006-03-05 Roland McGrath <roland@frob.com>
|
||||||
|
|
||||||
|
* sysdeps/mach/hurd/faccessat.c: New file.
|
||||||
|
* sysdeps/mach/hurd/fchmodat.c: New file.
|
||||||
|
* sysdeps/mach/hurd/fchownat.c: New file.
|
||||||
|
* sysdeps/mach/hurd/fxstatat.c: New file.
|
||||||
|
* sysdeps/mach/hurd/fxstatat64.c: New file.
|
||||||
|
* sysdeps/mach/hurd/linkat.c: New file.
|
||||||
|
* sysdeps/mach/hurd/mkdirat.c: New file.
|
||||||
|
* sysdeps/mach/hurd/openat.c: New file.
|
||||||
|
* sysdeps/mach/hurd/openat64.c: New file.
|
||||||
|
* sysdeps/mach/hurd/symlinkat.c: New file.
|
||||||
|
* sysdeps/mach/hurd/unlinkat.c: New file.
|
||||||
|
* sysdeps/mach/hurd/xmknod.c (__xmknod): Just call __xmknodat.
|
||||||
|
Guts move to ...
|
||||||
|
* sysdeps/mach/hurd/xmknodat.c: ... here, new file.
|
||||||
|
|
||||||
|
* hurd/lookup-at.c: New file.
|
||||||
|
* hurd/Makefile (routines): Add it.
|
||||||
|
* hurd/hurd/fd.h: Declare __file_name_lookup_at,
|
||||||
|
__file_name_split_at and __directory_name_split_at.
|
||||||
|
|
||||||
|
* hurd/hurd/lookup.h: Declare {,__}hurd_directory_name_split.
|
||||||
|
|
||||||
|
* hurd/hurdlookup.c (__hurd_directory_name_split): Use __memrchr
|
||||||
|
unconditionally.
|
||||||
|
|
||||||
|
* sysdeps/mach/hurd/open.c: Define {,__,__libc_,}open64 as aliases.
|
||||||
|
* sysdeps/mach/hurd/open64.c: New file.
|
||||||
|
|
||||||
* sysdeps/posix/sysconf.c (__sysconf): Use #if _POSIX_FOO > 0
|
* sysdeps/posix/sysconf.c (__sysconf): Use #if _POSIX_FOO > 0
|
||||||
rather than #ifdef _POSIX_FOO for options. We should return -1
|
rather than #ifdef _POSIX_FOO for options. We should return -1
|
||||||
at runtime for an option defined to 0 at compile time.
|
at runtime for an option defined to 0 at compile time.
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Copyright (C) 1991,92,93,94,95,96,97,98,99,2001,2002,2004
|
# Copyright (C) 1991,92,93,94,95,96,97,98,99,2001,2002,2004,2006
|
||||||
# Free Software Foundation, Inc.
|
# Free Software Foundation, Inc.
|
||||||
# This file is part of the GNU C Library.
|
# This file is part of the GNU C Library.
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ server-interfaces := hurd/msg faultexc
|
|||||||
|
|
||||||
routines = hurdstartup hurdinit \
|
routines = hurdstartup hurdinit \
|
||||||
hurdid hurdpid hurdrlimit hurdprio hurdexec hurdselect \
|
hurdid hurdpid hurdrlimit hurdprio hurdexec hurdselect \
|
||||||
hurdlookup lookup-retry \
|
hurdlookup lookup-retry lookup-at \
|
||||||
get-host set-host \
|
get-host set-host \
|
||||||
path-lookup \
|
path-lookup \
|
||||||
setauth \
|
setauth \
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* File descriptors.
|
/* File descriptors.
|
||||||
Copyright (C) 1993,94,95,96,97,98,99,2000,01,02
|
Copyright (C) 1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2006
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
@ -240,5 +240,21 @@ extern int _hurd_select (int nfds, struct pollfd *pollfds,
|
|||||||
const struct timespec *timeout,
|
const struct timespec *timeout,
|
||||||
const sigset_t *sigmask);
|
const sigset_t *sigmask);
|
||||||
|
|
||||||
|
/* Variant of file_name_lookup used in *at function implementations.
|
||||||
|
AT_FLAGS should contain only AT_SYMLINK_NOFOLLOW; other bits
|
||||||
|
cause EINVAL. */
|
||||||
|
extern file_t __file_name_lookup_at (int fd, int at_flags,
|
||||||
|
const char *file_name,
|
||||||
|
int flags, mode_t mode);
|
||||||
|
|
||||||
|
/* Variant of file_name_split used in *at function implementations. */
|
||||||
|
extern file_t __file_name_split_at (int fd, const char *file_name,
|
||||||
|
char **name);
|
||||||
|
|
||||||
|
/* Variant of directory_name_split used in *at function implementations. */
|
||||||
|
extern file_t __directory_name_split_at (int fd, const char *directory_name,
|
||||||
|
char **name);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* hurd/fd.h */
|
#endif /* hurd/fd.h */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Declarations of file name translation functions for the GNU Hurd.
|
/* Declarations of file name translation functions for the GNU Hurd.
|
||||||
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
Copyright (C) 1995, 1996, 1997, 2006 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -76,8 +76,8 @@ error_t __hurd_file_name_split (error_t (*use_init_port)
|
|||||||
(int which,
|
(int which,
|
||||||
error_t (*operate) (mach_port_t)),
|
error_t (*operate) (mach_port_t)),
|
||||||
file_t (*get_dtable_port) (int fd),
|
file_t (*get_dtable_port) (int fd),
|
||||||
error_t (*lookup)
|
error_t (*lookup) (file_t dir, char *name,
|
||||||
(file_t dir, char *name, int flags, mode_t mode,
|
int flags, mode_t mode,
|
||||||
retry_type *do_retry, string_t retry_name,
|
retry_type *do_retry, string_t retry_name,
|
||||||
mach_port_t *result),
|
mach_port_t *result),
|
||||||
const char *file_name,
|
const char *file_name,
|
||||||
@ -86,13 +86,37 @@ error_t hurd_file_name_split (error_t (*use_init_port)
|
|||||||
(int which,
|
(int which,
|
||||||
error_t (*operate) (mach_port_t)),
|
error_t (*operate) (mach_port_t)),
|
||||||
file_t (*get_dtable_port) (int fd),
|
file_t (*get_dtable_port) (int fd),
|
||||||
error_t (*lookup)
|
error_t (*lookup) (file_t dir, char *name,
|
||||||
(file_t dir, char *name, int flags, mode_t mode,
|
int flags, mode_t mode,
|
||||||
retry_type *do_retry, string_t retry_name,
|
retry_type *do_retry, string_t retry_name,
|
||||||
mach_port_t *result),
|
mach_port_t *result),
|
||||||
const char *file_name,
|
const char *file_name,
|
||||||
file_t *dir, char **name);
|
file_t *dir, char **name);
|
||||||
|
|
||||||
|
/* Split DIRECTORY into a parent directory and a name within the directory.
|
||||||
|
This is the same as hurd_file_name_split, but ignores trailing slashes. */
|
||||||
|
|
||||||
|
error_t __hurd_directory_name_split (error_t (*use_init_port)
|
||||||
|
(int which,
|
||||||
|
error_t (*operate) (mach_port_t)),
|
||||||
|
file_t (*get_dtable_port) (int fd),
|
||||||
|
error_t (*lookup) (file_t dir, char *name,
|
||||||
|
int flags, mode_t mode,
|
||||||
|
retry_type *do_retry, string_t retry_name,
|
||||||
|
mach_port_t *result),
|
||||||
|
const char *directory_name,
|
||||||
|
file_t *dir, char **name);
|
||||||
|
error_t hurd_directory_name_split (error_t (*use_init_port)
|
||||||
|
(int which,
|
||||||
|
error_t (*operate) (mach_port_t)),
|
||||||
|
file_t (*get_dtable_port) (int fd),
|
||||||
|
error_t (*lookup) (file_t dir, char *name,
|
||||||
|
int flags, mode_t mode,
|
||||||
|
retry_type *do_retry, string_t retry_name,
|
||||||
|
mach_port_t *result),
|
||||||
|
const char *directory_name,
|
||||||
|
file_t *dir, char **name);
|
||||||
|
|
||||||
|
|
||||||
/* Process the values returned by `dir_lookup' et al, and loop doing
|
/* Process the values returned by `dir_lookup' et al, and loop doing
|
||||||
`dir_lookup' calls until one returns FS_RETRY_NONE. The arguments
|
`dir_lookup' calls until one returns FS_RETRY_NONE. The arguments
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1992,93,94,95,96,97,99,2001,2004
|
/* Copyright (C) 1992,1993,1994,1995,1996,1997,1999,2001,2004,2006
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
@ -184,19 +184,7 @@ __hurd_directory_name_split (error_t (*use_init_port)
|
|||||||
--lastslash;
|
--lastslash;
|
||||||
|
|
||||||
/* Find the last one earlier in the string, before the trailing ones. */
|
/* Find the last one earlier in the string, before the trailing ones. */
|
||||||
#if __GLIBC__ > 2 || __GLIBC_MINOR__ >= 2
|
|
||||||
lastslash = __memrchr (file_name, '/', lastslash - file_name);
|
lastslash = __memrchr (file_name, '/', lastslash - file_name);
|
||||||
#else
|
|
||||||
/* Keep backing up, looking for a slash. */
|
|
||||||
do
|
|
||||||
if (lastslash == file_name)
|
|
||||||
{
|
|
||||||
/* Hit the start with no slash. */
|
|
||||||
lastslash = NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
while (*lastslash-- != '/');
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lastslash != NULL)
|
if (lastslash != NULL)
|
||||||
|
110
hurd/lookup-at.c
Normal file
110
hurd/lookup-at.c
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
/* Lookup helper function for Hurd implementation of *at functions.
|
||||||
|
Copyright (C) 2006 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#include <hurd.h>
|
||||||
|
#include <hurd/lookup.h>
|
||||||
|
#include <hurd/fd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
file_t
|
||||||
|
__file_name_lookup_at (int fd, int at_flags,
|
||||||
|
const char *file_name, int flags, mode_t mode)
|
||||||
|
{
|
||||||
|
error_t err;
|
||||||
|
file_t result;
|
||||||
|
|
||||||
|
flags |= (at_flags & AT_SYMLINK_NOFOLLOW) ? O_NOLINK : 0;
|
||||||
|
at_flags &= ~AT_SYMLINK_NOFOLLOW;
|
||||||
|
if (at_flags != 0)
|
||||||
|
return __hurd_fail (EINVAL);
|
||||||
|
|
||||||
|
if (fd == AT_FDCWD || file_name[0] == '/')
|
||||||
|
return __file_name_lookup (file_name, flags, mode);
|
||||||
|
|
||||||
|
file_t startdir;
|
||||||
|
error_t use_init_port (int which, error_t (*operate) (mach_port_t))
|
||||||
|
{
|
||||||
|
return (which == INIT_PORT_CWDIR ? (*operate) (startdir) :
|
||||||
|
_hurd_ports_use (which, operate));
|
||||||
|
}
|
||||||
|
|
||||||
|
err = HURD_DPORT_USE (fd, (startdir = port,
|
||||||
|
__hurd_file_name_lookup (&use_init_port,
|
||||||
|
&__getdport, NULL,
|
||||||
|
file_name,
|
||||||
|
flags,
|
||||||
|
mode & ~_hurd_umask,
|
||||||
|
&result)));
|
||||||
|
|
||||||
|
return err ? (__hurd_dfail (fd, err), MACH_PORT_NULL) : result;
|
||||||
|
}
|
||||||
|
|
||||||
|
file_t
|
||||||
|
__file_name_split_at (int fd, const char *file_name, char **name)
|
||||||
|
{
|
||||||
|
error_t err;
|
||||||
|
file_t result;
|
||||||
|
|
||||||
|
if (fd == AT_FDCWD || file_name[0] == '/')
|
||||||
|
return __file_name_split (file_name, name);
|
||||||
|
|
||||||
|
err = __hurd_file_name_split (&_hurd_ports_use, &__getdport, 0,
|
||||||
|
file_name, &result, name);
|
||||||
|
|
||||||
|
file_t startdir;
|
||||||
|
error_t use_init_port (int which, error_t (*operate) (mach_port_t))
|
||||||
|
{
|
||||||
|
return (which == INIT_PORT_CWDIR ? (*operate) (startdir) :
|
||||||
|
_hurd_ports_use (which, operate));
|
||||||
|
}
|
||||||
|
|
||||||
|
err = HURD_DPORT_USE (fd, (startdir = port,
|
||||||
|
__hurd_file_name_split (&use_init_port,
|
||||||
|
&__getdport, 0,
|
||||||
|
file_name,
|
||||||
|
&result, name)));
|
||||||
|
|
||||||
|
return err ? (__hurd_dfail (fd, err), MACH_PORT_NULL) : result;
|
||||||
|
}
|
||||||
|
|
||||||
|
file_t
|
||||||
|
__directory_name_split_at (int fd, const char *directory_name, char **name)
|
||||||
|
{
|
||||||
|
error_t err;
|
||||||
|
file_t result;
|
||||||
|
|
||||||
|
if (fd == AT_FDCWD || directory_name[0] == '/')
|
||||||
|
return __directory_name_split (directory_name, name);
|
||||||
|
|
||||||
|
file_t startdir;
|
||||||
|
error_t use_init_port (int which, error_t (*operate) (mach_port_t))
|
||||||
|
{
|
||||||
|
return (which == INIT_PORT_CWDIR ? (*operate) (startdir) :
|
||||||
|
_hurd_ports_use (which, operate));
|
||||||
|
}
|
||||||
|
|
||||||
|
err = HURD_DPORT_USE (fd, (startdir = port,
|
||||||
|
__hurd_directory_name_split (&use_init_port,
|
||||||
|
&__getdport, 0,
|
||||||
|
directory_name,
|
||||||
|
&result, name)));
|
||||||
|
|
||||||
|
return err ? (__hurd_dfail (fd, err), MACH_PORT_NULL) : result;
|
||||||
|
}
|
@ -385,7 +385,8 @@ extern "C" {
|
|||||||
powerpc32. For the time being, changing this is causing more
|
powerpc32. For the time being, changing this is causing more
|
||||||
compatibility problems due to malloc_get_state/malloc_set_state than
|
compatibility problems due to malloc_get_state/malloc_set_state than
|
||||||
will returning blocks not adequately aligned for long double objects
|
will returning blocks not adequately aligned for long double objects
|
||||||
under -mlong-double-128. */
|
under -mlong-double-128.
|
||||||
|
|
||||||
#define MALLOC_ALIGNMENT (2 * SIZE_SZ < __alignof__ (long double) \
|
#define MALLOC_ALIGNMENT (2 * SIZE_SZ < __alignof__ (long double) \
|
||||||
? __alignof__ (long double) : 2 * SIZE_SZ)
|
? __alignof__ (long double) : 2 * SIZE_SZ)
|
||||||
*/
|
*/
|
||||||
|
70
sysdeps/mach/hurd/faccessat.c
Normal file
70
sysdeps/mach/hurd/faccessat.c
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
/* Test for access to file, relative to open directory. Hurd version.
|
||||||
|
Copyright (C) 2006 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <hurd.h>
|
||||||
|
#include <hurd/fd.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
faccessat (fd, file, type, flag)
|
||||||
|
int fd;
|
||||||
|
const char *file;
|
||||||
|
int type;
|
||||||
|
int flag;
|
||||||
|
{
|
||||||
|
error_t err;
|
||||||
|
file_t port;
|
||||||
|
int allowed, flags;
|
||||||
|
|
||||||
|
if ((flag & AT_EACCESS) == 0)
|
||||||
|
{
|
||||||
|
if (fd == AT_FDCWD || file[0] == '/')
|
||||||
|
return __access (file, type);
|
||||||
|
__set_errno (ENOTSUP); /* XXX later */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
port = __file_name_lookup_at (fd, flag &~ AT_EACCESS, file, 0, 0);
|
||||||
|
if (port == MACH_PORT_NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* Find out what types of access we are allowed to this file. */
|
||||||
|
err = __file_check_access (port, &allowed);
|
||||||
|
__mach_port_deallocate (__mach_task_self (), port);
|
||||||
|
if (err)
|
||||||
|
return __hurd_fail (err);
|
||||||
|
|
||||||
|
flags = 0;
|
||||||
|
if (type & R_OK)
|
||||||
|
flags |= O_READ;
|
||||||
|
if (type & W_OK)
|
||||||
|
flags |= O_WRITE;
|
||||||
|
if (type & X_OK)
|
||||||
|
flags |= O_EXEC;
|
||||||
|
|
||||||
|
if (flags & ~allowed)
|
||||||
|
/* We are not allowed all the requested types of access. */
|
||||||
|
return __hurd_fail (EACCES);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
44
sysdeps/mach/hurd/fchmodat.c
Normal file
44
sysdeps/mach/hurd/fchmodat.c
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/* Change the protections of file relative to open directory. Hurd version.
|
||||||
|
Copyright (C) 2006 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <hurd.h>
|
||||||
|
#include <hurd/fd.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
fchmodat (fd, file, mode, flag)
|
||||||
|
int fd;
|
||||||
|
const char *file;
|
||||||
|
mode_t mode;
|
||||||
|
int flag;
|
||||||
|
{
|
||||||
|
error_t err;
|
||||||
|
file_t port = __file_name_lookup_at (fd, flag, file, 0, 0);
|
||||||
|
if (port == MACH_PORT_NULL)
|
||||||
|
return -1;
|
||||||
|
err = __file_chmod (port, mode);
|
||||||
|
__mach_port_deallocate (__mach_task_self (), port);
|
||||||
|
if (err)
|
||||||
|
return __hurd_fail (err);
|
||||||
|
return 0;
|
||||||
|
}
|
46
sysdeps/mach/hurd/fchownat.c
Normal file
46
sysdeps/mach/hurd/fchownat.c
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/* Change owner and group of a file relative to open directory. Hurd version.
|
||||||
|
Copyright (C) 2006 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <hurd.h>
|
||||||
|
#include <hurd/fd.h>
|
||||||
|
|
||||||
|
/* Change the owner and group of FILE. */
|
||||||
|
int
|
||||||
|
fchownat (fd, file, owner, group, flag)
|
||||||
|
int fd;
|
||||||
|
const char *file;
|
||||||
|
uid_t owner;
|
||||||
|
gid_t group;
|
||||||
|
int flag;
|
||||||
|
{
|
||||||
|
error_t err;
|
||||||
|
file_t port = __file_name_lookup_at (fd, flag, file, 0, 0);
|
||||||
|
if (port == MACH_PORT_NULL)
|
||||||
|
return -1;
|
||||||
|
err = __file_chown (port, owner, group);
|
||||||
|
__mach_port_deallocate (__mach_task_self (), port);
|
||||||
|
if (err)
|
||||||
|
return __hurd_fail (err);
|
||||||
|
return 0;
|
||||||
|
}
|
33
sysdeps/mach/hurd/fxstatat.c
Normal file
33
sysdeps/mach/hurd/fxstatat.c
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/* Get information about file named relative to open directory. Hurd version.
|
||||||
|
Copyright (C) 2006 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include "xstatconv.c"
|
||||||
|
|
||||||
|
int
|
||||||
|
__fxstatat (int vers, int fd, const char *filename, struct stat *buf, int flag)
|
||||||
|
{
|
||||||
|
struct stat64 buf64;
|
||||||
|
return (__fxstatat64 (vers, fd, filename, &buf64, flag)
|
||||||
|
?: xstat64_conv (buf, &buf64));
|
||||||
|
}
|
||||||
|
libc_hidden_def (__fxstatat)
|
46
sysdeps/mach/hurd/fxstatat64.c
Normal file
46
sysdeps/mach/hurd/fxstatat64.c
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/* Get information about file named relative to open directory. Hurd version.
|
||||||
|
Copyright (C) 2006 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <hurd.h>
|
||||||
|
#include <hurd/fd.h>
|
||||||
|
|
||||||
|
/* Get information about the file descriptor FD in BUF. */
|
||||||
|
int
|
||||||
|
__fxstatat64 (int vers, int fd, const char *filename, struct stat64 *buf,
|
||||||
|
int flag)
|
||||||
|
{
|
||||||
|
error_t err;
|
||||||
|
io_t port;
|
||||||
|
|
||||||
|
if (vers != _STAT_VER)
|
||||||
|
return __hurd_fail (EINVAL);
|
||||||
|
|
||||||
|
port = __file_name_lookup_at (fd, flag, filename, 0, 0);
|
||||||
|
if (port == MACH_PORT_NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
err = __io_stat (port, buf);
|
||||||
|
__mach_port_deallocate (__mach_task_self (), port);
|
||||||
|
|
||||||
|
return __hurd_fail (err);
|
||||||
|
}
|
66
sysdeps/mach/hurd/linkat.c
Normal file
66
sysdeps/mach/hurd/linkat.c
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/* Make a link between file names relative to open directories. Hurd version.
|
||||||
|
Copyright (C) 2006 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <hurd.h>
|
||||||
|
#include <hurd/fd.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* Make a link to FROM relative to FROMFD called TO relative to TOFD. */
|
||||||
|
int
|
||||||
|
linkat (fromfd, from, tofd, to, flags)
|
||||||
|
int fromfd;
|
||||||
|
const char *from;
|
||||||
|
int tofd;
|
||||||
|
const char *to;
|
||||||
|
int flags;
|
||||||
|
{
|
||||||
|
error_t err;
|
||||||
|
file_t oldfile, linknode, todir;
|
||||||
|
char *toname;
|
||||||
|
|
||||||
|
oldfile = __file_name_lookup_at (fromfd, flags, from, 0, 0);
|
||||||
|
if (oldfile == MACH_PORT_NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* The file_getlinknode RPC returns the port that should be passed to
|
||||||
|
the receiving filesystem (the one containing TODIR) in dir_link. */
|
||||||
|
|
||||||
|
err = __file_getlinknode (oldfile, &linknode);
|
||||||
|
__mach_port_deallocate (__mach_task_self (), oldfile);
|
||||||
|
if (err)
|
||||||
|
return __hurd_fail (err);
|
||||||
|
|
||||||
|
todir = __file_name_split_at (tofd, to, &toname);
|
||||||
|
if (todir != MACH_PORT_NULL)
|
||||||
|
{
|
||||||
|
err = __dir_link (todir, linknode, toname, 1);
|
||||||
|
__mach_port_deallocate (__mach_task_self (), todir);
|
||||||
|
}
|
||||||
|
__mach_port_deallocate (__mach_task_self (), linknode);
|
||||||
|
if (todir == MACH_PORT_NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
return __hurd_fail (err);
|
||||||
|
return 0;
|
||||||
|
}
|
42
sysdeps/mach/hurd/mkdirat.c
Normal file
42
sysdeps/mach/hurd/mkdirat.c
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/* Create a directory named relative to another open directory. Hurd version.
|
||||||
|
Copyright (C) 1991,1993,1994,1995,1996,1997,2002,2006
|
||||||
|
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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <hurd.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
mkdirat (fd, path, mode)
|
||||||
|
int fd;
|
||||||
|
const char *path;
|
||||||
|
mode_t mode;
|
||||||
|
{
|
||||||
|
error_t err;
|
||||||
|
const char *name;
|
||||||
|
file_t parent = __directory_name_split (path, (char **) &name);
|
||||||
|
if (parent == MACH_PORT_NULL)
|
||||||
|
return -1;
|
||||||
|
err = __dir_mkdir (parent, name, mode & ~_hurd_umask);
|
||||||
|
__mach_port_deallocate (__mach_task_self (), parent);
|
||||||
|
if (err)
|
||||||
|
return __hurd_fail (err);
|
||||||
|
return 0;
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1992,93,94,95,97,2000,2002 Free Software Foundation, Inc.
|
/* Copyright (C) 1992,93,94,95,97,2000,2002,2006 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -51,3 +51,9 @@ libc_hidden_def (__libc_open)
|
|||||||
weak_alias (__libc_open, __open)
|
weak_alias (__libc_open, __open)
|
||||||
libc_hidden_weak (__open)
|
libc_hidden_weak (__open)
|
||||||
weak_alias (__libc_open, open)
|
weak_alias (__libc_open, open)
|
||||||
|
|
||||||
|
/* open64 is just the same as open for us. */
|
||||||
|
weak_alias (__libc_open, __libc_open64)
|
||||||
|
weak_alias (__libc_open, __open64)
|
||||||
|
libc_hidden_weak (_open64)
|
||||||
|
weak_alias (__libc_open, open64)
|
||||||
|
1
sysdeps/mach/hurd/open64.c
Normal file
1
sysdeps/mach/hurd/open64.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
/* open64 is defined in open.c as an alias. */
|
62
sysdeps/mach/hurd/openat.c
Normal file
62
sysdeps/mach/hurd/openat.c
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/* openat -- Open a file named relative to an open directory. Hurd version.
|
||||||
|
Copyright (C) 2006 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <hurd.h>
|
||||||
|
#include <hurd/fd.h>
|
||||||
|
|
||||||
|
/* Open FILE with access OFLAG. Interpret relative paths relative to
|
||||||
|
the directory associated with FD. If OFLAG includes O_CREAT, a
|
||||||
|
third argument is the file protection. */
|
||||||
|
int
|
||||||
|
__openat (fd, file, oflag)
|
||||||
|
int fd;
|
||||||
|
const char *file;
|
||||||
|
int oflag;
|
||||||
|
{
|
||||||
|
int mode;
|
||||||
|
io_t port;
|
||||||
|
|
||||||
|
if (oflag & O_CREAT)
|
||||||
|
{
|
||||||
|
va_list arg;
|
||||||
|
va_start (arg, oflag);
|
||||||
|
mode = va_arg (arg, int);
|
||||||
|
va_end (arg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
mode = 0;
|
||||||
|
|
||||||
|
port = __file_name_lookup_at (fd, 0, file, oflag, mode);
|
||||||
|
if (port == MACH_PORT_NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return _hurd_intern_fd (port, oflag, 1);
|
||||||
|
}
|
||||||
|
libc_hidden_def (__openat)
|
||||||
|
weak_alias (__openat, openat)
|
||||||
|
|
||||||
|
/* openat64 is just the same as openat for us. */
|
||||||
|
weak_alias (__openat, __openat64)
|
||||||
|
libc_hidden_weak (__openat64)
|
||||||
|
weak_alias (__openat, openat64)
|
1
sysdeps/mach/hurd/openat64.c
Normal file
1
sysdeps/mach/hurd/openat64.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
/* openat64 is defined in openat.c as an alias. */
|
74
sysdeps/mach/hurd/symlinkat.c
Normal file
74
sysdeps/mach/hurd/symlinkat.c
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/* Create a symbolic link named relative to an open directory. Hurd version.
|
||||||
|
Copyright (C) 1991,1992,1993,1994,1995,1996,1997,2006
|
||||||
|
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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <hurd.h>
|
||||||
|
#include <hurd/paths.h>
|
||||||
|
#include <hurd/fd.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* Make a link to FROM called TO relative to FD. */
|
||||||
|
int
|
||||||
|
symlinkat (from, fd, to)
|
||||||
|
const char *from;
|
||||||
|
int fd;
|
||||||
|
const char *to;
|
||||||
|
{
|
||||||
|
error_t err;
|
||||||
|
file_t dir, node;
|
||||||
|
char *name;
|
||||||
|
const size_t len = strlen (from) + 1;
|
||||||
|
char buf[sizeof (_HURD_SYMLINK) + len];
|
||||||
|
|
||||||
|
/* A symlink is a file whose translator is "/hurd/symlink\0target\0". */
|
||||||
|
|
||||||
|
memcpy (buf, _HURD_SYMLINK, sizeof (_HURD_SYMLINK));
|
||||||
|
memcpy (&buf[sizeof (_HURD_SYMLINK)], from, len);
|
||||||
|
|
||||||
|
dir = __file_name_split_at (fd, to, &name);
|
||||||
|
if (dir == MACH_PORT_NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* Create a new, unlinked node in the target directory. */
|
||||||
|
err = __dir_mkfile (dir, O_WRITE, 0777 & ~_hurd_umask, &node);
|
||||||
|
|
||||||
|
if (! err)
|
||||||
|
/* Set the node's translator to make it a symlink. */
|
||||||
|
err = __file_set_translator (node,
|
||||||
|
FS_TRANS_EXCL|FS_TRANS_SET,
|
||||||
|
FS_TRANS_EXCL|FS_TRANS_SET, 0,
|
||||||
|
buf, sizeof (_HURD_SYMLINK) + len,
|
||||||
|
MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND);
|
||||||
|
|
||||||
|
if (! err)
|
||||||
|
/* Link the node, now a valid symlink, into the target directory. */
|
||||||
|
err = __dir_link (dir, node, name, 1);
|
||||||
|
|
||||||
|
__mach_port_deallocate (__mach_task_self (), dir);
|
||||||
|
__mach_port_deallocate (__mach_task_self (), node);
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
return __hurd_fail (err);
|
||||||
|
return 0;
|
||||||
|
}
|
55
sysdeps/mach/hurd/unlinkat.c
Normal file
55
sysdeps/mach/hurd/unlinkat.c
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/* unlinkat -- Remove a name relative to an open directory. Hurd version.
|
||||||
|
Copyright (C) 2006 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <hurd.h>
|
||||||
|
#include <hurd/fd.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* Remove the link named NAME. */
|
||||||
|
int
|
||||||
|
unlinkat (fd, name, flag)
|
||||||
|
int fd;
|
||||||
|
const char *name;
|
||||||
|
int flag;
|
||||||
|
{
|
||||||
|
error_t err;
|
||||||
|
file_t dir;
|
||||||
|
const char *file;
|
||||||
|
|
||||||
|
if ((flag &~ AT_REMOVEDIR) != 0)
|
||||||
|
{
|
||||||
|
__set_errno (EINVAL);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dir = __directory_name_split_at (fd, name, (char **) &file);
|
||||||
|
if (dir == MACH_PORT_NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
err = ((flag & AT_REMOVEDIR) ? __dir_rmdir : __dir_unlink) (dir, file);
|
||||||
|
__mach_port_deallocate (__mach_task_self (), dir);
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
return __hurd_fail (err);
|
||||||
|
return 0;
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1991,1992,1993,1994,1995,1996,1999,2002,2005
|
/* Copyright (C) 1991,1992,1993,1994,1995,1996,1999,2002,2005,2006
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
@ -18,13 +18,10 @@
|
|||||||
02111-1307 USA. */
|
02111-1307 USA. */
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <hurd.h>
|
|
||||||
#include <hurd/paths.h>
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include "stdio-common/_itoa.h"
|
#include <stddef.h>
|
||||||
#include <string.h>
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
|
||||||
/* Create a device file named FILE_NAME, with permission and special bits MODE
|
/* Create a device file named FILE_NAME, with permission and special bits MODE
|
||||||
@ -33,85 +30,6 @@
|
|||||||
int
|
int
|
||||||
__xmknod (int vers, const char *file_name, mode_t mode, dev_t *dev)
|
__xmknod (int vers, const char *file_name, mode_t mode, dev_t *dev)
|
||||||
{
|
{
|
||||||
error_t err;
|
return __xmknodat (vers, AT_FDCWD, file_name, mode, dev);
|
||||||
file_t dir, node;
|
|
||||||
char *name;
|
|
||||||
char buf[100], *bp;
|
|
||||||
const char *translator;
|
|
||||||
size_t len;
|
|
||||||
|
|
||||||
if (vers != _MKNOD_VER)
|
|
||||||
return __hurd_fail (EINVAL);
|
|
||||||
|
|
||||||
if (S_ISCHR (mode))
|
|
||||||
{
|
|
||||||
translator = _HURD_CHRDEV;
|
|
||||||
len = sizeof (_HURD_CHRDEV);
|
|
||||||
}
|
|
||||||
else if (S_ISBLK (mode))
|
|
||||||
{
|
|
||||||
translator = _HURD_BLKDEV;
|
|
||||||
len = sizeof (_HURD_BLKDEV);
|
|
||||||
}
|
|
||||||
else if (S_ISFIFO (mode))
|
|
||||||
{
|
|
||||||
translator = _HURD_FIFO;
|
|
||||||
len = sizeof (_HURD_FIFO);
|
|
||||||
}
|
|
||||||
else if (S_ISREG (mode))
|
|
||||||
{
|
|
||||||
translator = NULL;
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (translator != NULL && ! S_ISFIFO (mode))
|
|
||||||
{
|
|
||||||
/* We set the translator to "ifmt\0major\0minor\0", where IFMT
|
|
||||||
depends on the S_IFMT bits of our MODE argument, and MAJOR and
|
|
||||||
MINOR are ASCII decimal (octal or hex would do as well)
|
|
||||||
representations of our arguments. Thus the convention is that
|
|
||||||
CHRDEV and BLKDEV translators are invoked with two non-switch
|
|
||||||
arguments, giving the major and minor device numbers in %i format. */
|
|
||||||
|
|
||||||
bp = buf + sizeof (buf);
|
|
||||||
*--bp = '\0';
|
|
||||||
bp = _itoa (minor (*dev), bp, 10, 0);
|
|
||||||
*--bp = '\0';
|
|
||||||
bp = _itoa (major (*dev), bp, 10, 0);
|
|
||||||
memcpy (bp - len, translator, len);
|
|
||||||
translator = bp - len;
|
|
||||||
len = buf + sizeof (buf) - translator;
|
|
||||||
}
|
|
||||||
|
|
||||||
dir = __file_name_split (file_name, &name);
|
|
||||||
if (dir == MACH_PORT_NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* Create a new, unlinked node in the target directory. */
|
|
||||||
err = __dir_mkfile (dir, O_WRITE, (mode & ~S_IFMT) & ~_hurd_umask, &node);
|
|
||||||
|
|
||||||
if (! err && translator != NULL)
|
|
||||||
/* Set the node's translator to make it a device. */
|
|
||||||
err = __file_set_translator (node,
|
|
||||||
FS_TRANS_EXCL | FS_TRANS_SET,
|
|
||||||
FS_TRANS_EXCL | FS_TRANS_SET, 0,
|
|
||||||
translator, len,
|
|
||||||
MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND);
|
|
||||||
|
|
||||||
if (! err)
|
|
||||||
/* Link the node, now a valid device, into the target directory. */
|
|
||||||
err = __dir_link (dir, node, name, 1);
|
|
||||||
|
|
||||||
__mach_port_deallocate (__mach_task_self (), dir);
|
|
||||||
__mach_port_deallocate (__mach_task_self (), node);
|
|
||||||
|
|
||||||
if (err)
|
|
||||||
return __hurd_fail (err);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
libc_hidden_def (__xmknod)
|
libc_hidden_def (__xmknod)
|
||||||
|
118
sysdeps/mach/hurd/xmknodat.c
Normal file
118
sysdeps/mach/hurd/xmknodat.c
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
/* Create a device file relative to an open directory. Hurd version.
|
||||||
|
Copyright (C) 1991,1992,1993,1994,1995,1996,1999,2002,2005,2006
|
||||||
|
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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <hurd.h>
|
||||||
|
#include <hurd/fd.h>
|
||||||
|
#include <hurd/paths.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include "stdio-common/_itoa.h"
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
/* Create a device file named PATH relative to FD, with permission and
|
||||||
|
special bits MODE and device number DEV (which can be constructed
|
||||||
|
from major and minor device numbers with the `makedev' macro
|
||||||
|
above). */
|
||||||
|
int
|
||||||
|
__xmknodat (int vers, int fd, const char *path, mode_t mode, dev_t *dev)
|
||||||
|
{
|
||||||
|
error_t err;
|
||||||
|
file_t dir, node;
|
||||||
|
char *name;
|
||||||
|
char buf[100], *bp;
|
||||||
|
const char *translator;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
if (vers != _MKNOD_VER)
|
||||||
|
return __hurd_fail (EINVAL);
|
||||||
|
|
||||||
|
if (S_ISCHR (mode))
|
||||||
|
{
|
||||||
|
translator = _HURD_CHRDEV;
|
||||||
|
len = sizeof (_HURD_CHRDEV);
|
||||||
|
}
|
||||||
|
else if (S_ISBLK (mode))
|
||||||
|
{
|
||||||
|
translator = _HURD_BLKDEV;
|
||||||
|
len = sizeof (_HURD_BLKDEV);
|
||||||
|
}
|
||||||
|
else if (S_ISFIFO (mode))
|
||||||
|
{
|
||||||
|
translator = _HURD_FIFO;
|
||||||
|
len = sizeof (_HURD_FIFO);
|
||||||
|
}
|
||||||
|
else if (S_ISREG (mode))
|
||||||
|
{
|
||||||
|
translator = NULL;
|
||||||
|
len = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (translator != NULL && ! S_ISFIFO (mode))
|
||||||
|
{
|
||||||
|
/* We set the translator to "ifmt\0major\0minor\0", where IFMT
|
||||||
|
depends on the S_IFMT bits of our MODE argument, and MAJOR and
|
||||||
|
MINOR are ASCII decimal (octal or hex would do as well)
|
||||||
|
representations of our arguments. Thus the convention is that
|
||||||
|
CHRDEV and BLKDEV translators are invoked with two non-switch
|
||||||
|
arguments, giving the major and minor device numbers in %i format. */
|
||||||
|
|
||||||
|
bp = buf + sizeof (buf);
|
||||||
|
*--bp = '\0';
|
||||||
|
bp = _itoa (minor (*dev), bp, 10, 0);
|
||||||
|
*--bp = '\0';
|
||||||
|
bp = _itoa (major (*dev), bp, 10, 0);
|
||||||
|
memcpy (bp - len, translator, len);
|
||||||
|
translator = bp - len;
|
||||||
|
len = buf + sizeof (buf) - translator;
|
||||||
|
}
|
||||||
|
|
||||||
|
dir = __file_name_split_at (fd, path, &name);
|
||||||
|
if (dir == MACH_PORT_NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* Create a new, unlinked node in the target directory. */
|
||||||
|
err = __dir_mkfile (dir, O_WRITE, (mode & ~S_IFMT) & ~_hurd_umask, &node);
|
||||||
|
|
||||||
|
if (! err && translator != NULL)
|
||||||
|
/* Set the node's translator to make it a device. */
|
||||||
|
err = __file_set_translator (node,
|
||||||
|
FS_TRANS_EXCL | FS_TRANS_SET,
|
||||||
|
FS_TRANS_EXCL | FS_TRANS_SET, 0,
|
||||||
|
translator, len,
|
||||||
|
MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND);
|
||||||
|
|
||||||
|
if (! err)
|
||||||
|
/* Link the node, now a valid device, into the target directory. */
|
||||||
|
err = __dir_link (dir, node, name, 1);
|
||||||
|
|
||||||
|
__mach_port_deallocate (__mach_task_self (), dir);
|
||||||
|
__mach_port_deallocate (__mach_task_self (), node);
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
return __hurd_fail (err);
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user