about summary refs log tree commit diff
path: root/sysdeps/unix/sysv
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv')
-rw-r--r--sysdeps/unix/sysv/linux/Dist1
-rw-r--r--sysdeps/unix/sysv/linux/alpha/fpathconf.c44
-rw-r--r--sysdeps/unix/sysv/linux/alpha/pathconf.c44
-rw-r--r--sysdeps/unix/sysv/linux/arm/bits/armsigctx.h2
-rw-r--r--sysdeps/unix/sysv/linux/arm/profil-counter.h1
-rw-r--r--sysdeps/unix/sysv/linux/arm/sysdep.S2
-rw-r--r--sysdeps/unix/sysv/linux/fpathconf.c80
-rw-r--r--sysdeps/unix/sysv/linux/fstatvfs.c26
-rw-r--r--sysdeps/unix/sysv/linux/linux_fsinfo.h58
-rw-r--r--sysdeps/unix/sysv/linux/pathconf.c80
-rw-r--r--sysdeps/unix/sysv/linux/sys/ptrace.h2
11 files changed, 306 insertions, 34 deletions
diff --git a/sysdeps/unix/sysv/linux/Dist b/sysdeps/unix/sysv/linux/Dist
index 411f575b91..7747c82e99 100644
--- a/sysdeps/unix/sysv/linux/Dist
+++ b/sysdeps/unix/sysv/linux/Dist
@@ -7,6 +7,7 @@ kernel_stat.h
 kernel_termios.h
 ldd-rewrite.sed
 lddlibc4.c
+linux_fsinfo.h
 llseek.c
 s_pread64.c
 s_pwrite64.c
diff --git a/sysdeps/unix/sysv/linux/alpha/fpathconf.c b/sysdeps/unix/sysv/linux/alpha/fpathconf.c
index d8c428dcda..b822daaf39 100644
--- a/sysdeps/unix/sysv/linux/alpha/fpathconf.c
+++ b/sysdeps/unix/sysv/linux/alpha/fpathconf.c
@@ -22,9 +22,7 @@
 #include <limits.h>
 #include <sys/statfs.h>
 
-#define EXT2_SUPER_MAGIC	0xef53
-#define UFS_MAGIC		0x00011954
-#define UFS_CIGAM		0x54190100 /* byteswapped MAGIC */
+#include <linux_fsinfo.h>
 
 static long int default_fpathconf (int fd, int name);
 
@@ -55,6 +53,46 @@ __fpathconf (fd, name)
       /* This filesystem supported files >2GB.  */
       return 64;
     }
+  if (name == _PC_LINK_MAX)
+    {
+      struct statfs fsbuf;
+
+      /* Determine the filesystem type.  */
+      if (__fstatfs (fd, &fsbuf) < 0)
+	/* not possible, return the default value.  */
+	return LINK_MAX;
+
+      switch (fsbuf.f_type)
+	{
+	case EXT2_SUPER_MAGIC:
+	  return EXT2_LINK_MAX;
+
+	case MINIX_SUPER_MAGIC:
+	case MINIX_SUPER_MAGIC2:
+	  return MINIX_LINK_MAX;
+
+	case MINIX2_SUPER_MAGIC:
+	case MINIX2_SUPER_MAGIC2:
+	  return MINIX2_LINK_MAX;
+
+	case XENIX_SUPER_MAGIC:
+	  return XENIX_LINK_MAX;
+
+	case SYSV4_SUPER_MAGIC:
+	case SYSV2_SUPER_MAGIC:
+	  return SYSV_LINK_MAX;
+
+	case COH_SUPER_MAGIC:
+	  return COH_LINK_MAX;
+
+	case UFS_MAGIC:
+	case UFS_CIGAM:
+	  return UFS_LINK_MAX;
+
+	default:
+	  return LINK_MAX;
+	}
+    }
 
   /* Fallback to the generic version.  */
   return default_fpathconf (fd, name);
diff --git a/sysdeps/unix/sysv/linux/alpha/pathconf.c b/sysdeps/unix/sysv/linux/alpha/pathconf.c
index 91ca0942fb..15910be9a1 100644
--- a/sysdeps/unix/sysv/linux/alpha/pathconf.c
+++ b/sysdeps/unix/sysv/linux/alpha/pathconf.c
@@ -23,9 +23,7 @@
 #include <fcntl.h>
 #include <sys/statfs.h>
 
