WIP-glibc-override
[akaros.git] / user / parlib / memmove.c
1 #define _GNU_SOURCE
2 #include <dlfcn.h>
3 #include <parlib/vcore.h>
4
5 #include <string.h>
6
7 #include <stdio.h>
8
9 static void *parlib_memmove(void *dest, const void *src, size_t n)
10 {
11         const char *s;
12         char *d;
13
14         s = src;
15         d = dest;
16         if (s < d && s + n > d) {
17                 s += n;
18                 d += n;
19                 while (n-- > 0)
20                         *--d = *--s;
21         } else
22                 while (n-- > 0)
23                         *d++ = *s++;
24
25         return dest;
26 }
27
28 void *memmove(void *dest, const void *src, size_t n)
29 {
30         static void *(*glibc_memmove)(void *, const void *, size_t) = 0;
31
32         if (in_vcore_context())
33                 return parlib_memmove(dest, src, n);
34         if (!glibc_memmove)
35                 glibc_memmove = dlsym(RTLD_NEXT, "memmove");
36         return glibc_memmove(dest, src, n);
37 }