to the corresponding thread-unaware (?) libc routine.
------------------------------------------------------------------ */
-#define FORWARD(name, args...) \
+#define FORWARD(name, altname, args...) \
({ \
static name##_t name##_ptr = NULL; \
if (name##_ptr == NULL) { \
- name##_ptr = (name##_t)dlsym(RTLD_NEXT, #name); \
- my_assert(name##_ptr != NULL); \
+ if ((name##_ptr = (name##_t)dlsym(RTLD_NEXT, #name)) == NULL) \
+ name##_ptr = (name##_t)dlsym(RTLD_DEFAULT, #altname); \
+ my_assert(name##_ptr != NULL && name##_ptr != name); \
} \
name##_ptr(args); \
})
struct sigaction *oldact)
{
__my_pthread_testcancel();
- return FORWARD(sigaction, signum, act, oldact);
+#ifdef GLIBC_2_1
+ return FORWARD(sigaction, __sigaction, signum, act, oldact);
+#else
+ return FORWARD(sigaction, __libc_sigaction, signum, act, oldact);
+#endif
}
typedef
int accept(int fd, struct sockaddr *addr, socklen_t *len)
{
__my_pthread_testcancel();
- return FORWARD(accept, fd, addr, len);
+ return FORWARD(accept, __libc_accept, fd, addr, len);
}
typedef
socklen_t addrlen)
{
__my_pthread_testcancel();
- return FORWARD(connect, sockfd, serv_addr, addrlen);
+ return FORWARD(connect, __libc_connect, sockfd, serv_addr, addrlen);
}
int fcntl(int fd, int cmd, long arg)
{
__my_pthread_testcancel();
- return FORWARD(fcntl, fd, cmd, arg);
+ return FORWARD(fcntl, __libc_fcntl, fd, cmd, arg);
}
ssize_t write(int fd, const void *buf, size_t count)
{
__my_pthread_testcancel();
- return FORWARD(write, fd, buf, count);
+ return FORWARD(write, __libc_write, fd, buf, count);
}
ssize_t read(int fd, void *buf, size_t count)
{
__my_pthread_testcancel();
- return FORWARD(read, fd, buf, count);
+ return FORWARD(read, __libc_read, fd, buf, count);
}
typedef
/* WEAK */
int open64(const char *pathname, int flags, mode_t mode)
{
- return FORWARD(open64, pathname, flags, mode);
+ return FORWARD(open64, __libc_open64, pathname, flags, mode);
}
typedef
/* WEAK */
int open(const char *pathname, int flags, mode_t mode)
{
- return FORWARD(open, pathname, flags, mode);
+ return FORWARD(open, __libc_open, pathname, flags, mode);
}
typedef
int close(int fd)
{
__my_pthread_testcancel();
- return FORWARD(close, fd);
+ return FORWARD(close, __libc_close, fd);
}
pid_t waitpid(pid_t pid, int *status, int options)
{
__my_pthread_testcancel();
- return FORWARD(waitpid, pid, status, options);
+ return FORWARD(waitpid, __libc_waitpid, pid, status, options);
}
typedef
-int (*nanosleep_t)(const struct timespec *req, struct timespec *rem);
+int (*__nanosleep_t)(const struct timespec *req, struct timespec *rem);
WEAK
int __nanosleep(const struct timespec *req, struct timespec *rem)
{
__my_pthread_testcancel();
- return FORWARD(nanosleep, req, rem);
+ return FORWARD(__nanosleep, __libc_nanosleep, req, rem);
}
typedef
int (*pause_t)(void);
WEAK
-int __pause(void)
+int pause(void)
{
__my_pthread_testcancel();
- return FORWARD(pause);
+ return FORWARD(pause, __libc_pause);
}
typedef
-int (*tcdrain_t)(int fd);
+int (*__tcdrain_t)(int fd);
WEAK
int __tcdrain(int fd)
{
__my_pthread_testcancel();
- return FORWARD(tcdrain, fd);
+ return FORWARD(__tcdrain, __libc_tcdrain, fd);
}
int fsync(int fd)
{
__my_pthread_testcancel();
- return FORWARD(fsync, fd);
+ return FORWARD(fsync, __libc_fsync, fd);
}
off_t lseek(int fildes, off_t offset, int whence)
{
__my_pthread_testcancel();
- return FORWARD(lseek, fildes, offset, whence);
+ return FORWARD(lseek, __libc_lseek, fildes, offset, whence);
}
__off64_t lseek64(int fildes, __off64_t offset, int whence)
{
__my_pthread_testcancel();
- return FORWARD(lseek64, fildes, offset, whence);
+ return FORWARD(lseek64, __libc_lseek64, fildes, offset, whence);
}
__off64_t __offset)
{
__my_pthread_testcancel();
- return FORWARD(__pread64, __fd, __buf, __nbytes, __offset);
+ return FORWARD(__pread64, __libc_pread64, __fd, __buf, __nbytes, __offset);
}
__off64_t __offset)
{
__my_pthread_testcancel();
- return FORWARD(__pwrite64, __fd, __buf, __nbytes, __offset);
+ return FORWARD(__pwrite64, __libc_pwrite64, __fd, __buf, __nbytes, __offset);
}
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset)
{
__my_pthread_testcancel();
- return FORWARD(pwrite, fd, buf, count, offset);
+ return FORWARD(pwrite, __libc_pwrite, fd, buf, count, offset);
}
ssize_t pread(int fd, void *buf, size_t count, off_t offset)
{
__my_pthread_testcancel();
- return FORWARD(pread, fd, buf, count, offset);
+ return FORWARD(pread, __libc_pread, fd, buf, count, offset);
}
typedef
int recv(int s, void *msg, size_t len, int flags)
{
__my_pthread_testcancel();
- return FORWARD(recv, s, msg, len, flags);
+ return FORWARD(recv, __libc_recv, s, msg, len, flags);
}
typedef
int send(int s, const void *msg, size_t len, int flags)
{
__my_pthread_testcancel();
- return FORWARD(send, s, msg, len, flags);
+ return FORWARD(send, __libc_send, s, msg, len, flags);
}
int sendmsg(int s, const struct msghdr *msg, int flags)
{
__my_pthread_testcancel();
- return FORWARD(sendmsg, s, msg, flags);
+ return FORWARD(sendmsg, __libc_sendmsg, s, msg, flags);
}
int recvmsg(int s, struct msghdr *msg, int flags)
{
__my_pthread_testcancel();
- return FORWARD(recvmsg, s, msg, flags);
+ return FORWARD(recvmsg, __libc_recvmsg, s, msg, flags);
}
struct sockaddr *from, socklen_t *fromlen)
{
__my_pthread_testcancel();
- return FORWARD(recvfrom, s, buf, len, flags, from, fromlen);
+ return FORWARD(recvfrom, __libc_recfrom, s, buf, len, flags, from, fromlen);
}
const struct sockaddr *to, socklen_t tolen)
{
__my_pthread_testcancel();
- return FORWARD(sendto, s, msg, len, flags, to, tolen);
+ return FORWARD(sendto, __libc_sendto, s, msg, len, flags, to, tolen);
}
int system(const char* str)
{
__my_pthread_testcancel();
- return FORWARD(system, str);
+ return FORWARD(system, __libc_system, str);
}
pid_t wait(int *status)
{
__my_pthread_testcancel();
- return FORWARD(wait, status);
+ return FORWARD(wait, __libc_wait, status);
}
int msync(const void *start, size_t length, int flags)
{
__my_pthread_testcancel();
- return FORWARD(msync, start, length, flags);
+ return FORWARD(msync, __libc_msync, start, length, flags);
}
strong_alias(close, __close)
strong_alias(write, __write)
strong_alias(connect, __connect)
strong_alias(send, __send)
+strong_alias(pause, __pause)
weak_alias (__pread64, pread64)
weak_alias (__pwrite64, pwrite64)
weak_alias(__nanosleep, nanosleep)
-weak_alias(__pause, pause)
weak_alias(__tcdrain, tcdrain)
/* not weak: WEAK */
void longjmp(jmp_buf env, int val)
{
- FORWARD(longjmp, env, val);
+ FORWARD(longjmp, __libc_longjmp, env, val);
}
void siglongjmp(sigjmp_buf env, int val)
{
kludged("siglongjmp", "(it ignores cleanup handlers)");
- FORWARD(siglongjmp, env, val);
+ FORWARD(siglongjmp, __libc_siglongjmp, env, val);
}
__pthread_mutex_lock(&pthread_atfork_lock);
run_fork_handlers(0 /* prepare */);
- pid = FORWARD(__fork);
+ pid = FORWARD(__fork, __libc_fork);
if (pid == 0) {
/* I am the child */
run_fork_handlers(2 /* child */);