summaryrefslogtreecommitdiffstats
path: root/patches/prelink-0.0.20071009/generic/init.dpatch
blob: 7a1269ea38b8e55caf017f983b0f90b919e81c4f (plain)
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
75
76
77
78
79
80
81
82
83
84
85
86
#! /bin/sh -e
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: Adds method to re-execute /sbin/init upon change made by prelink.
## DP: Bug#281409

[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
patch_opts="${patch_opts:--f --no-backup-if-mismatch}"

if [ $# -ne 1 ]; then
    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
    exit 1
fi
case "$1" in
       -patch) patch $patch_opts -p1 < $0;;
       -unpatch) patch $patch_opts -p1 -R < $0;;
        *)
                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
                exit 1;;
esac

exit 0
@DPATCH@

diff -urN prelink-0.0.20041012.orig/src/main.c prelink-0.0.20041012/src/main.c
--- prelink-0.0.20041012.orig/src/main.c	2004-09-30 16:07:57.000000000 +0000
+++ prelink-0.0.20041012/src/main.c	2004-11-16 00:39:28.000000000 +0000
@@ -58,6 +58,8 @@
 const char *prelink_conf = PRELINK_CONF;
 const char *prelink_cache = PRELINK_CACHE;
 const char *undo_output;
+int noreexecinit;
+time_t initctime;
 
 const char *argp_program_version = "prelink 1.0";
 
@@ -111,6 +113,7 @@
   {"mmap-region-end",	OPT_MMAP_REG_END, "BASE_ADDRESS", OPTION_HIDDEN, "" },
   {"seed",		OPT_SEED, "SEED", OPTION_HIDDEN, "" },
   {"compute-checksum",	OPT_COMPUTE_CHECKSUM, 0, OPTION_HIDDEN, "" },
+  {"init",             'i', 0, 0,  "Do not re-execute init" },
   { 0 }
 };
 
@@ -222,12 +225,29 @@
     case OPT_COMPUTE_CHECKSUM:
       compute_checksum = 1;
       break;
+    case 'i':
+      noreexecinit=1;
+      break;
     default:
       return ARGP_ERR_UNKNOWN;
     }
   return 0;
 }
 
+time_t get_ctime(const char *file) {
+  struct stat st;
+  if(stat(file,&st) == 0)
+    return st.st_ctime;
+  return 0;
+}
+
+void checkinit() {
+    if(initctime != get_ctime("/sbin/init")) {
+      printf("Executing /sbin/init U\n");
+      system("/sbin/init U");
+       }
+}
+
 static struct argp argp = { options, parse_opt, "[FILES]", argp_doc };
 
 int
@@ -247,6 +267,11 @@
 
   argp_parse (&argp, argc, argv, 0, &remaining, 0);
 
+  if(!noreexecinit) {
+    initctime = get_ctime("/sbin/init");
+       atexit(checkinit);
+  }
+
   if (ld_library_path == NULL)
     ld_library_path = getenv ("LD_LIBRARY_PATH");