2003-09-01  Thorsten Kukuk  <kukuk@suse.de>

	* nis/nss_compat/compat-spwd.c (getspnam_plususer): Return
	NSS_STATUS_SUCCESS if entry was found.
	(getspent_next_file): Store user in blacklist after entry
	was found, use innetgr.

2003-09-01  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c: New.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c: New.

	* sysdeps/generic/dl-tls.c (_dl_determine_tlsoffset): Fix tls offset
	computation for TCB_AT_TP.  Support l_firstbyte_offset != 0 for
	DTV_AT_TP, optimize.
This commit is contained in:
Ulrich Drepper 2003-09-02 00:49:47 +00:00
parent c874a32e88
commit c503d3dc51
19 changed files with 294 additions and 101 deletions

View File

@ -1,3 +1,19 @@
2003-09-01 Thorsten Kukuk <kukuk@suse.de>
* nis/nss_compat/compat-spwd.c (getspnam_plususer): Return
NSS_STATUS_SUCCESS if entry was found.
(getspent_next_file): Store user in blacklist after entry
was found, use innetgr.
2003-09-01 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c: New.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c: New.
* sysdeps/generic/dl-tls.c (_dl_determine_tlsoffset): Fix tls offset
computation for TCB_AT_TP. Support l_firstbyte_offset != 0 for
DTV_AT_TP, optimize.
2003-08-31 Kaz Kojima <kkojima@rr.iij4u.or.jp>
* sysdeps/unix/sysv/linux/sh/Versions: Add posix_fadvise64 and

View File

@ -17,6 +17,15 @@
* tst-tls1modf.c: New.
* tst-tls2.sh: New test.
* internals.h (__pthread_cond_timedwait): New prototype.
* sysdeps/pthread/pthread-functions.h (struct pthread_functions): Add
ptr___pthread_cond_timedwait.
* pthread.c (__pthread_functions): Initialize them.
* forward.c (pthread_cond_timedwait@GLIBC_2.0,
pthread_cond_timedwait@@GLIBC_2.3.2): New forwards.
* Versions (libc): Export pthread_cond_timedwait@GLIBC_2.0,
pthread_cond_timedwait@@GLIBC_2.3.2.
2003-08-27 Ulrich Drepper <drepper@redhat.com>
* sysdeps/pthread/pthread.h: Don't mark pthread_exit,

View File

@ -7,6 +7,7 @@ libc {
pthread_attr_setschedparam; pthread_attr_setschedpolicy;
pthread_attr_setscope; pthread_cond_broadcast; pthread_cond_destroy;
pthread_cond_init; pthread_cond_signal; pthread_cond_wait;
pthread_cond_timedwait;
pthread_condattr_destroy; pthread_condattr_init; pthread_equal;
pthread_exit; pthread_getschedparam; pthread_mutex_destroy;
pthread_mutex_init; pthread_mutex_lock; pthread_mutex_unlock;
@ -20,7 +21,7 @@ libc {
# Changed pthread_cond_t.
pthread_cond_init; pthread_cond_destroy;
pthread_cond_wait; pthread_cond_signal;
pthread_cond_broadcast;
pthread_cond_broadcast; pthread_cond_timedwait;
}
GLIBC_PRIVATE {
# Internal libc interface to libpthread

View File

@ -128,6 +128,15 @@ compat_symbol (libc, __pthread_cond_wait_2_0, pthread_cond_wait, GLIBC_2_0);
#endif
versioned_symbol (libc, __pthread_cond_wait, pthread_cond_wait, GLIBC_2_3_2);
FORWARD (__pthread_cond_timedwait,
(pthread_cond_t *cond, pthread_mutex_t *mutex,
const struct timespec *abstime), (cond, mutex, abstime), 0)
#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3_2)
strong_alias (__pthread_cond_timedwait, __pthread_cond_timedwait_2_0)
compat_symbol (libc, __pthread_cond_timedwait_2_0, pthread_cond_timedwait, GLIBC_2_0);
#endif
versioned_symbol (libc, __pthread_cond_timedwait, pthread_cond_timedwait, GLIBC_2_3_2);
FORWARD (pthread_equal, (pthread_t thread1, pthread_t thread2),
(thread1, thread2), 1)

View File

@ -354,6 +354,9 @@ extern int __pthread_cond_init (pthread_cond_t *cond,
const pthread_condattr_t *cond_attr);
extern int __pthread_cond_destroy (pthread_cond_t *cond);
extern int __pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex);
extern int __pthread_cond_timedwait (pthread_cond_t *cond,
pthread_mutex_t *mutex,
const struct timespec *abstime);
extern int __pthread_cond_signal (pthread_cond_t *cond);
extern int __pthread_cond_broadcast (pthread_cond_t *cond);
extern int __pthread_condattr_init (pthread_condattr_t *attr);

View File

@ -260,6 +260,7 @@ struct pthread_functions __pthread_functions =
.ptr___pthread_cond_init = __pthread_cond_init,
.ptr___pthread_cond_signal = __pthread_cond_signal,
.ptr___pthread_cond_wait = __pthread_cond_wait,
.ptr___pthread_cond_timedwait = __pthread_cond_timedwait,
.ptr_pthread_equal = __pthread_equal,
.ptr___pthread_exit = __pthread_exit,
.ptr_pthread_getschedparam = __pthread_getschedparam,

View File

@ -54,6 +54,8 @@ struct pthread_functions
const pthread_condattr_t *);
int (*ptr___pthread_cond_signal) (pthread_cond_t *);
int (*ptr___pthread_cond_wait) (pthread_cond_t *, pthread_mutex_t *);
int (*ptr___pthread_cond_timedwait) (pthread_cond_t *, pthread_mutex_t *,
const struct timespec *);
int (*ptr_pthread_equal) (pthread_t, pthread_t);
void (*ptr___pthread_exit) (void *);
int (*ptr_pthread_getschedparam) (pthread_t, int *, struct sched_param *);