-#define EXT2_SUPER_MAGIC	0xef53
-#define UFS_MAGIC		0x00011954
-#define UFS_CIGAM		0x54190100 /* byteswapped MAGIC */
+#include <linux_fsinfo.h>
 
 static long int default_pathconf (const char *path, int name);
 
@@ -48,6 +46,46 @@ __pathconf (const char *path, int name)
       /* This filesystem supported files >2GB.  */
       return 64;
     }
+  if (name == _PC_LINK_MAX)
+    {
+      struct statfs fsbuf;
+
+      /* Determine the filesystem type.  */
+      if (__statfs (fd, &fsbuf) < 0)
+	/* not possible, return the default value.  */
+	return LINK_MAX;
+
+      switch (fsbuf.f_type)
+	{
+	case EXT2_SUPER_MAGIC:
+	  return EXT2_LINK_MAX;
+
+	case MINIX_SUPER_MAGIC:
+	case MINIX_SUPER_MAGIC2:
+	  return MINIX_LINK_MAX;
+
+	case MINIX2_SUPER_MAGIC:
+	case MINIX2_SUPER_MAGIC2:
+	  return MINIX2_LINK_MAX;
+
+	case XENIX_SUPER_MAGIC:
+	  return XENIX_LINK_MAX;
+
+	case SYSV4_SUPER_MAGIC:
+	case SYSV2_SUPER_MAGIC:
+	  return SYSV_LINK_MAX;
+
+	case COH_SUPER_MAGIC:
+	  return COH_LINK_MAX;
+
+	case UFS_MAGIC:
+	case UFS_CIGAM:
+	  return UFS_LINK_MAX;
+
+	default:
+	  return LINK_MAX;
+	}
+    }
 
   /* Fallback to the generic version.  */
   return default_pathconf (path, name);
