* 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:
Roland McGrath 2006-03-06 07:59:23 +00:00
parent 7d013a64de
commit 16a1046837
22 changed files with 858 additions and 109 deletions

View File

@ -13,6 +13,34 @@
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
rather than #ifdef _POSIX_FOO for options. We should return -1
at runtime for an option defined to 0 at compile time.

View File

@ -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.
# This file is part of the GNU C Library.
@ -46,7 +46,7 @@ server-interfaces := hurd/msg faultexc
routines = hurdstartup hurdinit \
hurdid hurdpid hurdrlimit hurdprio hurdexec hurdselect \
hurdlookup lookup-retry \
hurdlookup lookup-retry lookup-at \
get-host set-host \
path-lookup \
setauth \

View File

@ -1,5 +1,5 @@
/* 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.
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 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 */

View File

@ -1,5 +1,5 @@
/* 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.
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,
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,
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 *file_name,
@ -86,13 +86,37 @@ error_t hurd_file_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,
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 *file_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
`dir_lookup' calls until one returns FS_RETRY_NONE. The arguments

View File

@ -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.
This file is part of the GNU C Library.
@ -184,19 +184,7 @@ __hurd_directory_name_split (error_t (*use_init_port)
--lastslash;
/* 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);
#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)

110
hurd/lookup-at.c Normal file
View 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;
}

View File

@ -385,7 +385,8 @@ extern "C" {
powerpc32. For the time being, changing this is causing more
compatibility problems due to malloc_get_state/malloc_set_state than
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) \
? __alignof__ (long double) : 2 * SIZE_SZ)
*/

View 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;
}

View 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;
}

View 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;
}

View 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)

View 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);
}

View 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;
}

View 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;
}

View File

@ -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.
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)
libc_hidden_weak (__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)

View File

@ -0,0 +1 @@
/* open64 is defined in open.c as an alias. */

View 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)

View File

@ -0,0 +1 @@
/* openat64 is defined in openat.c as an alias. */

View 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;
}

View 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;
}

View File

@ -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.
This file is part of the GNU C Library.
@ -18,13 +18,10 @@
02111-1307 USA. */
#include <errno.h>
#include <sys/stat.h>
#include <hurd.h>
#include <hurd/paths.h>
#include <fcntl.h>
#include "stdio-common/_itoa.h"
#include <string.h>
#include <stddef.h>
#include <sys/types.h>
#include <sys/stat.h>
/* Create a device file named FILE_NAME, with permission and special bits MODE
@ -33,85 +30,6 @@
int
__xmknod (int vers, const char *file_name, 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 (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;
return __xmknodat (vers, AT_FDCWD, file_name, mode, dev);
}
libc_hidden_def (__xmknod)

View 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;
}