Sophie

Sophie

distrib > Mandriva > current > i586 > media > contrib-release-src > by-pkgid > 4b0164bd90d742e58f9385b55d61bc6c > files > 3

prelink-0.4.2-1.20091104.1mdv2010.1.src.rpm

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");