lin
2025-07-30 fcd736bf35fd93b563e9bbf594f2aa7b62028cc9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/*
 * Copyright (C) 2012-2013  ProFUSION embedded systems
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
 */
 
#include <dlfcn.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/utsname.h>
 
#include "testsuite.h"
 
TS_EXPORT int uname(struct utsname *u)
{
   static void *nextlib = NULL;
   static int (*nextlib_uname)(struct utsname *u);
   const char *release;
   int err;
   size_t sz;
 
   if (nextlib == NULL) {
#ifdef RTLD_NEXT
       nextlib = RTLD_NEXT;
#else
       nextlib = dlopen("libc.so.6", RTLD_LAZY);
#endif
       nextlib_uname = dlsym(nextlib, "uname");
   }
 
   err = nextlib_uname(u);
   if (err < 0)
       return err;
 
   if (!environ)
       /*
        * probably called from within glibc before main(); unsafe
        * to call getenv()
        */
       return 0;
 
   release = getenv(S_TC_UNAME_R);
   if (release == NULL) {
       fprintf(stderr, "TRAP uname(): missing export %s?\n",
                           S_TC_UNAME_R);
       return 0;
   }
 
   sz = strlen(release) + 1;
   if (sz > sizeof(u->release)) {
       fprintf(stderr, "uname(): sizeof release (%s) "
               "is greater than available space: %zu",
               release, sizeof(u->release));
       errno = -EFAULT;
       return -1;
   }
 
   memcpy(u->release, release, sz);
   return 0;
}