View File

@ -1,3 +1,9 @@
2003-09-01 Petter Reinholdtsen <pere@hungry.com>
* locales/iw_IL: Add comment stating why there are two locales for
Hebrew in Israel, and that he_IL replaces iw_IL.
* locales/he_IL: Likewise.
2003-08-25 Ulrich Drepper <drepper@redhat.com>
* locales/an_ES: Fix locale header information.

View File

@ -18,6 +18,10 @@ escape_char /
% Charset: ISO-8859-8
% Distribution and use is free, also
% for commercial purposes.
%
% This locale replaces iw_IL, as the ISO-639 code for Hebrew was changed
% from 'iw' to 'he' in 1989, according to Bruno Haible on libc-alpha
% 2003-09-01.
LC_IDENTIFICATION
title "Hebrew locale for Israel"

View File

@ -18,6 +18,9 @@ escape_char /
% Charset: ISO-8859-8
% Distribution and use is free, also
% for commercial purposes.
%
% Obsolete locale. The ISO-639 code for Hebrew was changed from 'iw'
% to 'he' in 1989, according to Bruno Haible on libc-alpha 2003-09-01.
LC_IDENTIFICATION
title "Hebrew locale for Israel"

View File

@ -435,7 +435,7 @@ getspnam_plususer (const char *name, struct spwd *result, ent_t *ent,
copy_spwd_changes (result, &pwd, p, plen);
give_spwd_free (&pwd);
/* We found the entry. */
return NSS_STATUS_RETURN;
return NSS_STATUS_SUCCESS;
}
static enum nss_status
@ -539,18 +539,23 @@ getspent_next_file (struct spwd *result, ent_t *ent,
if (result->sp_namp[0] == '+' && result->sp_namp[1] != '\0'
&& result->sp_namp[1] != '@')
{
size_t len = strlen (result->sp_namp);
char buf[len];
enum nss_status status;
/* Store the User in the blacklist for the "+" at the end of
/etc/passwd */
blacklist_store_name (&result->sp_namp[1], ent);
memcpy (buf, &result->sp_namp[1], len);
status = getspnam_plususer (&result->sp_namp[1], result, ent,
buffer, buflen, errnop);
blacklist_store_name (buf, ent);
if (status == NSS_STATUS_SUCCESS) /* We found the entry. */
break;
else if (status == NSS_STATUS_RETURN /* We couldn't parse the entry */
|| status == NSS_STATUS_NOTFOUND) /* entry doesn't exist */
/* We couldn't parse the entry */
else if (status == NSS_STATUS_RETURN
/* entry doesn't exist */
|| status == NSS_STATUS_NOTFOUND)
continue;
else
{
@ -653,6 +658,9 @@ internal_getspnam_r (const char *name, struct spwd *result, ent_t *ent,
return NSS_STATUS_TRYAGAIN;
}
/* Terminate the line for any case. */
buffer[buflen - 1] = '\0';
/* Skip leading blanks. */
while (isspace (*p))
++p;
@ -686,21 +694,8 @@ internal_getspnam_r (const char *name, struct spwd *result, ent_t *ent,
if (result->sp_namp[0] == '-' && result->sp_namp[1] == '@'
&& result->sp_namp[2] != '\0')
{
/* XXX Do not use fixed length buffers. */
char buf2[1024];
char *user, *host, *domain;
struct __netgrent netgrdata;
bzero (&netgrdata, sizeof (struct __netgrent));
__internal_setnetgrent (&result->sp_namp[2], &netgrdata);
while (__internal_getnetgrent_r (&host, &user, &domain, &netgrdata,
buf2, sizeof (buf2), errnop))
{
if (user != NULL && user[0] != '-')
if (strcmp (user, name) == 0)
return NSS_STATUS_NOTFOUND;
}
__internal_endnetgrent (&netgrdata);
if (innetgr (&result->sp_namp[2], NULL, name, NULL))
return NSS_STATUS_NOTFOUND;
continue;
}
@ -708,25 +703,18 @@ internal_getspnam_r (const char *name, struct spwd *result, ent_t *ent,
if (result->sp_namp[0] == '+' && result->sp_namp[1] == '@'
&& result->sp_namp[2] != '\0')
{
char *buf = strdupa (&result->sp_namp[2]);
int status;
enum nss_status status;
ent->netgroup = TRUE;
ent->first = TRUE;
copy_spwd_changes (&ent->pwd, result, NULL, 0);
do
if (innetgr (&result->sp_namp[2], NULL, name, NULL))
{
status = getspent_next_nss_netgr (name, result, ent, buf,
buffer, buflen, errnop);
status = getspnam_plususer (name, result, ent, buffer,
buflen, errnop);
if (status == NSS_STATUS_RETURN)
continue;
if (status == NSS_STATUS_SUCCESS
&& strcmp (result->sp_namp, name) == 0)
return NSS_STATUS_SUCCESS;
return status;
}
while (status == NSS_STATUS_SUCCESS);
continue;
}
@ -767,8 +755,12 @@ internal_getspnam_r (const char *name, struct spwd *result, ent_t *ent,
status = getspnam_plususer (name, result, ent,
buffer, buflen, errnop);
if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
return NSS_STATUS_NOTFOUND;
if (status == NSS_STATUS_SUCCESS)
/* We found the entry. */
break;
else if (status == NSS_STATUS_RETURN)
/* We couldn't parse the entry */
return NSS_STATUS_NOTFOUND;
else
return status;
}
@ -796,10 +788,8 @@ _nss_compat_getspnam_r (const char *name, struct spwd *pwd,
result = internal_setspent (&ent, 0);
if (result != NSS_STATUS_SUCCESS)
return result;
result = internal_getspnam_r (name, pwd, &ent, buffer, buflen, errnop);
if (result == NSS_STATUS_SUCCESS)
result = internal_getspnam_r (name, pwd, &ent, buffer, buflen, errnop);
internal_endspent (&ent);

View File

@ -21,6 +21,14 @@
* tst-tls5modf.c: New.
* tst-tls6.sh: New test.
* sysdeps/pthread/pthread-functions.h (struct pthread_functions): Add
ptr___pthread_cond_timedwait and ptr___pthread_cond_timedwait_2_0.
* init.c (pthread_functions): Initialize them.
* forward.c (pthread_cond_timedwait@GLIBC_2.0,
pthread_cond_timedwait@@GLIBC_2.3.2): New forwards.
* Versions (libc): Export pthread_cond_timedwait@GLIBC_2.0,
pthread_cond_timedwait@@GLIBC_2.3.2.
2003-09-01 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/alpha/timer_create.c: New file.

View File

@ -9,6 +9,7 @@ libc {
pthread_condattr_destroy; pthread_condattr_init;
pthread_cond_broadcast; pthread_cond_destroy;
pthread_cond_init; pthread_cond_signal; pthread_cond_wait;
pthread_cond_timedwait;
pthread_equal; pthread_exit;
pthread_getschedparam; pthread_setschedparam;
pthread_mutex_destroy; pthread_mutex_init;
@ -23,7 +24,7 @@ libc {
# Changed pthread_cond_t.
pthread_cond_init; pthread_cond_destroy;
pthread_cond_wait; pthread_cond_signal;
pthread_cond_broadcast;
pthread_cond_broadcast; pthread_cond_timedwait;
}
GLIBC_PRIVATE {
# Internal libc interface to libpthread

View File

@ -136,6 +136,19 @@ FORWARD (__pthread_cond_wait, (pthread_cond_t *cond, pthread_mutex_t *mutex),
versioned_symbol (libc, __pthread_cond_wait, pthread_cond_wait,
GLIBC_2_3_2);
#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3_2)
FORWARD (__pthread_cond_timedwait_2_0,
(pthread_cond_2_0_t *cond, pthread_mutex_t *mutex,
const struct timespec *abstime), (cond, mutex, abstime), 0)
compat_symbol (libc, __pthread_cond_timedwait_2_0, pthread_cond_timedwait,
GLIBC_2_0);
#endif
FORWARD (__pthread_cond_timedwait,
(pthread_cond_t *cond, pthread_mutex_t *mutex,
const struct timespec *abstime), (cond, mutex, abstime), 0)
versioned_symbol (libc, __pthread_cond_timedwait, pthread_cond_timedwait,
GLIBC_2_3_2);
FORWARD (pthread_equal, (pthread_t thread1, pthread_t thread2),
(thread1, thread2), 1)

View File

@ -95,12 +95,14 @@ static struct pthread_functions pthread_functions =
.ptr___pthread_cond_init = __pthread_cond_init,
.ptr___pthread_cond_signal = __pthread_cond_signal,
.ptr___pthread_cond_wait = __pthread_cond_wait,
.ptr___pthread_cond_timedwait = __pthread_cond_timedwait,
# if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_3_2)
.ptr___pthread_cond_broadcast_2_0 = __pthread_cond_broadcast_2_0,
.ptr___pthread_cond_destroy_2_0 = __pthread_cond_destroy_2_0,
.ptr___pthread_cond_init_2_0 = __pthread_cond_init_2_0,
.ptr___pthread_cond_signal_2_0 = __pthread_cond_signal_2_0,
.ptr___pthread_cond_wait_2_0 = __pthread_cond_wait_2_0,
.ptr___pthread_cond_timedwait_2_0 = __pthread_cond_timedwait_2_0,
# endif
.ptr_pthread_equal = __pthread_equal,
.ptr___pthread_exit = __pthread_exit,

View File

@ -52,12 +52,17 @@ struct pthread_functions
const pthread_condattr_t *);
int (*ptr___pthread_cond_signal) (pthread_cond_t *);
int (*ptr___pthread_cond_wait) (pthread_cond_t *, pthread_mutex_t *);
int (*ptr___pthread_cond_timedwait) (pthread_cond_t *, pthread_mutex_t *,
const struct timespec *);
int (*ptr___pthread_cond_broadcast_2_0) (pthread_cond_2_0_t *);
int (*ptr___pthread_cond_destroy_2_0) (pthread_cond_2_0_t *);
int (*ptr___pthread_cond_init_2_0) (pthread_cond_2_0_t *,
const pthread_condattr_t *);
int (*ptr___pthread_cond_signal_2_0) (pthread_cond_2_0_t *);
int (*ptr___pthread_cond_wait_2_0) (pthread_cond_2_0_t *, pthread_mutex_t *);
int (*ptr___pthread_cond_timedwait_2_0) (pthread_cond_2_0_t *,
pthread_mutex_t *,
const struct timespec *);
int (*ptr_pthread_equal) (pthread_t, pthread_t);
void (*ptr___pthread_exit) (void *);
int (*ptr_pthread_getschedparam) (pthread_t, int *, struct sched_param *);

View File

@ -117,10 +117,9 @@ internal_function
_dl_determine_tlsoffset (void)
{
struct dtv_slotinfo *slotinfo;
size_t max_align;
size_t offset;
size_t max_align = TLS_TCB_ALIGN;
size_t offset, freetop = 0, freebottom = 0;
size_t cnt;
size_t freebytes;
/* The first element of the dtv slot info list is allocated. */
assert (GL(dl_tls_dtv_slotinfo_list) != NULL);
@ -128,6 +127,8 @@ _dl_determine_tlsoffset (void)
dl_tls_dtv_slotinfo_list list. */
assert (GL(dl_tls_dtv_slotinfo_list)->next == NULL);
slotinfo = GL(dl_tls_dtv_slotinfo_list)->slotinfo;
/* Determining the offset of the various parts of the static TLS
block has several dependencies. In addition we have to work
around bugs in some toolchains.
@ -158,88 +159,90 @@ _dl_determine_tlsoffset (void)
# if TLS_TCB_AT_TP
/* We simply start with zero. */
slotinfo = GL(dl_tls_dtv_slotinfo_list)->slotinfo;
max_align = slotinfo[1].map != NULL ? slotinfo[1].map->l_tls_align : 1;
offset = 0;
freebytes = 0;
for (cnt = 1; slotinfo[cnt].map != NULL; ++cnt)
{
assert (cnt < GL(dl_tls_dtv_slotinfo_list)->len);
size_t blsize = (slotinfo[cnt].map->l_tls_blocksize
+ slotinfo[cnt].map->l_tls_firstbyte_offset);
if (blsize <= freebytes)
{
/* When we come here the amount of memory we was "wasted"
for the correct alignment of the previous block is larger
than what we need for this module. So use it. */
size_t n = (freebytes - blsize) / slotinfo[cnt].map->l_tls_align;
freebytes = (n * slotinfo[cnt].map->l_tls_align
+ slotinfo[cnt].map->l_tls_firstbyte_offset);
}
else
{
/* There is either no gap from the bottom of the static TLS
block to the first used byte or the gap is too small.
Extend the static TLS block. */
offset += roundup (blsize, max_align);
freebytes = slotinfo[cnt].map->l_tls_firstbyte_offset;
}
size_t firstbyte = (-slotinfo[cnt].map->l_tls_firstbyte_offset
& (slotinfo[cnt].map->l_tls_align - 1));
size_t off;
max_align = MAX (max_align, slotinfo[cnt].map->l_tls_align);
if (freebottom - freetop >= slotinfo[cnt].map->l_tls_blocksize)
{
off = roundup (freetop + slotinfo[cnt].map->l_tls_blocksize
- firstbyte, slotinfo[cnt].map->l_tls_align)
+ firstbyte;
if (off <= freebottom)
{
freetop = off;
/* XXX For some architectures we perhaps should store the
negative offset. */
slotinfo[cnt].map->l_tls_offset = off;
continue;
}
}
off = roundup (offset + slotinfo[cnt].map->l_tls_blocksize - firstbyte,
slotinfo[cnt].map->l_tls_align) + firstbyte;
if (off > offset + slotinfo[cnt].map->l_tls_blocksize
+ (freebottom - freetop))
{
freetop = offset;
freebottom = off - slotinfo[cnt].map->l_tls_blocksize;
}
offset = off;
/* XXX For some architectures we perhaps should store the
negative offset. */
slotinfo[cnt].map->l_tls_offset = offset - freebytes;
slotinfo[cnt].map->l_tls_offset = off;
}
/* The thread descriptor (pointed to by the thread pointer) has its
own alignment requirement. Adjust the static TLS size
and TLS offsets appropriately. */
// XXX How to deal with this. We cannot simply add zero bytes
// XXX after the first (closest to the TCB) TLS block since this
// XXX would invalidate the offsets the linker creates for the LE
// XXX model.
GL(dl_tls_static_used) = offset;
GL(dl_tls_static_size) = (offset + roundup (TLS_STATIC_SURPLUS, max_align)
GL(dl_tls_static_size) = (roundup (offset + TLS_STATIC_SURPLUS, max_align)
+ TLS_TCB_SIZE);
# elif TLS_DTV_AT_TP
/* The TLS blocks start right after the TCB. */
offset = TLS_TCB_SIZE;
max_align = __alignof (void *);
/* The first block starts right after the TCB. */
slotinfo = GL(dl_tls_dtv_slotinfo_list)->slotinfo;
if (slotinfo[1].map != NULL)
for (cnt = 1; slotinfo[cnt].map != NULL; ++cnt)
{
size_t prev_size;
assert (cnt < GL(dl_tls_dtv_slotinfo_list)->len);
offset = roundup (offset, slotinfo[1].map->l_tls_align);
slotinfo[1].map->l_tls_offset = offset;
max_align = slotinfo[1].map->l_tls_align;
prev_size = slotinfo[1].map->l_tls_blocksize;
size_t firstbyte = (-slotinfo[cnt].map->l_tls_firstbyte_offset
& (slotinfo[cnt].map->l_tls_align - 1));
size_t off;
max_align = MAX (max_align, slotinfo[cnt].map->l_tls_align);
for (cnt = 2; slotinfo[cnt].map != NULL; ++cnt)
if (slotinfo[cnt].map->l_tls_blocksize >= freetop - freebottom)
{
assert (cnt < GL(dl_tls_dtv_slotinfo_list)->len);
max_align = MAX (max_align, slotinfo[cnt].map->l_tls_align);
/* Compute the offset of the next TLS block. */
offset = roundup (offset + prev_size,
slotinfo[cnt].map->l_tls_align);
/* XXX For some architectures we perhaps should store the
negative offset. */
slotinfo[cnt].map->l_tls_offset = offset;
prev_size = slotinfo[cnt].map->l_tls_blocksize;
off = roundup (freebottom, slotinfo[cnt].map->l_tls_align);
if (off - freebottom < firstbyte)
off += slotinfo[cnt].map->l_tls_align;
if (off + slotinfo[cnt].map->l_tls_blocksize - firstbyte <= freetop)
{
slotinfo[cnt].map->l_tls_offset = off - firstbyte;
freebottom = off + slotinfo[cnt].map->l_tls_blocksize
- firstbyte;
continue;
}
}
offset += prev_size;
off = roundup (offset, slotinfo[cnt].map->l_tls_align);
if (off - offset < firstbyte)
off += slotinfo[cnt].map->l_tls_align;
slotinfo[cnt].map->l_tls_offset = off - firstbyte;
if (off - firstbyte - offset > freetop - freebottom)
{
freebottom = offset;
freetop = off - firstbyte;
}
offset = off + slotinfo[cnt].map->l_tls_blocksize - firstbyte;
}
GL(dl_tls_static_used) = offset;

View File

@ -0,0 +1,40 @@
/* Copyright (C) 2003 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 <sysdep.h>
/* Advice the system about the expected behaviour of the application with
respect to the file associated with FD. */
int
posix_fadvise (int fd, off_t offset, off_t len, int advise)
{
#ifdef __NR_fadvise64
INTERNAL_SYSCALL_DECL (err);
int ret = INTERNAL_SYSCALL (fadvise64, err, 6, fd, 0,
__LONG_LONG_PAIR (offset >> 31, offset), len,
advise);
if (INTERNAL_SYSCALL_ERROR_P (ret, err))
return INTERNAL_SYSCALL_ERRNO (ret, err);
return 0;
#else
return ENOSYS;
#endif
}

View File

@ -0,0 +1,77 @@
/* Copyright (C) 2003 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 <sysdep.h>
#include <kernel-features.h>
int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise);
int __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise);
/* Advice the system about the expected behaviour of the application with
respect to the file associated with FD. */
int
__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise)
{
#ifdef __NR_fadvise64_64
INTERNAL_SYSCALL_DECL (err);
int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd, advise,
__LONG_LONG_PAIR ((long)(offset >> 32), (long)offset),
__LONG_LONG_PAIR ((long)(len >> 32), (long)len));
if (!INTERNAL_SYSCALL_ERROR_P (ret, err))
return 0;
# ifndef __ASSUME_FADVISE64_64_SYSCALL
if (INTERNAL_SYSCALL_ERRNO (ret, err) != ENOSYS)
# endif
return INTERNAL_SYSCALL_ERRNO (ret, err);
#endif
#ifndef __ASSUME_FADVISE64_64_SYSCALL
# ifdef __NR_fadvise64
if (len != (off_t) len)
return EOVERFLOW;
INTERNAL_SYSCALL_DECL (err2);
int ret2 = INTERNAL_SYSCALL (fadvise64, err2, 6, fd, 0,
__LONG_LONG_PAIR ((long)(offset >> 32), (long)offset),
(off_t) len, advise);
if (!INTERNAL_SYSCALL_ERROR_P (ret2, err2))
return 0;
return INTERNAL_SYSCALL_ERRNO (ret2, err2);
# else
return ENOSYS;
# endif
#endif
}
#include <shlib-compat.h>
#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3)
int
__posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise)
{
return __posix_fadvise64_l64 (fd, offset, len, advise);
}
versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3);
compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2);
#else
strong_alias (__posix_fadvise64_l64, posix_fadvise64);
#endif