You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

333 lines
9.3 KiB

# --- SDE-COPYRIGHT-NOTE-BEGIN ---
# This copyright note is auto-generated by ./scripts/Create-CopyPatch.
#
# Filename: package/.../mine/any-archiver.patch
# Copyright (C) 2004 - 2006 The T2 SDE Project
#
# 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 as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
# --- SDE-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 <rene@exactcode.de>
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-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
@@ -29,7 +30,6 @@
#include <fnmatch.h>
#include "cdb.h"
-#include "bzlib.h"
#include "libtar.h"
#include "mine.h"
@@ -60,70 +60,114 @@
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;
+ // fprintf (stderr, "Decomp: '%s'\n", decompressor);
+ 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 {
+ fprintf (stderr, "Unknown decompressor '%s'.\n",
+ decompressor);
+ return 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;
-
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 )