SOURCES: poldek-split64.patch (NEW) - 64bit internals for split
arekm
arekm at pld-linux.org
Mon Oct 3 22:16:19 CEST 2005
Author: arekm Date: Mon Oct 3 20:16:19 2005 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- 64bit internals for split
---- Files affected:
SOURCES:
poldek-split64.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/poldek-split64.patch
diff -u /dev/null SOURCES/poldek-split64.patch:1.1
--- /dev/null Mon Oct 3 22:16:19 2005
+++ SOURCES/poldek-split64.patch Mon Oct 3 22:16:14 2005
@@ -0,0 +1,219 @@
+Index: cli/op_split.c
+===================================================================
+RCS file: /cvsroot/installer/poldek/cli/op_split.c,v
+retrieving revision 1.10
+retrieving revision 1.11
+diff -u -r1.10 -r1.11
+--- cli/op_split.c 10 Jul 2005 13:30:17 -0000 1.10
++++ cli/op_split.c 3 Oct 2005 19:57:05 -0000 1.11
+@@ -7,7 +7,7 @@
+ */
+
+ /*
+- $Id$
++ $Id$
+ */
+
+ #ifdef HAVE_CONFIG_H
+@@ -167,9 +167,6 @@
+ logn(LOGERR, _("first free space bigger than chunk size"));
+ return 0;
+ }
+-
+- arg_s->size *= 1024 * 1024;
+- arg_s->first_free_space *= 1024 * 1024;
+
+ return poldek_split(ctx, arg_s->size, arg_s->first_free_space,
+ arg_s->prefix);
+Index: split.c
+===================================================================
+RCS file: /cvsroot/installer/poldek/split.c,v
+retrieving revision 1.22
+retrieving revision 1.23
+diff -u -r1.22 -r1.23
+--- split.c 5 Jul 2005 21:11:12 -0000 1.22
++++ split.c 3 Oct 2005 19:57:04 -0000 1.23
+@@ -11,7 +11,7 @@
+ */
+
+ /*
+- $Id$
++ $Id$
+ */
+
+ #include <ctype.h>
+@@ -39,8 +39,8 @@
+
+ struct chunk {
+ int no;
+- unsigned size;
+- unsigned maxsize;
++ uint64_t size;
++ uint64_t maxsize;
+ int items;
+ tn_array *pkgs;
+ };
+@@ -50,7 +50,7 @@
+ char mask[0];
+ };
+
+-static struct chunk *chunk_new(int no, int maxsize)
++static struct chunk *chunk_new(int no, uint64_t maxsize)
+ {
+ struct chunk *chunk;
+
+@@ -241,7 +241,7 @@
+
+
+ static
+-int try_package(int deep, unsigned *chunk_size, unsigned maxsize,
++int try_package(int deep, uint64_t *chunk_size, uint64_t maxsize,
+ struct pkg *pkg, tn_array *stack)
+ {
+ int i, rc = 1;
+@@ -256,7 +256,7 @@
+ n_array_push(stack, pkg_link(pkg));
+ *chunk_size += pkg->fsize;
+
+- DBGF("trying %s: %d (%d) > %d\n", pkg_snprintf_s(pkg), *chunk_size,
++ DBGF("trying %s: %lld (%d) > %lld\n", pkg_snprintf_s(pkg), *chunk_size,
+ pkg->fsize, maxsize);
+
+ if (*chunk_size > maxsize)
+@@ -281,7 +281,7 @@
+ int chunk_add(struct chunk *chunk, struct pkg *pkg)
+ {
+ int i, rc = 0;
+- int chunk_size = 0;
++ uint64_t chunk_size = 0;
+ tn_array *stack = NULL;
+
+
+@@ -320,9 +320,46 @@
+ return rc;
+ }
+
++static
++int snprintf_size64(char *buf, int bufsize, uint64_t nbytes,
++ int ndigits, int longunit)
++{
++ char unit[3], fmt[32];
++ double nb;
++
++
++ nb = nbytes;
++ unit[0] = 'B';
++ unit[1] = unit[2] = '\0';
++
++ if (nb > 1024) {
++ nb /= 1024.0;
++
++ unit[0] = 'K';
++ unit[1] = 'B';
++
++ if (nb > 1024) {
++ nb /= 1024;
++ unit[0] = 'M';
++ }
++
++ if (nb > 1024) {
++ nb /= 1024;
++ unit[0] = 'G';
++ }
++ }
++
++ n_snprintf(fmt, sizeof(fmt), "%%.%df%%s", ndigits);
++ if (!longunit)
++ unit[1] = '\0';
++
++ return n_snprintf(buf, bufsize, fmt, nb, unit);
++}
++
++
+
+ static
+-int make_chunks(tn_array *pkgs, unsigned split_size, unsigned first_free_space,
++int make_chunks(tn_array *pkgs, uint64_t split_size, uint64_t first_free_space,
+ const char *outprefix)
+ {
+ int i, chunk_no = 0, rc = 1;
+@@ -356,7 +393,7 @@
+ }
+
+ for (i=0; i < n_array_size(chunks); i++) {
+- struct vfile *vf;
++ FILE *stream;
+ char path[PATH_MAX], strsize[128];
+ struct chunk *chunk;
+ struct pkg *pkg;
+@@ -373,21 +410,21 @@
+ pri_max = pkg->pri;
+
+ snprintf(path, sizeof(path), "%s.%.2d", outprefix, chunk->no);
+- snprintf_size(strsize, sizeof(strsize), chunk->size, 2, 0);
+- msgn(0, _("Writing %s (%4d packages, %s, "
++ snprintf_size64(strsize, sizeof(strsize), chunk->size, 2, 0);
++ msgn(0, _("Writing %s (%4d packages, %s (%lldb), "
+ "pri min, max = %d, %d)"),
+- path, chunk->items, strsize, pri_min, pri_max);
++ path, chunk->items, strsize, chunk->size, pri_min, pri_max);
+
+
+- if ((vf = vfile_open(path, VFT_STDIO, VFM_RW)) == NULL)
++ if ((stream = fopen(path, "w")) == NULL)
+ return 0;
+
+ #if 0
+- fprintf(vf->vf_stream, "# chunk #%d: %d packages, %d bytes\n",
++ fprintf(vf->vf_stream, "# chunk #%d: %d packages, %lld bytes\n",
+ i, chunk->items, chunk->size);
+ #endif
+- chunk_dump(chunk, vf->vf_stream);
+- vfile_close(vf);
++ chunk_dump(chunk, stream);
++ fclose(stream);
+ }
+
+ l_end:
+@@ -444,12 +481,18 @@
+ }
+
+ static
+-int packages_split(const tn_array *pkgs, unsigned split_size,
+- unsigned first_free_space, const char *outprefix)
++int packages_split(const tn_array *pkgs, unsigned split_size_mb,
++ unsigned first_free_space_mb, const char *outprefix)
+ {
+ tn_array *packages = NULL, *ordered_pkgs = NULL;
+ int i, rc = 1;
++ uint64_t split_size, first_free_space;
++
++ split_size = (uint64_t)split_size_mb * 1024L * 1024L;
++ first_free_space = (uint64_t)first_free_space_mb * 1024L * 1024L;
+
++ DBGF("%dM (%lld), %dM %lld\n", split_size_mb, split_size,
++ first_free_space_mb, first_free_space);
+
+ packages = n_array_dup(pkgs, (tn_fn_dup)pkg_link);
+ // pre-sort packages with pkg_cmp_pri_name_evr_rev()
+@@ -482,8 +525,8 @@
+ return rc;
+ }
+
+-int poldek_split(const struct poldek_ctx *ctx, unsigned size,
+- unsigned first_free_space, const char *outprefix)
++int poldek_split(const struct poldek_ctx *ctx, unsigned size_mb,
++ unsigned first_free_space_mb, const char *outprefix)
+ {
+ if (outprefix == NULL)
+ outprefix = "packages.chunk";
+@@ -492,6 +535,7 @@
+ logn(LOGERR, "split: %s", _("no available packages found"));
+ return 0;
+ }
+-
+- return packages_split(ctx->ps->pkgs, size, first_free_space, outprefix);
++
++ return packages_split(ctx->ps->pkgs, size_mb, first_free_space_mb,
++ outprefix);
+ }
================================================================
More information about the pld-cvs-commit
mailing list