[pacman-dev] [PATCH] Copy pmdelta_t objects in _alpm_pkg_dup().

Dan McGee dpmcgee at gmail.com
Mon Oct 29 22:00:47 EDT 2007


On 10/29/07, Nathan Jones <nathanj at insightbb.com> wrote:
> _alpm_pkg_dup() should create copies of all objects inside the pmpkg_t
> struct. I missed this function when adding the delta list to pmpkg_t.
>
> Signed-off-by: Nathan Jones <nathanj at insightbb.com>


How about this instead?

diff --git a/lib/libalpm/alpm_list.c b/lib/libalpm/alpm_list.c
index 2301411..6487753 100644
--- a/lib/libalpm/alpm_list.c
+++ b/lib/libalpm/alpm_list.c
@@ -361,8 +361,6 @@ alpm_list_t SYMEXPORT
*alpm_list_remove_dupes(const alpm_list_t *list)
 /**
  * @brief Copy a string list, including data.
  *
- * This is gross, assumes string data members.
- *
  * @param list the list to copy
  *
  * @return a copy of the original list
@@ -397,6 +395,30 @@ alpm_list_t SYMEXPORT *alpm_list_copy(const
alpm_list_t *list)
 }

 /**
+ * @brief Copy a list and copy the data.
+ *
+ * The data must be constant size!
+ *
+ * @param list the list to copy
+ *
+ * @return a copy of the original list, data copied as well
+ */
+alpm_list_t SYMEXPORT *alpm_list_copy_data(const alpm_list_t *list)
+{
+	const alpm_list_t *lp = list;
+	alpm_list_t *newlist = NULL;
+	while(lp) {
+		void *newdata = calloc(1, sizeof(lp->data));
+		if(newdata) {
+			memcpy(newdata, lp->data, sizeof(lp->data));
+			newlist = alpm_list_add(newlist, newdata);
+			lp = lp->next;
+		}
+	}
+	return(newlist);
+}
+
+/**
  * @brief Create a new list in reverse order.
  *
  * @param list the list to copy
diff --git a/lib/libalpm/alpm_list.h b/lib/libalpm/alpm_list.h
index 8fce280..addf950 100644
--- a/lib/libalpm/alpm_list.h
+++ b/lib/libalpm/alpm_list.h
@@ -61,6 +61,7 @@ alpm_list_t *alpm_list_remove_node(alpm_list_t *node);
 alpm_list_t *alpm_list_remove_dupes(const alpm_list_t *list);
 alpm_list_t *alpm_list_strdup(const alpm_list_t *list);
 alpm_list_t *alpm_list_copy(const alpm_list_t *list);
+alpm_list_t *alpm_list_copy_data(const alpm_list_t *list);
 alpm_list_t *alpm_list_reverse(alpm_list_t *list);

 /* item accessors */
diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c
index 9c166a5..5103a38 100644
--- a/lib/libalpm/package.c
+++ b/lib/libalpm/package.c
@@ -46,6 +46,7 @@
 #include "error.h"
 #include "db.h"
 #include "cache.h"
+#include "delta.h"
 #include "provide.h"
 #include "handle.h"
 #include "alpm.h"
@@ -703,6 +704,7 @@ pmpkg_t *_alpm_pkg_dup(pmpkg_t *pkg)
 	newpkg->groups     = alpm_list_strdup(alpm_pkg_get_groups(pkg));
 	newpkg->provides   = alpm_list_strdup(alpm_pkg_get_provides(pkg));
 	newpkg->replaces   = alpm_list_strdup(alpm_pkg_get_replaces(pkg));
+	newpkg->deltas     = alpm_list_copy_data(alpm_pkg_get_deltas(pkg));
 	/* internal */
 	if(newpkg->origin == PKG_FROM_FILE) {
 		newpkg->origin_data.file = strdup(pkg->origin_data.file);




More information about the pacman-dev mailing list