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
|
#! /bin/sh /usr/share/dpatch/dpatch-run
## 60_linux_init.dpatch by <david.sugar@canonical.com>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: Fix Linux version detection which relied on elf loader side-effect.
## DP: This patch also depends on 40_gnu-kbsd-version, which modified
## DP: init_Linux_version().
@DPATCH@
---
proc/sysinfo.c | 1 +
proc/version.c | 5 +++--
proc/version.h | 1 +
3 files changed, 5 insertions(+), 2 deletions(-)
--- procps-3.2.8.orig/proc/sysinfo.c
+++ procps-3.2.8/proc/sysinfo.c
@@ -210,10 +210,11 @@ static int check_for_privs(void){
}
static void init_libproc(void) __attribute__((constructor));
static void init_libproc(void){
have_privs = check_for_privs();
+ init_Linux_version(); // make sure we have version before continuing...
// ought to count CPUs in /proc/stat instead of relying
// on glibc, which foolishly tries to parse /proc/cpuinfo
//
// SourceForge has an old Alpha running Linux 2.2.20 that
// appears to have a non-SMP kernel on a 2-way SMP box.
--- procps-3.2.8.orig/proc/version.c
+++ procps-3.2.8/proc/version.c
@@ -31,12 +31,13 @@ void display_version(void) {
#define LINUX_VERSION(x,y,z) (0x10000*(x) + 0x100*(y) + z)
int linux_version_code;
-static void init_Linux_version(void) __attribute__((constructor));
-static void init_Linux_version(void) {
+// cannot depend on this auto-running before libproc init...
+//static void init_Linux_version(void) __attribute__((constructor));
+void init_Linux_version(void) {
static struct utsname uts;
int x = 0, y = 0, z = 0; /* cleared in case sscanf() < 3 */
if (uname(&uts) == -1) /* failure implies impending death */
exit(1);
--- procps-3.2.8.orig/proc/version.h
+++ procps-3.2.8/proc/version.h
@@ -12,10 +12,11 @@
* Copyright 2002 Albert Cahalan
*/
EXTERN_C_BEGIN
+extern void init_Linux_version(void); /* initialize linux version */
extern void display_version(void); /* display suite version */
extern const char procps_version[]; /* global buf for suite version */
extern int linux_version_code; /* runtime version of LINUX_VERSION_CODE
in /usr/include/linux/version.h */
|