summaryrefslogtreecommitdiffstats
path: root/src/package.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/package.c')
-rw-r--r--src/package.c37
1 files changed, 26 insertions, 11 deletions
diff --git a/src/package.c b/src/package.c
index 3d23306..9496742 100644
--- a/src/package.c
+++ b/src/package.c
@@ -717,42 +717,57 @@ finish:
return r;
}
-const char *package_get_item(struct package* p, const char *name, int c) {
+int package_get_item(struct package* p, const char *name, int c, const char ** fn) {
struct package_item *i;
char path[PATH_MAX];
assert(p && name);
for (i = p->items; i; i = i->next)
- if (!strncmp(name, i->name, PACKAGE_ITEMNAMELEN))
- return i->path;
+ if (!strncmp(name, i->name, PACKAGE_ITEMNAMELEN)) {
+ if (fn)
+ *fn = i->path;
+
+ return 1;
+ }
for (;;) {
int r;
if ((r = read_item(p)) < 0)
- return NULL;
+ return -1;
- if (r == 0)
+ if (!r)
break;
assert(p->last);
- if (!strncmp(name, p->last->name, PACKAGE_ITEMNAMELEN))
- return p->last->path;
+ if (!strncmp(name, p->last->name, PACKAGE_ITEMNAMELEN)) {
+ if (fn)
+ *fn = p->last->path;
+
+ return 1;
+ }
}
if (!c)
- return NULL;
+ return 0;
snprintf(path, sizeof(path), "%s/%i", p->base, p->count++);
if (!(i = item_new(name, path, 1))) {
unlink(path);
- return NULL;
+ return -1;
}
-
+
append_item(p, i);
+
+ assert(i);
+
+ assert(fn);
- return i->path;
+ if (fn)
+ *fn = i->path;
+
+ return 1;
}
int package_add_file(struct package *p, const char *name, const char *fn) {