X-Git-Url: https://git.grml.org/?p=grml-debootstrap.git;a=blobdiff_plain;f=packer%2Ffake-uname.c;fp=packer%2Ffake-uname.c;h=7bbcb24bbe3dbb24690ee830216af4731eedd333;hp=0000000000000000000000000000000000000000;hb=7fc0e06e6bb818dd8410e8dc2341da015121203a;hpb=1081c44c4f6368490481c4c5b48281f3846cbed1 diff --git a/packer/fake-uname.c b/packer/fake-uname.c new file mode 100644 index 0000000..7bbcb24 --- /dev/null +++ b/packer/fake-uname.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef UTS_RELEASE +#define UTS_RELEASE "0.0.0" +#endif + +#ifndef RTLD_NEXT +#define RTLD_NEXT ((void *) -1l) +#endif + +typedef int (*uname_t) (struct utsname * buf); + +static void *get_libc_func(const char *funcname) +{ + void *func; + char *error; + + func = dlsym(RTLD_NEXT, funcname); + if ((error = dlerror()) != NULL) { + fprintf(stderr, "Can't locate libc function `%s' error: %s", funcname, error); + _exit(EXIT_FAILURE); + } + return func; +} + +int uname(struct utsname *buf) +{ + int ret; + char *env = NULL; + uname_t real_uname = (uname_t) get_libc_func("uname"); + + ret = real_uname((struct utsname *) buf); + strncpy(buf->release, ((env = getenv("UTS_RELEASE")) == NULL) ? UTS_RELEASE : env, 65); + return ret; +}