Skip to content

Commit

Permalink
Re-install F_[GS]ETOWN_EX changes
Browse files Browse the repository at this point in the history
  • Loading branch information
Andreas Schwab committed Nov 24, 2009
1 parent bacf60d commit 4909e83
Show file tree
Hide file tree
Showing 11 changed files with 252 additions and 26 deletions.
27 changes: 27 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,22 @@ d2009-10-30 Ulrich Drepper <drepper@redhat.com>
* sysdeps/generic/netinet/ip.h: Define IPTOS_ENC* and IPTOS_DSCP*
macros. Patch by Philip Prindeville <philipp@redfish-solutions.com>.

[BZ #10840]
* sysdeps/unix/sysv/linux/kernel-features.h: Define
__ASSUME_F_GETOWN_EX.
* sysdeps/unix/sysv/linux/fcntl.c: Implement F_GETOWN using F_GETOWN_EX
if possible.
* sysdeps/unix/sysv/linux/i386/fcntl.c: Likewise.

* sysdeps/unix/sysv/linux/sh/bits/fcntl.h: Define F_OWNER_*
and f_owner_ex.
* sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h: Likewise.
* sysdeps/unix/sysv/linux/x86_64/bits/fcntl.h: Likewise.
* sysdeps/unix/sysv/linux/sparc/bits/fcntl.h: Likewise.
* sysdeps/unix/sysv/linux/ia64/bits/fcntl.h: Likewise.
* sysdeps/unix/sysv/linux/i386/bits/fcntl.h: Likewise.
* sysdeps/unix/sysv/linux/s390/bits/fcntl.h: Likewise.

[BZ #10847]
* sysdeps/gnu/getutmp.c: Allow compatibility code to play around with
getutmpx symbol.
Expand Down Expand Up @@ -362,6 +378,17 @@ d2009-10-30 Ulrich Drepper <drepper@redhat.com>
* locale/C-time.c: Revert week-1stday back to 19971130 and set
first_weekday to 1 and first_workday to 2.

2009-10-01 Ulrich Drepper <drepper@redhat.com>

* sysdeps/unix/sysv/linux/sh/bits/fcntl.h: Define F_SETOWN_EX and
F_GETOWN_EX.
* sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h: Likewise.
* sysdeps/unix/sysv/linux/x86_64/bits/fcntl.h: Likewise.
* sysdeps/unix/sysv/linux/sparc/bits/fcntl.h: Likewise.
* sysdeps/unix/sysv/linux/ia64/bits/fcntl.h: Likewise.
* sysdeps/unix/sysv/linux/i386/bits/fcntl.h: Likewise.
* sysdeps/unix/sysv/linux/s390/bits/fcntl.h: Likewise.

2009-09-28 Andreas Schwab <schwab@redhat.com>

* stdio-common/printf_fp.c: Check for and avoid integer overflows.
Expand Down
42 changes: 38 additions & 4 deletions sysdeps/unix/sysv/linux/fcntl.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright (C) 2000, 2002, 2003, 2004 Free Software Foundation, Inc.
/* Copyright (C) 2000, 2002, 2003, 2004, 2009 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
Expand All @@ -23,6 +23,40 @@
#include <stdarg.h>

#include <sys/syscall.h>
#include <kernel-features.h>


#ifdef __ASSUME_F_GETOWN_EX
# define miss_F_GETOWN_EX 0
#else
static int miss_F_GETOWN_EX;
#endif


static int
do_fcntl (int fd, int cmd, void *arg)
{
if (cmd != F_GETOWN || miss_F_GETOWN_EX)
return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);

INTERNAL_SYSCALL_DECL (err);
struct f_owner_ex fex;
int res = INTERNAL_SYSCALL (fcntl, err, 3, fd, F_GETOWN_EX, &fex);
if (!INTERNAL_SYSCALL_ERROR_P (res, err))
return fex.type == F_OWNER_GID ? -fex.pid : fex.pid;

#ifndef __ASSUME_F_GETOWN_EX
if (INTERNAL_SYSCALL_ERRNO (res, err) == EINVAL)
{
res = INLINE_SYSCALL (fcntl, 3, fd, F_GETOWN, arg);
miss_F_GETOWN_EX = 1;
return res;
}
#endif

__set_errno (INTERNAL_SYSCALL_ERRNO (res, err));
return -1;
}


#ifndef NO_CANCELLATION
Expand All @@ -36,7 +70,7 @@ __fcntl_nocancel (int fd, int cmd, ...)
arg = va_arg (ap, void *);
va_end (ap);

return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
return do_fcntl (fd, cmd, arg);
}
#endif

Expand All @@ -52,11 +86,11 @@ __libc_fcntl (int fd, int cmd, ...)
va_end (ap);

if (SINGLE_THREAD_P || cmd != F_SETLKW)
return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
return do_fcntl (fd, cmd, arg);

int oldtype = LIBC_CANCEL_ASYNC ();

int result = INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
int result = do_fcntl (fd, cmd, arg);

LIBC_CANCEL_RESET (oldtype);

Expand Down
25 changes: 22 additions & 3 deletions sysdeps/unix/sysv/linux/i386/bits/fcntl.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* O_*, F_*, FD_* bit values for Linux.
Copyright (C) 1995, 1996, 1997, 1998, 2000, 2004, 2006, 2007
Copyright (C) 1995, 1996, 1997, 1998, 2000, 2004, 2006, 2007, 2009
Free Software Foundation, Inc.
This file is part of the GNU C Library.
Expand Down Expand Up @@ -85,13 +85,15 @@
#define F_SETLKW64 14 /* Set record locking info (blocking). */

#if defined __USE_BSD || defined __USE_UNIX98
# define F_SETOWN 8 /* Get owner of socket (receiver of SIGIO). */
# define F_GETOWN 9 /* Set owner of socket (receiver of SIGIO). */
# define F_SETOWN 8 /* Get owner (process receiving SIGIO). */
# define F_GETOWN 9 /* Set owner (process receiving SIGIO). */
#endif

#ifdef __USE_GNU
# define F_SETSIG 10 /* Set number of signal to be sent. */
# define F_GETSIG 11 /* Get number of signal to be sent. */
# define F_SETOWN_EX 12 /* Get owner (thread receiving SIGIO). */
# define F_GETOWN_EX 13 /* Set owner (thread receiving SIGIO). */
#endif

#ifdef __USE_GNU
Expand Down Expand Up @@ -166,6 +168,23 @@ struct flock64
};
#endif

#ifdef __USE_GNU
/* Owner types. */
enum __pid_type
{
F_OWNER_TID = 0, /* Kernel thread. */
F_OWNER_PID, /* Process. */
F_OWNER_GID /* Process group. */
};

/* Structure to use with F_GETOWN_EX and F_SETOWN_EX. */
struct f_owner_ex
{
enum __pid_type type; /* Owner type of ID. */
__pid_t pid; /* ID of owner. */
};
#endif

/* Define some more compatibility macros to be backward compatible with
BSD systems which did not managed to hide these kernel macros. */
#ifdef __USE_BSD
Expand Down
29 changes: 28 additions & 1 deletion sysdeps/unix/sysv/linux/i386/fcntl.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright (C) 2000,2002,2003,2004,2006 Free Software Foundation, Inc.
/* Copyright (C) 2000,2002,2003,2004,2006,2009 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
Expand Down Expand Up @@ -30,6 +30,13 @@
int __have_no_fcntl64;
#endif

#ifdef __ASSUME_F_GETOWN_EX
# define miss_F_GETOWN_EX 0
#else
static int miss_F_GETOWN_EX;
#endif


#if defined NO_CANCELLATION && __ASSUME_FCNTL64 == 0
# define __fcntl_nocancel __libc_fcntl
#endif
Expand Down Expand Up @@ -119,6 +126,26 @@ __fcntl_nocancel (int fd, int cmd, ...)
assert (F_SETLK - F_SETLKW == F_SETLK64 - F_SETLKW64);
return INLINE_SYSCALL (fcntl, 3, fd, cmd + F_SETLK - F_SETLK64, &fl);
}
case F_GETOWN:
if (! miss_F_GETOWN_EX)
{
INTERNAL_SYSCALL_DECL (err);
struct f_owner_ex fex;
int res = INTERNAL_SYSCALL (fcntl, err, 3, fd, F_GETOWN_EX, &fex);
if (!INTERNAL_SYSCALL_ERROR_P (res, err))
return fex.type == F_OWNER_GID ? -fex.pid : fex.pid;

#ifndef __ASSUME_F_GETOWN_EX
if (INTERNAL_SYSCALL_ERRNO (res, err) == EINVAL)
miss_F_GETOWN_EX = 1;
else
#endif
{
__set_errno (INTERNAL_SYSCALL_ERRNO (res, err));
return -1;
}
}
/* FALLTHROUGH */
default:
return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
}
Expand Down
25 changes: 22 additions & 3 deletions sysdeps/unix/sysv/linux/ia64/bits/fcntl.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* O_*, F_*, FD_* bit values for Linux/IA64.
Copyright (C) 1999, 2000, 2004, 2006, 2007 Free Software Foundation, Inc.
Copyright (C) 1999,2000,2004,2006,2007,2009 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
Expand Down Expand Up @@ -81,13 +81,15 @@
#define F_SETLKW64 7 /* Set record locking info (blocking). */

