Revision: 838 http://trac.macosforge.org/projects/darwinbuild/changeset/838 Author: wsiegrist@apple.com Date: 2010-06-14 12:13:53 -0700 (Mon, 14 Jun 2010) Log Message: ----------- Add automatic touching of /System/Library/Extensions. Modified Paths: -------------- branches/PR-7872907/darwinup/Depot.cpp branches/PR-7872907/darwinup/Depot.h branches/PR-7872907/darwinup/darwinup.1 branches/PR-7872907/darwinup/main.cpp branches/PR-7872907/testing/darwinup/run-tests.sh Modified: branches/PR-7872907/darwinup/Depot.cpp =================================================================== --- branches/PR-7872907/darwinup/Depot.cpp 2010-06-11 16:18:54 UTC (rev 837) +++ branches/PR-7872907/darwinup/Depot.cpp 2010-06-14 19:13:53 UTC (rev 838) @@ -61,6 +61,7 @@ m_is_locked = 0; m_depot_mode = 0750; m_is_dirty = false; + m_modified_extensions = false; } Depot::Depot(const char* prefix) { @@ -69,6 +70,7 @@ m_depot_mode = 0750; m_build = NULL; m_is_dirty = false; + m_modified_extensions = false; asprintf(&m_prefix, "%s", prefix); join_path(&m_depot_path, m_prefix, "/.DarwinDepot"); @@ -91,10 +93,11 @@ if (m_downloads_path) free(m_downloads_path); } -const char* Depot::archives_path() { return m_archives_path; } -const char* Depot::downloads_path() { return m_downloads_path; } -const char* Depot::prefix() { return m_prefix; } -bool Depot::is_dirty() { return m_is_dirty; } +const char* Depot::archives_path() { return m_archives_path; } +const char* Depot::downloads_path() { return m_downloads_path; } +const char* Depot::prefix() { return m_prefix; } +bool Depot::is_dirty() { return m_is_dirty; } +bool Depot::has_modified_extensions() { return m_modified_extensions; } int Depot::connect() { m_db = new DarwinupDatabase(m_database_path); @@ -486,7 +489,14 @@ IF_DEBUG("[analyze] needs user data backup\n"); actual->info_set(FILE_INFO_ROLLBACK_DATA); } - } + } + + if (!this->m_modified_extensions && + (strncmp(file->path(), "/System/Library/Extensions", 26) == 0)) { + IF_DEBUG("[analyze] kernel extension detected\n"); + this->m_modified_extensions = true; + } + } // if file == actual, but actual != preceding, then an external Modified: branches/PR-7872907/darwinup/Depot.h =================================================================== --- branches/PR-7872907/darwinup/Depot.h 2010-06-11 16:18:54 UTC (rev 837) +++ branches/PR-7872907/darwinup/Depot.h 2010-06-14 19:13:53 UTC (rev 838) @@ -122,6 +122,7 @@ void archive_header(); bool is_dirty(); + bool has_modified_extensions(); protected: @@ -170,7 +171,9 @@ char* m_build; int m_lock_fd; int m_is_locked; - bool m_is_dirty; // track if we need to update dyld cache + bool m_is_dirty; // track if we need to update dyld cache + bool m_modified_extensions; // track if we need to touch /S/L/E + }; #endif Modified: branches/PR-7872907/darwinup/darwinup.1 =================================================================== --- branches/PR-7872907/darwinup/darwinup.1 2010-06-11 16:18:54 UTC (rev 837) +++ branches/PR-7872907/darwinup/darwinup.1 2010-06-14 19:13:53 UTC (rev 838) @@ -46,9 +46,7 @@ .Sh OPTIONS .Bl -tag -width -indent .It \-d -Do not update dyld cache. Darwinup normally runs update_dyld_shared_cache -if the operation actually changes files on disk. To ensure this does not -happen, you can provide this option. +Do not run helpful automation. See HELPFUL AUTOMATION below. .It \-f Force. Some operations will fail gracefully due to potentially unsafe situations, such as a root that installs a file where a directory is. @@ -58,6 +56,7 @@ Dry run. Darwinup will go through an operation, including analyzing the root(s) and printing the state/change symbol, but no files will be modified on your system and no records will be added to the depot. +This option implies -d. .It \-p Op Ar path Prefix path. Normally, darwinup will operate on the boot partition. You can use the -p option to have darwinup work on another partition. You @@ -210,6 +209,20 @@ superseded, then you should not get this error as the backup copies will not be used anyway. .El +.Sh HELPFUL AUTOMATION +Darwinup tries to detect common situations and run external tools that you +would otherwise have to remember to run yourself. The "dry run" (-n) and +"disable automation" (-d) options prevent any of the following from +happening. +.Bl -tag -width -indent +.It Dyld Cache +If a root modifies any file, then darwinup will run +update_dyld_shared_cache unless the -d option is specified. +.It Kernel Extensions +If a root modifies a file under /System/Library/Extensions, then darwinup +will update the mtime of /System/Library/Extensions to ensure that the +kext cache is updated during the next boot. +.El .Sh EXAMPLES .Bl -tag -width -indent .It Install files from a tarball @@ -231,4 +244,5 @@ .Xr curl 1 , .Xr tar 1 , .Xr gzip 1 , -.Xr ditto 1 \ No newline at end of file +.Xr ditto 1 , +.Xr update_dyld_shared_cache 1 \ No newline at end of file Modified: branches/PR-7872907/darwinup/main.cpp =================================================================== --- branches/PR-7872907/darwinup/main.cpp 2010-06-11 16:18:54 UTC (rev 837) +++ branches/PR-7872907/darwinup/main.cpp 2010-06-14 19:13:53 UTC (rev 838) @@ -35,6 +35,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/time.h> #include <unistd.h> #include <limits.h> @@ -50,7 +51,7 @@ fprintf(stderr, " \n"); fprintf(stderr, "options: \n"); #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 - fprintf(stderr, " -d do not update dyld cache \n"); + fprintf(stderr, " -d disable helpful automation \n"); #endif fprintf(stderr, " -f force operation to succeed at all costs \n"); fprintf(stderr, " -n dry run \n"); @@ -104,7 +105,7 @@ char* progname = strdup(basename(argv[0])); char* path = NULL; #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 - bool update_dyld = true; + bool disable_automation = false; #endif int ch; @@ -116,7 +117,7 @@ switch (ch) { #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 case 'd': - update_dyld = false; + disable_automation = true; break; #endif case 'f': @@ -125,7 +126,7 @@ case 'n': dryrun = 1; #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 - update_dyld = false; + disable_automation = true; #endif break; case 'p': @@ -158,7 +159,7 @@ if (dryrun) IF_DEBUG("option: dry run\n"); if (force) IF_DEBUG("option: forcing operations\n"); #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 - if (!update_dyld) IF_DEBUG("option: not updating dyld cache\n"); + if (!disable_automation) IF_DEBUG("option: helpful automation disabled\n"); #endif if (!path) { @@ -238,11 +239,21 @@ } } #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 - if (update_dyld && depot->is_dirty() && res == 0) { + if (!disable_automation && depot->is_dirty() && res == 0) { res = update_dyld_shared_cache(path); if (res) fprintf(stderr, "Warning: could not update dyld cache.\n"); res = 0; - } + } + if (!disable_automation && depot->has_modified_extensions() && res == 0) { + char *sle_path; + res = join_path(&sle_path, depot->prefix(), "/System/Library/Extensions"); + if (res == 0) res = utimes(sle_path, NULL); + if (res) { + fprintf(stderr, "Warning: unable to touch %s \n", sle_path); + res = 0; + } + free(sle_path); + } #endif } Modified: branches/PR-7872907/testing/darwinup/run-tests.sh =================================================================== --- branches/PR-7872907/testing/darwinup/run-tests.sh 2010-06-11 16:18:54 UTC (rev 837) +++ branches/PR-7872907/testing/darwinup/run-tests.sh 2010-06-14 19:13:53 UTC (rev 838) @@ -37,7 +37,7 @@ tar zxvf $R.tar.gz -C $PREFIX done; -for R in 300dirs.tbz2 300files.tbz2 deep-rollback.cpgz deep-rollback-2.xar; +for R in 300dirs.tbz2 300files.tbz2 deep-rollback.cpgz deep-rollback-2.xar extension.tar.bz2; do cp $R $PREFIX/ done; @@ -300,7 +300,19 @@ echo "DIFF: diffing original test files to dest (should be no diffs) ..." $DIFF $ORIG $DEST 2>&1 +echo "========== TEST: Modify /System/Library/Extensions ==========" +mkdir -p $DEST/System/Library/Extensions/Foo.kext +BEFORE=$(ls -Tld $DEST/System/Library/Extensions/ | awk '{print $6$7$8$9}'); +sleep 2; +$DARWINUP install extension.tar.bz2 +AFTER=$(ls -Tld $DEST/System/Library/Extensions/ | awk '{print $6$7$8$9}'); +test $BEFORE != $AFTER +$DARWINUP uninstall newest +rm -rf $DEST/System +echo "DIFF: diffing original test files to dest (should be no diffs) ..." +$DIFF $ORIG $DEST 2>&1 + # # The following are expected failures #
participants (1)
-
source_changes@macosforge.org