diff --git a/libpkg/pkg_ports.c b/libpkg/pkg_ports.c index 9c9bfa9..9d1c7bf 100644 --- a/libpkg/pkg_ports.c +++ b/libpkg/pkg_ports.c @@ -915,7 +915,6 @@ ports_parse_plist(struct pkg *pkg, char *plist, const char *stage) char *plist_buf, *walk, *buf, *token; int ret = EPKG_OK; off_t sz = 0; - struct hardlinks hardlinks = {NULL, 0, 0}; struct plist pplist; assert(pkg != NULL); @@ -937,7 +936,7 @@ ports_parse_plist(struct pkg *pkg, char *plist, const char *stage) pplist.pkg = pkg; pplist.slash = ""; pplist.ignore_next = false; - pplist.hardlinks = &hardlinks; + pplist.hardlinks = NULL; pplist.flatsize = 0; pplist.keywords = NULL; @@ -1023,7 +1022,7 @@ ports_parse_plist(struct pkg *pkg, char *plist, const char *stage) flush_script_buffer(pplist.post_upgrade_buf, pkg, PKG_SCRIPT_POST_UPGRADE); - free(hardlinks.inodes); + HASH_FREE(pplist.hardlinks, hardlinks, free); free(plist_buf); HASH_FREE(pplist.keywords, keyword, keyword_free); diff --git a/libpkg/private/utils.h b/libpkg/private/utils.h index f6cdd76..2bc199d 100644 --- a/libpkg/private/utils.h +++ b/libpkg/private/utils.h @@ -41,10 +41,14 @@ #define ERROR_SQLITE(db) \ pkg_emit_error("sqlite: %s (%s:%d)", sqlite3_errmsg(db), __FILE__, __LINE__) +#define HASH_FIND_INO(head,ino,out) \ + HASH_FIND(hh,head,ino,sizeof(ino_t),out) +#define HASH_ADD_INO(head,ino,add) \ + HASH_ADD(hh,head,ino,sizeof(ino_t),add) + struct hardlinks { ino_t *inodes; - size_t len; - size_t cap; + UT_hash_handle hh; }; struct dns_srvinfo { diff --git a/libpkg/utils.c b/libpkg/utils.c index d29d4bf..dee926f 100644 --- a/libpkg/utils.c +++ b/libpkg/utils.c @@ -392,19 +392,14 @@ is_conf_file(const char *path, char *newpath, size_t len) bool is_hardlink(struct hardlinks *hl, struct stat *st) { - size_t i; + struct hardlinks *h; - for (i = 0; i < hl->len; i++) { - if (hl->inodes[i] == st->st_ino) - return (false); - } - if (hl->cap <= hl->len) { - hl->cap |= 1; - hl->cap *= 2; - hl->inodes = reallocf(hl->inodes, - hl->cap * sizeof(ino_t)); - } - hl->inodes[hl->len++] = st->st_ino; + HASH_FIND_INO(hl, &st->st_ino, h); + if (h != NULL) + return false; + + h = malloc(sizeof(struct hardlinks)); + HASH_ADD_INO(hl, st->st_ino, h); return (true); }