# --- T2-COPYRIGHT-NOTE-BEGIN --- # T2 SDE: package/*/mine/any-archiver.patch # Copyright (C) 2004 - 2024 The T2 SDE Project # # This Copyright note is generated by scripts/Create-CopyPatch, # more information can be found in the files COPYING and README. # # This patch file is dual-licensed. It is available under the license the # patched project is licensed under, as long as it is an OpenSource license # as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms # of the GNU General Public License version 2 as used by the T2 SDE. # --- T2-COPYRIGHT-NOTE-END --- This fixes a few bugs like crashing on non-existing file and reading the package database before checking for the file. Implements using any compressed tar package as archiver and not use the bzip2 copy but the systen compressors. (This is just a quick gap filler until we get rid of the whole mine mess.) - Rene Rebe Index: install.c =================================================================== --- ./install.c (revision 3) +++ ./install.c (revision 13) @@ -1,6 +1,7 @@ /* * GEM MINE - The ROCK Linux Package Manager * Copyright (C) 2002-2005 Clifford Wolf + * Copyright (C) 2005-2024 René Rebe * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,7 +30,6 @@ #include #include "cdb.h" -#include "bzlib.h" #include "libtar.h" #include "mine.h" @@ -60,70 +60,119 @@ int pos, len; int rc; - char *filename; + char *filename = 0; + char *decompressor = 0; char buffer[1024]; char buffer2[1024]; char buffer3[1024]; TAR *t = NULL; - BZFILE *b = NULL; - if ( ! mode_force ) - md5sum_initdb(root, mode_verbose); + errno = 0; - if ( (gem_fd = open(package, O_RDONLY)) < 0 ) goto error_errno; - cdb_init(&c, gem_fd); + decompressor = strstr (package, ".tar"); + if (decompressor) { + /* strip .tar. */ + decompressor += 4; + /* some substitution, other, e.g. lzma are used as it */ + if (!*decompressor) + decompressor = "cat"; + else if (strcmp (decompressor, ".bz2") == 0) + decompressor = "bzip2"; + else if (strcmp (decompressor, ".gz") == 0) + decompressor = "gzip"; + else if (strcmp (decompressor, ".lzo") == 0) + decompressor = "lzop"; + else if (strcmp (decompressor, ".lzma") == 0) + decompressor = "lzma"; + else if (strcmp (decompressor, ".xz") == 0) + decompressor = "xz"; + else if (strcmp (decompressor, ".zst") == 0) + decompressor = "zstd"; + else if (strcmp (decompressor, ".br") == 0) + decompressor = "brotli"; + else + ++decompressor; /* skip over leading dot (.) */ + } - rc = cdb_find(&c, "pkg_name", 8); - if ( rc <= 0 ) goto error; - pos = cdb_datapos(&c); len = cdb_datalen(&c); - pname = malloc(len+1); pname[len] = 0; - if (cdb_read(&c, pname, len, pos) == -1) goto error; - pipe(gem2bunzip); - pipe(bunzip2tar); - /* - * Extract tar.bz2 from GEM file - */ - if (!fork()) { - close(gem2bunzip[0]); - close(bunzip2tar[0]); - close(bunzip2tar[1]); + if (!decompressor) { + decompressor = "bzip2"; /* let the generic code decompress it */ - rc = cdb_find(&c, "pkg_tarbz2", 10); - if ( rc <= 0 ) exit(1); + if ( (gem_fd = open(package, O_RDONLY)) < 0 ) goto error_errno; + cdb_init(&c, gem_fd); - pos = cdb_datapos(&c); - len = cdb_datalen(&c); - if (len <= 0) exit(1); + rc = cdb_find(&c, "pkg_name", 8); + if ( rc <= 0 ) goto error; + pos = cdb_datapos(&c); len = cdb_datalen(&c); + pname = malloc(len+1); pname[len] = 0; + if (cdb_read(&c, pname, len, pos) == -1) goto error; - while (len > 0) { - if ( cdb_read(&c, buffer, len>512 ? 512 : len, - pos) == -1 ) goto error; - write(gem2bunzip[1], buffer, len > 512 ? 512 : len); - pos += len > 512 ? 512 : len; - len -= 512; + /* + * Extract tar.bz2 from GEM file + */ + if (!fork()) { + close(gem2bunzip[0]); + + rc = cdb_find(&c, "pkg_tarbz2", 10); + if ( rc <= 0 ) exit(1); + + pos = cdb_datapos(&c); + len = cdb_datalen(&c); + if (len <= 0) exit(1); + + while (len > 0) { + if ( cdb_read(&c, buffer, len>512 ? 512 : len, + pos) == -1 ) goto error; + write(gem2bunzip[1], buffer, len > 512 ? 512 : len); + pos += len > 512 ? 512 : len; + len -= 512; + } + + cdb_free(&c); + close(gem_fd); + + exit(0); } + } + else /* vanilla tar flavour */ + { + if (!fork()) { + close(gem2bunzip[0]); - cdb_free(&c); - close(gem_fd); + int fd = open (package, O_RDONLY); + if (fd < 0) goto error_errno; + int len; + do { + len = read(fd, buffer, sizeof(buffer)); + if (len < 0) goto error; + write(gem2bunzip[1], buffer, len); - exit(0); + } while (len > 0); + + close(fd); + exit(0); + } } + pipe(bunzip2tar); + /* - * Bunzip tar.bz2 file + * decompress */ if (!fork()) { close(gem2bunzip[1]); close(bunzip2tar[0]); - b = BZ2_bzdopen(gem2bunzip[0], "r"); - while ( (rc=BZ2_bzread(b, buffer, 512)) > 0 ) - write(bunzip2tar[1], buffer, rc); - BZ2_bzclose(b); - - exit(0); + dup2 (gem2bunzip[0], 0); + dup2 (bunzip2tar[1], 1); + close (gem2bunzip[0]); + close (bunzip2tar[1]); + if (strcmp (decompressor, "cat") == 0) + execlp (decompressor, decompressor, NULL); + else + execlp (decompressor, decompressor, "-d", "-c", NULL); + goto error_errno; } /* @@ -133,6 +177,9 @@ close(gem2bunzip[1]); close(bunzip2tar[1]); + if ( ! mode_force ) + md5sum_initdb(root, mode_verbose); + if (tar_fdopen(&t, bunzip2tar[0], "pipe", NULL, O_RDONLY, 0, 0) == -1) goto error_errno; if ( mode_test && mode_verbose ) printf("-- %s --\n", pname); @@ -225,7 +272,9 @@ error_errno: fprintf(stderr, "While installing GEM file %s%s%s%s: %s\n", package, - filename?" (":"", filename?filename:"", filename?"(":"", + filename ? " (" : "", + filename ? filename : "", + filename ? ")" : "", errno ? strerror(errno) : "Unknown error"); if ( t != NULL) tar_close(t); if ( gem_fd != -1 ) { cdb_free(&c); close(gem_fd); } Index: Makefile =================================================================== --- ./Makefile (revision 3) +++ ./Makefile (revision 13) @@ -6,12 +6,6 @@ CDB_OBJ = $(CDB_DIR)/cdb.a $(CDB_DIR)/alloc.a $(CDB_DIR)/buffer.a CDB_OBJ += $(CDB_DIR)/byte.a $(CDB_DIR)/unix.a -# LibBzip2 Sub-Package -# -BZIP2_VER = 1.0.2 -BZIP2_DIR = bzip2-$(BZIP2_VER) -BZIP2_OBJ = $(BZIP2_DIR)/libbz2.a - # LibTar Sub-Package # LIBTAR_VER = 1.2.11 @@ -43,11 +37,11 @@ # The usual list of build targets # -MINE_ALL_OBJS = $(MINE_OBJ) $(CDB_OBJ) $(BZIP2_OBJ) $(LIBTAR_OBJ) +MINE_ALL_OBJS = $(MINE_OBJ) $(CDB_OBJ) $(LIBTAR_OBJ) # Set and configure the c-compiler # -CFLAGS = -I$(CDB_DIR) -I$(BZIP2_DIR) -I$(LIBTAR_DIR)/lib -I. -Wall -Os +CFLAGS = -I$(CDB_DIR) -I/usr/include -I$(LIBTAR_DIR)/lib -I. -Wall -Os CFLAGS += -I$(LIBTAR_DIR)/listhash -DMINE_VERSION=\"$(MINE_VER)\" -ggdb CFLAGS += -DGEMCACHE=\"/var/cache/gem\" -DMINECURLOPT=\"/etc/mine.curlopt\" ifeq ($(USE_AVL), 1) @@ -86,7 +80,7 @@ $(CC) $(MINE_ALL_OBJS) -o mine mine.static: - $(CC) $(MINE_ALL_OBJS) -static -o mine.static + $(CC) -static $(MINE_ALL_OBJS) $(MINE_ALL_LIBS) -o mine.static gasgui: $(GAS_OBJ) $(CC) $(GAS_OBJ) -ldialog -lcurses -lm -o gasgui @@ -100,22 +94,18 @@ endif [ -f $(sysprefix)/etc/rocket.conf ] || cp rocket.conf $(sysprefix)/etc/ -$(MINE_OBJ): $(CDB_OBJ) $(BZIP2_OBJ) $(LIBTAR_OBJ) +$(MINE_OBJ): $(CDB_OBJ) $(LIBTAR_OBJ) $(CDB_OBJ): $(BUILDCC) -o $(CDB_DIR)/auto-str $(CDB_DIR)/auto-str.c $(MAKE) 'AR=$(AR)' 'RANLIB=$(RANLIB)' -C $(CDB_DIR) -$(BZIP2_OBJ): - $(MAKE) -C $(BZIP2_DIR) libbz2.a - $(LIBTAR_OBJ): cd $(LIBTAR_DIR) && ./configure --without-zlib $(CONFOPT) $(MAKE) -C $(LIBTAR_DIR) patchfiles: sh xdiff.sh $(CDB_DIR)/ > $(CDB_DIR).patch -# sh xdiff.sh (BZIP2_DIR)/ > $(BZIP2_DIR).patch sh xdiff.sh $(LIBTAR_DIR)/ > $(LIBTAR_DIR).patch clean: @@ -124,7 +114,6 @@ grep -qx "$${x#$(CDB_DIR)/}" $(CDB_DIR)/FILES || rm -v $$x ; \ done @rm -vf *.o mine mine.static gasgui core - -@make -C $(BZIP2_DIR) distclean -@make -C $(LIBTAR_DIR) distclean echo "GEM MINE $(MINE_VER)" > VERSION --- ./readdb.c 2005-03-23 09:51:06.000000000 +0100 +++ ./readdb.c 2006-06-05 14:55:33.817538500 +0200 @@ -1,6 +1,7 @@ /* * GEM MINE - The ROCK Linux Package Manager * Copyright (C) 2002-2005 Clifford Wolf + * Copyright (C) 2006 René Rebe * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -215,11 +216,12 @@ } if ( !dbf ) fclose(f); - snprintf(line, 1024, "%s/pkgs/%s-%s.gem", config, p->name, p->version); + /* without extension, it is cut off above */ + snprintf(line, 1024, "%s/pkgs/%s-%s", config, p->name, p->version); if ( memdb_get(&files_on_disks, line) ) { p->disk_number = atoi(memdb_search_result); } else { - snprintf(line, 1024, "%s/pkgs/%s.gem", config, p->name); + snprintf(line, 1024, "%s/pkgs/%s", config, p->name); if ( memdb_get(&files_on_disks, line) ) p->disk_number = atoi(memdb_search_result); } @@ -420,7 +423,12 @@ snprintf(pkgdir, 200, "%s/pkgs/", config); while ( fgets(line, 160, f) != NULL ) { + char* s; sscanf(line, "disk%s %s", disk, filename); + /* cut the extension */ + s = strstr (filename, ".tar."); + if ( !s ) s = strstr (filename, ".gem"); + if ( s ) *s = 0; if ( !strncmp(filename, pkgdir, strlen(pkgdir)) ) memdb_put(&files_on_disks, filename, disk); if ( atoi(disk) > max_disk_number )