summaryrefslogtreecommitdiff
path: root/recipes/ipkg/files
diff options
context:
space:
mode:
authorDenys Dmytriyenko <denis@denix.org>2009-03-17 14:32:59 -0400
committerDenys Dmytriyenko <denis@denix.org>2009-03-17 14:32:59 -0400
commit709c4d66e0b107ca606941b988bad717c0b45d9b (patch)
tree37ee08b1eb308f3b2b6426d5793545c38396b838 /recipes/ipkg/files
parentfa6cd5a3b993f16c27de4ff82b42684516d433ba (diff)
rename packages/ to recipes/ per earlier agreement
See links below for more details: http://thread.gmane.org/gmane.comp.handhelds.openembedded/21326 http://thread.gmane.org/gmane.comp.handhelds.openembedded/21816 Signed-off-by: Denys Dmytriyenko <denis@denix.org> Acked-by: Mike Westerhof <mwester@dls.net> Acked-by: Philip Balister <philip@balister.org> Acked-by: Khem Raj <raj.khem@gmail.com> Acked-by: Marcin Juszkiewicz <hrw@openembedded.org> Acked-by: Koen Kooi <koen@openembedded.org> Acked-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
Diffstat (limited to 'recipes/ipkg/files')
-rw-r--r--recipes/ipkg/files/1-pkg-parse--Optimize-inefficient-parsing.patch227
-rw-r--r--recipes/ipkg/files/2-pkg-vec--Optimize-gross-inefficiency.patch65
-rw-r--r--recipes/ipkg/files/enable_debversion.patch111
-rw-r--r--recipes/ipkg/files/ipkg-configure5
-rw-r--r--recipes/ipkg/files/is-processing.patch179
-rw-r--r--recipes/ipkg/files/libdir.patch11
-rw-r--r--recipes/ipkg/files/lonk-link-name.patch38
-rw-r--r--recipes/ipkg/files/terse.patch18
-rw-r--r--recipes/ipkg/files/uclibc.patch13
-rw-r--r--recipes/ipkg/files/uninclude-replace.patch10
-rw-r--r--recipes/ipkg/files/update_version_comparision.patch84
11 files changed, 761 insertions, 0 deletions
diff --git a/recipes/ipkg/files/1-pkg-parse--Optimize-inefficient-parsing.patch b/recipes/ipkg/files/1-pkg-parse--Optimize-inefficient-parsing.patch
new file mode 100644
index 0000000000..e7632b11d1
--- /dev/null
+++ b/recipes/ipkg/files/1-pkg-parse--Optimize-inefficient-parsing.patch
@@ -0,0 +1,227 @@
+# HG changeset patch
+# User pfalcon@localhost
+# Date 1178334771 0
+# Node ID e4c99830ba0d55813e1774bd6d41039ca640d6a6
+# Parent d324eba24e79a0a86df7978f0511e4632a2732c7
+pkg_parse: Optimize inefficient parsing.
+
+Instead of expensively probing all fields in row, dispatch based on the
+first letter of the field. Tests show ~12 times reduction in number of calls
+to low-level parsing functions.
+
+diff -r d324eba24e79 -r e4c99830ba0d pkg_parse.c
+--- a/pkg_parse.c Fri May 04 23:22:33 2007 +0000
++++ b/pkg_parse.c Sat May 05 03:12:51 2007 +0000
+@@ -241,87 +241,116 @@ int pkg_parse_raw(pkg_t *pkg, char ***ra
+
+ for (lines = *raw; *lines; lines++) {
+ /* fprintf(stderr, "PARSING %s\n", *lines);*/
+- if(isGenericFieldType("Package:", *lines))
+- pkg->name = parseGenericFieldType("Package", *lines);
+- else if(isGenericFieldType("Architecture:", *lines))
+- pkg->architecture = parseGenericFieldType("Architecture", *lines);
+- else if(isGenericFieldType("Filename:", *lines))
+- pkg->filename = parseGenericFieldType("Filename", *lines);
+- else if(isGenericFieldType("Section:", *lines))
+- pkg->section = parseGenericFieldType("Section", *lines);
+- else if(isGenericFieldType("MD5sum:", *lines))
+- pkg->md5sum = parseGenericFieldType("MD5sum", *lines);
+- /* The old ipkg wrote out status files with the wrong case for MD5sum,
+- let's parse it either way */
+- else if(isGenericFieldType("MD5Sum:", *lines))
+- pkg->md5sum = parseGenericFieldType("MD5Sum", *lines);
+- else if(isGenericFieldType("Size:", *lines))
+- pkg->size = parseGenericFieldType("Size", *lines);
+- else if(isGenericFieldType("Source:", *lines))
+- pkg->source = parseGenericFieldType("Source", *lines);
+- else if(isGenericFieldType("Installed-Size:", *lines))
+- pkg->installed_size = parseGenericFieldType("Installed-Size", *lines);
+- else if(isGenericFieldType("Installed-Time:", *lines)) {
+- char *time_str = parseGenericFieldType("Installed-Time", *lines);
+- pkg->installed_time = strtoul(time_str, NULL, 0);
+- } else if(isGenericFieldType("Priority:", *lines))
+- pkg->priority = parseGenericFieldType("Priority", *lines);
+- else if(isGenericFieldType("Essential:", *lines)) {
+- char *essential_value;
+- essential_value = parseGenericFieldType("Essential", *lines);
+- if (strcmp(essential_value, "yes") == 0) {
+- pkg->essential = 1;
+- }
+- free(essential_value);
+- }
+- else if(isGenericFieldType("Status", *lines))
+- parseStatus(pkg, *lines);
+- else if(isGenericFieldType("Version", *lines))
+- parseVersion(pkg, *lines);
+- else if(isGenericFieldType("Maintainer", *lines))
+- pkg->maintainer = parseGenericFieldType("Maintainer", *lines);
+- else if(isGenericFieldType("Conffiles", *lines)){
+- parseConffiles(pkg, *lines);
+- reading_conffiles = 1;
+- }
+- else if(isGenericFieldType("Description", *lines)) {
+- pkg->description = parseGenericFieldType("Description", *lines);
+- reading_conffiles = 0;
+- reading_description = 1;
+- }
+-
+- else if(isGenericFieldType("Provides", *lines)){
++ switch (**lines) {
++ case 'P':
++ if(isGenericFieldType("Package:", *lines))
++ pkg->name = parseGenericFieldType("Package", *lines);
++ else if(isGenericFieldType("Priority:", *lines))
++ pkg->priority = parseGenericFieldType("Priority", *lines);
++ else if(isGenericFieldType("Provides", *lines)){
+ /* Here we add the internal_use to align the off by one problem between provides_str and provides */
+- provide = (char * ) malloc(strlen(*lines)+ 35 ); /* Preparing the space for the new ipkg_internal_use_only */
+- if ( alterProvidesLine(*lines,provide) ){
+- return EINVAL;
+- }
+- pkg->provides_str = parseDependsString( provide, &pkg->provides_count);
++ provide = (char * ) malloc(strlen(*lines)+ 35 ); /* Preparing the space for the new ipkg_internal_use_only */
++ if ( alterProvidesLine(*lines,provide) ){
++ return EINVAL;
++ }
++ pkg->provides_str = parseDependsString( provide, &pkg->provides_count);
+ /* Let's try to hack a bit here.
+ The idea is that if a package has no Provides, we would add one generic, to permit the check of dependencies
+ in alot of other places. We will remove it before writing down the status database */
+- pkg_false_provides=0;
+- free(provide);
+- }
+-
+- else if(isGenericFieldType("Depends", *lines))
+- pkg->depends_str = parseDependsString(*lines, &pkg->depends_count);
+- else if(isGenericFieldType("Pre-Depends", *lines))
+- pkg->pre_depends_str = parseDependsString(*lines, &pkg->pre_depends_count);
+- else if(isGenericFieldType("Recommends", *lines))
+- pkg->recommends_str = parseDependsString(*lines, &pkg->recommends_count);
+- else if(isGenericFieldType("Suggests", *lines))
+- pkg->suggests_str = parseDependsString(*lines, &pkg->suggests_count);
+- /* Abhaya: support for conflicts */
+- else if(isGenericFieldType("Conflicts", *lines))
+- pkg->conflicts_str = parseDependsString(*lines, &pkg->conflicts_count);
+- else if(isGenericFieldType("Replaces", *lines))
+- pkg->replaces_str = parseDependsString(*lines, &pkg->replaces_count);
+- else if(line_is_blank(*lines)) {
+- lines++;
+- break;
+- }
+- else if(**lines == ' '){
++ pkg_false_provides=0;
++ free(provide);
++ }
++ else if(isGenericFieldType("Pre-Depends", *lines))
++ pkg->pre_depends_str = parseDependsString(*lines, &pkg->pre_depends_count);
++ break;
++
++ case 'A':
++ if(isGenericFieldType("Architecture:", *lines))
++ pkg->architecture = parseGenericFieldType("Architecture", *lines);
++ break;
++
++ case 'F':
++ if(isGenericFieldType("Filename:", *lines))
++ pkg->filename = parseGenericFieldType("Filename", *lines);
++ break;
++
++ case 'S':
++ if(isGenericFieldType("Section:", *lines))
++ pkg->section = parseGenericFieldType("Section", *lines);
++ else if(isGenericFieldType("Size:", *lines))
++ pkg->size = parseGenericFieldType("Size", *lines);
++ else if(isGenericFieldType("Source:", *lines))
++ pkg->source = parseGenericFieldType("Source", *lines);
++ else if(isGenericFieldType("Status", *lines))
++ parseStatus(pkg, *lines);
++ else if(isGenericFieldType("Suggests", *lines))
++ pkg->suggests_str = parseDependsString(*lines, &pkg->suggests_count);
++ break;
++
++ case 'M':
++ if(isGenericFieldType("MD5sum:", *lines))
++ pkg->md5sum = parseGenericFieldType("MD5sum", *lines);
++ /* The old ipkg wrote out status files with the wrong case for MD5sum,
++ let's parse it either way */
++ else if(isGenericFieldType("MD5Sum:", *lines))
++ pkg->md5sum = parseGenericFieldType("MD5Sum", *lines);
++ else if(isGenericFieldType("Maintainer", *lines))
++ pkg->maintainer = parseGenericFieldType("Maintainer", *lines);
++ break;
++
++ case 'I':
++ if(isGenericFieldType("Installed-Size:", *lines))
++ pkg->installed_size = parseGenericFieldType("Installed-Size", *lines);
++ else if(isGenericFieldType("Installed-Time:", *lines)) {
++ char *time_str = parseGenericFieldType("Installed-Time", *lines);
++ pkg->installed_time = strtoul(time_str, NULL, 0);
++ }
++ break;
++
++ case 'E':
++ if(isGenericFieldType("Essential:", *lines)) {
++ char *essential_value;
++ essential_value = parseGenericFieldType("Essential", *lines);
++ if (strcmp(essential_value, "yes") == 0) {
++ pkg->essential = 1;
++ }
++ free(essential_value);
++ }
++ break;
++
++ case 'V':
++ if(isGenericFieldType("Version", *lines))
++ parseVersion(pkg, *lines);
++ break;
++
++ case 'C':
++ if(isGenericFieldType("Conffiles", *lines)){
++ parseConffiles(pkg, *lines);
++ reading_conffiles = 1;
++ }
++ else if(isGenericFieldType("Conflicts", *lines))
++ pkg->conflicts_str = parseDependsString(*lines, &pkg->conflicts_count);
++ break;
++
++ case 'D':
++ if(isGenericFieldType("Description", *lines)) {
++ pkg->description = parseGenericFieldType("Description", *lines);
++ reading_conffiles = 0;
++ reading_description = 1;
++ }
++ else if(isGenericFieldType("Depends", *lines))
++ pkg->depends_str = parseDependsString(*lines, &pkg->depends_count);
++ break;
++
++ case 'R':
++ if(isGenericFieldType("Recommends", *lines))
++ pkg->recommends_str = parseDependsString(*lines, &pkg->recommends_count);
++ else if(isGenericFieldType("Replaces", *lines))
++ pkg->replaces_str = parseDependsString(*lines, &pkg->replaces_count);
++
++ break;
++
++ case ' ':
+ if(reading_description) {
+ /* we already know it's not blank, so the rest of description */
+ pkg->description = realloc(pkg->description,
+@@ -332,8 +361,18 @@ int pkg_parse_raw(pkg_t *pkg, char ***ra
+ }
+ else if(reading_conffiles)
+ parseConffiles(pkg, *lines);
++
++ break;
++
++ default:
++ if(line_is_blank(*lines)) {
++ lines++;
++ goto out;
++ }
+ }
+ }
++out:;
++
+ *raw = lines;
+ /* If the ipk has not a Provides line, we insert our false line */
+ if ( pkg_false_provides==1)
diff --git a/recipes/ipkg/files/2-pkg-vec--Optimize-gross-inefficiency.patch b/recipes/ipkg/files/2-pkg-vec--Optimize-gross-inefficiency.patch
new file mode 100644
index 0000000000..3c5cac49dc
--- /dev/null
+++ b/recipes/ipkg/files/2-pkg-vec--Optimize-gross-inefficiency.patch
@@ -0,0 +1,65 @@
+# HG changeset patch
+# User pfalcon@localhost
+# Date 1178812057 0
+# Node ID eff4450fdea2f8210a4fc927bd35ae2562d2eced
+# Parent e4c99830ba0d55813e1774bd6d41039ca640d6a6
+pkg_vec: Optimize gross inefficiency.
+
+This module tries to implement *unique* vector (without duplicating
+objects), and does this by iterating thru all already existing elements.
+Thus, complexity of adding N elements was O(N^2). However, there're no grave
+reasons to do uniqueness at all:
+1. First of all, if feeds are correct, there won't be duplicates.
+2. Then, even if there will be, there won't be serious problems like
+segfaults.
+3. Finally, for quite a few operations vectors is constructed from a
+hashtable, thus uniqueness is guaranteed (which reduces possible cases of
+non-uniqueness to values of Depends: and friends).
+
+All an all, remove dup check, and make ipkg work order of magnitude faster
+on a feed with few thousands of packages.
+
+diff -r e4c99830ba0d -r eff4450fdea2 pkg_vec.c
+--- a/pkg_vec.c Sat May 05 03:12:51 2007 +0000
++++ b/pkg_vec.c Thu May 10 15:47:37 2007 +0000
+@@ -104,6 +104,7 @@ void pkg_vec_insert(pkg_vec_t *vec, cons
+ int i;
+ int found = 0;
+
++#if 0
+ /* look for a duplicate pkg by name, version, and architecture */
+ for (i = 0; i < vec->len; i++)
+ if ((strcmp(pkg->name, vec->pkgs[i]->name) == 0)
+@@ -112,6 +113,7 @@ void pkg_vec_insert(pkg_vec_t *vec, cons
+ found = 1;
+ break;
+ }
++#endif
+
+ /* we didn't find one, add it */
+ if(!found){
+@@ -191,6 +193,7 @@ void abstract_pkg_vec_insert(abstract_pk
+ {
+ int i;
+
++#if 0
+ /* look for a duplicate pkg by name */
+ for(i = 0; i < vec->len; i++)
+ if (strcmp(pkg->name, vec->pkgs[i]->name) == 0)
+@@ -198,12 +201,15 @@ void abstract_pkg_vec_insert(abstract_pk
+
+ /* we didn't find one, add it */
+ if(i == vec->len){
++#endif
+ vec->pkgs =
+ (abstract_pkg_t **)
+ realloc(vec->pkgs, (vec->len + 1) * sizeof(abstract_pkg_t *));
+ vec->pkgs[vec->len] = pkg;
+ vec->len++;
+- }
++#if 0
++ }
++#endif
+ }
+
+ abstract_pkg_t * abstract_pkg_vec_get(abstract_pkg_vec_t *vec, int i)
diff --git a/recipes/ipkg/files/enable_debversion.patch b/recipes/ipkg/files/enable_debversion.patch
new file mode 100644
index 0000000000..e9c3a7a1d4
--- /dev/null
+++ b/recipes/ipkg/files/enable_debversion.patch
@@ -0,0 +1,111 @@
+OE makes heavy use of the revision field so it makes sense to
+enable it. We don't want the familiar stuff though so patch that
+out.
+
+RP - 19/02/2008
+
+Index: ipkg-0.99.163/pkg.c
+===================================================================
+--- ipkg-0.99.163.orig/pkg.c 2008-02-19 00:35:03.000000000 +0000
++++ ipkg-0.99.163/pkg.c 2008-02-19 00:36:02.000000000 +0000
+@@ -1118,15 +1118,11 @@
+ return r;
+ }
+
+-#ifdef USE_DEBVERSION
+ r = verrevcmp(pkg->revision, ref_pkg->revision);
+ if (r) {
+ return r;
+ }
+
+- r = verrevcmp(pkg->familiar_revision, ref_pkg->familiar_revision);
+-#endif
+-
+ return r;
+ }
+
+@@ -1240,10 +1236,7 @@
+ {
+ char *complete_version;
+ char *epoch_str;
+-#ifdef USE_DEBVERSION
+ char *revision_str;
+- char *familiar_revision_str;
+-#endif
+
+ if (pkg->epoch) {
+ sprintf_alloc(&epoch_str, "%d:", pkg->epoch);
+@@ -1251,33 +1244,18 @@
+ epoch_str = strdup("");
+ }
+
+-#ifdef USE_DEBVERSION
+ if (pkg->revision && strlen(pkg->revision)) {
+ sprintf_alloc(&revision_str, "-%s", pkg->revision);
+ } else {
+ revision_str = strdup("");
+ }
+
+- if (pkg->familiar_revision && strlen(pkg->familiar_revision)) {
+- sprintf_alloc(&familiar_revision_str, "-fam%s", pkg->familiar_revision);
+- } else {
+- familiar_revision_str = strdup("");
+- }
+-#endif
+
+-#ifdef USE_DEBVERSION
+- sprintf_alloc(&complete_version, "%s%s%s%s",
+- epoch_str, pkg->version, revision_str, familiar_revision_str);
+-#else
+- sprintf_alloc(&complete_version, "%s%s",
+- epoch_str, pkg->version);
+-#endif
++ sprintf_alloc(&complete_version, "%s%s%s",
++ epoch_str, pkg->version, revision_str);
+
+ free(epoch_str);
+-#ifdef USE_DEBVERSION
+ free(revision_str);
+- free(familiar_revision_str);
+-#endif
+
+ return complete_version;
+ }
+Index: ipkg-0.99.163/pkg_parse.c
+===================================================================
+--- ipkg-0.99.163.orig/pkg_parse.c 2008-02-19 00:35:03.000000000 +0000
++++ ipkg-0.99.163/pkg_parse.c 2008-02-19 00:38:42.000000000 +0000
+@@ -105,9 +105,7 @@
+ int parseVersion(pkg_t *pkg, char *raw)
+ {
+ char *colon, *eepochcolon;
+-#ifdef USE_DEBVERSION
+ char *hyphen;
+-#endif
+ unsigned long epoch;
+
+ if (!*raw) {
+@@ -149,23 +147,12 @@
+ }
+ strcpy(pkg->version, raw);
+
+-#ifdef USE_DEBVERSION
+ hyphen= strrchr(pkg->version,'-');
+
+ if (hyphen) {
+ *hyphen++= 0;
+- if (strncmp("fam", hyphen, 3) == 0) {
+- pkg->familiar_revision=hyphen+3;
+- hyphen= strrchr(pkg->version,'-');
+- if (hyphen) {
+- *hyphen++= 0;
+- pkg->revision = hyphen;
+- }
+- } else {
+ pkg->revision = hyphen;
+- }
+ }
+-#endif
+
+ /*
+ fprintf(stderr,"Parsed version: %lu, %s, %s, %s\n",
diff --git a/recipes/ipkg/files/ipkg-configure b/recipes/ipkg/files/ipkg-configure
new file mode 100644
index 0000000000..e0c65ad4e2
--- /dev/null
+++ b/recipes/ipkg/files/ipkg-configure
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+echo "Starting to configure packages..."
+ipkg-cl configure
+echo "Finished to configure packages."
diff --git a/recipes/ipkg/files/is-processing.patch b/recipes/ipkg/files/is-processing.patch
new file mode 100644
index 0000000000..45ede41668
--- /dev/null
+++ b/recipes/ipkg/files/is-processing.patch
@@ -0,0 +1,179 @@
+diff -Nur ipkg-0.99.163.orig/ipkg_install.c ipkg-0.99.163/ipkg_install.c
+--- ipkg-0.99.163.orig/ipkg_install.c 2006-03-30 21:50:24.000000000 +0800
++++ ipkg-0.99.163/ipkg_install.c 2007-03-15 08:01:20.000000000 +0800
+@@ -211,6 +211,7 @@
+ anyone ever wants to make a nice libipkg. */
+
+ ipkg_message(conf, IPKG_DEBUG2,"Function: %s calling ipkg_install_pkg \n",__FUNCTION__);
++ new->is_processing = 1;
+ return ipkg_install_pkg(conf, new,0);
+ }
+
+diff -Nur ipkg-0.99.163.orig/libbb/unzip.c ipkg-0.99.163/libbb/unzip.c
+--- ipkg-0.99.163.orig/libbb/unzip.c 2006-02-06 16:13:02.000000000 +0800
++++ ipkg-0.99.163/libbb/unzip.c 2007-03-15 08:03:45.000000000 +0800
+@@ -1028,13 +1028,15 @@
+ */
+ extern void gz_close(int gunzip_pid)
+ {
+- if (kill(gunzip_pid, SIGTERM) == -1) {
+- error_msg_and_die("*** Couldnt kill old gunzip process *** aborting");
+- }
++ if (kill(gunzip_pid, 0) == 0) {
++ if (kill(gunzip_pid, SIGTERM) == -1) {
++ error_msg_and_die("*** Couldnt kill old gunzip process *** aborting");
++ }
+
+- if (waitpid(gunzip_pid, NULL, 0) == -1) {
+- printf("Couldnt wait ?");
++ if (waitpid(gunzip_pid, NULL, 0) == -1) {
++ printf("Couldnt wait ?");
++ }
+ }
+- free(window);
+- free(crc_table);
++ free(window);
++ free(crc_table);
+ }
+diff -Nur ipkg-0.99.163.orig/pkg.c ipkg-0.99.163/pkg.c
+--- ipkg-0.99.163.orig/pkg.c 2006-04-21 04:29:28.000000000 +0800
++++ ipkg-0.99.163/pkg.c 2007-03-20 15:11:32.845064480 +0800
+@@ -33,6 +33,7 @@
+ #include "xsystem.h"
+ #include "ipkg_conf.h"
+
++
+ typedef struct enum_map enum_map_t;
+ struct enum_map
+ {
+@@ -522,6 +523,10 @@
+ strncat(buff ,line, strlen(line));
+ free(line);
+
++ line = pkg_formatted_field(pkg, "Installed-Size");
++ strncat(buff ,line, strlen(line));
++ free(line);
++
+ return buff;
+ }
+
+@@ -542,7 +547,6 @@
+ }
+
+ temp[0]='\0';
+-
+ switch (field[0])
+ {
+ case 'a':
+@@ -690,13 +694,42 @@
+ case 'I': {
+ if (strcasecmp(field, "Installed-Size") == 0) {
+ /* Installed-Size */
+- temp = (char *)realloc(temp,strlen(pkg->installed_size)+17);
+- if ( temp == NULL ){
+- fprintf(stderr, "%s: out of memory\n", __FUNCTION__);
+- return NULL;
+- }
+- temp[0]='\0';
+- snprintf(temp, (strlen(pkg->installed_size)+17), "Installed-Size: %s\n", pkg->installed_size);
++ if (pkg->installed_size) {
++ temp = (char *)realloc(temp,strlen(pkg->installed_size)+18);
++ if ( temp == NULL ){
++ fprintf(stderr, "%s: out of memory\n", __FUNCTION__);
++ return NULL;
++ }
++ temp[0]='\0';
++ snprintf(temp, (strlen(pkg->installed_size)+18), "Installed-Size: %s\n", pkg->installed_size);
++ } else {
++ /* Caculate installed files size */
++ str_list_elt_t *iter;
++ struct stat buf;
++ int installed_files_length = 0;
++ if (pkg->installed_files == NULL)
++ break;
++
++ if (pkg->is_processing!=1)
++ break;
++
++ for (iter = pkg->installed_files->head; iter; iter = iter->next) {
++ memset(&buf, 0, sizeof(struct stat));
++ stat(iter->data, &buf);
++ if (S_ISREG(buf.st_mode))
++ installed_files_length += buf.st_size;
++ }
++ /*printf("installed_files_length:%d\n", installed_files_length);*/
++
++ sprintf_alloc(&pkg->installed_size, "%d", installed_files_length);
++ temp = (char *)realloc(temp,strlen(pkg->installed_size)+18);
++ if ( temp == NULL ){
++ fprintf(stderr, "%s: out of memory\n", __FUNCTION__);
++ return NULL;
++ }
++ temp[0]='\0';
++ snprintf(temp, (strlen(pkg->installed_size)+18), "Installed-Size: %s\n", pkg->installed_size);
++ }
+ } else if (strcasecmp(field, "Installed-Time") == 0 && pkg->installed_time) {
+ temp = (char *)realloc(temp,29);
+ if ( temp == NULL ){
+@@ -720,7 +753,7 @@
+ return NULL;
+ }
+ temp[0]='\0';
+- snprintf(temp, (strlen(pkg->maintainer)+14), "maintainer: %s\n", pkg->maintainer);
++ snprintf(temp, (strlen(pkg->maintainer)+14), "Maintainer: %s\n", pkg->maintainer);
+ }
+ } else if (strcasecmp(field, "MD5sum") == 0) {
+ /* MD5sum */
+@@ -871,6 +904,24 @@
+ }
+ temp[0]='\0';
+ snprintf(temp, (strlen(pkg->size)+8), "Size: %s\n", pkg->size);
++ } else {
++ if ( pkg->local_filename ) {
++ struct stat buf;
++ memset(&buf, 0, sizeof(struct stat));
++
++ if ( stat(pkg->local_filename, &buf) == 0 ) {
++
++ sprintf_alloc(&pkg->size, "%d", buf.st_size);
++ temp = (char *)realloc(temp, strlen(pkg->size)+8);
++ if ( temp == NULL ){
++ fprintf(stderr, "%s: out of memory\n", __FUNCTION__);
++ return NULL;
++ }
++ temp[0]='\0';
++ snprintf(temp, (strlen(pkg->size)+8), "Size: %s\n", pkg->size);
++ }
++ }
++
+ }
+ } else if (strcasecmp(field, "Source") == 0) {
+ /* Source */
+@@ -1016,6 +1067,12 @@
+ pkg_print_field(pkg, file, "Essential"); /* @@@@ should be removed in future release. */
+ pkg_print_field(pkg, file, "Architecture");
+ pkg_print_field(pkg, file, "Conffiles");
++ pkg_print_field(pkg, file, "Description");
++ pkg_print_field(pkg, file, "Maintainer");
++ pkg_print_field(pkg, file, "Section");
++ pkg_print_field(pkg, file, "Size");
++ pkg_print_field(pkg, file, "Filename");
++ pkg_print_field(pkg, file, "Installed-Size");
+ pkg_print_field(pkg, file, "Installed-Time");
+ fputs("\n", file);
+ }
+diff -Nur ipkg-0.99.163.orig/pkg.h ipkg-0.99.163/pkg.h
+--- ipkg-0.99.163.orig/pkg.h 2006-05-30 16:31:08.000000000 +0800
++++ ipkg-0.99.163/pkg.h 2007-03-15 08:01:20.000000000 +0800
+@@ -176,6 +176,10 @@
+ int arch_priority;
+ /* Adding this flag, to "force" ipkg to choose a "provided_by_hand" package, if there are multiple choice */
+ int provided_by_hand;
++
++ /* Check whether this pkg is being removed or installed */
++ int is_processing;
++
+ };
+
+ pkg_t *pkg_new(void);
+
diff --git a/recipes/ipkg/files/libdir.patch b/recipes/ipkg/files/libdir.patch
new file mode 100644
index 0000000000..38f0b4d286
--- /dev/null
+++ b/recipes/ipkg/files/libdir.patch
@@ -0,0 +1,11 @@
+--- C/ipkg.h.in.old 2005-04-02 17:11:02.762413624 +0100
++++ C/ipkg.h.in 2005-04-02 17:11:06.314873568 +0100
+@@ -36,7 +36,7 @@
+ #define IPKG_LEGAL_PKG_NAME_CHARS "abcdefghijklmnopqrstuvwxyz0123456789.+-"
+ #define IPKG_PKG_VERSION_SEP_CHAR '_'
+
+-#define IPKG_STATE_DIR_PREFIX LIBDIR"/ipkg"
++#define IPKG_STATE_DIR_PREFIX "/usr/lib/ipkg"
+ #define IPKG_LISTS_DIR_SUFFIX "lists"
+ #define IPKG_INFO_DIR_SUFFIX "info"
+ #define IPKG_STATUS_FILE_SUFFIX "status"
diff --git a/recipes/ipkg/files/lonk-link-name.patch b/recipes/ipkg/files/lonk-link-name.patch
new file mode 100644
index 0000000000..14fc73a5ac
--- /dev/null
+++ b/recipes/ipkg/files/lonk-link-name.patch
@@ -0,0 +1,38 @@
+--- ipkg-0.99.163/libbb/unarchive.c.orig 2007-10-04 12:39:42.000000000 +0200
++++ ipkg-0.99.163/libbb/unarchive.c 2007-10-04 12:41:28.000000000 +0200
+@@ -595,10 +595,6 @@
+ if (longname) {
+ tar_entry->name = longname;
+ longname = NULL;
+- }
+- else if (linkname) {
+- tar_entry->name = linkname;
+- linkname = NULL;
+ } else
+ #endif
+ if (tar.formated.prefix[0] == 0) {
+@@ -606,6 +602,15 @@
+ } else {
+ tar_entry->name = concat_path_file(tar.formated.prefix, tar.formated.name);
+ }
++
++#ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS
++ if (linkname) {
++ tar_entry->link_name = linkname;
++ linkname = NULL;
++ } else
++#endif
++ tar_entry->link_name = strlen(tar.formated.linkname) ?
++ xstrdup(tar.formated.linkname) : NULL;
+
+ // tar_entry->name = xstrdup(tar.formated.name);
+
+@@ -618,8 +623,6 @@
+ tar_entry->gid = strtol(tar.formated.gid, NULL, 8);
+ tar_entry->size = strtol(tar.formated.size, NULL, 8);
+ tar_entry->mtime = strtol(tar.formated.mtime, NULL, 8);
+- tar_entry->link_name = strlen(tar.formated.linkname) ?
+- xstrdup(tar.formated.linkname) : NULL;
+ tar_entry->device = (strtol(tar.formated.devmajor, NULL, 8) << 8) +
+ strtol(tar.formated.devminor, NULL, 8);
+
diff --git a/recipes/ipkg/files/terse.patch b/recipes/ipkg/files/terse.patch
new file mode 100644
index 0000000000..3c4d6bed7e
--- /dev/null
+++ b/recipes/ipkg/files/terse.patch
@@ -0,0 +1,18 @@
+
+#
+# Patch managed by http://www.holgerschurig.de/patcher.html
+#
+
+--- C/ipkg_cmd.c~terse
++++ C/ipkg_cmd.c
+@@ -148,9 +146,7 @@
+ int result;
+ p_userdata = userdata;
+ result = (cmd->fun)(conf, argc, argv);
+- if ( result == 0 ) {
+- ipkg_message(conf, IPKG_NOTICE, "Successfully terminated.\n");
+- } else {
++ if ( result != 0 ) {
+ ipkg_message(conf, IPKG_NOTICE, "An error ocurred, return value: %d.\n", result);
+ }
+
diff --git a/recipes/ipkg/files/uclibc.patch b/recipes/ipkg/files/uclibc.patch
new file mode 100644
index 0000000000..d0d3a3ff7c
--- /dev/null
+++ b/recipes/ipkg/files/uclibc.patch
@@ -0,0 +1,13 @@
+Index: C/libbb/libbb.h
+===================================================================
+--- C.orig/libbb/libbb.h 2003-02-24 10:31:52.000000000 -0500
++++ C/libbb/libbb.h 2005-01-20 03:07:10.031420944 -0500
+@@ -340,7 +340,7 @@
+ #define CONSOLE_DEV "/dev/console"
+
+ /* Cope with mmu-less systems somewhat gracefully */
+-#if defined(__UCLIBC__) && !defined(__UCLIBC_HAS_MMU__)
++#if defined(__UCLIBC__) && !defined(__ARCH_HAS_MMU__)
+ #define fork vfork
+ #endif
+
diff --git a/recipes/ipkg/files/uninclude-replace.patch b/recipes/ipkg/files/uninclude-replace.patch
new file mode 100644
index 0000000000..a3ed2201fd
--- /dev/null
+++ b/recipes/ipkg/files/uninclude-replace.patch
@@ -0,0 +1,10 @@
+--- C/includes.h 2003-03-28 19:36:22.000000000 +0000
++++ C/includes.h 2004-07-28 03:41:11.000000000 +0100
+@@ -48,6 +48,6 @@
+ # include <unistd.h>
+ #endif
+
+-#include "replace/replace.h"
++//#include "replace/replace.h"
+
+ #endif
diff --git a/recipes/ipkg/files/update_version_comparision.patch b/recipes/ipkg/files/update_version_comparision.patch
new file mode 100644
index 0000000000..b0d0df525b
--- /dev/null
+++ b/recipes/ipkg/files/update_version_comparision.patch
@@ -0,0 +1,84 @@
+Update the version comparision to a more recent one from dpkg. This
+means it now recognises 0.0-foo > 0.0+foo as it should.
+
+RP - 19/02/2008
+
+Index: ipkg-0.99.163/pkg.c
+===================================================================
+--- ipkg-0.99.163.orig/pkg.c 2008-02-18 11:24:45.000000000 +0000
++++ ipkg-0.99.163/pkg.c 2008-02-19 00:24:50.000000000 +0000
+@@ -1128,43 +1130,37 @@
+ return r;
+ }
+
+-int verrevcmp(const char *val, const char *ref)
+-{
+- int vc, rc;
+- long vl, rl;
+- const char *vp, *rp;
+- const char *vsep, *rsep;
+-
+- if (!val) val= "";
+- if (!ref) ref= "";
+- for (;;) {
+- vp= val; while (*vp && !isdigit(*vp)) vp++;
+- rp= ref; while (*rp && !isdigit(*rp)) rp++;
+- for (;;) {
+- vc= (val == vp) ? 0 : *val++;
+- rc= (ref == rp) ? 0 : *ref++;
+- if (!rc && !vc) break;
+- if (vc && !isalpha(vc)) vc += 256; /* assumes ASCII character set */
+- if (rc && !isalpha(rc)) rc += 256;
+- if (vc != rc) return vc - rc;
+- }
+- val= vp;
+- ref= rp;
+- vl=0; if (isdigit(*vp)) vl= strtol(val,(char**)&val,10);
+- rl=0; if (isdigit(*rp)) rl= strtol(ref,(char**)&ref,10);
+- if (vl != rl) return vl - rl;
+-
+- vc = *val;
+- rc = *ref;
+- vsep = strchr(".-", vc);
+- rsep = strchr(".-", rc);
+- if (vsep && !rsep) return -1;
+- if (!vsep && rsep) return +1;
+-
+- if (!*val && !*ref) return 0;
+- if (!*val) return -1;
+- if (!*ref) return +1;
+- }
++/* assume ascii; warning: evaluates x multiple times! */
++#define order(x) ((x) == '~' ? -1 \
++ : isdigit((x)) ? 0 \
++ : !(x) ? 0 \
++ : isalpha((x)) ? (x) \
++ : (x) + 256)
++
++static int verrevcmp(const char *val, const char *ref) {
++ if (!val) val= "";
++ if (!ref) ref= "";
++
++ while (*val || *ref) {
++ int first_diff= 0;
++
++ while ( (*val && !isdigit(*val)) || (*ref && !isdigit(*ref)) ) {
++ int vc= order(*val), rc= order(*ref);
++ if (vc != rc) return vc - rc;
++ val++; ref++;
++ }
++
++ while ( *val == '0' ) val++;
++ while ( *ref == '0' ) ref++;
++ while (isdigit(*val) && isdigit(*ref)) {
++ if (!first_diff) first_diff= *val - *ref;
++ val++; ref++;
++ }
++ if (isdigit(*val)) return 1;
++ if (isdigit(*ref)) return -1;
++ if (first_diff) return first_diff;
++ }
++ return 0;
+ }
+
+ int pkg_version_satisfied(pkg_t *it, pkg_t *ref, const char *op)