ClickHouse/libs/libglibc-compatibility/glibc-compatibility.c
2017-09-15 12:51:56 +03:00

113 lines
2.3 KiB
C

/** Allows to build programs with libc 2.18 and run on systems with at least libc 2.4,
* such as Ubuntu Lucid or CentOS 6.
*
* Highly experimental, not recommended, disabled by default.
*
* Also look at http://www.lightofdawn.org/wiki/wiki.cgi/NewAppsOnOldGlibc
*/
#if defined (__cplusplus)
extern "C" {
#endif
#include <pthread.h>
size_t __pthread_get_minstack(const pthread_attr_t * attr)
{
return 1048576; /// This is a guess. Don't sure it is correct.
}
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <sys/syscall.h>
long int syscall(long int __sysno, ...) __THROW;
int __gai_sigqueue(int sig, const union sigval val, pid_t caller_pid)
{
siginfo_t info;
memset(&info, 0, sizeof(siginfo_t));
info.si_signo = sig;
info.si_code = SI_ASYNCNL;
info.si_pid = caller_pid;
info.si_uid = getuid();
info.si_value = val;
return syscall(__NR_rt_sigqueueinfo, info.si_pid, sig, &info);
}
/// NOTE This disables some of FORTIFY_SOURCE functionality.
#include <sys/select.h>
#include <stdlib.h>
long int __fdelt_chk(long int d)
{
if (d < 0 || d >= FD_SETSIZE)
abort();
return d / __NFDBITS;
}
#include <sys/poll.h>
#include <stddef.h>
int __poll_chk(struct pollfd * fds, nfds_t nfds, int timeout, size_t fdslen)
{
if (fdslen / sizeof(*fds) < nfds)
abort();
return poll(fds, nfds, timeout);
}
#include <setjmp.h>
void longjmp(jmp_buf env, int val);
void __longjmp_chk(jmp_buf env, int val)
{
return longjmp(env, val);
}
#include <stdio.h>
int vasprintf(char **s, const char *fmt, va_list ap);
int __vasprintf_chk(char **s, const char *fmt, va_list ap)
{
return vasprintf(s, fmt, ap);
}
size_t __fread_chk(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
return fread(ptr, size, nmemb, stream);
}
#include <stdarg.h>
int vsscanf(const char *str, const char *format, va_list ap);
int __isoc99_vsscanf(const char *str, const char *format, va_list ap)
{
return vsscanf(str, format, ap);
}
int sscanf(const char *restrict s, const char *restrict fmt, ...)
{
int ret;
va_list ap;
va_start(ap, fmt);
ret = vsscanf(s, fmt, ap);
va_end(ap);
return ret;
}
int __isoc99_sscanf(const char *str, const char *format, ...) __attribute__((weak, alias("sscanf")));
#if defined (__cplusplus)
}
#endif