diff --git a/package/base/mine/mine.desc b/package/base/mine/mine.desc index 5e6130908..b39aa2289 100644 --- a/package/base/mine/mine.desc +++ b/package/base/mine/mine.desc @@ -35,7 +35,7 @@ [L] GPL [S] Stable -[V] 0.21 +[V] 0.22 [P] X 01---5---9 111.900 [D] 2514882620 mine-0.21.tar.bz2 http://www.rocklinux.net/people/clifford/GEM-MINE/ diff --git a/package/base/mine/postinstall.patch b/package/base/mine/postinstall.patch new file mode 100644 index 000000000..e65ef9972 --- /dev/null +++ b/package/base/mine/postinstall.patch @@ -0,0 +1,329 @@ +diff -dur /usr/src/mine-0.21/install.c ./install.c +--- /usr/src/mine-0.21/install.c 2005-03-23 09:51:06.000000000 +0100 ++++ ./install.c 2005-05-03 13:14:05.000000000 +0200 +@@ -137,6 +137,20 @@ + O_RDONLY, 0, 0) == -1) goto error_errno; + if ( mode_test && mode_verbose ) printf("-- %s --\n", pname); + ++ FILE *logfile = NULL; ++ if ( ! mode_test ) ++ { ++ char postinst[1024]; ++ snprintf(postinst, 1024, "%s/var/adm/postinstall/%s-install.XXXXXX", root, pname); ++ if ( mkstemp(postinst) != -1 ) ++ logfile = fopen(postinst, "w"); ++ if ( mode_verbose ) ++ if ( logfile == NULL ) ++ printf("Not writing postinstall log\n"); ++ else ++ printf("Writing postinstall log to %s\n", postinst); ++ } ++ + filename = 0; + while (th_read(t) == 0) + { +@@ -187,17 +201,20 @@ + } + else + { +- if (mode_verbose) ++ if ( mode_verbose ) + printf("%s: %s\n", pname, filename); + rename(buffer, buffer3); + if (tar_extract_file(t, buffer) != 0) + goto error_errno; + unlink(buffer3); ++ if ( logfile != NULL ) ++ fprintf(logfile, "%s: %s\n", pname, filename); + } + } + + tar_close(t); close(bunzip2tar[0]); + cdb_free(&c); close(gem_fd); ++ if ( logfile != NULL ) fclose(logfile); + + return 0; + +diff -dur /usr/src/mine-0.21/Makefile ./Makefile +--- /usr/src/mine-0.21/Makefile 2005-03-23 09:51:06.000000000 +0100 ++++ ./Makefile 2005-05-03 16:41:09.000000000 +0200 +@@ -20,7 +20,7 @@ + + # Mine Itself + # +-MINE_VER = 0.21 ++MINE_VER = 0.22 + MINE_OBJ = check.o create.o install.o remove.o pkglist.o mkpdb.o + MINE_OBJ += showfile.o showkey.o memdb.o md5.o md5sum.o mine.o + +diff -dur /usr/src/mine-0.21/md5sum.c ./md5sum.c +--- /usr/src/mine-0.21/md5sum.c 2005-03-23 09:51:06.000000000 +0100 ++++ ./md5sum.c 2005-05-03 16:52:52.000000000 +0200 +@@ -41,21 +41,31 @@ + ? "" : md5_file(realfilename); + } + ++/* Returns 1 if file is duplicate, 2 if file is modified. */ + int md5sum_check(char * root, char * filename) + { + char *md5_f, *md5_d; + + md5_f = md5sum_create(root, filename); + md5_d = memdb_get(&md5_memdb, filename); +- +- return md5_f != NULL && md5_d != NULL && strcmp(md5_f, md5_d); ++ ++ if (md5_f == NULL || strcmp(md5_f, "") == 0) ++ return 0; ++ else if (md5_d == NULL) ++ return 1; ++ else if (strcmp(md5_f, md5_d) == 0) ++ return 0; ++ else ++ return 2; + } + + void md5sum_initdb(char * root, int verbose) + { + struct dirent *md5_dent; +- char buffer[1024]; ++ char buffer[1024], buffer2[1024]; + char *md5sum, *filename; ++ const char const *admdirs[6] = ++ {"cksums", "dependencies", "descs", "flists", "md5sums", "packages"}; + FILE *f; + DIR *d; + +@@ -71,6 +81,16 @@ + root, md5_dent->d_name); + f = fopen(buffer, "r"); + if ( f != NULL ) { ++ /* Add the /var/adm files of each package to the ++ md5sum memdb so md5sum_check() recognizes them. */ ++ int n; ++ for (n = 0; n < 6; n++) { ++ snprintf(buffer2, 1024, "var/adm/%s/%s", ++ admdirs[n], md5_dent->d_name); ++ memdb_put(&md5_memdb, buffer2, ++ md5sum_create(root, buffer2)); ++ } ++ + while (fgets(buffer, 1024, f) != NULL) { + md5sum = strtok(buffer, " \t\n"); + filename = strtok(NULL, "\n"); +diff -dur /usr/src/mine-0.21/mine.c ./mine.c +--- /usr/src/mine-0.21/mine.c 2005-03-23 09:51:06.000000000 +0100 ++++ ./mine.c 2005-05-03 17:40:51.000000000 +0200 +@@ -87,13 +87,13 @@ + "\n" + "Install (-i), remove (-r) and check (-y) GEM packages:\n" + "\n" +-" mine -i [ -t ] [ -v ] [ -f ] [-x glob ] [ -R root ] package1.gem [ .. ]\n" +-" mine -r [ -t ] [ -v ] [ -f ] [ -s ] [ -R root ] package1 [ package2 [ .. ] ]\n" ++" mine -i [ -R root ] [ -t ] [ -v ] [ -f ] [-x glob ] package1.gem [ .. ]\n" ++" mine -r [ -R root ] [ -t ] [ -v ] [ -f ] [ -s ] package1 [ package2 [ .. ] ]\n" + " mine -y [ -R root ] package1 [ package2 [ .. ] ]\n" + "\n" + "Query installed packages or GEM package files:\n" + "\n" +-" mine {query-mode} [ -h | -H ] [ package1 [ package2.gem [ .. ] ] ]\n" ++" mine {query-mode} [ -R root ] [ -h | -H ] [ package1 [ package2.gem [ .. ] ] ]\n" + "\n" + " Where {query-mode} might be one of:\n" + "\n" +@@ -114,13 +114,19 @@ + " -x next parameter is a pattern for files to skip\n" + " -R next parameter is the root directory\n" + "\n" +-"Create GEM package files from installed packages:\n" ++"Create GEM (-C) and .tar.bz2 (-T) package files from installed packages:\n" + "\n" + " mine -C var-adm-dir package-tar-bz2 package-name gem-file\n" + " mine -T var-adm-dir root-dir package-name package-tar-bz2\n" + "\n" ++"E.g. this will create a GEM file from the mine package installed in /:\n" ++"\n" ++" mine -T /var/adm / mine mine.tar.bz2\n" ++" mine -C /var/adm mine.tar.bz2 mine.gem\n" ++"\n" + "Hint: After installing, updating or removing packages you should run the\n" +-" script 'cron.run'. This updates some important system files.\n" ++" scripts 'cron.run' and 'postinstall'. This updates some important\n" ++" system files.\n" + "\n" + ); + exit(1); +@@ -316,9 +322,7 @@ + break; + + case 'R': +- if ( mine_root_dir == NULL && +- (mine_mode == MINE_MODE_INSTALL || +- mine_mode == MINE_MODE_REMOVE) ) ++ if ( mine_root_dir == NULL ) + { + mine_root_dir = optarg; + } else +@@ -340,6 +344,11 @@ + + if ( mine_mode == MINE_MODE_NONE ) help(); + if ( mine_root_dir == NULL ) mine_root_dir = ""; ++ else if ( !(mine_mode == MINE_MODE_INSTALL || ++ mine_mode == MINE_MODE_REMOVE || ++ mine_mode == MINE_MODE_CHECK || ++ mine_mode == MINE_MODE_PKGLIST || ++ mine_mode == MINE_MODE_SHOWFILE) ) help(); + + if (optind < argc) + { +@@ -362,11 +371,11 @@ + break; + + case MINE_MODE_PKGLIST: +- rc = gem_pkglist(argv[optind]); ++ rc = gem_pkglist(mine_root_dir, argv[optind]); + break; + + case MINE_MODE_SHOWFILE: +- rc = gem_showfile( mine_file_key_name, ++ rc = gem_showfile( mine_root_dir, mine_file_key_name, + mine_mode_header_block, + argv[optind]); + break; +@@ -398,20 +407,24 @@ + mine_mode == MINE_MODE_REMOVE || + mine_mode == MINE_MODE_SHOWKEY ) help(); + +- n = scandir("/var/adm/packages", &namelist, 0, alphasort); ++ char buffer[1024]; ++ snprintf(buffer, 1024, "%s/var/adm/packages", mine_root_dir); ++ n = scandir(buffer, &namelist, 0, alphasort); + if (n < 0) { +- perror("Can't read /var/adm/packages"); ++ char buffer2[1024]; ++ snprintf(buffer2, 1024, "Can't read %s", buffer); ++ perror(buffer2); + exit(1); + } + while(n--) { + rc = 0; + switch (mine_mode) { + case MINE_MODE_PKGLIST: +- rc = gem_pkglist(namelist[n]->d_name); ++ rc = gem_pkglist(mine_root_dir, namelist[n]->d_name); + break; + + case MINE_MODE_SHOWFILE: +- rc = gem_showfile( mine_file_key_name, ++ rc = gem_showfile(mine_root_dir, mine_file_key_name, + mine_mode_header_block, + namelist[n]->d_name); + break; +diff -dur /usr/src/mine-0.21/mine.h ./mine.h +--- /usr/src/mine-0.21/mine.h 2005-03-23 09:51:06.000000000 +0100 ++++ ./mine.h 2005-05-03 13:05:51.000000000 +0200 +@@ -37,9 +37,9 @@ + extern int gem_remove(char * root, int mode_test, int mode_verbose, + int mode_force, int mode_sub, char * package); + +-extern int gem_pkglist(char * package); ++extern int gem_pkglist(char * root, char * package); + +-extern int gem_showfile(char * name, int mode_header_block, char * package); ++extern int gem_showfile(char * root, char * name, int mode_header_block, char * package); + + extern int gem_showkey(char * name, int mode_header_line, + int mode_header_block, char * package); +diff -dur /usr/src/mine-0.21/pkglist.c ./pkglist.c +--- /usr/src/mine-0.21/pkglist.c 2005-03-23 09:51:06.000000000 +0100 ++++ ./pkglist.c 2005-05-03 13:05:51.000000000 +0200 +@@ -77,12 +77,12 @@ + return 1; + } + +-int gem_pkglist(char * package) ++int gem_pkglist(char * root, char * package) + { + char buffer[1024]; + FILE *f; + +- snprintf(buffer, 1024, "/var/adm/packages/%s", package); ++ snprintf(buffer, 1024, "%s/var/adm/packages/%s", root, package); + if ( (f = fopen(buffer, "r")) == NULL ) + return gem_pkglist_gemfile(package); + +diff -dur /usr/src/mine-0.21/remove.c ./remove.c +--- /usr/src/mine-0.21/remove.c 2005-03-23 09:51:06.000000000 +0100 ++++ ./remove.c 2005-05-03 16:50:40.000000000 +0200 +@@ -32,7 +32,7 @@ + + /* we need to reverse the package file list so we first remove + * the content of a directory and after that the directory itself. +- * so we temporary store the data in a liked list. ++ * so we temporarily store the data in a linked list. + */ + struct flist; + struct flist { +@@ -98,6 +98,21 @@ + } + fclose(f); + ++ FILE *logfile = NULL; ++ if ( ! mode_test ) ++ { ++ char postinst[1024]; ++ snprintf(postinst, 1024, "%s/var/adm/postinstall/%s-remove.XXXXXX", ++ root, package); ++ if ( mkstemp(postinst) != -1 ) ++ logfile = fopen(postinst, "w"); ++ if ( mode_verbose ) ++ if ( logfile == NULL ) ++ printf("Not writing postremove log\n"); ++ else ++ printf("Writing postremove log to %s\n", postinst); ++ } ++ + while ( flist ) + { + filename = flist->filename; +@@ -158,9 +173,12 @@ + errors++; + } + } ++ if ( logfile != NULL ) ++ fprintf(logfile, "%s: %s\n", package, filename); + } + + free(filename); ++ if ( logfile != NULL ) fclose(logfile); + } + + if ( errors ) +diff -dur /usr/src/mine-0.21/showfile.c ./showfile.c +--- /usr/src/mine-0.21/showfile.c 2005-03-23 09:51:06.000000000 +0100 ++++ ./showfile.c 2005-05-03 13:05:51.000000000 +0200 +@@ -20,12 +20,12 @@ + #include + #include "mine.h" + +-int gem_showfile(char * name, int mode_header_block, char * package) ++int gem_showfile(char * root, char * name, int mode_header_block, char * package) + { + char buffer[1024]; + FILE *f; + +- snprintf(buffer, 1024, "/var/adm/%s/%s", name, package); ++ snprintf(buffer, 1024, "%s/var/adm/%s/%s", root, name, package); + if ( (f = fopen(buffer, "r")) == NULL ) { + return gem_showkey(name, 0, mode_header_block, package); + } +diff -dur /usr/src/mine-0.21/TODO ./TODO +--- /usr/src/mine-0.21/TODO 2003-08-28 13:49:26.000000000 +0200 ++++ ./TODO 2005-05-03 17:07:29.000000000 +0200 +@@ -1,6 +1,5 @@ + + Todos: + +- - Don't install a file if an old file exists which is not in the package db + - Remove old files when updating a package (?) +