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