diff --git a/sysdeps/unix/sysv/linux/arm/bits/armsigctx.h b/sysdeps/unix/sysv/linux/arm/bits/armsigctx.h
index 395e194293..ba78c03a89 100644
--- a/sysdeps/unix/sysv/linux/arm/bits/armsigctx.h
+++ b/sysdeps/unix/sysv/linux/arm/bits/armsigctx.h
@@ -21,6 +21,8 @@
    Fortunately 2.0 puts a magic number in the first word and this is not
    a legal value for `trap_no', so we can tell them apart.  */
 
+#include <asm/ptrace.h>
+
 union k_sigcontext
   {
     struct
diff --git a/sysdeps/unix/sysv/linux/arm/profil-counter.h b/sysdeps/unix/sysv/linux/arm/profil-counter.h
index 55a11bd76b..a1a4fc9d7f 100644
--- a/sysdeps/unix/sysv/linux/arm/profil-counter.h
+++ b/sysdeps/unix/sysv/linux/arm/profil-counter.h
@@ -18,7 +18,6 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <signal.h>
-#include <asm/ptrace.h>
 #include <bits/armsigctx.h>
 
 void
diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.S b/sysdeps/unix/sysv/linux/arm/sysdep.S
index 872ed4b555..3e3c853c78 100644
--- a/sysdeps/unix/sysv/linux/arm/sysdep.S
+++ b/sysdeps/unix/sysv/linux/arm/sysdep.S
@@ -24,7 +24,7 @@
 	.type C_SYMBOL_NAME(errno),%object
 	.size C_SYMBOL_NAME(errno),4
 C_SYMBOL_NAME(errno):	.zero 4
-weak_alias (C_SYMBOL_NAME(errno), C_SYMBOL_NAME(_errno))
+weak_alias (errno, _errno)
 	.text
 
 /* The syscall stubs jump here when they detect an error.
diff --git a/sysdeps/unix/sysv/linux/fpathconf.c b/sysdeps/unix/sysv/linux/fpathconf.c
new file mode 100644
index 0000000000..81ddef3944
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/fpathconf.c
@@ -0,0 +1,80 @@
+/* Linux specific extensions to fpathconf.
+   Copyright (C) 1991, 1995, 1996, 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 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>
+#include <limits.h>
+#include <sys/statfs.h>
+
+#include "linux_fsinfo.h"
+
+static long int posix_fpathconf (int fd, int name);
+
+
+/* Get file-specific information about descriptor FD.  */
+long int
+__fpathconf (fd, name)
+     int fd;
+     int name;
+{
+  if (name == _PC_LINK_MAX)
+    {
+      struct statfs fsbuf;
+
+      /* Determine the filesystem type.  */
+      if (__fstatfs (fd, &fsbuf) < 0)
+	/* not possible, return the default value.  */
+	return LINK_MAX;
+
+      switch (fsbuf.f_type)
+	{
+	case EXT2_SUPER_MAGIC:
+	  return EXT2_LINK_MAX;
+
+	case MINIX_SUPER_MAGIC:
+	case MINIX_SUPER_MAGIC2:
+	  return MINIX_LINK_MAX;
+
+	case MINIX2_SUPER_MAGIC:
+	case MINIX2_SUPER_MAGIC2:
+	  return MINIX2_LINK_MAX;
+
+	case XENIX_SUPER_MAGIC:
+	  return XENIX_LINK_MAX;
+
+	case SYSV4_SUPER_MAGIC:
+	case SYSV2_SUPER_MAGIC:
+	  return SYSV_LINK_MAX;
+
+	case COH_SUPER_MAGIC:
+	  return COH_LINK_MAX;
+
+	case UFS_MAGIC:
+	case UFS_CIGAM:
+	  return UFS_LINK_MAX;
+
+	default:
+	  return LINK_MAX;
+	}
+    }
+
+  return posix_fpathconf (fd, name);
+}
+
+#define __fpathconf static posix_fpathconf
+#include <sysdeps/posix/fpathconf.c>
diff --git a/sysdeps/unix/sysv/linux/fstatvfs.c b/sysdeps/unix/sysv/linux/fstatvfs.c
index 43bab44543..11f6f8eb44 100644
--- a/sysdeps/unix/sysv/linux/fstatvfs.c
+++ b/sysdeps/unix/sysv/linux/fstatvfs.c
@@ -26,31 +26,7 @@
 #include <sys/statfs.h>
 #include <sys/statvfs.h>
 
-/* These definitions come from the kernel headers.  But we cannot
-   include the headers here because of type clashes.  If new
-   filesystem types will become available we have to add the
-   appropriate definitions here.*/
-#define ADFS_SUPER_MAGIC	0xadf5
-#define AFFS_SUPER_MAGIC	0xadff
-#define CODA_SUPER_MAGIC	0x73757245
-#define EXT2_SUPER_MAGIC	0xef53
-#define HPFS_SUPER_MAGIC	0xf995e849
-#define ISOFS_SUPER_MAGIC	0x9660
-#define MINIX_SUPER_MAGIC	0x137f
-#define MINIX_SUPER_MAGIC2	0x138F
-#define MINIX2_SUPER_MAGIC	0x2468
-#define MINIX2_SUPER_MAGIC2	0x2478
-#define MSDOS_SUPER_MAGIC	0x4d44
-#define NCP_SUPER_MAGIC		0x564c
-#define NFS_SUPER_MAGIC		0x6969
-#define PROC_SUPER_MAGIC	0x9fa0
-#define SMB_SUPER_MAGIC		0x517b
-#define XENIX_SUPER_MAGIC	0x012ff7b4
-#define SYSV4_SUPER_MAGIC	0x012ff7b5
-#define SYSV2_SUPER_MAGIC	0x012ff7b6
-#define COH_SUPER_MAGIC		0x012ff7b7
-#define UFS_MAGIC		0x00011954
-#define UFS_CIGAM		0x54190100 /* byteswapped MAGIC */
+#include "linux_fsinfo.h"
 
 
 int
diff --git a/sysdeps/unix/sysv/linux/linux_fsinfo.h b/sysdeps/unix/sysv/linux/linux_fsinfo.h
new file mode 100644
index 0000000000..9dfb034b7d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/linux_fsinfo.h
@@ -0,0 +1,58 @@
+/* Constants from kernel header for various FSes.
+   Copyright (C) 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 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.  */
+
+#ifndef _LINUX_FSINFO_H
+#define _LINUX_FSINFO_H	1
+
+/* These definitions come from the kernel headers.  But we cannot
+   include the headers here because of type clashes.  If new
+   filesystem types will become available we have to add the
+   appropriate definitions here.*/
+#define ADFS_SUPER_MAGIC	0xadf5
+#define AFFS_SUPER_MAGIC	0xadff
+#define CODA_SUPER_MAGIC	0x73757245
+#define EXT2_SUPER_MAGIC	0xef53
+#define HPFS_SUPER_MAGIC	0xf995e849
+#define ISOFS_SUPER_MAGIC	0x9660
+#define MINIX_SUPER_MAGIC	0x137f
+#define MINIX_SUPER_MAGIC2	0x138F
+#define MINIX2_SUPER_MAGIC	0x2468
+#define MINIX2_SUPER_MAGIC2	0x2478
+#define MSDOS_SUPER_MAGIC	0x4d44
+#define NCP_SUPER_MAGIC		0x564c
+#define NFS_SUPER_MAGIC		0x6969
+#define PROC_SUPER_MAGIC	0x9fa0
+#define SMB_SUPER_MAGIC		0x517b
+#define XENIX_SUPER_MAGIC	0x012ff7b4
+#define SYSV4_SUPER_MAGIC	0x012ff7b5
+#define SYSV2_SUPER_MAGIC	0x012ff7b6
+#define COH_SUPER_MAGIC		0x012ff7b7
+#define UFS_MAGIC		0x00011954
+#define UFS_CIGAM		0x54190100 /* byteswapped MAGIC */
+
+/* Maximum link counts.  */
+#define EXT2_LINK_MAX		32000
+#define MINIX_LINK_MAX		250
+#define MINIX2_LINK_MAX		65530
+#define XENIX_LINK_MAX		126     /* ?? */
+#define SYSV_LINK_MAX		126     /* 127? 251? */
+#define COH_LINK_MAX		10000
+#define UFS_LINK_MAX		EXT2_LINK_MAX
+
+#endif	/* linux_fsinfo.h */
diff --git a/sysdeps/unix/sysv/linux/pathconf.c b/sysdeps/unix/sysv/linux/pathconf.c
new file mode 100644
index 0000000000..dcf87d5284
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/pathconf.c
@@ -0,0 +1,80 @@
+/* Linux specific extensions to pathconf.
+   Copyright (C) 1991, 1995, 1996, 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 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>
+#include <limits.h>
+#include <sys/statfs.h>
+
+#include "linux_fsinfo.h"
+
+static long int posix_pathconf (const char *path, int name);
+
+
+/* Get file-specific information about descriptor FD.  */
+long int
+__pathconf (path, name)
+     const char *path;
+     int name;
+{
+  if (name == _PC_LINK_MAX)
+    {
+      struct statfs fsbuf;
+
+      /* Determine the filesystem type.  */
+      if (__statfs (path, &fsbuf) < 0)
+	/* not possible, return the default value.  */
+	return LINK_MAX;
+
+      switch (fsbuf.f_type)
+	{
+	case EXT2_SUPER_MAGIC:
+	  return EXT2_LINK_MAX;
+
+	case MINIX_SUPER_MAGIC:
+	case MINIX_SUPER_MAGIC2:
+	  return MINIX_LINK_MAX;
+
+	case MINIX2_SUPER_MAGIC:
+	case MINIX2_SUPER_MAGIC2:
+	  return MINIX2_LINK_MAX;
+
+	case XENIX_SUPER_MAGIC:
+	  return XENIX_LINK_MAX;
+
+	case SYSV4_SUPER_MAGIC:
+	case SYSV2_SUPER_MAGIC:
+	  return SYSV_LINK_MAX;
+
+	case COH_SUPER_MAGIC:
+	  return COH_LINK_MAX;
+
+	case UFS_MAGIC:
+	case UFS_CIGAM:
+	  return UFS_LINK_MAX;
+
+	default:
+	  return LINK_MAX;
+	}
+    }
+
+  return posix_pathconf (path, name);
+}
+
+#define __pathconf static posix_pathconf
+#include <sysdeps/posix/pathconf.c>
diff --git a/sysdeps/unix/sysv/linux/sys/ptrace.h b/sysdeps/unix/sysv/linux/sys/ptrace.h
index 6c5d580d7b..5b670668bf 100644
--- a/sysdeps/unix/sysv/linux/sys/ptrace.h
+++ b/sysdeps/unix/sysv/linux/sys/ptrace.h
@@ -99,7 +99,7 @@ enum __ptrace_request
 #define PT_DETACH PTRACE_DETACH
 
   /* Continue and stop at the next (return from) syscall.  */
-  PTRACE_SYSCALL = 24,
+  PTRACE_SYSCALL = 24
 #define PTRACE_SYSCALL PTRACE_SYSCALL
 };