mirror of https://github.com/pygos/pkg-utils.git
Add package header with dependency information
Signed-off-by: David Oberhollenzer <goliath@infraroot.at>master
parent
47e237688b
commit
aab510aa98
@ -0,0 +1,113 @@
|
||||
#include "pack.h"
|
||||
|
||||
static int handle_requires(input_file_t *f, pkg_desc_t *desc)
|
||||
{
|
||||
char *ptr = f->line, *end;
|
||||
dependency_t *dep;
|
||||
size_t len;
|
||||
|
||||
while (*ptr != '\0') {
|
||||
while (isspace(*ptr))
|
||||
++ptr;
|
||||
end = ptr;
|
||||
while (*end != '\0' && !isspace(*end))
|
||||
++end;
|
||||
|
||||
len = end - ptr;
|
||||
if (len == 0)
|
||||
break;
|
||||
|
||||
if (len > 0xFF) {
|
||||
fprintf(stderr, "%s: %zu: dependency name too long\n",
|
||||
f->filename, f->linenum);
|
||||
return -1;
|
||||
}
|
||||
|
||||
dep = calloc(1, sizeof(*dep) + len + 1);
|
||||
if (dep == NULL) {
|
||||
fprintf(stderr, "%s: %zu: out of memory\n",
|
||||
f->filename, f->linenum);
|
||||
return -1;
|
||||
}
|
||||
|
||||
memcpy(dep->name, ptr, len);
|
||||
dep->type = PKG_DEPENDENCY_REQUIRES;
|
||||
dep->next = desc->deps;
|
||||
desc->deps = dep;
|
||||
|
||||
ptr = end;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct {
|
||||
const char *name;
|
||||
int (*handle)(input_file_t *f, pkg_desc_t *desc);
|
||||
} line_hooks[] = {
|
||||
{ "requires", handle_requires },
|
||||
};
|
||||
|
||||
#define NUM_LINE_HOOKS (sizeof(line_hooks) / sizeof(line_hooks[0]))
|
||||
|
||||
int desc_read(const char *path, pkg_desc_t *desc)
|
||||
{
|
||||
input_file_t f;
|
||||
size_t i, len;
|
||||
char *ptr;
|
||||
int ret;
|
||||
|
||||
memset(desc, 0, sizeof(*desc));
|
||||
|
||||
if (open_file(&f, path))
|
||||
return -1;
|
||||
|
||||
for (;;) {
|
||||
ret = prefetch_line(&f);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
if (ret > 0)
|
||||
break;
|
||||
|
||||
ptr = f.line;
|
||||
|
||||
for (i = 0; i < NUM_LINE_HOOKS; ++i) {
|
||||
len = strlen(line_hooks[i].name);
|
||||
|
||||
if (strncmp(ptr, line_hooks[i].name, len) != 0)
|
||||
continue;
|
||||
if (!isspace(ptr[len]) && ptr[len] != '\0')
|
||||
continue;
|
||||
for (ptr += len; isspace(*ptr); ++ptr)
|
||||
;
|
||||
memmove(f.line, ptr, strlen(ptr) + 1);
|
||||
break;
|
||||
}
|
||||
|
||||
if (i == NUM_LINE_HOOKS) {
|
||||
fprintf(stderr, "%s: %zu: unknown description field\n",
|
||||
f.filename, f.linenum);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
ret = line_hooks[i].handle(&f, desc);
|
||||
if (ret)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
return 0;
|
||||
fail:
|
||||
return -1;
|
||||
}
|
||||
|
||||
void desc_free(pkg_desc_t *desc)
|
||||
{
|
||||
dependency_t *dep;
|
||||
|
||||
while (desc->deps != NULL) {
|
||||
dep = desc->deps;
|
||||
desc->deps = dep->next;
|
||||
|
||||
free(dep);
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
#include "pack.h"
|
||||
|
||||
int write_header_data(pkg_writer_t *wr, pkg_desc_t *desc)
|
||||
{
|
||||
pkg_dependency_t pkgdep;
|
||||
size_t dep_count = 0;
|
||||
dependency_t *dep;
|
||||
pkg_header_t hdr;
|
||||
|
||||
for (dep = desc->deps; dep != NULL; dep = dep->next)
|
||||
dep_count += 1;
|
||||
|
||||
if (dep_count > 0xFFFF) {
|
||||
fputs("too many package dependencies\n", stderr);
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(&hdr, 0, sizeof(hdr));
|
||||
hdr.num_depends = htole16(dep_count);
|
||||
|
||||
if (pkg_writer_write_payload(wr, &hdr, sizeof(hdr)))
|
||||
return -1;
|
||||
|
||||
for (dep = desc->deps; dep != NULL; dep = dep->next) {
|
||||
memset(&pkgdep, 0, sizeof(pkgdep));
|
||||
|
||||
pkgdep.type = dep->type;
|
||||
pkgdep.name_length = strlen(dep->name);
|
||||
|
||||
if (pkg_writer_write_payload(wr, &pkgdep, sizeof(pkgdep)))
|
||||
return -1;
|
||||
|
||||
if (pkg_writer_write_payload(wr, dep->name,
|
||||
pkgdep.name_length)) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return pkg_writer_end_record(wr);
|
||||
}
|
Loading…
Reference in New Issue