diff options
Diffstat (limited to 'debian/bash.preinst.c')
-rw-r--r-- | debian/bash.preinst.c | 112 |
1 files changed, 109 insertions, 3 deletions
diff --git a/debian/bash.preinst.c b/debian/bash.preinst.c index ff22653..524e126 100644 --- a/debian/bash.preinst.c +++ b/debian/bash.preinst.c @@ -1,5 +1,6 @@ /* Copyright (c) 1999 Anthony Towns * Copyright (c) 2000, 2002 Matthias Klose + * Copyright (c) 2008 Canonical Ltd * * You may freely use, distribute, and modify this program. */ @@ -20,6 +21,8 @@ #define PATH_MAX 4096 #endif +#include "md5.h" + int check_predepends(void) { pid_t child; @@ -53,6 +56,81 @@ int check_predepends(void) return EXIT_FAILURE; } +#define BUFSIZE 8192 + +int md5sum_match(char *fn, char* fn_digest) +{ + md5_state_t md5; + md5_byte_t digest[16]; + unsigned char hexdigest[33]; + int i, j, fd; + size_t nbytes; + md5_byte_t buf[BUFSIZE]; + + // if not existant, md5sums don't match + if (access(fn, R_OK)) + return 0; + if ((fd = open(fn, O_RDONLY)) == -1) + return 0; + + md5_init(&md5); + while (nbytes = read(fd, buf, BUFSIZE)) + md5_append(&md5, buf, nbytes); + md5_finish(&md5, digest); + close(fd); + + for (i = j = 0; i < 16; i++) { + unsigned char c; + c = (digest[i] >> 4) & 0xf; + c = (c > 9) ? c + 'a' - 10 : c + '0'; + hexdigest[j++] = c; + c = (digest[i] & 0xf); + c = (c > 9) ? c + 'a' - 10 : c + '0'; + hexdigest[j++] = c; + } + hexdigest[j] = '\0'; +#ifdef NDEBUG + fprintf(stderr, "fn=%s, md5sum=%s, expected=%s\n", fn, hexdigest, fn_digest); +#endif + return !strcmp(fn_digest, hexdigest); +} + +int unmodified_file(char *fn, int md5sumc, unsigned char* md5sumv[]) +{ + int i; + + // if not existant, pretend its unmodified + if (access(fn, R_OK)) + return 1; + for (i = 0; i < md5sumc; i++) { + if (md5sum_match(fn, md5sumv[i])) + return 1; + } + return 0; +} + +unsigned char *md5sumv_bash_profile[] = { + "d1a8c44e7dd1bed2f3e75d1343b6e4e1", // dapper, edgy, etch + "0bc1802860b758732b862ef973cd79ff", // feisty, gutsy +}; +const int md5sumc_bash_profile = sizeof(md5sumv_bash_profile) / sizeof (char *); + +unsigned char *md5sumv_profile[] = { + "7d97942254c076a2ea5ea72180266420", // feisty, gutsy +}; +const int md5sumc_profile = sizeof(md5sumv_profile) / sizeof (char *); + +#ifdef BC_CONFIG +unsigned char *md5sumv_completion[] = { + "2bc0b6cf841eefd31d607e618f1ae29d", // dapper + "ae1d298e51ea7f8253eea8b99333561f", // edgy + "adc2e9fec28bd2d4a720e725294650f0", // feisty + "c8bce25ea68fb0312579a421df99955c", // gutsy, and last one in bash + "9da8d1c95748865d516764fb9af82af9", // etch, sid (last one in bash) +}; +const int md5sumc_completion = sizeof(md5sumv_completion) / sizeof (char *); +#endif + char *check_diversion(void) { pid_t child; @@ -105,13 +183,40 @@ char *check_diversion(void) const char *msg = "As bash for Debian is destined to provide a working /bin/sh (pointing to\n" "/bin/bash) your link will be overwritten by a default link.\n\n" - "If you don't want further upgrades to overwrite your customization,\n" - "please read /usr/share/doc/bash/README.Debian for a more permanent solution.\n\n" + "If you don't want further upgrades to overwrite your customization, please\n" + "read /usr/share/doc/bash/README.Debian.gz for a more permanent solution.\n\n" "[Press RETURN to continue]"; int main(void) { int targetlen; - char target[PATH_MAX+1], answer[1024]; + char target[PATH_MAX+1], answer[1024], *fn; + + fn = "/etc/skel/.bash_profile"; + if (!access(fn, R_OK)) { + if (unmodified_file(fn, md5sumc_bash_profile, md5sumv_bash_profile)) { + printf("removing %s in favour of /etc/skel/.profile\n", fn); + unlink(fn); + } + else { + fn = "/etc/skel/.profile"; + if (!access(fn, R_OK)) { + if (unmodified_file(fn, md5sumc_profile, md5sumv_profile)) { + printf("renaming /etc/skel/.bash_profile to %s\n", fn); + rename("/etc/skel/.bash_profile", fn); + } + } + } + } + +#ifdef BC_CONFIG + fn = "/etc/bash_completion"; + if (!access(fn, R_OK)) { + if (unmodified_file(fn, md5sumc_completion, md5sumv_completion)) { + printf("removing unmodified %s, now in package bash-completion\n", fn); + unlink(fn); + } + } +#endif if (check_predepends() != EXIT_SUCCESS) { printf("\nPlease upgrade to a new version of dpkg\n\n"); @@ -140,5 +245,6 @@ int main(void) { fgets(answer, 1024, stdin); return EXIT_SUCCESS; } + return EXIT_SUCCESS; } |