#if defined __USE_BSD || defined __USE_UNIX98
# define F_SETOWN 8 /* Get owner of socket (receiver of SIGIO). */
# define F_GETOWN 9 /* Set owner of socket (receiver of SIGIO). */
# define F_SETOWN 8 /* Get owner (process receiving SIGIO). */
# define F_GETOWN 9 /* Set owner (process receiving SIGIO). */
#endif

#ifdef __USE_GNU
# define F_SETSIG 10 /* Set number of signal to be sent. */
# define F_GETSIG 11 /* Get number of signal to be sent. */
# define F_SETOWN_EX 12 /* Get owner (thread receiving SIGIO). */
# define F_GETOWN_EX 13 /* Set owner (thread receiving SIGIO). */
#endif

#ifdef __USE_GNU
Expand Down Expand Up @@ -159,6 +161,23 @@ struct flock64
};
#endif

#ifdef __USE_GNU
/* Owner types. */
enum __pid_type
{
F_OWNER_TID = 0, /* Kernel thread. */
F_OWNER_PID, /* Process. */
F_OWNER_GID /* Process group. */
};

/* Structure to use with F_GETOWN_EX and F_SETOWN_EX. */
struct f_owner_ex
{
enum __pid_type type; /* Owner type of ID. */
__pid_t pid; /* ID of owner. */
};
#endif


