X-Git-Url: https://git.grml.org/?a=blobdiff_plain;f=packer%2Ffake-uname.c;h=d71a4f4e65986f27857cfe0b1744afcdd32938cd;hb=2669404614bd984dd3188bdf4aa275b0003f42f2;hp=7bbcb24bbe3dbb24690ee830216af4731eedd333;hpb=1669cf2d8c22833e325ce86e005ebd1a51abc295;p=grml-debootstrap.git diff --git a/packer/fake-uname.c b/packer/fake-uname.c index 7bbcb24..d71a4f4 100644 --- a/packer/fake-uname.c +++ b/packer/fake-uname.c @@ -17,28 +17,45 @@ #define RTLD_NEXT ((void *) -1l) #endif -typedef int (*uname_t) (struct utsname * buf); +#define SYMBOL_EXPORT __attribute__((visibility("default"))) + +typedef int uname_func(struct utsname *buf); static void *get_libc_func(const char *funcname) { void *func; char *error; + /* Clear any previous errors. */ + dlerror(); func = dlsym(RTLD_NEXT, funcname); - if ((error = dlerror()) != NULL) { - fprintf(stderr, "Can't locate libc function `%s' error: %s", funcname, error); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "Cannot locate libc function '%s' error: %s", + funcname, error); _exit(EXIT_FAILURE); } return func; } -int uname(struct utsname *buf) +int SYMBOL_EXPORT uname(struct utsname *buf) { + static uname_func *real_uname; + const char *release; 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); + if (real_uname == NULL) + real_uname = (uname_func *)get_libc_func("uname"); + + ret = real_uname(buf); + if (ret < 0) + return ret; + + release = getenv("UTS_RELEASE"); + if (release == NULL) + release = UTS_RELEASE; + strncpy(buf->release, release, sizeof(buf->release) - 1); + buf->release[sizeof(buf->release) - 1] = '\0'; + return ret; }