diff options
Diffstat (limited to 'sysdeps/mach/hurd')
77 files changed, 1337 insertions, 2049 deletions
diff --git a/sysdeps/mach/hurd/Dist b/sysdeps/mach/hurd/Dist deleted file mode 100644 index 52c84297cb..0000000000 --- a/sysdeps/mach/hurd/Dist +++ /dev/null @@ -1,17 +0,0 @@ -cthreads.c -errlist.c -errnos.awk -err_hurd.sub -libc-ldscript -libc_p-ldscript -bits/libc-tsd.h -net/ethernet.h -net/if_arp.h -net/if_ether.h -net/if_ppp.h -net/route.h -nfs/nfs.h -set-init.c -siglist.h -statfsconv.c -xstatconv.c diff --git a/sysdeps/mach/hurd/Subdirs b/sysdeps/mach/hurd/Subdirs index 16b8348437..7a7757582a 100644 --- a/sysdeps/mach/hurd/Subdirs +++ b/sysdeps/mach/hurd/Subdirs @@ -1 +1,9 @@ -hurd +# This file says that the hurd subdirectory should appear before all others. +# The mach and hurd subdirectories have many generated header files which +# much of the rest of the library depends on, so it is best to build them +# first (and mach before hurd, at that). The before-compile additions in +# sysdeps/{mach,hurd}/Makefile should make it reliably work for these files +# not to exist when making in other directories, but it will be slower that +# way with more somewhat expensive `make' invocations. + +first hurd diff --git a/sysdeps/mach/hurd/alpha/Dist b/sysdeps/mach/hurd/alpha/Dist deleted file mode 100644 index c58180257e..0000000000 --- a/sysdeps/mach/hurd/alpha/Dist +++ /dev/null @@ -1 +0,0 @@ -static-start.S diff --git a/sysdeps/mach/hurd/alpha/longjmp-ts.c b/sysdeps/mach/hurd/alpha/longjmp-ts.c index b271d6d2a9..f472dbcb30 100644 --- a/sysdeps/mach/hurd/alpha/longjmp-ts.c +++ b/sysdeps/mach/hurd/alpha/longjmp-ts.c @@ -1,5 +1,5 @@ /* Perform a `longjmp' on a Mach thread_state. Alpha version. - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 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 @@ -19,6 +19,7 @@ #include <hurd/signal.h> #include <setjmp.h> +#include <jmpbuf-offsets.h> #include <mach/thread_status.h> diff --git a/sysdeps/mach/hurd/bits/ioctls.h b/sysdeps/mach/hurd/bits/ioctls.h index 206058bf2f..06a73df75e 100644 --- a/sysdeps/mach/hurd/bits/ioctls.h +++ b/sysdeps/mach/hurd/bits/ioctls.h @@ -226,6 +226,7 @@ enum __ioctl_datum { IOC_8, IOC_16, IOC_32, IOC_64 }; #define SIOCSIFADDR _IOW('i', 12, struct ifreq) /* set ifnet address */ #define OSIOCGIFADDR _IOWR('i',13, struct ifreq) /* get ifnet address */ #define SIOCGIFADDR _IOWR('i',33, struct ifreq) /* get ifnet address */ +#define SIOCGIFHWADDR _IOWR('i',39, struct ifreq) /* get hwaddress */ #define SIOCSIFDSTADDR _IOW('i', 14, struct ifreq) /* set p-p address */ #define OSIOCGIFDSTADDR _IOWR('i',15, struct ifreq) /* get p-p address */ #define SIOCGIFDSTADDR _IOWR('i',34, struct ifreq) /* get p-p address */ diff --git a/sysdeps/mach/hurd/bits/posix_opt.h b/sysdeps/mach/hurd/bits/posix_opt.h index 326bebff7f..6747bc276e 100644 --- a/sysdeps/mach/hurd/bits/posix_opt.h +++ b/sysdeps/mach/hurd/bits/posix_opt.h @@ -1,5 +1,5 @@ /* Define POSIX options for GNU/Hurd. - Copyright (C) 1998,2000,2001,2002 Free Software Foundation, Inc. + Copyright (C) 1998,2000,2001,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 @@ -31,13 +31,6 @@ /* Processes have a saved set-user-ID and a saved set-group-ID. */ #define _POSIX_SAVED_IDS 1 -#if 0 /* XXX implement aio_* */ -/* Asynchronous I/O is supported. */ -#define _POSIX_ASYNCHRONOUS_IO 1 -/* Alternative name for Unix98. */ -#define _LFS_ASYNCHRONOUS_IO _POSIX_ASYNCHRONOUS_IO -#endif - /* Synchronizing file data is supported, but msync is missing. */ #undef _POSIX_SYNCHRONIZED_IO @@ -47,15 +40,15 @@ /* Mapping of files to memory is supported. */ #define _POSIX_MAPPED_FILES 200112L +/* Locking of all memory could be supported in future. */ +#define _POSIX_MEMLOCK 0 + /* Locking of ranges of memory is supported. */ #define _POSIX_MEMLOCK_RANGE 200112L /* Setting of memory protections is supported. */ #define _POSIX_MEMORY_PROTECTION 200112L -/* POSIX.4 shared memory objects are supported (using regular files). */ -#define _POSIX_SHARED_MEMORY_OBJECTS _POSIX_MAPPED_FILES - /* Elements of the `c_cc' member of `struct termios' structure can be disabled by using the value _POSIX_VDISABLE. */ #define _POSIX_VDISABLE ((unsigned char) -1) @@ -67,13 +60,106 @@ #undef _POSIX_NO_TRUNC /* Overlong file names get error? */ #undef _POSIX_SYNC_IO /* File supports O_SYNC et al? */ + +/* We do not have the POSIX threads interface. */ +#define _POSIX_THREADS -1 + +/* We have the reentrant functions described in POSIX. */ +#define _POSIX_REENTRANT_FUNCTIONS 1 +#define _POSIX_THREAD_SAFE_FUNCTIONS 200112L + +/* These are all things that won't be supported when _POSIX_THREADS is not. */ +#define _POSIX_THREAD_PRIORITY_SCHEDULING -1 +#define _POSIX_THREAD_ATTR_STACKSIZE -1 +#define _POSIX_THREAD_ATTR_STACKADDR -1 +#define _POSIX_SEMAPHORES -1 + +/* Real-time signals are not yet supported. */ +#define _POSIX_REALTIME_SIGNALS -1 + +/* Asynchronous I/O might supported with the existing ABI. */ +#define _POSIX_ASYNCHRONOUS_IO 0 +/* Alternative name for Unix98. */ +#define _LFS_ASYNCHRONOUS_IO _POSIX_ASYNCHRONOUS_IO + +/* The LFS support in asynchronous I/O is also available. */ +#define _LFS64_ASYNCHRONOUS_IO _POSIX_ASYNCHRONOUS_IO + +/* The rest of the LFS is also available. */ +#define _LFS_LARGEFILE 1 +#define _LFS64_LARGEFILE 1 +#define _LFS64_STDIO 1 + +/* POSIX.4 shared memory objects are supported (using regular files). */ +#define _POSIX_SHARED_MEMORY_OBJECTS _POSIX_MAPPED_FILES + +/* CPU-time clocks support needs to be checked at runtime. */ +#define _POSIX_CPUTIME 0 + +/* Clock support in threads must be also checked at runtime. */ +#define _POSIX_THREAD_CPUTIME 0 + /* GNU libc provides regular expression handling. */ #define _POSIX_REGEXP 1 +/* Reader/Writer locks are not available. */ +#define _POSIX_READER_WRITER_LOCKS -1 + /* We have a POSIX shell. */ #define _POSIX_SHELL 1 +/* We cannot support the Timeouts option without _POSIX_THREADS. */ +#define _POSIX_TIMEOUTS -1 + /* The `spawn' function family is supported. */ #define _POSIX_SPAWN 200112L +/* We do not have POSIX timers, but could in future without ABI change. */ +#define _POSIX_TIMERS 0 + +/* The barrier functions are not available. */ +#define _POSIX_BARRIERS -1 + +/* POSIX message queues could be available in future. */ +#define _POSIX_MESSAGE_PASSING 0 + +/* Thread process-shared synchronization is not supported. */ +#define _POSIX_THREAD_PROCESS_SHARED -1 + +/* The monotonic clock might be available. */ +#define _POSIX_MONOTONIC_CLOCK 0 + +/* The clock selection interfaces are available. */ +#define _POSIX_CLOCK_SELECTION 200112L + +/* Advisory information interfaces could be available in future. */ +#define _POSIX_ADVISORY_INFO 0 + +/* IPv6 support is available. */ +#define _POSIX_IPV6 200112L + +/* Raw socket support is available. */ +#define _POSIX_RAW_SOCKETS 200112L + +/* We have at least one terminal. */ +#define _POSIX2_CHAR_TERM 200112L + +/* Neither process nor thread sporadic server interfaces is available. */ +#define _POSIX_SPORADIC_SERVER -1 +#define _POSIX_THREAD_SPORADIC_SERVER -1 + +/* trace.h is not available. */ +#define _POSIX_TRACE -1 +#define _POSIX_TRACE_EVENT_FILTER -1 +#define _POSIX_TRACE_INHERIT -1 +#define _POSIX_TRACE_LOG -1 + +/* Typed memory objects are not available. */ +#define _POSIX_TYPED_MEMORY_OBJECTS -1 + +/* No support for priority inheritance or protection so far. */ +#define _POSIX_THREAD_PRIO_INHERIT -1 +#define _POSIX_THREAD_PRIO_PROTECT -1 + + #endif /* bits/posix_opt.h */ diff --git a/sysdeps/mach/hurd/bits/stat.h b/sysdeps/mach/hurd/bits/stat.h index 172bc5ea8e..c3f96660cc 100644 --- a/sysdeps/mach/hurd/bits/stat.h +++ b/sysdeps/mach/hurd/bits/stat.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1992, 93, 94, 96, 97, 99, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1992,93,94,96,97,99,2000,2005 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 @@ -182,8 +182,11 @@ struct stat64 /* All the bits relevant to translators */ #define S_ITRANS 000070000000 +/* Definitely no mmaps to this. */ +#define S_IMMAP0 000100000000 + /* ALL the unused bits. */ -#define S_ISPARE (~(S_IFMT|S_ITRANS|S_INOCACHE| \ +#define S_ISPARE (~(S_IFMT|S_ITRANS|S_INOCACHE|S_IMMAP0| \ S_IUSEUNK|S_IUNKNOWN|07777)) #endif diff --git a/sysdeps/mach/hurd/dl-sysdep.h b/sysdeps/mach/hurd/dl-sysdep.h index 2dc9b0a910..4b21b779ef 100644 --- a/sysdeps/mach/hurd/dl-sysdep.h +++ b/sysdeps/mach/hurd/dl-sysdep.h @@ -1,5 +1,5 @@ /* System-specific settings for dynamic linker code. Hurd version. - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2002, 2005 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 @@ -23,3 +23,9 @@ (open, mmap, etc). */ #define RTLD_PRIVATE_ERRNO 0 + +#ifdef SHARED +/* _dl_argv cannot be attribute_relro, because the stack-switching + libc initializer for using cthreads might write into it. */ +# define DL_ARGV_NOT_RELRO 1 +#endif diff --git a/sysdeps/mach/hurd/errno.c b/sysdeps/mach/hurd/errno.c new file mode 100644 index 0000000000..a29091b5e2 --- /dev/null +++ b/sysdeps/mach/hurd/errno.c @@ -0,0 +1 @@ +/* No definition of `errno' variable on the Hurd. */ diff --git a/sysdeps/mach/hurd/euidaccess.c b/sysdeps/mach/hurd/euidaccess.c index 4e72e2abb3..57f2a015cc 100644 --- a/sysdeps/mach/hurd/euidaccess.c +++ b/sysdeps/mach/hurd/euidaccess.c @@ -1,5 +1,5 @@ /* Test for access to FILE using effective UID and GID. Hurd version. - Copyright (C) 1991, 1995, 1997 Free Software Foundation, Inc. + Copyright (C) 1991, 1995, 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 @@ -57,3 +57,4 @@ __euidaccess (file, type) return 0; } weak_alias (__euidaccess, euidaccess) +weak_alias (__euidaccess, eaccess) diff --git a/sysdeps/mach/hurd/faccessat.c b/sysdeps/mach/hurd/faccessat.c new file mode 100644 index 0000000000..bb3c9fe19f --- /dev/null +++ b/sysdeps/mach/hurd/faccessat.c @@ -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; +} diff --git a/sysdeps/mach/hurd/fchmodat.c b/sysdeps/mach/hurd/fchmodat.c new file mode 100644 index 0000000000..d27e845274 --- /dev/null +++ b/sysdeps/mach/hurd/fchmodat.c @@ -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; +} diff --git a/sysdeps/mach/hurd/fchownat.c b/sysdeps/mach/hurd/fchownat.c new file mode 100644 index 0000000000..1b99b29272 --- /dev/null +++ b/sysdeps/mach/hurd/fchownat.c @@ -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; +} diff --git a/sysdeps/mach/hurd/fdopendir.c b/sysdeps/mach/hurd/fdopendir.c new file mode 100644 index 0000000000..016f825f1d --- /dev/null +++ b/sysdeps/mach/hurd/fdopendir.c @@ -0,0 +1,58 @@ +/* Open a directory stream from a file descriptor. Hurd version. + Copyright (C) 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 <dirent.h> +#include <errno.h> +#include <hurd.h> +#include <hurd/fd.h> +#include <fcntl.h> + +DIR *_hurd_fd_opendir (struct hurd_fd *d); /* opendir.c */ + +/* Open a directory stream on FD. */ +DIR * +__fdopendir (int fd) +{ + struct hurd_fd *d = _hurd_fd_get (fd); + + if (d == NULL) + { + errno = EBADF; + return NULL; + } + + /* Ensure that it's a directory. */ + error_t err = HURD_FD_PORT_USE + (d, ({ + file_t dir = __file_name_lookup_under (port, "/", + O_DIRECTORY | O_NOTRANS, 0);; + if (dir != MACH_PORT_NULL) + __mach_port_deallocate (__mach_task_self (), dir); + dir != MACH_PORT_NULL ? 0 : errno; + })); + + if (err) + { + errno = err; + return NULL; + } + + return _hurd_fd_opendir (d); +} +weak_alias (__fdopendir, fdopendir) diff --git a/sysdeps/mach/hurd/mips/init-fault.c b/sysdeps/mach/hurd/fgetxattr.c index 05f48a3a56..2eb6db06c7 100644 --- a/sysdeps/mach/hurd/mips/init-fault.c +++ b/sysdeps/mach/hurd/fgetxattr.c @@ -1,5 +1,5 @@ -/* Set up a thread_state for proc_handle_exceptions. MIPS version. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. +/* Access to extended attributes on files. Hurd version. + Copyright (C) 2004 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 @@ -17,25 +17,18 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include <hurd/signal.h> -#include <mach/thread_status.h> -#include <string.h> -#include <setjmp.h> +#include <errno.h> +#include <sys/xattr.h> +#include <hurd.h> +#include <hurd/xattr.h> +#include <hurd/fd.h> -extern jmp_buf _hurd_sigthread_fault_env; - -static char fault_stack[32]; -static volatile void -faulted (void) +ssize_t +fgetxattr (int fd, const char *name, void *value, size_t size) { - __longjmp (_hurd_sigthread_fault_env, 1); -} + error_t err; -void -_hurd_initialize_fault_recovery_state (void *state) -{ - struct mips_thread_state *ts = state; - memset (ts, 0, sizeof (*ts)); - ts->r29 = (int) &fault_stack[sizeof (fault_stack)]; - ts->pc = (int) &faulted; + err = HURD_DPORT_USE (fd, _hurd_xattr_get (port, name, value, &size)); + + return err ? __hurd_dfail (fd, err) : size; } diff --git a/sysdeps/mach/hurd/nfs/nfs.h b/sysdeps/mach/hurd/flistxattr.c index e83a874fe6..a577e4e393 100644 --- a/sysdeps/mach/hurd/nfs/nfs.h +++ b/sysdeps/mach/hurd/flistxattr.c @@ -1,5 +1,5 @@ -/* <nfs/nfs.h> -- ill-specified NFS-related definitions - Copyright (C) 1999 Free Software Foundation, Inc. +/* Access to extended attributes on files. Hurd version. + Copyright (C) 2005 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 @@ -17,16 +17,18 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#ifndef _NFS_NFS_H -#define _NFS_NFS_H 1 +#include <errno.h> +#include <sys/xattr.h> +#include <hurd.h> +#include <hurd/xattr.h> +#include <hurd/fd.h> -/* This file is empty for now. Its contents do not seem to be - standardized in any way. It exists solely for the sake of - <rpcsvc/bootparam_prot.h> which insists on including <nfs/nfs.h>. +ssize_t +flistxattr (int fd, char *list, size_t size) +{ + error_t err; - For the time being, we just provide this file here to smooth building - the libc distribution (i.e. librpcsvc). We do not install this file for - users, since we haven't really figured out what the right thing to go - here is. */ + err = HURD_DPORT_USE (fd, _hurd_xattr_list (port, list, &size)); -#endif /* nfs/nfs.h */ + return err ? __hurd_dfail (fd, err) : size; +} diff --git a/sysdeps/mach/hurd/fork.c b/sysdeps/mach/hurd/fork.c index 8728596915..fa7da60204 100644 --- a/sysdeps/mach/hurd/fork.c +++ b/sysdeps/mach/hurd/fork.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1994,95,96,97,99,2001,02, 04 Free Software Foundation, Inc. +/* Copyright (C) 1994,1995,1996,1997,1999,2001,2002,2004,2005 + 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 @@ -21,7 +22,7 @@ #include <hurd.h> #include <hurd/signal.h> #include <setjmp.h> -#include "thread_state.h" +#include <thread_state.h> #include <sysdep.h> /* For stack growth direction. */ #include "set-hooks.h" #include <assert.h> diff --git a/sysdeps/mach/hurd/mips/longjmp-ctx.c b/sysdeps/mach/hurd/fremovexattr.c index 66ee7b6fb8..5d3aca6093 100644 --- a/sysdeps/mach/hurd/mips/longjmp-ctx.c +++ b/sysdeps/mach/hurd/fremovexattr.c @@ -1,5 +1,5 @@ -/* Perform a `longjmp' on a `struct sigcontext'. MIPS version. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. +/* Access to extended attributes on files. Hurd version. + Copyright (C) 2005 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 @@ -17,25 +17,18 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include <setjmp.h> -#include <hurd/signal.h> -#include <string.h> +#include <errno.h> +#include <sys/xattr.h> +#include <hurd.h> +#include <hurd/xattr.h> +#include <hurd/fd.h> -void -_hurd_longjmp_sigcontext (struct sigcontext *scp, jmp_buf env, int retval) +int +fremovexattr (int fd, const char *name) { - scp->sc_gpr[16] = env[0].__regs[0]; - scp->sc_gpr[17] = env[0].__regs[1]; - scp->sc_gpr[18] = env[0].__regs[2]; - scp->sc_gpr[19] = env[0].__regs[3]; - scp->sc_gpr[20] = env[0].__regs[4]; - scp->sc_gpr[21] = env[0].__regs[5]; - scp->sc_gpr[22] = env[0].__regs[6]; - scp->sc_gpr[23] = env[0].__regs[7]; + error_t err; - scp->sc_gpr[28] = (int) env[0].__gp; - scp->sc_fp = (int) env[0].__fp; - scp->sc_sp = (int) env[0].__sp; - scp->sc_pc = (int) env[0].__pc; - scp->sc_gpr[2] = retval ?: 1; + err = HURD_DPORT_USE (fd, _hurd_xattr_remove (port, name)); + + return err ? __hurd_dfail (fd, err) : 0; } diff --git a/sysdeps/mach/hurd/fsetxattr.c b/sysdeps/mach/hurd/fsetxattr.c new file mode 100644 index 0000000000..db8b676a06 --- /dev/null +++ b/sysdeps/mach/hurd/fsetxattr.c @@ -0,0 +1,34 @@ +/* Access to extended attributes on files. 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 <sys/xattr.h> +#include <hurd.h> +#include <hurd/xattr.h> +#include <hurd/fd.h> + +ssize_t +fsetxattr (int fd, const char *name, const void *value, size_t size, int flags) +{ + error_t err; + + err = HURD_DPORT_USE (fd, _hurd_xattr_set (port, name, value, size, flags)); + + return err ? __hurd_dfail (fd, err) : 0; +} diff --git a/sysdeps/mach/hurd/fxstatat.c b/sysdeps/mach/hurd/fxstatat.c new file mode 100644 index 0000000000..dd9d2796eb --- /dev/null +++ b/sysdeps/mach/hurd/fxstatat.c @@ -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) diff --git a/sysdeps/mach/hurd/fxstatat64.c b/sysdeps/mach/hurd/fxstatat64.c new file mode 100644 index 0000000000..6862e80d52 --- /dev/null +++ b/sysdeps/mach/hurd/fxstatat64.c @@ -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); +} diff --git a/sysdeps/mach/hurd/getdents.c b/sysdeps/mach/hurd/getdents.c index 4775f983b4..d15be3b8f3 100644 --- a/sysdeps/mach/hurd/getdents.c +++ b/sysdeps/mach/hurd/getdents.c @@ -1 +1 @@ -#include <sysdeps/generic/getdents.c> +#include <dirent/getdents.c> diff --git a/sysdeps/mach/hurd/getpeername.c b/sysdeps/mach/hurd/getpeername.c index 2e4f9f6a9d..325b6fd75d 100644 --- a/sysdeps/mach/hurd/getpeername.c +++ b/sysdeps/mach/hurd/getpeername.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992, 1994, 1997, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1992,1994,1997,1999,2000,2005 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 @@ -47,14 +47,22 @@ __getpeername (int fd, __SOCKADDR_ARG addrarg, socklen_t *len) if (*len > buflen) *len = buflen; - + if (buf != (char *) addr) { memcpy (addr, buf, *len); __vm_deallocate (__mach_task_self (), (vm_address_t) buf, buflen); } - addr->sa_family = type; + const sa_family_t family = type; + if (*len > offsetof (struct sockaddr, sa_family)) + { + if (*len < (char *) (&addr->sa_family + 1) - (char *) addr) + memcpy (&addr->sa_family, &family, + *len - offsetof (struct sockaddr, sa_family)); + else + addr->sa_family = family; + } return 0; } diff --git a/sysdeps/mach/hurd/getresgid.c b/sysdeps/mach/hurd/getresgid.c index a96aa49369..7847d213c4 100644 --- a/sysdeps/mach/hurd/getresgid.c +++ b/sysdeps/mach/hurd/getresgid.c @@ -1,5 +1,5 @@ -/* getresgid -- fetch effective group ID, real group ID, and saved-set group ID - Copyright (C) 2002 Free Software Foundation, Inc. +/* getresgid -- fetch real group ID, effective group ID, and saved-set group ID + Copyright (C) 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 @@ -22,13 +22,13 @@ #include <hurd.h> #include <hurd/id.h> -/* Fetch the effective group ID, real group ID, and saved-set group ID, +/* Fetch the real group ID, effective group ID, and saved-set group ID, of the calling process. */ int -__getresgid (gid_t *egid, gid_t *rgid, gid_t *sgid) +__getresgid (gid_t *rgid, gid_t *egid, gid_t *sgid) { error_t err; - gid_t eff, real, saved; + gid_t real, eff, saved; HURD_CRITICAL_BEGIN; __mutex_lock (&_hurd_id.lock); @@ -42,8 +42,8 @@ __getresgid (gid_t *egid, gid_t *rgid, gid_t *sgid) else { real = _hurd_id.aux.gids[0]; - saved = _hurd_id.aux.ngids < 2 ? real :_hurd_id.aux.gids[1]; eff = _hurd_id.gen.ngids < 1 ? real : _hurd_id.gen.gids[0]; + saved = _hurd_id.aux.ngids < 2 ? real : _hurd_id.aux.gids[1]; } } @@ -53,8 +53,8 @@ __getresgid (gid_t *egid, gid_t *rgid, gid_t *sgid) if (err) return __hurd_fail (err); - *egid = eff; *rgid = real; + *egid = eff; *sgid = saved; return 0; } diff --git a/sysdeps/mach/hurd/getresuid.c b/sysdeps/mach/hurd/getresuid.c index f4bfaeaf56..668e463a39 100644 --- a/sysdeps/mach/hurd/getresuid.c +++ b/sysdeps/mach/hurd/getresuid.c @@ -1,5 +1,5 @@ -/* getresuid -- fetch effective user ID, real user ID, and saved-set user ID - Copyright (C) 2002 Free Software Foundation, Inc. +/* getresuid -- fetch real user ID, effective user ID, and saved-set user ID + Copyright (C) 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 @@ -22,13 +22,13 @@ #include <hurd.h> #include <hurd/id.h> -/* Fetch the effective user ID, real user ID, and saved-set user ID, +/* Fetch the real user ID, effective user ID, and saved-set user ID, of the calling process. */ int -__getresuid (uid_t *euid, uid_t *ruid, uid_t *suid) +__getresuid (uid_t *ruid, uid_t *euid, uid_t *suid) { error_t err; - uid_t eff, real, saved; + uid_t real, eff, saved; HURD_CRITICAL_BEGIN; __mutex_lock (&_hurd_id.lock); @@ -42,8 +42,8 @@ __getresuid (uid_t *euid, uid_t *ruid, uid_t *suid) else { real = _hurd_id.aux.uids[0]; - saved = _hurd_id.aux.nuids < 2 ? real :_hurd_id.aux.uids[1]; eff = _hurd_id.gen.nuids < 1 ? real : _hurd_id.gen.uids[0]; + saved = _hurd_id.aux.nuids < 2 ? real : _hurd_id.aux.uids[1]; } } @@ -53,8 +53,8 @@ __getresuid (uid_t *euid, uid_t *ruid, uid_t *suid) if (err) return __hurd_fail (err); - *euid = eff; *ruid = real; + *euid = eff; *suid = saved; return 0; } diff --git a/sysdeps/mach/hurd/getsid.c b/sysdeps/mach/hurd/getsid.c index 57c10c58b7..9dcfa90fde 100644 --- a/sysdeps/mach/hurd/getsid.c +++ b/sysdeps/mach/hurd/getsid.c @@ -28,6 +28,9 @@ getsid (pid_t pid) error_t err; pid_t sid; + if (pid == 0) + pid = _hurd_pid; + err = __USEPORT (PROC, __proc_getsid (port, pid, &sid)); if (err) return (pid_t) __hurd_fail (err); diff --git a/sysdeps/mach/hurd/getxattr.c b/sysdeps/mach/hurd/getxattr.c new file mode 100644 index 0000000000..8f688a1d2f --- /dev/null +++ b/sysdeps/mach/hurd/getxattr.c @@ -0,0 +1,35 @@ +/* Access to extended attributes on files. Hurd version. + Copyright (C) 2004 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/xattr.h> +#include <hurd.h> +#include <hurd/xattr.h> + +ssize_t +getxattr (const char *path, const char *name, void *value, size_t size) +{ + error_t err; + file_t port = __file_name_lookup (path, 0, 0); + if (port == MACH_PORT_NULL) + return -1; + err = _hurd_xattr_get (port, name, value, &size); + __mach_port_deallocate (__mach_task_self (), port); + return err ? __hurd_fail (err) : size; +} diff --git a/sysdeps/mach/hurd/hppa/bits/sigcontext.h b/sysdeps/mach/hurd/hppa/bits/sigcontext.h deleted file mode 100644 index 5db43fc22c..0000000000 --- a/sysdeps/mach/hurd/hppa/bits/sigcontext.h +++ /dev/null @@ -1,94 +0,0 @@ -/* Machine-dependent signal context structure for GNU Hurd. HPPA version. - Copyright (C) 1995,97,2001 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. */ - -#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H -# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead." -#endif - -#ifndef sc_parisc_thread_state - -/* Signal handlers are actually called: - void handler (int sig, int code, struct sigcontext *scp); */ - -/* State of this thread when the signal was taken. */ -struct sigcontext - { - /* These first members are machine-independent. */ - - int sc_onstack; /* Nonzero if running on sigstack. */ - __sigset_t sc_mask; /* Blocked signals to restore. */ - - /* MiG reply port this thread is using. */ - unsigned int sc_reply_port; - - /* Port this thread is doing an interruptible RPC on. */ - unsigned int sc_intr_port; - - /* Error code associated with this signal (interpreted as `error_t'). */ - int sc_error; - - /* All following members are machine-dependent. The rest of this - structure is written to be laid out identically to a `struct - parisc_thread_state'. trampoline.c knows this, so it must be - changed if this changes. */ - -#define sc_parisc_thread_state sc_flags /* Beginning of correspondence. */ - /* "General" registers $1..$31. */ - unsigned int sc_regs[31]; - - /* Control registers. */ - unsigned int sc_cr11; /* sar */ - /* These four registers make up the PC. */ - unsigned int iioq_head; - unsigned int iisq_head; - unsigned int iioq_tail; - unsigned int iisq_tail; - unsigned int sc_cr15; - unsigned int sc_cr19; - unsigned int sc_cr20; - unsigned int sc_cr21; - unsigned int sc_cr22; /* ipsw */ - unsigned int sc_bsd_goto; /* unused */ - unsigned int sc_sr4; - unsigned int sc_sr0; - unsigned int sc_sr1; - unsigned int sc_sr2; - unsigned int sc_sr3; - unsigned int sc_sr5; - unsigned int sc_sr6; - unsigned int sc_sr7; - unsigned int sc_cr0; - unsigned int sc_cr8; - unsigned int sc_cr9; - unsigned int sc_cr10; /* unused */ - unsigned int sc_cr12; - unsigned int sc_cr13; - unsigned int sc_cr24; /* unused */ - unsigned int sc_cr25; /* unused */ - unsigned int sc_cr26; /* unused */ - unsigned sc_mpsfu_high; /* unused */ - unsigned sc_mpsfu_low; /* unused */ - unsigned sc_mpsfu_ovflo; /* unused */ - int sc_pad; - - /* Floating point registers $f0..$f31. */ - double sc_fpregs[32]; - }; - -#endif /* sc_parisc_thread_state */ diff --git a/sysdeps/mach/hurd/hppa/trampoline.c b/sysdeps/mach/hurd/hppa/trampoline.c deleted file mode 100644 index bbb5b960ac..0000000000 --- a/sysdeps/mach/hurd/hppa/trampoline.c +++ /dev/null @@ -1,230 +0,0 @@ -/* Set thread_state for sighandler, and sigcontext to recover. HPPA version. - Copyright (C) 1995, 1997, 1998 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/signal.h> -#include "thread_state.h" -#include <assert.h> -#include <errno.h> -#include "hurdfault.h" - - -struct mach_msg_trap_regargs - { - /* These first four arguments are in registers 26..23. */ - mach_msg_size_t rcv_size; /* arg3 */ - mach_msg_size_t send_size; /* arg2 */ - mach_msg_option_t option; /* arg1 */ - mach_msg_header_t *msg; /* arg0 */ - }; - -struct sigcontext * -_hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler, - int signo, long int sigcode, - volatile int rpc_wait, - struct machine_thread_all_state *state) -{ - __label__ trampoline, rpc_wait_trampoline; - void *volatile sigsp; - struct sigcontext *scp; - - if (ss->context) - { - /* We have a previous sigcontext that sigreturn was about - to restore when another signal arrived. We will just base - our setup on that. */ - if (_hurdsig_catch_fault (SIGSEGV)) - assert (_hurdsig_fault_sigcode >= (long int) ss->context && - _hurdsig_fault_sigcode < (long int) (ss->context + 1)); - else - { - memcpy (&state->basic, &ss->context->sc_parisc_thread_state, - sizeof (state->basic)); - state->set = (1 << PARISC_THREAD_STATE); - assert (! rpc_wait); - /* The intr_port slot was cleared before sigreturn sent us the - sig_post that made us notice this pending signal, so - _hurd_internal_post_signal wouldn't do interrupt_operation. - After we return, our caller will set SCP->sc_intr_port (in the - new context) from SS->intr_port and clear SS->intr_port. Now - that we are restoring this old context recorded by sigreturn, - we want to restore its intr_port too; so store it in - SS->intr_port now, so it will end up in SCP->sc_intr_port - later. */ - ss->intr_port = ss->context->sc_intr_port; - } - /* If the sigreturn context was bogus, just ignore it. */ - ss->context = NULL; - } - else if (! machine_get_basic_state (ss->thread, state)) - return NULL; - - if ((ss->actions[signo].sa_flags & SA_ONSTACK) && - !(ss->sigaltstack.ss_flags & (SS_DISABLE|SS_ONSTACK))) - { - sigsp = ss->sigaltstack.ss_sp + ss->sigaltstack.ss_size; - ss->sigaltstack.ss_flags |= SS_ONSTACK; - /* XXX need to set up base of new stack for - per-thread variables, cthreads. */ - } - else - sigsp = (char *) state->basic.uesp; - - /* Push the signal context on the stack. */ - sigsp -= sizeof (*scp); - scp = sigsp; - - if (_hurdsig_catch_fault (SIGSEGV)) - { - assert (_hurdsig_fault_sigcode >= (long int) scp && - _hurdsig_fault_sigcode <= (long int) (scp + 1)); - /* We got a fault trying to write the stack frame. - We cannot set up the signal handler. - Returning NULL tells our caller, who will nuke us with a SIGILL. */ - return NULL; - } - else - { - int ok; - - /* Set up the sigcontext from the current state of the thread. */ - - scp->sc_onstack = ss->sigaltstack.ss_flags & SS_ONSTACK ? 1 : 0; - - /* struct sigcontext is laid out so that starting at sc_regs mimics a - struct parisc_thread_state. */ - memcpy (&scp->sc_parisc_thread_state, - &state->basic, sizeof (state->basic)); - - _hurdsig_end_catch_fault (); - - if (! ok) - return NULL; - } - - /* Modify the thread state to call the trampoline code on the new stack. */ - if (rpc_wait) - { - /* The signalee thread was blocked in a mach_msg_trap system call, - still waiting for a reply. We will have it run the special - trampoline code which retries the message receive before running - the signal handler. - - To do this we change the OPTION argument on its stack to enable only - message reception, since the request message has already been - sent. */ - - struct mach_msg_trap_regargs *args = (void *) &state->basic.r23; - - if (_hurdsig_catch_fault (SIGSEGV)) - { - assert (_hurdsig_fault_sigcode >= (long int) args && - _hurdsig_fault_sigcode < (long int) (args + 1)); - /* Faulted accessing ARGS. Bomb. */ - return NULL; - } - - assert (args->option & MACH_RCV_MSG); - /* Disable the message-send, since it has already completed. The - calls we retry need only wait to receive the reply message. */ - args->option &= ~MACH_SEND_MSG; - - /* Limit the time to receive the reply message, in case the server - claimed that `interrupt_operation' succeeded but in fact the RPC - is hung. */ - args->option |= MACH_RCV_TIMEOUT; - args->timeout = _hurd_interrupted_rpc_timeout; - - _hurdsig_end_catch_fault (); - - MACHINE_THREAD_STATE_SET_PC (&state->basic, &&rpc_wait_trampoline); - /* The reply-receiving trampoline code runs initially on the original - user stack. We pass it the signal stack pointer in %r5. */ - state->basic.r5 = (int) sigsp; - /* After doing the message receive, the trampoline code will need to - update the %r28 value to be restored by sigreturn. To simplify - the assembly code, we pass the address of its slot in SCP to the - trampoline code in %r4. */ - state->basic.r4 = (unsigned int) &scp->sc_regs[27]; - /* Set up the arguments for the handler function in callee-saved - registers that we will move to the argument registers after - mach_msg_trap returns. */ - state->basic.r6 = signo; - state->basic.r7 = sigcode; - state->basic.r8 = (unsigned int) scp; - } - else - { - MACHINE_THREAD_STATE_SET_PC (&state->basic, &&trampoline); - state->basic.r20 = (unsigned int) sigsp; - /* Set up the arguments for the handler function. */ - state->basic.r26 = signo; - state->basic.r25 = sigcode; - state->basic.r24 = (unsigned int) scp; - } - - /* We pass the handler function to the trampoline code in %r9. */ - state->basic.r9 = (unsigned int) handler; - /* For convenience, we pass the address of __sigreturn in %r10. */ - state->basic.r10 = (unsigned int) &__sigreturn; - /* The extra copy of SCP for the __sigreturn arg goes in %r8. */ - state->basic.r10 = (unsigned int) scp; - - return scp; - - /* The trampoline code follows. This is not actually executed as part of - this function, it is just convenient to write it that way. */ - - rpc_wait_trampoline: - /* This is the entry point when we have an RPC reply message to receive - before running the handler. The MACH_MSG_SEND bit has already been - cleared in the OPTION argument on our stack. The interrupted user - stack pointer has not been changed, so the system call can find its - arguments; the signal stack pointer is in %ebx. For our convenience, - %ecx points to the sc_eax member of the sigcontext. */ - asm volatile - (/* Retry the interrupted mach_msg system call. */ - "ldil L%0xC0000000,%r1\nble 4(%sr7,%r1)\n" - "ldi -25, %r22\n" /* mach_msg_trap */ - /* When the sigcontext was saved, %r28 was MACH_RCV_INTERRUPTED. But - now the message receive has completed and the original caller of - the RPC (i.e. the code running when the signal arrived) needs to - see the final return value of the message receive in %r28. So - store the new %r28 value into the sc_regs[27] member of the sigcontext - (whose address is in %r4 to make this code simpler). */ - "stw (%r4), %r28\n" - /* Switch to the signal stack. */ - "copy %r5, %r30\n" - /* Copy the handler arguments to the argument registers. */ - "copy %r6, %r26\n" - "copy %r7, %r25\n" - "copy %r8, %r24\n" - ); - - trampoline: - /* Entry point for running the handler normally. The arguments to the - handler function are already in the argument registers. */ - asm volatile - ("bv (%r9); nop" /* Call the handler function. */ - "bv (%r10)\n" /* Call __sigreturn (SCP); never returns. */ - "copy %r8, %r26" /* Set up arg in delay slot. */ - : : "i" (&__sigreturn)); - - /* NOTREACHED */ - return NULL; -} diff --git a/sysdeps/mach/hurd/i386/Dist b/sysdeps/mach/hurd/i386/Dist deleted file mode 100644 index 82c44df00b..0000000000 --- a/sysdeps/mach/hurd/i386/Dist +++ /dev/null @@ -1,3 +0,0 @@ -static-start.S -sys/io.h -ioperm.c diff --git a/sysdeps/mach/hurd/i386/init-first.c b/sysdeps/mach/hurd/i386/init-first.c index caa232026d..f9a7a58deb 100644 --- a/sysdeps/mach/hurd/i386/init-first.c +++ b/sysdeps/mach/hurd/i386/init-first.c @@ -1,5 +1,6 @@ /* Initialization code run first thing by the ELF startup code. For i386/Hurd. - Copyright (C) 1995,96,97,98,99,2000,01,02,03,04 Free Software Foundation, Inc. + Copyright (C) 1995,96,97,98,99,2000,01,02,03,04,05 + 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 @@ -54,7 +55,7 @@ extern int __libc_argc attribute_hidden; extern char **__libc_argv attribute_hidden; extern char **_dl_argv; -void *(*_cthread_init_routine) (void); /* Returns new SP to use. */ +extern void *(*_cthread_init_routine) (void) __attribute__ ((weak)); void (*_cthread_exit_routine) (int status) __attribute__ ((__noreturn__)); /* Things that want to be run before _hurd_init or much anything else. @@ -203,7 +204,7 @@ init (int *data) code as the return address, and the argument data immediately above that on the stack. */ - if (_cthread_init_routine) + if (&_cthread_init_routine && _cthread_init_routine) { /* Initialize cthreads, which will allocate us a new stack to run on. */ int *newsp = (*_cthread_init_routine) (); @@ -271,7 +272,7 @@ init (int *data) /* The argument data is just above the stack frame we will unwind by returning. Mutate our own return address to run the code below. */ usercode = data[-1]; - ((void **) data)[-1] = call_init1; + data[-1] = (int) &call_init1; /* Force USERCODE into %eax and &init1 into %ecx, which are not restored by function return. */ asm volatile ("# a %0 c %1" : : "a" (usercode), "c" (&init1)); @@ -319,11 +320,11 @@ first_init (void) stack set up just as the user will see it, so it can switch stacks. */ void -_dl_init_first (int argc, ...) +_dl_init_first (void) { first_init (); - init (&argc); + init ((int *) __builtin_frame_address (0) + 2); } #endif @@ -350,21 +351,23 @@ strong_alias (posixland_init, __libc_init_first); This poorly-named function is called by static-start.S, which should not exist at all. */ void -_hurd_stack_setup (volatile int argc, ...) +_hurd_stack_setup (void) { + intptr_t caller = (intptr_t) __builtin_return_address (0); + void doinit (intptr_t *data) { /* This function gets called with the argument data at TOS. */ - void doinit1 (volatile int argc, ...) + void doinit1 (void) { - init ((int *) &argc); + init ((int *) __builtin_frame_address (0) + 2); } /* Push the user return address after the argument data, and then jump to `doinit1' (above), so it is as if __libc_init_first's caller had called `doinit1' with the argument data already on the stack. */ - *--data = (&argc)[-1]; + *--data = caller; asm volatile ("movl %0, %%esp\n" /* Switch to new outermost stack. */ "movl $0, %%ebp\n" /* Clear outermost frame pointer. */ "jmp *%1" : : "r" (data), "r" (&doinit1) : "sp"); @@ -373,7 +376,7 @@ _hurd_stack_setup (volatile int argc, ...) first_init (); - _hurd_startup ((void **) &argc, &doinit); + _hurd_startup ((void **) __builtin_frame_address (0) + 2, &doinit); } #endif diff --git a/sysdeps/mach/hurd/i386/longjmp-ts.c b/sysdeps/mach/hurd/i386/longjmp-ts.c index 586ce6b015..c902002cbc 100644 --- a/sysdeps/mach/hurd/i386/longjmp-ts.c +++ b/sysdeps/mach/hurd/i386/longjmp-ts.c @@ -1,5 +1,5 @@ /* Perform a `longjmp' on a Mach thread_state. i386 version. - Copyright (C) 1991, 1994, 1995, 1997 Free Software Foundation, Inc. + Copyright (C) 1991, 1994, 1995, 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 @@ -19,6 +19,7 @@ #include <hurd/signal.h> #include <setjmp.h> +#include <jmpbuf-offsets.h> #include <mach/thread_status.h> diff --git a/sysdeps/mach/hurd/i386/tls.h b/sysdeps/mach/hurd/i386/tls.h index ff849716e0..223a47d2f2 100644 --- a/sysdeps/mach/hurd/i386/tls.h +++ b/sysdeps/mach/hurd/i386/tls.h @@ -98,7 +98,7 @@ _hurd_tls_init (tcbhead_t *tcb, int secondcall) { /* Fetch the selector set by the first call. */ int sel; - asm ("mov %%gs, %w0" : "=q" (sel)); + asm ("mov %%gs, %w0" : "=q" (sel) : "0" (0)); if (__builtin_expect (sel, 0x50) & 4) /* LDT selector */ { error_t err = __i386_set_ldt (tcb->self, sel, &desc, 1); @@ -151,7 +151,7 @@ _hurd_tls_fork (thread_t child, struct i386_thread_state *state) { /* Fetch the selector set by _hurd_tls_init. */ int sel; - asm ("mov %%gs, %w0" : "=q" (sel)); + asm ("mov %%gs, %w0" : "=q" (sel) : "0" (0)); if (sel == state->ds) /* _hurd_tls_init was never called. */ return 0; diff --git a/sysdeps/mach/hurd/i386/trampoline.c b/sysdeps/mach/hurd/i386/trampoline.c index 781a0441dc..dddc6f3ef6 100644 --- a/sysdeps/mach/hurd/i386/trampoline.c +++ b/sysdeps/mach/hurd/i386/trampoline.c @@ -1,5 +1,6 @@ /* Set thread_state for sighandler, and sigcontext to recover. i386 version. - Copyright (C) 1994, 95, 96, 97, 98, 99 Free Software Foundation, Inc. + Copyright (C) 1994,1995,1996,1997,1998,1999,2005 + 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 @@ -19,11 +20,11 @@ #include <hurd/signal.h> #include <hurd/userlink.h> -#include "thread_state.h" +#include <thread_state.h> #include <assert.h> #include <errno.h> #include "hurdfault.h" -#include "intr-msg.h" +#include <intr-msg.h> struct sigcontext * diff --git a/sysdeps/mach/hurd/ifreq.h b/sysdeps/mach/hurd/ifreq.c index 77f0b9cac0..9da8a6803a 100644 --- a/sysdeps/mach/hurd/ifreq.h +++ b/sysdeps/mach/hurd/ifreq.c @@ -1,5 +1,5 @@ /* Fetch the host's network interface list. Hurd version. - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2002,2005 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 @@ -17,14 +17,13 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include <net/if.h> +#include <ifreq.h> #include <hurd.h> #include <hurd/pfinet.h> -#include <sys/socket.h> #include <sys/mman.h> -static inline void +void __ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd) { file_t server; @@ -64,17 +63,3 @@ __ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd) } } - - -static inline struct ifreq * -__if_nextreq (struct ifreq *ifr) -{ - return ifr + 1; -} - - -static inline void -__if_freereq (struct ifreq *ifreqs, int num_ifs) -{ - __munmap (ifreqs, num_ifs * sizeof (struct ifreq)); -} diff --git a/sysdeps/mach/hurd/init-posix.c b/sysdeps/mach/hurd/init-posix.c index 3eecf62769..eaf6332fe1 100644 --- a/sysdeps/mach/hurd/init-posix.c +++ b/sysdeps/mach/hurd/init-posix.c @@ -1,2 +1,2 @@ /* We don't need the unix/bsd version. */ -#include <sysdeps/generic/init-posix.c> +#include <posix/init-posix.c> diff --git a/sysdeps/mach/hurd/ioctl.c b/sysdeps/mach/hurd/ioctl.c index 3d590d5845..bcc78bc84e 100644 --- a/sysdeps/mach/hurd/ioctl.c +++ b/sysdeps/mach/hurd/ioctl.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1992,93,94,95,96,97,99,2000,02 Free Software Foundation, Inc. +/* Copyright (C) 1992,93,94,95,96,97,99,2000,2002,2005 + 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 @@ -57,7 +58,16 @@ __ioctl (int fd, unsigned long int request, ...) struct { #ifdef MACH_MSG_TYPE_BIT - mig_reply_header_t header; + union + { + mig_reply_header_t header; + struct + { + mach_msg_header_t Head; + int RetCodeType; + kern_return_t RetCode; + } header_typecheck; + }; char data[3 * sizeof (mach_msg_type_t) + msg_align (_IOT_COUNT0 (type) * typesize (_IOT_TYPE0 (type))) + msg_align (_IOT_COUNT1 (type) * typesize (_IOT_TYPE1 (type))) + @@ -136,9 +146,11 @@ __ioctl (int fd, unsigned long int request, ...) Rather than pointing to the value, ARG is the value itself. */ #ifdef MACH_MSG_TYPE_BIT *t++ = io2mach_type (1, _IOTS (integer_t)); - *((integer_t *) t)++ = (integer_t) arg; + *(integer_t *) t = (integer_t) arg; + t = (void *) t + sizeof (integer_t); #else - *((integer_t *) p)++ = (integer_t) arg; + *(integer_t *) p = (integer_t) arg; + p = (void *) p + sizeof (integer_t); #endif } @@ -189,7 +201,7 @@ __ioctl (int fd, unsigned long int request, ...) return MIG_TYPE_ERROR; #ifdef MACH_MSG_TYPE_BIT - if (*(int *) &msg.header.RetCodeType != + if (msg.header_typecheck.RetCodeType != ((union { mach_msg_type_t t; int i; }) { t: io2mach_type (1, _IOTS (msg.header.RetCode)) }).i) return MIG_TYPE_ERROR; diff --git a/sysdeps/mach/hurd/jmp-unwind.c b/sysdeps/mach/hurd/jmp-unwind.c index 4624ad9e26..e0e16e28b2 100644 --- a/sysdeps/mach/hurd/jmp-unwind.c +++ b/sysdeps/mach/hurd/jmp-unwind.c @@ -1,5 +1,5 @@ /* _longjmp_unwind -- Clean up stack frames unwound by longjmp. Hurd version. - Copyright (C) 1995, 1996 Free Software Foundation, Inc. + Copyright (C) 1995,1996,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 @@ -17,17 +17,27 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include <setjmp.h> +#include <jmpbuf-unwind.h> #include <hurd/userlink.h> #include <hurd/signal.h> #include <hurd/sigpreempt.h> #include <assert.h> +#include <stdint.h> #ifndef _JMPBUF_UNWINDS -#error "<bits/setjmp.h> fails to define _JMPBUF_UNWINDS" +#error "<jmpbuf-unwind.h> fails to define _JMPBUF_UNWINDS" #endif +static inline uintptr_t +demangle_ptr (uintptr_t x) +{ +# ifdef PTR_DEMANGLE + PTR_DEMANGLE (x); +# endif + return x; +} + /* This function is called by `longjmp' (with its arguments) to restore active resources to a sane state before the frames code using them are jumped out of. */ @@ -46,7 +56,7 @@ _longjmp_unwind (jmp_buf env, int val) /* Remove local signal preemptors being unwound past. */ while (ss->preemptors && - _JMPBUF_UNWINDS (env[0].__jmpbuf, ss->preemptors)) + _JMPBUF_UNWINDS (env[0].__jmpbuf, ss->preemptors, demangle_ptr)) ss->preemptors = ss->preemptors->next; __spin_unlock (&ss->lock); @@ -56,7 +66,7 @@ _longjmp_unwind (jmp_buf env, int val) in stack frames being unwound by this jump. */ for (link = ss->active_resources; - link && _JMPBUF_UNWINDS (env[0].__jmpbuf, link); + link && _JMPBUF_UNWINDS (env[0].__jmpbuf, link, demangle_ptr); link = link->thread.next) /* Remove this link from the resource's users list, since the frame using the resource is being unwound. diff --git a/sysdeps/mach/hurd/lgetxattr.c b/sysdeps/mach/hurd/lgetxattr.c new file mode 100644 index 0000000000..5ab591575e --- /dev/null +++ b/sysdeps/mach/hurd/lgetxattr.c @@ -0,0 +1,36 @@ +/* Access to extended attributes on files. Hurd version. + Copyright (C) 2004 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/xattr.h> +#include <hurd.h> +#include <hurd/xattr.h> +#include <fcntl.h> + +ssize_t +lgetxattr (const char *path, const char *name, void *value, size_t size) +{ + error_t err; + file_t port = __file_name_lookup (path, O_NOLINK, 0); + if (port == MACH_PORT_NULL) + return -1; + err = _hurd_xattr_get (port, name, value, &size); + __mach_port_deallocate (__mach_task_self (), port); + return err ? __hurd_fail (err) : size; +} diff --git a/sysdeps/mach/hurd/linkat.c b/sysdeps/mach/hurd/linkat.c new file mode 100644 index 0000000000..1942144e0f --- /dev/null +++ b/sysdeps/mach/hurd/linkat.c @@ -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; +} diff --git a/sysdeps/mach/hurd/listxattr.c b/sysdeps/mach/hurd/listxattr.c new file mode 100644 index 0000000000..5f84e88316 --- /dev/null +++ b/sysdeps/mach/hurd/listxattr.c @@ -0,0 +1,35 @@ +/* Access to extended attributes on files. Hurd version. + Copyright (C) 2005 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/xattr.h> +#include <hurd.h> +#include <hurd/xattr.h> + +ssize_t +listxattr (const char *path, char *list, size_t size) +{ + error_t err; + file_t port = __file_name_lookup (path, 0, 0); + if (port == MACH_PORT_NULL) + return -1; + err = _hurd_xattr_list (port, list, &size); + __mach_port_deallocate (__mach_task_self (), port); + return err ? __hurd_fail (err) : size; +} diff --git a/sysdeps/mach/hurd/lsetxattr.c b/sysdeps/mach/hurd/lsetxattr.c new file mode 100644 index 0000000000..c2eae40e3a --- /dev/null +++ b/sysdeps/mach/hurd/lsetxattr.c @@ -0,0 +1,37 @@ +/* Access to extended attributes on files. Hurd version. + Copyright (C) 2004 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/xattr.h> +#include <hurd.h> +#include <hurd/xattr.h> +#include <fcntl.h> + +ssize_t +lsetxattr (const char *path, const char *name, const void *value, size_t size, + int flags) +{ + error_t err; + file_t port = __file_name_lookup (path, O_NOLINK, 0); + if (port == MACH_PORT_NULL) + return -1; + err = _hurd_xattr_set (port, name, value, size, flags); + __mach_port_deallocate (__mach_task_self (), port); + return err ? __hurd_fail (err) : size; +} diff --git a/sysdeps/mach/hurd/mig-reply.c b/sysdeps/mach/hurd/mig-reply.c index 78bac4bffc..5e40c147b4 100644 --- a/sysdeps/mach/hurd/mig-reply.c +++ b/sysdeps/mach/hurd/mig-reply.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1994,1995,1996,1997,2005 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 @@ -22,7 +22,7 @@ #define GETPORT \ mach_port_t *portloc = \ (mach_port_t *) __hurd_threadvar_location (_HURD_THREADVAR_MIG_REPLY) -#define reply_port (use_threadvar ? *portloc : global_reply_port) +#define reply_port (*(use_threadvar ? portloc : &global_reply_port)) static int use_threadvar; static mach_port_t global_reply_port; diff --git a/sysdeps/mach/hurd/mips/Dist b/sysdeps/mach/hurd/mips/Dist deleted file mode 100644 index b6f3ffa4c3..0000000000 --- a/sysdeps/mach/hurd/mips/Dist +++ /dev/null @@ -1,3 +0,0 @@ -longjmp-ctx.c -init-fault.c -dl-machine.c diff --git a/sysdeps/mach/hurd/mips/bits/sigcontext.h b/sysdeps/mach/hurd/mips/bits/sigcontext.h deleted file mode 100644 index 14c618857e..0000000000 --- a/sysdeps/mach/hurd/mips/bits/sigcontext.h +++ /dev/null @@ -1,80 +0,0 @@ -/* Machine-dependent signal context structure for GNU Hurd. MIPS version. - Copyright (C) 1994,97,2001 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. */ - -#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H -# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead." -#endif - -#ifndef sc_mips_thread_state - -/* Signal handlers are actually called: - void handler (int sig, int code, struct sigcontext *scp); */ - -/* State of this thread when the signal was taken. */ -struct sigcontext - { - /* These first members are machine-independent. */ - - int sc_onstack; /* Nonzero if running on sigstack. */ - __sigset_t sc_mask; /* Blocked signals to restore. */ - - /* MiG reply port this thread is using. */ - unsigned int sc_reply_port; - - /* Port this thread is doing an interruptible RPC on. */ - unsigned int sc_intr_port; - - /* Error code associated with this signal (interpreted as `error_t'). */ - int sc_error; - - /* All following members are machine-dependent. The rest of this - structure is written to be laid out identically to: - { - struct mips_thread_state ts; - struct mips_exc_state es; - struct mips_float_state fs; - } - trampoline.c knows this, so it must be changed if this changes. */ -#define sc_mips_thread_state sc_gpr /* Beginning of correspondence. */ - int sc_gpr[31]; /* "General" registers; [0] is r1. */ - int sc_mdlo, sc_mdhi; /* Low and high multiplication results. */ - int sc_pc; /* Instruction pointer. */ - - /* struct mips_exc_state */ -#define sc_mips_exc_state sc_cause - unsigned int sc_cause; /* Machine-level trap code. */ -#define SC_CAUSE_SST 0x00000044 - unsigned int sc_badvaddr; - unsigned int sc_coproc_used; /* Which coprocessors the thread has used. */ -#define SC_COPROC_USE_COP0 1 /* (by definition) */ -#define SC_COPROC_USE_COP1 2 /* FPA */ -#define SC_COPROC_USE_FPU SC_COPROC_USE_COP1 -#define SC_COPROC_USE_COP2 4 -#define SC_COPROC_USE_COP3 8 - - /* struct mips_float_state - This is only filled in if the SC_COPROC_USE_FPU bit - is set in sc_coproc_used. */ -#define sc_mips_float_state sc_fpr - int sc_fpr[32]; /* FP registers. */ - int sc_fpcsr; /* FPU status register. */ - int sc_fpeir; /* FP exception instruction register. */ - }; - -#endif /* sc_mips_thread_state */ diff --git a/sysdeps/mach/hurd/mips/dl-machine.c b/sysdeps/mach/hurd/mips/dl-machine.c deleted file mode 100644 index ce2d5db510..0000000000 --- a/sysdeps/mach/hurd/mips/dl-machine.c +++ /dev/null @@ -1,132 +0,0 @@ -/* Operating system support for run-time dynamic linker. MIPS specific - stuffs on Hurd. - Copyright (C) 1996, 1997 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 <link.h> -#include <unistd.h> -#include <fcntl.h> -#include <stdlib.h> -#include <sys/mman.h> -#include <assert.h> -#include <sysdep.h> -#include <mach/mig_support.h> -#include "../stdio-common/_itoa.h" -#include <stdarg.h> -#include <ctype.h> -#include <sys/stat.h> -#include <libintl.h> - -void weak_function -abort (void) -{ - _exit (127); -} - - -#include <string.h> -#include <mach/error.h> -#include <errorlib.h> - -#undef _ -#define _(x) x - -/* Return a string describing the errno code in ERRNUM. */ -char * weak_function -_strerror_internal (int errnum, char *buf, size_t buflen) -{ - int system; - int sub; - int code; - const struct error_system *es; - extern void __mach_error_map_compat (int *); - - __mach_error_map_compat (&errnum); - - system = err_get_system (errnum); - sub = err_get_sub (errnum); - code = err_get_code (errnum); - - if (system > err_max_system || ! __mach_error_systems[system].bad_sub) - { - const char *unk = _("Error in unknown error system: "); - const size_t unklen = strlen (unk); - char *p = buf + buflen; - *--p = '\0'; - p = _itoa (errnum, p, 16, 1); - return memcpy (p - unklen, unk, unklen); - } - - es = &__mach_error_systems[system]; - - if (sub >= es->max_sub) - return (char *) es->bad_sub; - - if (code >= es->subsystem[sub].max_code) - { - const char *unk = _("Unknown error "); - const size_t unklen = strlen (unk); - char *p = buf + buflen; - size_t len = strlen (es->subsystem[sub].subsys_name); - *--p = '\0'; - p = _itoa (errnum, p, 16, 1); - *p-- = ' '; - p = memcpy (p - len, es->subsystem[sub].subsys_name, len); - return memcpy (p - unklen, unk, unklen); - } - - return (char *) _(es->subsystem[sub].codes[code]); -} - -/* Read the whole contents of FILE into new mmap'd space with given - protections. The size of the file is returned in SIZE. */ -void * -_dl_sysdep_read_whole_file (const char *file, size_t *size, int prot) -{ - struct stat stat; - mach_port_t memobj_rd; - void *contents; - error_t err; - - memobj_rd = __open (file, O_RDONLY, 0); - if (memobj_rd) - { - err = __io_stat ((file_t) memobj_rd, &stat); - if (err) - { - __hurd_fail (err); - contents = 0; - } - else - { - /* Map a copy of the file contents. */ - contents = __mmap (0, stat.st_size, prot, MAP_COPY, memobj_rd, 0); - if (contents == (void *)-1) - contents = 0; - else - *size = stat.st_size; - } - - __mach_port_deallocate (__mach_task_self (), memobj_rd); - } - else - contents = 0; - - return contents; -} diff --git a/sysdeps/mach/hurd/mips/exc2signal.c b/sysdeps/mach/hurd/mips/exc2signal.c deleted file mode 100644 index c505ae5b22..0000000000 --- a/sysdeps/mach/hurd/mips/exc2signal.c +++ /dev/null @@ -1,97 +0,0 @@ -/* Translate Mach exception codes into signal numbers. MIPS version. - Copyright (C) 1996, 1997 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/signal.h> -#include <mach/exception.h> - -/* Translate the Mach exception codes, as received in an `exception_raise' RPC, - into a signal number and signal subcode. */ - -void -_hurd_exception2signal (struct hurd_signal_detail *detail, int *signo) -{ - detail->error = 0; - - switch (detail->exc) - { - default: - *signo = SIGIOT; - detail->code = detail->exc; - break; - - case EXC_BAD_ACCESS: - if (detail->exc_code == KERN_PROTECTION_FAILURE) - *signo = SIGSEGV; - else - *signo = SIGBUS; - detail->code = detail->exc_subcode; - detail->error = detail->exc_code; - break; - - case EXC_BAD_INSTRUCTION: - *signo = SIGILL; - if (detail->exc_code == EXC_MIPS_II) - detail->code = detail->exc_subcode; - else - detail->code = 0; - break; - - case EXC_ARITHMETIC: - switch (detail->exc_code) - { - case EXC_MIPS_OV: /* integer overflow */ - *signo = SIGFPE; - detail->code = detail->exc_subcode; - break; - - default: - *signo = SIGFPE; - detail->code = 0; - break; - - case EXC_MIPS_INT: - /* Subcode is the fp_status word saved by the hardware. - Give an error code corresponding to the first bit set. */ - if (detail->exc_subcode == EXC_MIPS_FLT_UNIMP) - *signo = SIGILL; - else - *signo = SIGFPE; - detail->code = detail->exc_subcode; - break; - } - break; - - case EXC_EMULATION: - /* 3.0 doesn't give this one, why, I don't know. */ - *signo = SIGEMT; - detail->code = 0; - break; - - case EXC_SOFTWARE: - *signo = SIGEMT; - detail->code = 0; - break; - - case EXC_BREAKPOINT: - *signo = SIGTRAP; - detail->code = 0; - break; - } -} diff --git a/sysdeps/mach/hurd/mips/init-first.c b/sysdeps/mach/hurd/mips/init-first.c deleted file mode 100644 index 6f53e839b3..0000000000 --- a/sysdeps/mach/hurd/mips/init-first.c +++ /dev/null @@ -1,414 +0,0 @@ -/* Initialization code run first thing by the ELF startup code. For Mips/Hurd. - Copyright (C) 1996,1997,1998,2000,01,02,03 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 <stdio.h> -#include <unistd.h> -#include <string.h> -#include "hurdstartup.h" -#include "set-hooks.h" -#include "hurdmalloc.h" /* XXX */ - -extern void __mach_init (void); -extern void __init_misc (int, char **, char **); -#ifdef USE_NONOPTION_FLAGS -extern void __getopt_clean_environment (char **); -#endif -#ifndef SHARED -extern void _dl_non_dynamic_init (void) internal_function; -#endif -extern void __libc_global_ctors (void); - -unsigned int __hurd_threadvar_max; -unsigned long int __hurd_threadvar_stack_offset; -unsigned long int __hurd_threadvar_stack_mask; - -int __libc_multiple_libcs attribute_hidden = 1; - -int __libc_argc attribute_hidden; -char **__libc_argv attribute_hidden; - -void *(*_cthread_init_routine) (void); /* Returns new SP to use. */ -void (*_cthread_exit_routine) (int status) __attribute__ ((__noreturn__)); - - -/* Things that want to be run before _hurd_init or much anything else. - Importantly, these are called before anything tries to use malloc. */ -DEFINE_HOOK (_hurd_preinit_hook, (void)); - -static void -init1 (int argc, char *arg0, ...) -{ - char **argv = &arg0; - char **envp = &argv[argc + 1]; - struct hurd_startup_data *d; - - __libc_argc = argc; - __libc_argv = argv; - __environ = envp; - while (*envp) - ++envp; - d = (void *) ++envp; - - /* If we are the bootstrap task started by the kernel, - then after the environment pointers there is no Hurd - data block; the argument strings start there. */ - if ((void *) d != argv[0]) - { - _hurd_init_dtable = d->dtable; - _hurd_init_dtablesize = d->dtablesize; - - { - /* Check if the stack we are now on is different from - the one described by _hurd_stack_{base,size}. */ - - char dummy; - const vm_address_t newsp = (vm_address_t) &dummy; - - if (d->stack_size != 0 && (newsp < d->stack_base || - newsp - d->stack_base > d->stack_size)) - /* The new stack pointer does not intersect with the - stack the exec server set up for us, so free that stack. */ - __vm_deallocate (__mach_task_self (), d->stack_base, d->stack_size); - } - } - - if (__hurd_threadvar_stack_mask == 0) - { - /* We are not using cthreads, so we will have just a single allocated - area for the per-thread variables of the main user thread. */ - unsigned long int i; - __hurd_threadvar_stack_offset - = (unsigned long int) malloc (__hurd_threadvar_max * - sizeof (unsigned long int)); - if (__hurd_threadvar_stack_offset == 0) - __libc_fatal ("Can't allocate single-threaded per-thread variables."); - for (i = 0; i < __hurd_threadvar_max; ++i) - ((unsigned long int *) __hurd_threadvar_stack_offset)[i] = 0; - } - - if ((void *) d != argv[0] && (d->portarray || d->intarray)) - /* Initialize library data structures, start signal processing, etc. */ - _hurd_init (d->flags, argv, - d->portarray, d->portarraysize, - d->intarray, d->intarraysize); - -#ifndef SHARED - _dl_non_dynamic_init (); -#endif - __init_misc (argc, argv, __environ); - -#ifdef USE_NONOPTION_FLAGS - /* This is a hack to make the special getopt in GNU libc working. */ - __getopt_clean_environment (envp); -#endif - -#ifdef SHARED - __libc_global_ctors (); -#endif - - (void) &init1; -} - -static void * -__init (int *data) -{ - int argc = *data; - char **argv = (void *) (data + 1); - char **envp = &argv[argc + 1]; - struct hurd_startup_data *d; - - __environ = envp; - while (*envp) - ++envp; - d = (void *) ++envp; - - /* The user might have defined a value for this, to get more variables. - Otherwise it will be zero on startup. We must make sure it is set - properly before before cthreads initialization, so cthreads can know - how much space to leave for thread variables. */ - if (__hurd_threadvar_max < _HURD_THREADVAR_MAX) - __hurd_threadvar_max = _HURD_THREADVAR_MAX; - - - /* After possibly switching stacks, call `init1' (above) with the user - code as the return address, and the argument data immediately above - that on the stack. */ - - if (_cthread_init_routine) - { - /* Initialize cthreads, which will allocate us a new stack to run on. */ - void *newsp = (*_cthread_init_routine) (); - struct hurd_startup_data *od; - - /* Copy the argdata from the old stack to the new one. */ - newsp = memcpy (newsp - ((char *) &d[1] - (char *) data), data, - (char *) d - (char *) data); - - /* Set up the Hurd startup data block immediately following - the argument and environment pointers on the new stack. */ - od = (newsp + ((char *) d - (char *) data)); - if ((void *) argv[0] == d) - /* We were started up by the kernel with arguments on the stack. - There is no Hurd startup data, so zero the block. */ - memset (od, 0, sizeof *od); - else - /* Copy the Hurd startup data block to the new stack. */ - *od = *d; - - /* Push the user code address on the top of the new stack. It will - be the return address for `init1'; we will jump there with NEWSP - as the stack pointer. */ - return newsp; - } - - /* The argument data is just above the stack frame we will unwind by - returning. */ - return (void *) data; - - (void) &__init; -} - -#ifdef SHARED -/* This function is called to initialize the shared C library. - It is called just before the user _start code from mips/elf/start.S, - with the stack set up as that code gets it. */ - -/* NOTE! The linker notices the magical name `_init' and sets the DT_INIT - pointer in the dynamic section based solely on that. It is convention - for this function to be in the `.init' section, but the symbol name is - the only thing that really matters!! */ -/*void _init (int argc, ...) __attribute__ ((unused, section (".init")));*/ - -#if __mips64 -asm ("\ - .section .init,\"ax\",@progbits\n\ - .align 3\n\ - .globl _init\n\ - .type _init,@function\n\ - .ent _init\n\ -_init:\n\ - .set noreorder\n\ - .cpload $25\n\ - .set reorder\n\ - dsubu $29, 8*8\n\ - .cprestore 6*8\n\ - sd $16, 4*8($29)\n\ - sd $31, 5*8($29)\n\ - jal preinit\n\ - sd $28, 6*8($29)\n\ - move $16, $29 # Save the old stack pointer to s0 ($16)\n\ - daddu $4, $29, 4*8\n\ - jal __init\n\ - # Restore saved registers from the old stack.\n\ - ld $28, 6*8($16)\n\ - ld $31, 5*8($16)\n\ - ld $16, 4*8($16)\n\ - move $29, $2 # set new sp to SP\n\ -call_init1:\n\ - ld $4, 0($29)\n\ - ld $5, 1*8($29)\n\ - ld $6, 2*8($29)\n\ - ld $7, 3*8($29)\n\ - dla $25, init1\n\ - jr $25\n\ - .end _init\n\ - .text\n\ -"); -#else -asm ("\ - .section .init,\"ax\",@progbits\n\ - .align 2\n\ - .globl _init\n\ - .type _init,@function\n\ - .ent _init\n\ -_init:\n\ - .set noreorder\n\ - .cpload $25\n\ - .set reorder\n\ - subu $29, 32\n\ - .cprestore 24\n\ - sw $16, 16($29)\n\ - sw $31, 20($29)\n\ - jal preinit\n\ - sw $28, 24($29)\n\ - move $16, $29 # Save the old stack pointer to s0 ($16)\n\ - addu $4, $29, 32\n\ - jal __init\n\ - # Restore saved registers from the old stack.\n\ - lw $28, 24($16)\n\ - lw $31, 20($16)\n\ - lw $16, 16($16)\n\ - move $29, $2 # set new sp to SP\n\ -call_init1:\n\ - lw $4, 0($29)\n\ - lw $5, 4($29)\n\ - lw $6, 8($29)\n\ - lw $7, 12($29)\n\ - la $25, init1\n\ - jr $25\n\ - .end _init\n\ - .text\n\ -"); -#endif - -static void -preinit (void) -{ - /* Initialize data structures so we can do RPCs. */ - __mach_init (); - - RUN_HOOK (_hurd_preinit_hook, ()); - - (void) &preinit; -} - -void __libc_init_first (int argc, ...) -{ -} -#endif - -#ifndef SHARED -/* An assembler code wrapping c function __init. */ -#ifdef __mips64 -asm ("\ - .text\n\ - .align 3\n\ -init:\n\ - dsubu $29, 8*8\n\ - sd $16, 4*8($29)\n\ - sd $31, 5*8($29)\n\ - move $16, $29\n\ - jal __init\n\ - ld $31, 5*8($16)\n\ - ld $16, 4*8($16)\n\ - move $29, $2 # set new sp to SP\n\ -call_init1:\n\ - ld $4, 0($29)\n\ - ld $5, 1*8($29)\n\ - ld $6, 2*8($29)\n\ - ld $7, 3*8($29)\n\ - dla $25, init1\n\ - jr $25\n\ -"); -#else -asm ("\ - .text\n\ - .align 2\n\ -init:\n\ - subu $29, 32\n\ - sw $16, 16($29)\n\ - sw $31, 20($29)\n\ - move $16, $29\n\ - jal __init\n\ - lw $31, 20($16)\n\ - lw $16, 16($16)\n\ - move $29, $2 # set new sp to SP\n\ -call_init1:\n\ - lw $4, 0($29)\n\ - lw $5, 4($29)\n\ - lw $6, 8($29)\n\ - lw $7, 12($29)\n\ - la $25, init1\n\ - jr $25\n\ -"); -#endif - -/* An assembler code wrapping c function ___libc_init_first. - ___libc_init_first does an RPC call to flush cache to put doinit - function on the stack, so we should call __mach_init first in - this wrap. */ -#ifdef __mips64 -asm ("\ - .text\n\ - .align 3\n\ - .globl __libc_init_first\n\ -__libc_init_first:\n\ - dsubu $29, 8\n\ - sd $31, 0($29)\n\ - jal __mach_init\n\ - ld $4, 0($29)\n\ - ld $5, 1*8($29)\n\ - ld $6, 2*8($29)\n\ - ld $7, 3*8($29)\n\ - j ___libc_init_first\n\ -"); -#else -asm ("\ - .text\n\ - .align 2\n\ - .globl __libc_init_first\n\ -__libc_init_first:\n\ - subu $29, 4\n\ - sw $31, 0($29)\n\ - jal __mach_init\n\ - lw $4, 0($29)\n\ - lw $5, 4($29)\n\ - lw $6, 8($29)\n\ - lw $7, 12($29)\n\ - j ___libc_init_first\n\ -"); -#endif - -static void -___libc_init_first (int return_addr, int argc, ...) -{ - void doinit (int *data) - { -#if 0 - /* This function gets called with the argument data at TOS. */ - void doinit1 (int argc, ...) - { - init (&argc); - } -#endif - extern void init (int *data); - - /* Push the user return address after the argument data, and then - jump to `doinit1' (above), so it is as if __libc_init_first's - caller had called `init' with the argument data already on the - stack. */ - *--data = return_addr; - -#ifdef __mips64 - asm volatile ("ld $31, 0(%0)\n" /* Load the original return address. */ - "daddu $29, %0, 8\n" /* Switch to new outermost stack. */ - "move $4, $29\n" - "jr %1" : : "r" (data), "r" (&init)); -#else - asm volatile ("lw $31, 0(%0)\n" /* Load the original return address. */ - "addu $29, %0, 4\n" /* Switch to new outermost stack. */ - "move $4, $29\n" - "jr %1" : : "r" (data), "r" (&init)); -#endif - /* NOTREACHED */ - } - -#if 0 - /* Initialize data structures so we can do RPCs. */ - __mach_init (); -#endif - - RUN_HOOK (_hurd_preinit_hook, ()); - - _hurd_startup ((void **) &argc, &doinit); - - (void) &___libc_init_first; -} -#endif diff --git a/sysdeps/mach/hurd/mips/intr-msg.h b/sysdeps/mach/hurd/mips/intr-msg.h deleted file mode 100644 index 16c78972ac..0000000000 --- a/sysdeps/mach/hurd/mips/intr-msg.h +++ /dev/null @@ -1,127 +0,0 @@ -/* Machine-dependent details of interruptible RPC messaging. Mips version. - Copyright (C) 1996, 1997 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. */ - - -#ifdef __mips64 -#define INTR_MSG_TRAP(msg, option, send_size, rcv_size, rcv_name, timeout, notify) \ -({ \ - error_t err; \ - mach_port_t __rcv_name = (rcv_name); \ - mach_msg_timeout_t __timeout = (timeout); \ - mach_port_t __notify = (notify); \ - asm (".globl _hurd_intr_rpc_msg_do_trap\n" \ - ".globl _hurd_intr_rpc_msg_in_trap\n" \ - " move $4, %1\n" \ - " move $5, %2\n" \ - " move $6, %3\n" \ - " move $7, %4\n" \ - " move $8, %5\n" \ - " move $9, %6\n" \ - " move $10, %7\n" \ - " dli $2, -25\n" \ - "_hurd_intr_rpc_msg_do_trap: syscall\n" \ - "_hurd_intr_rpc_msg_in_trap: move %0, $2\n" \ - : "=r" (err) \ - : "r" (msg), "r" (option), "r" (send_size), "r" (rcv_size), \ - "r" (__rcv_name), "r" (__timeout), "r" (__notify) \ - : "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", \ - "$11", "$12", "$13", "$14", "$15", "$24", "$25", "$28"); \ - err; \ -}) -#else -#define INTR_MSG_TRAP(msg, option, send_size, rcv_size, rcv_name, timeout, notify) \ -({ \ - error_t err; \ - mach_port_t __rcv_name = (rcv_name); \ - mach_msg_timeout_t __timeout = (timeout); \ - mach_port_t __notify = (notify); \ - asm (".globl _hurd_intr_rpc_msg_do_trap\n" \ - ".globl _hurd_intr_rpc_msg_in_trap\n" \ - " move $4, %1\n" \ - " move $5, %2\n" \ - " move $6, %3\n" \ - " move $7, %4\n" \ - " move $8, %5\n" \ - " move $9, %6\n" \ - " move $10, %7\n" \ - " li $2, -25\n" \ - "_hurd_intr_rpc_msg_do_trap: syscall\n" \ - "_hurd_intr_rpc_msg_in_trap: move %0, $2\n" \ - : "=r" (err) \ - : "r" (msg), "r" (option), "r" (send_size), "r" (rcv_size), \ - "r" (__rcv_name), "r" (__timeout), "r" (__notify) \ - : "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", \ - "$11", "$12", "$13", "$14", "$15", "$24", "$25", "$28"); \ - err; \ -}) -#endif - -static inline void -INTR_MSG_BACK_OUT (struct mips_thread_state *state) -{ - return; -} - -#include "hurdfault.h" - -static inline int -SYSCALL_EXAMINE (struct mips_thread_state *state, int *callno) -{ - u_int32_t *p = (void *) (state->pc - 4); - int result; - if (_hurdsig_catch_memory_fault (p)) - return 0; - if (result = (*p == 0x0000000c)) - /* The PC is just after a `syscall' instruction. - This is a system call in progress; v0($2) holds the call number. */ - *callno = state->r2; - _hurdsig_end_catch_fault (); - return result; -} - - -struct mach_msg_trap_args - { - /* This is the order of arguments to mach_msg_trap. */ - mach_msg_header_t *msg; - mach_msg_option_t option; - mach_msg_size_t send_size; - mach_msg_size_t rcv_size; - mach_port_t rcv_name; - mach_msg_timeout_t timeout; - mach_port_t notify; - }; - - -static inline mach_port_t -MSG_EXAMINE (struct mips_thread_state *state, int *msgid) -{ - mach_msg_header_t *msg; - mach_port_t send_port; - - msg = (mach_msg_header_t *) state->r4; - - if (_hurdsig_catch_memory_fault (msg)) - return MACH_PORT_NULL; - send_port = msg->msgh_remote_port; - *msgid = msg->msgh_id; - _hurdsig_end_catch_fault (); - - return send_port; -} diff --git a/sysdeps/mach/hurd/mips/longjmp-ts.c b/sysdeps/mach/hurd/mips/longjmp-ts.c deleted file mode 100644 index 4c69e4e2b9..0000000000 --- a/sysdeps/mach/hurd/mips/longjmp-ts.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Perform a `longjmp' on a Mach thread_state. MIPS version. - Copyright (C) 1996, 1997 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/signal.h> -#include <setjmp.h> -#include <mach/thread_status.h> - - -/* Set up STATE to do the equivalent of `longjmp (ENV, VAL);'. */ - -void -_hurd_longjmp_thread_state (void *state, jmp_buf env, int val) -{ - struct mips_thread_state *ts = state; - - ts->r16 = env[0].__jmpbuf[0].__regs[0]; - ts->r17 = env[0].__jmpbuf[0].__regs[1]; - ts->r18 = env[0].__jmpbuf[0].__regs[2]; - ts->r19 = env[0].__jmpbuf[0].__regs[3]; - ts->r20 = env[0].__jmpbuf[0].__regs[4]; - ts->r21 = env[0].__jmpbuf[0].__regs[5]; - ts->r22 = env[0].__jmpbuf[0].__regs[6]; - ts->r23 = env[0].__jmpbuf[0].__regs[7]; - ts->r28 = (int) env[0].__jmpbuf[0].__gp; - ts->r29 = (int) env[0].__jmpbuf[0].__sp; - ts->r30 = (int) env[0].__jmpbuf[0].__fp; - ts->pc = (int) env[0].__jmpbuf[0].__pc; - ts->r2 = val ?: 1; -} diff --git a/sysdeps/mach/hurd/mips/sigreturn.c b/sysdeps/mach/hurd/mips/sigreturn.c deleted file mode 100644 index a9f7673eb5..0000000000 --- a/sysdeps/mach/hurd/mips/sigreturn.c +++ /dev/null @@ -1,223 +0,0 @@ -/* Copyright (C) 1996, 1997, 1998 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/signal.h> -#include <hurd/threadvar.h> -#include <stdlib.h> -#include <mach/mips/mips_instruction.h> - -int -__sigreturn (struct sigcontext *scp) -{ - struct hurd_sigstate *ss; - struct hurd_userlink *link = (void *) &scp[1]; - mach_port_t *reply_port; - - if (scp == NULL || (scp->sc_mask & _SIG_CANT_MASK)) - { - errno = EINVAL; - return -1; - } - - ss = _hurd_self_sigstate (); - __spin_lock (&ss->lock); - - /* Remove the link on the `active resources' chain added by - _hurd_setup_sighandler. Its purpose was to make sure - that we got called; now we have, it is done. */ - _hurd_userlink_unlink (link); - - /* Restore the set of blocked signals, and the intr_port slot. */ - ss->blocked = scp->sc_mask; - ss->intr_port = scp->sc_intr_port; - - /* Check for pending signals that were blocked by the old set. */ - if (ss->pending & ~ss->blocked) - { - /* There are pending signals that just became unblocked. Wake up the - signal thread to deliver them. But first, squirrel away SCP where - the signal thread will notice it if it runs another handler, and - arrange to have us called over again in the new reality. */ - ss->context = scp; - __spin_unlock (&ss->lock); - __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ()); - /* If a pending signal was handled, sig_post never returned. */ - __spin_lock (&ss->lock); - ss->context = NULL; - } - - if (scp->sc_onstack) - { - ss->sigaltstack.ss_flags &= ~SS_ONSTACK; /* XXX threadvars */ - /* XXX cannot unlock until off sigstack */ - abort (); - } - else - __spin_unlock (&ss->lock); - - /* Destroy the MiG reply port used by the signal handler, and restore the - reply port in use by the thread when interrupted. */ - reply_port = - (mach_port_t *) __hurd_threadvar_location (_HURD_THREADVAR_MIG_REPLY); - if (*reply_port) - { - mach_port_t port = *reply_port; - - /* Assigning MACH_PORT_DEAD here tells libc's mig_get_reply_port not to - get another reply port, but avoids mig_dealloc_reply_port trying to - deallocate it after the receive fails (which it will, because the - reply port will be bogus, whether we do this or not). */ - *reply_port = MACH_PORT_DEAD; - - __mach_port_destroy (__mach_task_self (), port); - } - *reply_port = scp->sc_reply_port; - - if (scp->sc_coproc_used & SC_COPROC_USE_FPU) - { - /* Restore FPU state. */ -#define restore_fpr(n) \ - asm volatile ("l.d $f" #n ",%0" : : "m" (scp->sc_fpr[n])) - - /* Restore floating-point registers. */ -#ifdef __mips64 - restore_fpr (0); - restore_fpr (1); - restore_fpr (2); - restore_fpr (3); - restore_fpr (4); - restore_fpr (5); - restore_fpr (6); - restore_fpr (7); - restore_fpr (8); - restore_fpr (9); - restore_fpr (10); - restore_fpr (11); - restore_fpr (12); - restore_fpr (13); - restore_fpr (14); - restore_fpr (15); - restore_fpr (16); - restore_fpr (17); - restore_fpr (18); - restore_fpr (19); - restore_fpr (20); - restore_fpr (21); - restore_fpr (22); - restore_fpr (23); - restore_fpr (24); - restore_fpr (25); - restore_fpr (26); - restore_fpr (27); - restore_fpr (28); - restore_fpr (29); - restore_fpr (30); - restore_fpr (31); -#else - restore_fpr (0); - restore_fpr (2); - restore_fpr (4); - restore_fpr (6); - restore_fpr (8); - restore_fpr (10); - restore_fpr (12); - restore_fpr (14); - restore_fpr (16); - restore_fpr (18); - restore_fpr (20); - restore_fpr (22); - restore_fpr (24); - restore_fpr (26); - restore_fpr (28); - restore_fpr (30); -#endif - - /* Restore the floating-point control/status register ($f31). */ - asm volatile ("ctc1 %0,$f31" : : "r" (scp->sc_fpcsr)); - } - - /* Load all the registers from the sigcontext. */ -#ifdef __mips64 -#define restore_gpr(n) \ - asm volatile ("ld $" #n ",%0" : : "m" (scpreg->sc_gpr[n - 1])) -#else -#define restore_gpr(n) \ - asm volatile ("lw $" #n ",%0" : : "m" (scpreg->sc_gpr[n - 1])) -#endif - - { - register const struct sigcontext *const scpreg asm ("$1") = scp; - register int *at asm ("$1"); - - /* First restore the multiplication result registers. The compiler - will use some temporary registers, so we do this before restoring - the general registers. */ - asm volatile ("mtlo %0" : : "r" (scpreg->sc_mdlo)); - asm volatile ("mthi %0" : : "r" (scpreg->sc_mdhi)); - - /* In the word after the saved PC, store the saved $1 value. */ - (&scpreg->sc_pc)[1] = scpreg->sc_gpr[0]; - - asm volatile (".set noreorder; .set noat;"); - - /* Restore the normal registers. */ - restore_gpr (2); - restore_gpr (3); - restore_gpr (4); - restore_gpr (5); - restore_gpr (6); - restore_gpr (7); - restore_gpr (8); - restore_gpr (9); - restore_gpr (10); - restore_gpr (11); - restore_gpr (12); - restore_gpr (13); - restore_gpr (14); - restore_gpr (15); - restore_gpr (16); - restore_gpr (17); - restore_gpr (18); - restore_gpr (19); - restore_gpr (20); - restore_gpr (21); - restore_gpr (22); - restore_gpr (23); - restore_gpr (24); - restore_gpr (25); - /* Registers 26-27 are kernel-only. */ - restore_gpr (28); - restore_gpr (29); /* Stack pointer. */ - restore_gpr (30); /* Frame pointer. */ - restore_gpr (31); /* Return address. */ - - at = &scpreg->sc_pc; - /* This is an emulated instruction that will find at the address in $1 - two words: the PC value to restore, and the $1 value to restore. */ - asm volatile (".word %0" : : "i" (op_sigreturn)); - asm volatile (".set reorder; .set at;"); - /* NOTREACHED */ - return at; /* To prevent optimization. */ - } - - /* NOTREACHED */ - return -1; -} - -weak_alias (__sigreturn, sigreturn) diff --git a/sysdeps/mach/hurd/mips/trampoline.c b/sysdeps/mach/hurd/mips/trampoline.c deleted file mode 100644 index dd42dfc1c6..0000000000 --- a/sysdeps/mach/hurd/mips/trampoline.c +++ /dev/null @@ -1,292 +0,0 @@ -/* Set thread_state for sighandler, and sigcontext to recover. MIPS version. - Copyright (C) 1996, 1997, 1998 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/signal.h> -#include <hurd/userlink.h> -#include "thread_state.h" -#include <assert.h> -#include <errno.h> -#include "hurdfault.h" -#include "intr-msg.h" - - -struct sigcontext * -_hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler, - int signo, struct hurd_signal_detail *detail, - volatile int rpc_wait, - struct machine_thread_all_state *state) -{ - __label__ trampoline, rpc_wait_trampoline, firewall; - void *volatile sigsp; - struct sigcontext *scp; - struct - { - int signo; - long int sigcode; - struct sigcontext *scp; /* Points to ctx, below. */ - void *sigreturn_addr; - void *sigreturn_returns_here; - struct sigcontext *return_scp; /* Same; arg to sigreturn. */ - struct sigcontext ctx; - struct hurd_userlink link; - } *stackframe; - - if (ss->context) - { - /* We have a previous sigcontext that sigreturn was about - to restore when another signal arrived. We will just base - our setup on that. */ - if (! _hurdsig_catch_memory_fault (ss->context)) - { - memcpy (&state->basic, &ss->context->sc_mips_thread_state, - sizeof (state->basic)); - memcpy (&state->exc, &ss->context->sc_mips_exc_state, - sizeof (state->exc)); - state->set = (1 << MIPS_THREAD_STATE) | (1 << MIPS_EXC_STATE); - if (state->exc.coproc_state & SC_COPROC_USE_FPU) - { - memcpy (&state->fpu, &ss->context->sc_mips_float_state, - sizeof (state->fpu)); - state->set |= (1 << MIPS_FLOAT_STATE); - } - } - } - - if (! machine_get_basic_state (ss->thread, state)) - return NULL; - - /* Save the original SP in the gratuitous s0 ($16) slot. - We may need to reset the SP (the `r29' slot) to avoid clobbering an - interrupted RPC frame. */ - state->basic.r16 = state->basic.r29; - - if ((ss->actions[signo].sa_flags & SA_ONSTACK) && - !(ss->sigaltstack.ss_flags & (SS_DISABLE|SS_ONSTACK))) - { - sigsp = ss->sigaltstack.ss_sp + ss->sigaltstack.ss_size; - ss->sigaltstack.ss_flags |= SS_ONSTACK; - /* XXX need to set up base of new stack for - per-thread variables, cthreads. */ - } - else - sigsp = (char *) state->basic.r29; - - /* Push the arguments to call `trampoline' on the stack. */ - sigsp -= sizeof (*stackframe); - stackframe = sigsp; - - if (_hurdsig_catch_memory_fault (stackframe)) - { - /* We got a fault trying to write the stack frame. - We cannot set up the signal handler. - Returning NULL tells our caller, who will nuke us with a SIGILL. */ - return NULL; - } - else - { - int ok; - - extern void _hurdsig_longjmp_from_handler (void *, jmp_buf, int); - - /* Add a link to the thread's active-resources list. We mark this as - the only user of the "resource", so the cleanup function will be - called by any longjmp which is unwinding past the signal frame. - The cleanup function (in sigunwind.c) will make sure that all the - appropriate cleanups done by sigreturn are taken care of. */ - stackframe->link.cleanup = &_hurdsig_longjmp_from_handler; - stackframe->link.cleanup_data = &stackframe->ctx; - stackframe->link.resource.next = NULL; - stackframe->link.resource.prevp = NULL; - stackframe->link.thread.next = ss->active_resources; - stackframe->link.thread.prevp = &ss->active_resources; - if (stackframe->link.thread.next) - stackframe->link.thread.next->thread.prevp - = &stackframe->link.thread.next; - ss->active_resources = &stackframe->link; - - /* Set up the arguments for the signal handler. */ - stackframe->signo = signo; - stackframe->sigcode = detail->code; - stackframe->scp = stackframe->return_scp = scp = &stackframe->ctx; - stackframe->sigreturn_addr = &__sigreturn; - stackframe->sigreturn_returns_here = &&firewall; /* Crash on return. */ - - /* Set up the sigcontext from the current state of the thread. */ - - scp->sc_onstack = ss->sigaltstack.ss_flags & SS_ONSTACK ? 1 : 0; - - /* struct sigcontext is laid out so that starting at sc_gpr - mimics a struct mips_thread_state. */ - memcpy (&scp->sc_mips_thread_state, - &state->basic, sizeof (state->basic)); - - /* struct sigcontext is laid out so that starting at sc_cause - mimics a struct mips_exc_state. */ - ok = machine_get_state (ss->thread, state, MIPS_EXC_STATE, - &state->exc, &scp->sc_cause, - sizeof (state->exc)); - - if (ok && (scp->sc_coproc_used & SC_COPROC_USE_FPU)) - /* struct sigcontext is laid out so that starting at sc_fpr - mimics a struct mips_float_state. This state - is only meaningful if the coprocessor was used. */ - ok = machine_get_state (ss->thread, state, MIPS_FLOAT_STATE, - &state->fpu, &scp->sc_mips_float_state, - sizeof (state->fpu)); - - _hurdsig_end_catch_fault (); - - if (! ok) - return NULL; - } - - /* Modify the thread state to call the trampoline code on the new stack. */ - if (rpc_wait) - { - /* The signalee thread was blocked in a mach_msg_trap system call, - still waiting for a reply. We will have it run the special - trampoline code which retries the message receive before running - the signal handler. - - To do this we change the OPTION argument in its registers to - enable only message reception, since the request message has - already been sent. */ - - /* The system call arguments are stored in consecutive registers - starting with a0 ($4). */ - struct mach_msg_trap_args *args = (void *) &state->basic.r4; - - if (_hurdsig_catch_memory_fault (args)) - { - /* Faulted accessing ARGS. Bomb. */ - return NULL; - } - - assert (args->option & MACH_RCV_MSG); - /* Disable the message-send, since it has already completed. The - calls we retry need only wait to receive the reply message. */ - args->option &= ~MACH_SEND_MSG; - - /* Limit the time to receive the reply message, in case the server - claimed that `interrupt_operation' succeeded but in fact the RPC - is hung. */ - args->option |= MACH_RCV_TIMEOUT; - args->timeout = _hurd_interrupted_rpc_timeout; - - _hurdsig_end_catch_fault (); - - state->basic.pc = (int) &&rpc_wait_trampoline; - /* The reply-receiving trampoline code runs initially on the original - user stack. We pass it the signal stack pointer in s4 ($20). */ - state->basic.r29 = state->basic.r16; /* Restore mach_msg syscall SP. */ - state->basic.r20 = (int) sigsp; - /* After doing the message receive, the trampoline code will need to - update the v0 ($2) value to be restored by sigreturn. To simplify - the assembly code, we pass the address of its slot in SCP to the - trampoline code in s5 ($21). */ - state->basic.r21 = (int) &scp->sc_gpr[1]; - /* We must preserve the mach_msg_trap args in a0..t2 ($4..$10). - Pass the handler args to the trampoline code in s1..s3 ($17..$19). */ - state->basic.r17 = signo; - state->basic.r18 = detail->code; - state->basic.r19 = (int) scp; - } - else - { - state->basic.pc = (int) &&trampoline; - state->basic.r29 = (int) sigsp; - state->basic.r4 = signo; - state->basic.r5 = detail->code; - state->basic.r6 = (int) scp; - } - - /* We pass the handler function to the trampoline code in s6 ($22). */ - state->basic.r22 = (int) handler; - /* In the callee-saved register s0 ($16), we save the SCP value to pass - to __sigreturn after the handler returns. */ - state->basic.r16 = (int) scp; - - return scp; - - /* The trampoline code follows. This is not actually executed as part of - this function, it is just convenient to write it that way. */ - - rpc_wait_trampoline: - /* This is the entry point when we have an RPC reply message to receive - before running the handler. The MACH_MSG_SEND bit has already been - cleared in the OPTION argument in our registers. For our convenience, - $3 points to the sc_gpr[1] member of the sigcontext (saved v0 ($2)). */ - asm volatile - (".set noat; .set noreorder; .set nomacro\n" - /* Retry the interrupted mach_msg system call. */ -#ifdef __mips64 - "dli $2, -25\n" /* mach_msg_trap */ -#else - "li $2, -25\n" /* mach_msg_trap */ -#endif - "syscall\n" - /* When the sigcontext was saved, v0 was MACH_RCV_INTERRUPTED. But - now the message receive has completed and the original caller of - the RPC (i.e. the code running when the signal arrived) needs to - see the final return value of the message receive in v0. So - store the new v0 value into the sc_gpr[1] member of the sigcontext - (whose address is in s5 to make this code simpler). */ -#ifdef __mips64 - "sd $2, ($21)\n" -#else - "sw $2, ($21)\n" -#endif - /* Since the argument registers needed to have the mach_msg_trap - arguments, we've stored the arguments to the handler function - in registers s1..s3 ($17..$19). */ - "move $4, $17\n" - "move $5, $18\n" - "move $6, $19\n" - /* Switch to the signal stack. */ - "move $29, $20\n"); - - trampoline: - /* Entry point for running the handler normally. The arguments to the - handler function are already in the standard registers: - - a0 SIGNO - a1 SIGCODE - a2 SCP - */ - asm volatile - ("move $25, $22\n" /* Copy s6 to t9 for MIPS ABI. */ - "jal $25; nop\n" /* Call the handler function. */ - /* Call __sigreturn (SCP); this cannot return. */ -#ifdef __mips64 - "dla $1,%0\n" -#else - "la $1,%0\n" -#endif - "j $1\n" - "move $4, $16" /* Set up arg from saved SCP in delay slot. */ - : : "i" (&__sigreturn)); - - /* NOTREACHED */ - asm volatile (".set reorder; .set at; .set macro"); - - firewall: - asm volatile ("hlt: j hlt"); - - return NULL; -} diff --git a/sysdeps/mach/hurd/mkdirat.c b/sysdeps/mach/hurd/mkdirat.c new file mode 100644 index 0000000000..321d59f2fd --- /dev/null +++ b/sysdeps/mach/hurd/mkdirat.c @@ -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; +} diff --git a/sysdeps/mach/hurd/open.c b/sysdeps/mach/hurd/open.c index dd575a47b1..bdfed5e311 100644 --- a/sysdeps/mach/hurd/open.c +++ b/sysdeps/mach/hurd/open.c @@ -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) diff --git a/sysdeps/mach/hurd/open64.c b/sysdeps/mach/hurd/open64.c new file mode 100644 index 0000000000..018ac94f28 --- /dev/null +++ b/sysdeps/mach/hurd/open64.c @@ -0,0 +1 @@ +/* open64 is defined in open.c as an alias. */ diff --git a/sysdeps/mach/hurd/openat.c b/sysdeps/mach/hurd/openat.c new file mode 100644 index 0000000000..1faf857e16 --- /dev/null +++ b/sysdeps/mach/hurd/openat.c @@ -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) diff --git a/sysdeps/mach/hurd/openat64.c b/sysdeps/mach/hurd/openat64.c new file mode 100644 index 0000000000..15d9d6a183 --- /dev/null +++ b/sysdeps/mach/hurd/openat64.c @@ -0,0 +1 @@ +/* openat64 is defined in openat.c as an alias. */ diff --git a/sysdeps/mach/hurd/opendir.c b/sysdeps/mach/hurd/opendir.c index a1ff947f06..23e04ede0e 100644 --- a/sysdeps/mach/hurd/opendir.c +++ b/sysdeps/mach/hurd/opendir.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1993,94,95,96,97,98,2001,2003 Free Software Foundation, Inc. +/* Copyright (C) 1993,1994,1995,1996,1997,1998,2001,2003,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 @@ -32,62 +33,29 @@ #include "dirstream.h" -/* Open a directory stream on NAME. */ +/* Open a directory stream on a file descriptor in Hurd internal form. + We do no checking here on the descriptor. */ DIR * -__opendir (const char *name) +_hurd_fd_opendir (struct hurd_fd *d) { DIR *dirp; - int fd; - struct hurd_fd *d; - if (name[0] == '\0') + if (d == NULL) { - /* POSIX.1-1990 says an empty name gets ENOENT; - but `open' might like it fine. */ - __set_errno (ENOENT); + errno = EBADF; return NULL; } - { - /* Append trailing slash to directory name to force ENOTDIR - if it's not a directory. - - We open using the O_NONBLOCK flag so that a nondirectory with - blocking behavior (FIFO or device) gets ENOTDIR immediately - rather than waiting for the special file's open wakeup predicate. */ - - size_t len = strlen (name); - if (name[len - 1] == '/') - fd = __open (name, O_RDONLY | O_NONBLOCK); - else - { - char n[len + 2]; - memcpy (n, name, len); - n[len] = '/'; - n[len + 1] = '\0'; - fd = __open (n, O_RDONLY | O_NONBLOCK); - } - } - if (fd < 0) - return NULL; - dirp = (DIR *) malloc (sizeof (DIR)); if (dirp == NULL) - { - __close (fd); - return NULL; - } - - /* Extract the pointer to the descriptor structure. */ - __mutex_lock (&_hurd_dtable_lock); - d = dirp->__fd = _hurd_dtable[fd]; - __mutex_unlock (&_hurd_dtable_lock); + return NULL; /* Set the descriptor to close on exec. */ __spin_lock (&d->port.lock); d->flags |= FD_CLOEXEC; __spin_unlock (&d->port.lock); + dirp->__fd = d; dirp->__data = dirp->__ptr = NULL; dirp->__entry_data = dirp->__entry_ptr = 0; dirp->__allocation = 0; @@ -97,4 +65,29 @@ __opendir (const char *name) return dirp; } + + +/* Open a directory stream on NAME. */ +DIR * +__opendir (const char *name) +{ + if (name[0] == '\0') + { + /* POSIX.1-1990 says an empty name gets ENOENT; + but `open' might like it fine. */ + __set_errno (ENOENT); + return NULL; + } + + int fd = __open (name, O_RDONLY | O_NONBLOCK | O_DIRECTORY); + if (fd < 0) + return NULL; + + /* Extract the pointer to the descriptor structure. */ + DIR *dirp = _hurd_fd_opendir (_hurd_fd_get (fd)); + if (dirp == NULL) + __close (fd); + + return dirp; +} weak_alias (__opendir, opendir) diff --git a/sysdeps/mach/hurd/powerpc/Dist b/sysdeps/mach/hurd/powerpc/Dist deleted file mode 100644 index c58180257e..0000000000 --- a/sysdeps/mach/hurd/powerpc/Dist +++ /dev/null @@ -1 +0,0 @@ -static-start.S diff --git a/sysdeps/mach/hurd/powerpc/longjmp-ts.c b/sysdeps/mach/hurd/powerpc/longjmp-ts.c index 4a59f16aa8..757366bc47 100644 --- a/sysdeps/mach/hurd/powerpc/longjmp-ts.c +++ b/sysdeps/mach/hurd/powerpc/longjmp-ts.c @@ -1,5 +1,5 @@ /* Perform a `longjmp' on a Mach thread_state. PowerPC version. - Copyright (C) 1991,94,95,97,2001 Free Software Foundation, Inc. + Copyright (C) 1991,94,95,97,2001, 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 @@ -19,6 +19,7 @@ #include <hurd/signal.h> #include <setjmp.h> +#include <jmpbuf-offsets.h> #include <mach/thread_status.h> diff --git a/sysdeps/mach/hurd/powerpc/register-dump.h b/sysdeps/mach/hurd/powerpc/register-dump.h index 0377175227..c0b1d06236 100644 --- a/sysdeps/mach/hurd/powerpc/register-dump.h +++ b/sysdeps/mach/hurd/powerpc/register-dump.h @@ -1,5 +1,5 @@ /* Dump registers. PowerPC/Hurd version. - Copyright (C) 1998, 2001 Free Software Foundation, Inc. + Copyright (C) 1998, 2001, 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 @@ -113,7 +113,7 @@ register_dump (int fd, struct sigcontext *ctx) } /* Write the output. */ - write (fd, buffer, sizeof(buffer)); + write (fd, buffer, sizeof(buffer) - 1); } #define REGISTER_DUMP \ diff --git a/sysdeps/mach/hurd/powerpc/trampoline.c b/sysdeps/mach/hurd/powerpc/trampoline.c index 4e5d675258..4e1ea4b9d9 100644 --- a/sysdeps/mach/hurd/powerpc/trampoline.c +++ b/sysdeps/mach/hurd/powerpc/trampoline.c @@ -1,5 +1,6 @@ /* Set thread_state for sighandler, and sigcontext to recover. For PowerPC. - Copyright (C) 1994,95,96,97,98,99,2001 Free Software Foundation, Inc. + Copyright (C) 1994,1995,1996,1997,1998,1999,2001,2005 + 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 @@ -19,11 +20,11 @@ #include <hurd/signal.h> #include <hurd/userlink.h> -#include "thread_state.h" +#include <thread_state.h> #include <assert.h> #include <errno.h> #include "hurdfault.h" -#include "intr-msg.h" +#include <intr-msg.h> struct sigcontext * _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler, diff --git a/sysdeps/mach/hurd/ppoll.c b/sysdeps/mach/hurd/ppoll.c new file mode 100644 index 0000000000..693bc13839 --- /dev/null +++ b/sysdeps/mach/hurd/ppoll.c @@ -0,0 +1,30 @@ +/* poll file descriptors. 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 <sys/poll.h> +#include <sys/time.h> +#include <hurd.h> +#include <hurd/fd.h> + +int +ppoll (struct pollfd *fds, nfds_t nfds, + const struct timespec *timeout, const sigset_t *sigmask) +{ + return _hurd_select (nfds, fds, NULL, NULL, NULL, timeout, sigmask); +} diff --git a/sysdeps/mach/hurd/profil.c b/sysdeps/mach/hurd/profil.c index d212872643..0426f67b6f 100644 --- a/sysdeps/mach/hurd/profil.c +++ b/sysdeps/mach/hurd/profil.c @@ -1,5 +1,5 @@ /* Low-level statistical profiling support function. Mach/Hurd version. - Copyright (C) 1995, 1996, 1997, 2000, 2002 Free Software Foundation, Inc. + Copyright (C) 1995, 1996, 1997, 2000, 2002, 2005 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 @@ -49,6 +49,7 @@ static kern_return_t profil_task_get_sampled_pcs (mach_port_t, sampled_pc_array_t, mach_msg_type_number_t *); static void fetch_samples (void); +static void profile_waiter (void); /* Enable statistical profiling, writing samples of the PC into at most SIZE bytes of SAMPLE_BUFFER; every processor clock tick while profiling @@ -64,7 +65,6 @@ update_waiter (u_short *sample_buffer, size_t size, size_t offset, u_int scale) if (profile_thread == MACH_PORT_NULL) { /* Set up the profiling collector thread. */ - static void profile_waiter (void); err = __thread_create (__mach_task_self (), &profile_thread); if (! err) err = __mach_setup_thread (__mach_task_self (), profile_thread, diff --git a/sysdeps/mach/hurd/readdir64_r.c b/sysdeps/mach/hurd/readdir64_r.c index c26b35bb70..5b5a7fe362 100644 --- a/sysdeps/mach/hurd/readdir64_r.c +++ b/sysdeps/mach/hurd/readdir64_r.c @@ -109,4 +109,4 @@ __readdir64_r (DIR *dirp, struct dirent64 *entry, struct dirent64 **result) return dp ? 0 : err ? errno : 0; } -weak_alias(__readdir64_r, readdir64_r) +weak_alias (__readdir64_r, readdir64_r) diff --git a/sysdeps/mach/hurd/recv.c b/sysdeps/mach/hurd/recv.c index a2b8fd5be5..b001729d18 100644 --- a/sysdeps/mach/hurd/recv.c +++ b/sysdeps/mach/hurd/recv.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1994, 1997, 2001 Free Software Foundation, Inc. +/* Copyright (C) 1994,1997,2001,2005 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 @@ -26,9 +26,8 @@ /* Read N bytes into BUF from socket FD. Returns the number read or -1 for errors. */ -/* XXX should be __recv ? */ ssize_t -recv (fd, buf, n, flags) +__recv (fd, buf, n, flags) int fd; void *buf; size_t n; @@ -62,3 +61,4 @@ recv (fd, buf, n, flags) return nread; } +weak_alias (__recv, recv) diff --git a/sysdeps/mach/hurd/removexattr.c b/sysdeps/mach/hurd/removexattr.c new file mode 100644 index 0000000000..bbfee3d304 --- /dev/null +++ b/sysdeps/mach/hurd/removexattr.c @@ -0,0 +1,35 @@ +/* Access to extended attributes on files. Hurd version. + Copyright (C) 2005 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/xattr.h> +#include <hurd.h> +#include <hurd/xattr.h> + +ssize_t +removexattr (const char *path, const char *name) +{ + error_t err; + file_t port = __file_name_lookup (path, 0, 0); + if (port == MACH_PORT_NULL) + return -1; + err = _hurd_xattr_remove (port, name); + __mach_port_deallocate (__mach_task_self (), port); + return __hurd_fail (err); +} diff --git a/sysdeps/mach/hurd/setitimer.c b/sysdeps/mach/hurd/setitimer.c index 9fef56287d..fec64a8cb5 100644 --- a/sysdeps/mach/hurd/setitimer.c +++ b/sysdeps/mach/hurd/setitimer.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1994,1995,1996,1997,2000,2001 Free Software Foundation, Inc. +/* Copyright (C) 1994,1995,1996,1997,2000,2001,2005 + 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 @@ -41,7 +42,7 @@ static void quantize_timeval (struct timeval *tv) { static time_t quantum = -1; - + if (quantum == -1) quantum = 1000000 / __getclktck (); @@ -127,14 +128,15 @@ timer_thread (void) } +/* Forward declaration. */ +static int setitimer_locked (const struct itimerval *new, + struct itimerval *old, void *crit); + static sighandler_t restart_itimer (struct hurd_signal_preemptor *preemptor, struct hurd_sigstate *ss, int *signo, struct hurd_signal_detail *detail) { - static int setitimer_locked (const struct itimerval *new, - struct itimerval *old, void *crit); - /* This function gets called in the signal thread each time a SIGALRM is arriving (even if blocked). */ struct itimerval it; diff --git a/sysdeps/mach/hurd/setresgid.c b/sysdeps/mach/hurd/setresgid.c index d0ee412b46..8fcf26eaf1 100644 --- a/sysdeps/mach/hurd/setresgid.c +++ b/sysdeps/mach/hurd/setresgid.c @@ -1,5 +1,5 @@ -/* setresgid -- set effective group ID, real group ID, and saved-set group ID - Copyright (C) 2002 Free Software Foundation, Inc. +/* setresgid -- set real group ID, effective group ID, and saved-set group ID + Copyright (C) 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 @@ -22,10 +22,10 @@ #include <hurd.h> #include <hurd/id.h> -/* Set the effective group ID, real group ID, and saved-set group ID, - of the calling process to EGID, RGID, and SGID, respectively. */ +/* Set the real group ID, effective group ID, and saved-set group ID, + of the calling process to RGID, EGID, and SGID, respectively. */ int -__setresgid (gid_t egid, gid_t rgid, gid_t sgid) +__setresgid (gid_t rgid, gid_t egid, gid_t sgid) { auth_t newauth; error_t err; @@ -75,3 +75,4 @@ __setresgid (gid_t egid, gid_t rgid, gid_t sgid) return err; } libc_hidden_def (__setresgid) +weak_alias (__setresgid, setresgid) diff --git a/sysdeps/mach/hurd/setresuid.c b/sysdeps/mach/hurd/setresuid.c index 2d05dbc850..ccf8d08d40 100644 --- a/sysdeps/mach/hurd/setresuid.c +++ b/sysdeps/mach/hurd/setresuid.c @@ -1,5 +1,5 @@ -/* setresuid -- set effective user ID, real user ID, and saved-set user ID - Copyright (C) 2002 Free Software Foundation, Inc. +/* setresuid -- set real user ID, effective user ID, and saved-set user ID + Copyright (C) 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 @@ -22,10 +22,10 @@ #include <hurd.h> #include <hurd/id.h> -/* Set the effective user ID, real user ID, and saved-set user ID, - of the calling process to EUID, RUID, and SUID, respectively. */ +/* Set the real user ID, effective user ID, and saved-set user ID, + of the calling process to RUID, EUID, and SUID, respectively. */ int -__setresuid (uid_t euid, uid_t ruid, uid_t suid) +__setresuid (uid_t ruid, uid_t euid, uid_t suid) { auth_t newauth; error_t err; @@ -75,3 +75,4 @@ __setresuid (uid_t euid, uid_t ruid, uid_t suid) return err; } libc_hidden_def (__setresuid) +weak_alias (__setresuid, setresuid) diff --git a/sysdeps/mach/hurd/setxattr.c b/sysdeps/mach/hurd/setxattr.c new file mode 100644 index 0000000000..afabc8ee06 --- /dev/null +++ b/sysdeps/mach/hurd/setxattr.c @@ -0,0 +1,36 @@ +/* Access to extended attributes on files. 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 <sys/xattr.h> +#include <hurd.h> +#include <hurd/xattr.h> + +ssize_t +setxattr (const char *path, const char *name, const void *value, size_t size, + int flags) +{ + error_t err; + file_t port = __file_name_lookup (path, 0, 0); + if (port == MACH_PORT_NULL) + return -1; + err = _hurd_xattr_set (port, name, value, size, flags); + __mach_port_deallocate (__mach_task_self (), port); + return __hurd_fail (err); +} diff --git a/sysdeps/mach/hurd/sigaltstack.c b/sysdeps/mach/hurd/sigaltstack.c index ea3e07d26b..5b2f06561b 100644 --- a/sysdeps/mach/hurd/sigaltstack.c +++ b/sysdeps/mach/hurd/sigaltstack.c @@ -60,4 +60,4 @@ __sigaltstack (argss, oss) return 0; } -weak_alias(__sigaltstack, sigaltstack) +weak_alias (__sigaltstack, sigaltstack) diff --git a/sysdeps/mach/hurd/symlinkat.c b/sysdeps/mach/hurd/symlinkat.c new file mode 100644 index 0000000000..9a51c66d8d --- /dev/null +++ b/sysdeps/mach/hurd/symlinkat.c @@ -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; +} diff --git a/sysdeps/mach/hurd/tls.h b/sysdeps/mach/hurd/tls.h index bc15b4dab6..cce42ef374 100644 --- a/sysdeps/mach/hurd/tls.h +++ b/sysdeps/mach/hurd/tls.h @@ -1,5 +1,5 @@ /* Definitions for thread-local data handling. Hurd version. - Copyright (C) 2003 Free Software Foundation, Inc. + Copyright (C) 2003, 2005 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 @@ -23,6 +23,7 @@ #if defined HAVE_TLS_SUPPORT && !defined ASSEMBLER # include <stddef.h> +# include <stdbool.h> # include <mach/mig_errors.h> # include <mach.h> @@ -31,7 +32,11 @@ typedef union dtv { size_t counter; - void *pointer; + struct + { + void *val; + bool is_static; + } pointer; } dtv_t; diff --git a/sysdeps/mach/hurd/unlinkat.c b/sysdeps/mach/hurd/unlinkat.c new file mode 100644 index 0000000000..7740c5a297 --- /dev/null +++ b/sysdeps/mach/hurd/unlinkat.c @@ -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; +} diff --git a/sysdeps/mach/hurd/xmknod.c b/sysdeps/mach/hurd/xmknod.c index 2989215d9c..5f40188fb6 100644 --- a/sysdeps/mach/hurd/xmknod.c +++ b/sysdeps/mach/hurd/xmknod.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1991,92,93,94,95,96,99,2002 Free Software Foundation, Inc. +/* 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 @@ -17,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 @@ -32,80 +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 - { - errno = EINVAL; - return -1; - } - - if (! 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) - /* 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) diff --git a/sysdeps/mach/hurd/xmknodat.c b/sysdeps/mach/hurd/xmknodat.c new file mode 100644 index 0000000000..b2227593c9 --- /dev/null +++ b/sysdeps/mach/hurd/xmknodat.c @@ -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; +} |