Merge remote-tracking branch 'origin/pr/129'
[grml-debootstrap.git] / packer / fake-uname.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <dlfcn.h>
4 #include <stdlib.h>
5 #include <unistd.h>
6 #include <sys/types.h>
7 #include <sys/stat.h>
8 #include <fcntl.h>
9 #include <sys/syslog.h>
10 #include <sys/utsname.h>
11
12 #ifndef UTS_RELEASE
13 #define UTS_RELEASE "0.0.0"
14 #endif
15
16 #ifndef RTLD_NEXT
17 #define RTLD_NEXT      ((void *) -1l)
18 #endif
19
20 typedef int (*uname_t) (struct utsname * buf);
21
22 static void *get_libc_func(const char *funcname)
23 {
24   void *func;
25   char *error;
26
27   func = dlsym(RTLD_NEXT, funcname);
28   if ((error = dlerror()) != NULL) {
29     fprintf(stderr, "Can't locate libc function `%s' error: %s", funcname, error);
30     _exit(EXIT_FAILURE);
31   }
32   return func;
33 }
34
35 int uname(struct utsname *buf)
36 {
37   int ret;
38   char *env = NULL;
39   uname_t real_uname = (uname_t) get_libc_func("uname");
40
41   ret = real_uname((struct utsname *) buf);
42   strncpy(buf->release, ((env = getenv("UTS_RELEASE")) == NULL) ? UTS_RELEASE : env, 65);
43   return ret;
44 }