summaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/mach/hurd/getcwd.c47
-rw-r--r--sysdeps/posix/getcwd.c29
-rw-r--r--sysdeps/posix/tempname.c19
-rw-r--r--sysdeps/unix/sysv/linux/Makefile23
-rw-r--r--sysdeps/unix/sysv/linux/reboot.c28
-rw-r--r--sysdeps/unix/sysv/linux/sys/reboot.h43
-rw-r--r--sysdeps/unix/sysv/linux/syscall.h10
-rw-r--r--sysdeps/unix/sysv/linux/syscalls.list2
8 files changed, 163 insertions, 38 deletions
diff --git a/sysdeps/mach/hurd/getcwd.c b/sysdeps/mach/hurd/getcwd.c
index ed8ed96697..463b28ce29 100644
--- a/sysdeps/mach/hurd/getcwd.c
+++ b/sysdeps/mach/hurd/getcwd.c
@@ -29,14 +29,16 @@ Cambridge, MA 02139, USA. */
#include <fcntl.h>
-/* Get the pathname of the current working directory, and put it in SIZE
- bytes of BUF. Returns NULL if the directory couldn't be determined or
- SIZE was too small. If successful, returns BUF. In GNU, if BUF is
- NULL, an array is allocated with `malloc'; the array is SIZE bytes long,
- unless SIZE <= 0, in which case it is as big as necessary. */
+/* Get the canonical absolute name of the given directory port, and put it
+ in SIZE bytes of BUF. Returns NULL if the directory couldn't be
+ determined or SIZE was too small. If successful, returns BUF. In GNU,
+ if BUF is NULL, an array is allocated with `malloc'; the array is SIZE
+ bytes long, unless SIZE <= 0, in which case it is as big as necessary. */
char *
-__getcwd (char *buf, size_t size)
+_hurd_canonicalize_directory_name_internal (file_t thisdir,
+ char *buf,
+ size_t size)
{
error_t err;
mach_port_t rootid, thisid, rootdevid, thisdevid;
@@ -91,10 +93,9 @@ __getcwd (char *buf, size_t size)
return __hurd_fail (err), NULL;
__mach_port_deallocate (__mach_task_self (), rootdevid);
- /* Get a port to our current working directory and stat it. */
+ /* Stat the port to the directory of interest. */
- if (err = __USEPORT (CRDIR, __io_identity (port,
- &thisid, &thisdevid, &thisino)))
+ if (err = __io_identity (thisdir, &thisid, &thisdevid, &thisino))
{
__mach_port_deallocate (__mach_task_self (), rootid);
return __hurd_fail (err), NULL;
@@ -255,4 +256,32 @@ __getcwd (char *buf, size_t size)
cleanup ();
return NULL;
}
+
+char *
+__canonicalize_directory_name_internal (thisdir, buf, size)
+ const char *thisdir;
+ char *buf;
+ size_t size;
+{
+ char *result;
+ file_t port = __file_name_lookup (thisdir, 0, 0);
+ if (port == MACH_PORT_NULL)
+ return NULL;
+ result = _hurd_canonicalize_directory_name_internal (port, buf, size);
+ __mach_port_deallocate (__mach_task_self (), port);
+ return result;
+}
+
+/* Get the pathname of the current working directory, and put it in SIZE
+ bytes of BUF. Returns NULL if the directory couldn't be determined or
+ SIZE was too small. If successful, returns BUF. In GNU, if BUF is
+ NULL, an array is allocated with `malloc'; the array is SIZE bytes long,
+ unless SIZE <= 0, in which case it is as big as necessary. */
+char *
+__getcwd (char *buf, size_t size)
+{
+ return __USEPORT (CWDIR,
+ _hurd_canonicalize_directory_name_internal (port,
+ buf, size));
+}
weak_alias (__getcwd, getcwd)
diff --git a/sysdeps/posix/getcwd.c b/sysdeps/posix/getcwd.c
index af858a2643..05f626f869 100644
--- a/sysdeps/posix/getcwd.c
+++ b/sysdeps/posix/getcwd.c
@@ -180,18 +180,15 @@ extern char *alloca ();
#define __lstat stat
#endif
-#ifndef _LIBC
-#define __getcwd getcwd
-#endif
-
-/* Get the pathname of the current working directory, and put it in SIZE
+/* Get the canonical absolute name of the named directory, and put it in SIZE
bytes of BUF. Returns NULL if the directory couldn't be determined or
SIZE was too small. If successful, returns BUF. In GNU, if BUF is
NULL, an array is allocated with `malloc'; the array is SIZE bytes long,
unless SIZE <= 0, in which case it is as big as necessary. */
char *
-__getcwd (buf, size)
+__canonicalize_directory_name_internal (thisdir, buf, size)
+ const char *thisdir;
char *buf;
size_t size;
{
@@ -230,7 +227,7 @@ __getcwd (buf, size)
pathp = path + size;
*--pathp = '\0';
- if (__lstat (".", &st) < 0)
+ if (__lstat (thisdir, &st) < 0)
return NULL;
thisdev = st.st_dev;
thisino = st.st_ino;
@@ -369,6 +366,24 @@ __getcwd (buf, size)
free ((__ptr_t) dotlist);
return NULL;
}
+
+/* Get the pathname of the current working directory, and put it in SIZE
+ bytes of BUF. Returns NULL if the directory couldn't be determined or
+ SIZE was too small. If successful, returns BUF. In GNU, if BUF is
+ NULL, an array is allocated with `malloc'; the array is SIZE bytes long,
+ unless SIZE <= 0, in which case it is as big as necessary. */
+
+#ifndef _LIBC
+#define __getcwd getcwd
+#endif
+
+char *
+__getcwd (buf, size)
+ char *buf;
+ size_t size;
+{
+ return __canonicalize_directory_name_internal (".", buf, size);
+}
#ifdef _LIBC
weak_alias (__getcwd, getcwd)
diff --git a/sysdeps/posix/tempname.c b/sysdeps/posix/tempname.c
index c70a6e8d35..fdddae2d0c 100644
--- a/sysdeps/posix/tempname.c
+++ b/sysdeps/posix/tempname.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 95, 96 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
@@ -16,7 +16,6 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
-#include <ansidecl.h>
#include <errno.h>
#include <stddef.h>
#include <stdio.h>
@@ -34,7 +33,7 @@ Cambridge, MA 02139, USA. */
/* Return nonzero if DIR is an existent directory. */
static int
-DEFUN(diraccess, (dir), CONST char *dir)
+diraccess (const char *dir)
{
struct stat buf;
return __stat (dir, &buf) == 0 && S_ISDIR (buf.st_mode);
@@ -42,7 +41,7 @@ DEFUN(diraccess, (dir), CONST char *dir)
/* Return nonzero if FILE exists. */
static int
-DEFUN(exists, (file), CONST char *file)
+exists (const char *file)
{
/* We can stat the file even if we can't read its data. */
struct stat st;
@@ -64,7 +63,7 @@ DEFUN(exists, (file), CONST char *file)
/* These are the characters used in temporary filenames. */
-static CONST char letters[] =
+static const char letters[] =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
/* Generate a temporary filename and return it (in a static buffer). If
@@ -82,13 +81,11 @@ static CONST char letters[] =
existing file will be returned. When the cycle reaches its end
(12345ZZZ), NULL is returned. */
char *
-DEFUN(__stdio_gen_tempname, (dir, pfx, dir_search, lenptr, streamptr),
- CONST char *dir AND CONST char *pfx AND
- int dir_search AND size_t *lenptr AND
- FILE **streamptr)
+__stdio_gen_tempname (const char *dir, const char *pfx, int dir_search,
+ size_t *lenptr, FILE **streamptr)
{
int saverrno = errno;
- static CONST char tmpdir[] = P_tmpdir;
+ static const char tmpdir[] = P_tmpdir;
static size_t indices[2];
size_t *idx;
static char buf[FILENAME_MAX];
@@ -98,7 +95,7 @@ DEFUN(__stdio_gen_tempname, (dir, pfx, dir_search, lenptr, streamptr),
if (dir_search)
{
- register CONST char *d = getenv ("TMPDIR");
+ register const char *d = getenv ("TMPDIR");
if (d != NULL && !diraccess (d))
d = NULL;
if (d == NULL && dir != NULL && diraccess (dir))
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index d25e0525ca..8c9fcfe934 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -16,8 +16,29 @@ endif
ifeq ($(subdir), misc)
sysdep_routines += mount umount xmknod s_ptrace s_sysctl sysctl llseek \
-setfsgid setfsuid sysinfo uselib
+setfsgid setfsuid sysinfo uselib s_reboot
headers += sys/mount.h sys/sysinfo.h sys/acct.h sys/sysctl.h
+
+install-others += $(includedir)/sys/syscall.h
+
+$(includedir)/sys/syscall.h::
+ @rm -f $(objpfx)syscall.h $(objpfx)syscall.sed
+ @(os=`uname -sr`; \
+ echo -e '1i\\\n#ifndef _SYS_SYSCALL_H\\'; \
+ echo -e '#define _SYS_SYSCALL_H\t1\\\n\\'; \
+ echo -e -n '/* This file is automatically generated as part of '; \
+ echo -e 'GNU libc-$(version)\\'; \
+ echo -e " on a system running $$os. */\\"; echo; \
+ echo -e -n 's/#define __NR_\\([A-Za-z0-9_]*\\)[ \t]*__NR_\\(.*\\)/';\
+ echo -e '#define SYS_\\1 SYS_\\2/p'; \
+ echo -e -n 's/#define __NR_\\([A-Za-z0-9_]*\\)[ \t]*\\(.*\\)/';\
+ echo -e '#define SYS_\\1 \\2/p'; \
+ echo -e '$$i\\\n\\\n#endif\t/* sys/syscall.h */\nd') \
+ > $(objpfx)syscall.sed
+ set -- `echo '#include <asm/unistd.h>'|$(CC) -M -E -`; \
+ sed -f $(objpfx)syscall.sed $$2 > $(objpfx)syscall.h
+ $(INSTALL_DATA) $(objpfx)syscall.h $@
+ rm -f $(objpfx)syscall.h $(objpfx)syscall.sed
endif
ifeq ($(subdir), time)
diff --git a/sysdeps/unix/sysv/linux/reboot.c b/sysdeps/unix/sysv/linux/reboot.c
new file mode 100644
index 0000000000..ecda522444
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/reboot.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 1996 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 Library General Public License as
+published by the Free Software Foundation; either version 2 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#include <unistd.h>
+
+extern int __syscall_reboot (int magic, int magic_too, int flag);
+
+/* Call kernel with additional two arguments the syscall requires. */
+int
+reboot (int howto)
+{
+ return __syscall_reboot (0xfee1dead, 672274793, howto);
+}
diff --git a/sysdeps/unix/sysv/linux/sys/reboot.h b/sysdeps/unix/sysv/linux/sys/reboot.h
new file mode 100644
index 0000000000..a7b86fa804
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sys/reboot.h
@@ -0,0 +1,43 @@
+/* Copyright (C) 1996 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 Library General Public License as
+published by the Free Software Foundation; either version 2 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* This file should define RB_* macros to be used as flag
+ bits in the argument to the `reboot' system call. */
+
+#ifndef _SYS_REBOOT_H
+
+#define _SYS_REBOOT_H 1
+#include <features.h>
+
+/* Perform a hard reset now. */
+#define RB_AUTOBOOT 0x01234567
+
+/* Halt the system. */
+#define RB_HALT_SYSTEM 0xcdef0123
+
+/* Enable reboot using Ctrl-Alt-Delete keystroke. */
+#define RB_ENABLE_CAD 0x89abcdef
+
+/* Disable reboot using Ctrl-Alt-Delete keystroke. */
+#define RB_DISABLE_CAD 0
+
+
+/* Reboot or halt the system. */
+extern int reboot __P ((int __howto));
+
+#endif /* sys/reboot.h */
diff --git a/sysdeps/unix/sysv/linux/syscall.h b/sysdeps/unix/sysv/linux/syscall.h
index efe285c1fe..62fca57d70 100644
--- a/sysdeps/unix/sysv/linux/syscall.h
+++ b/sysdeps/unix/sysv/linux/syscall.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996 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
@@ -24,12 +24,4 @@ Cambridge, MA 02139, USA. */
from the kernel sources. */
#include <asm/unistd.h>
-/* Among the system calls defined there are
- _setdomainname
- _fchdir
- _readv
- _writev
- (This is a hack for the autoconf mechanism. Don't change a single
- character, esp white spaces, unless you know what you are doing!) */
-
#endif
diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list
index 019d746a73..f401bc8c60 100644
--- a/sysdeps/unix/sysv/linux/syscalls.list
+++ b/sysdeps/unix/sysv/linux/syscalls.list
@@ -23,7 +23,7 @@ munlockall - munlockall 0 __munlockall munlockall
nanosleep - nanosleep 2 nanosleep
personality init-first personality 1 __personality personality
pipe - pipe 1 __pipe pipe
-reboot - reboot 3 reboot
+s_reboot - reboot 3 __syscall_reboot
s_getpriority getpriority getpriority 2 __syscall_getpriority
s_ptrace ptrace ptrace 4 __syscall_ptrace
s_sigsuspend sigsuspend sigsuspend 3 __syscall_sigsuspend