/* Define some more compatibility macros to be backward compatible with
BSD systems which did not managed to hide these kernel macros. */
Expand Down
5 changes: 5 additions & 0 deletions sysdeps/unix/sysv/linux/kernel-features.h
Original file line number Diff line number Diff line change
Expand Up @@ -542,3 +542,8 @@
# define __ASSUME_PREADV 1
# define __ASSUME_PWRITEV 1
#endif

/* Support for F_GETOWN_EX was introduced in 2.6.32. */
#if __LINUX_KERNEL_VERSION >= 0x020620
# define __ASSUME_F_GETOWN_EX 1
#endif
25 changes: 22 additions & 3 deletions sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* O_*, F_*, FD_* bit values for Linux/PowerPC.
Copyright (C) 1995, 1996, 1997, 1998, 2000, 2003, 2004, 2006, 2007
Copyright (C) 1995, 1996, 1997, 1998, 2000, 2003, 2004, 2006, 2007, 2009
Free Software Foundation, Inc.
This file is part of the GNU C Library.
Expand Down Expand Up @@ -85,13 +85,15 @@
#define F_SETLKW64 14 /* Set record locking info (blocking). */

#if defined __USE_BSD || defined __USE_UNIX98
# define F_SETOWN 8 /* Get owner of socket (receiver of SIGIO). */
# define F_GETOWN 9 /* Set owner of socket (receiver of SIGIO). */
# define F_SETOWN 8 /* Get owner (process receiving of SIGIO). */
# define F_GETOWN 9 /* Set owner (process receiving of SIGIO). */
#endif

#ifdef __USE_GNU
# define F_SETSIG 10 /* Set number of signal to be sent. */
# define F_GETSIG 11 /* Get number of signal to be sent. */
# define F_SETOWN_EX 12 /* Get owner (thread receiving SIGIO). */
# define F_GETOWN_EX 13 /* Set owner (thread receiving SIGIO). */
#endif

#ifdef __USE_GNU
Expand Down Expand Up @@ -166,6 +168,23 @@ struct flock64
};
#endif

#ifdef __USE_GNU
/* Owner types. */
enum __pid_type
{
F_OWNER_TID = 0, /* Kernel thread. */
F_OWNER_PID, /* Process. */
F_OWNER_GID /* Process group. */
};

/* Structure to use with F_GETOWN_EX and F_SETOWN_EX. */
struct f_owner_ex
{
enum __pid_type type; /* Owner type of ID. */
__pid_t pid; /* ID of owner. */
};
#endif

/* Define some more compatibility macros to be backward compatible with
BSD systems which did not managed to hide these kernel macros. */
#ifdef __USE_BSD
Expand Down
25 changes: 22 additions & 3 deletions sysdeps/unix/sysv/linux/s390/bits/fcntl.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* O_*, F_*, FD_* bit values for Linux.
Copyright (C) 2000,2001,2002,2004,2006,2007 Free Software Foundation, Inc.
Copyright (C) 2000,2001,2002,2004,2006,2007,2009 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
Expand Down Expand Up @@ -100,13 +100,15 @@
#endif

#if defined __USE_BSD || defined __USE_UNIX98
# define F_SETOWN 8 /* Get owner of socket (receiver of SIGIO). */
# define F_GETOWN 9 /* Set owner of socket (receiver of SIGIO). */
# define F_SETOWN 8 /* Get owner (process receiving SIGIO). */
# define F_GETOWN 9 /* Set owner (process receiving SIGIO). */
#endif

#ifdef __USE_GNU
# define F_SETSIG 10 /* Set number of signal to be sent. */
# define F_GETSIG 11 /* Get number of signal to be sent. */
# define F_SETOWN_EX 12 /* Get owner (thread receiving SIGIO). */
# define F_GETOWN_EX 13 /* Set owner (thread receiving SIGIO). */
#endif

#ifdef __USE_GNU
Expand Down Expand Up @@ -181,6 +183,23 @@ struct flock64
};
#endif

#ifdef __USE_GNU
/* Owner types. */
enum __pid_type
{
F_OWNER_TID = 0, /* Kernel thread. */
F_OWNER_PID, /* Process. */
F_OWNER_GID /* Process group. */
};

/* Structure to use with F_GETOWN_EX and F_SETOWN_EX. */
struct f_owner_ex
{
enum __pid_type type; /* Owner type of ID. */
__pid_t pid; /* ID of owner. */
};
#endif

/* Define some more compatibility macros to be backward compatible with
BSD systems which did not managed to hide these kernel macros. */
#ifdef __USE_BSD
Expand Down
Loading

0 comments on commit 4909e83

Please sign in to comment.