package

simple and robust package manager
Log | Files | Refs | README

commit 30c5bd25f2a2858f72375399fda1782a7cfb890c
parent 3d5f0823b3d6b56bedb89b4b7260bb242f8bfd8f
Author: Josuah Demangeon <mail@josuah.net>
Date:   Sun, 13 Jan 2019 11:07:57 +0100

stralloc_0 -> stralloc_cat0

Diffstat:
Mfs.c | 6+++---
Mpack-get.c | 4++--
Apack-tree.c | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mpack.c | 35+++++++++++++++++------------------
Mstralloc.h | 2+-
5 files changed, 107 insertions(+), 24 deletions(-)

diff --git a/fs.c b/fs.c @@ -130,7 +130,7 @@ fs_remove_r_recurse(stralloc *sa) sa->n = n; if (!stralloc_cats(sa, de->d_name)) break; - if (!stralloc_0(sa)) break; + if (!stralloc_cat0(sa)) break; if (lstat(sa->x, &st) == -1) break; sa->n--; @@ -183,11 +183,11 @@ fs_copy_r_recurse(stralloc *from, stralloc *to, int action) to->n = to_n; if (!stralloc_cats(to, de->d_name)) break; - if (!stralloc_0(to)) break; + if (!stralloc_cat0(to)) break; from->n = from_n; if (!stralloc_cats(from, de->d_name)) break; - if (!stralloc_0(from)) break; + if (!stralloc_cat0(from)) break; if (lstat(from->x, &st) == -1) break; if (S_ISDIR(st.st_mode)) { diff --git a/pack-get.c b/pack-get.c @@ -70,7 +70,7 @@ main(int argc, char **argv) if (!stralloc_cats(&sa, "/")) die_nomem(); if (!stralloc_cats(&sa, p.ver)) die_nomem(); if (!stralloc_cats(&sa, "/uri")) die_nomem(); - if (!stralloc_0(&sa)) die_nomem(); + if (!stralloc_cat0(&sa)) die_nomem(); fd = open_read(sa.x); if (fd == -1) die_nomem(); stralloc_zero(&sa); @@ -79,7 +79,7 @@ main(int argc, char **argv) if (!stralloc_cats(&sa, p.name)) die_nomem(); if (!stralloc_cats(&sa, "/")) die_nomem(); if (!stralloc_cats(&sa, p.ver)) die_nomem(); - if (!stralloc_0(&sa)) die_nomem(); + if (!stralloc_cat0(&sa)) die_nomem(); if (!fs_mkdir_r(sa.x, 0750)) log_diesys2(101, "recursive mkdir:", sa.x); diff --git a/pack-tree.c b/pack-tree.c @@ -0,0 +1,84 @@ +#include "pack.h" +#include "stalloc.h" +#include "open.h" +#include "buffer.h" + +void +pack_tree(pack *p, stralloc *prefix) +{ + stralloc sa = STRALLOC_ZERO; + buffer b; + char buf[1024]; + ssize_t r; + int fd = -1; + int ret; + + if (!pack_version(p, def)) goto err; + + stralloc_init(&sa); + if (stralloc_cats(&sa, def)) goto err; + if (stralloc_cats(&sa, "/")) goto err; + if (stralloc_cats(&sa, p.name)) goto err; + if (stralloc_cats(&sa, "/")) goto err; + if (stralloc_cats(&sa, p.ver)) goto err; + if (stralloc_cats(&sa, "/dependencies")) goto err; + if (stralloc_cat0(&sa)) goto err; + + errno = 0; + fd = open_read(sa.x); + if (fd == -1) { ret = (errno != ENOENT); goto end; } + + buffer_put(buffer_1, prefix->x, sa->n); + buffer_puts(buffer_1, "\t"); + buffer_puts(buffer_1, pack.name); + buffer_puts(buffer_1, "/"); + buffer_puts(buffer_1, pack.ver); + buffer_puts(buffer_1, "\n"); + + buffer_init(&b, fd, &read, buf, sizeof buf); + while (stralloc_zero(&sa), (r = buffer_getline(buffer_, &sa))) + { + pack p; + size_t n; + + if (sa.x[sa.n] == '\n') sa.x[--sa.n] = '\0'; + if (line[pack_scan(&p, sa.x)] != '\0') goto err; + + n = prefix->n; + if (!stralloc_cats(prefix, "\t")) goto err; + if (!stralloc_cats(prefix, p.name)) goto err; + if (!stralloc_cats(prefix, "/")) goto err; + if (!stralloc_cats(prefix, p.ver)) goto err; + pack_tree(&p, prefix); + prefix->n = n; + } + if (r != 0) goto err; + + ret = 1; +err: + stralloc_free(&sa); + if (fd >= 0) close (fd); + return ret; +} + +int +main(int argc, char **argv) +{ + char *def; + stralloc *sa; + pack p; + + def = env_get("PACK_DEF"); if (!def) def = PACK_DEF; + if (!fs_isdir(def)) log_diesys1(101, def); + + if (argc != 2) log_usage(*argv, "package[/version]") + + if (!pack_scan(&p, argv)) + log_die2(1, "invalid package format: ", *argv); + + if (!pack_tree(&p, &sa, def)) + log_diesys(100, "generating tree for ", p.name, "/", p.version); + + buffer_flush(buffer_1); + return 0; +} diff --git a/pack.c b/pack.c @@ -75,7 +75,7 @@ pack_version(pack *p, char const *def) if (!stralloc_cats(&sa, "/")) goto err; if (!stralloc_cats(&sa, p->name)) goto err; if (!stralloc_cats(&sa, "/default/version")) goto err; - if (!stralloc_0(&sa)) goto err; + if (!stralloc_cat0(&sa)) goto err; fd = open_read(sa.x); if (fd == -1) goto err; @@ -141,7 +141,7 @@ pack_remove(pack const *p, char const *dir) if (!stralloc_cats(&sa, p->name)) goto err; if (!stralloc_cats(&sa, "/")) goto err; if (!stralloc_cats(&sa, p->ver)) goto err; - if (!stralloc_0(&sa)) goto err; + if (!stralloc_cat0(&sa)) goto err; errno = 0; if (!fs_remove_r(sa.x) && errno != ENOTDIR && errno != ENOENT) goto err; @@ -182,12 +182,12 @@ pack_step(pack const *p, char const *cmd, char const *log) if (!stralloc_cats(&sa, p->name)) goto err; if (!stralloc_cats(&sa, "/")) goto err; if (!stralloc_cats(&sa, p->ver)) goto err; - if (!stralloc_0(&sa)) goto err; + if (!stralloc_cat0(&sa)) goto err; sa.n--; if (!fs_mkdir_r(sa.x, 0640)) goto err; if (!stralloc_cats(&sa, "/")) goto err; if (!stralloc_cats(&sa, cmd)) goto err; - if (!stralloc_0(&sa)) goto err; + if (!stralloc_cat0(&sa)) goto err; argv[0] = cmd; pack_fmt(p, fmt); @@ -220,7 +220,7 @@ pack_dep(pack const *p, genalloc *packs, char const *def) pack new; size_t n; - stralloc_0(&sa); + stralloc_cat0(&sa); n = pack_scan(&new, sa.x); if (n == 0) goto err; if (sa.x[n] != '\n' && sa.x[n] != '\0') goto err; if (!pack_version(&new, def)) goto err; @@ -269,7 +269,7 @@ pack_patch(pack const *p, char *def) if (!stralloc_cats(&path, d[i])) goto err; if (!stralloc_cats(&path, "/patch/")) goto err; m = path.n; - if (!stralloc_0(&path)) goto err; + if (!stralloc_cat0(&path)) goto err; dp = opendir(path.x); if (dp == NULL) { if (errno == ENOTDIR || errno == ENOENT) continue; @@ -281,7 +281,7 @@ pack_patch(pack const *p, char *def) path.n = m; if (!stralloc_cats(&path, de->d_name)) goto err; - if (!stralloc_0(&path)) goto err; + if (!stralloc_cat0(&path)) goto err; if (fs_redir_read(0, path.x) == -1) goto err; if (forkexec_wait(argv) != 0) goto err; close(fd); @@ -309,7 +309,7 @@ pack_chdir(pack const *p, char const *src) if (!stralloc_cats(&path, p->name)) goto err; if (!stralloc_cats(&path, "/")) goto err; if (!stralloc_cats(&path, p->ver)) goto err; - if (!stralloc_0(&path)) goto err; + if (!stralloc_cat0(&path)) goto err; if (chdir(path.x) == -1) goto err; @@ -337,14 +337,14 @@ pack_build(pack const *p, char const *def) n = path.n; if (!stralloc_cats(&path, p->ver)) goto err; if (!stralloc_cats(&path, "/build")) goto err; - if (!stralloc_0(&path)) goto err; + if (!stralloc_cat0(&path)) goto err; execv(path.x, argv); if (!(errno == ENOTDIR || errno == ENOENT)) goto err; path.n = n; if (!stralloc_cats(&path, "default/build")) goto err; - if (!stralloc_0(&path)) goto err; + if (!stralloc_cat0(&path)) goto err; execv(path.x, argv); if (!(errno == ENOTDIR || errno == ENOENT)) goto err; @@ -370,14 +370,14 @@ pack_data(pack const *p, char const *def) if (!stralloc_cats(&sa, "/")) goto err; n = sa.n; if (!stralloc_cats(&sa, "default/data")) goto err; - if (!stralloc_0(&sa)) goto err; + if (!stralloc_cat0(&sa)) goto err; if (fs_isdir(sa.x)) if (!fs_copy_r(sa.x, ".")) goto err; sa.n = n; if (!stralloc_cats(&sa, p->ver)) goto err; if (!stralloc_cats(&sa, "/data")) goto err; - if (!stralloc_0(&sa)) goto err; + if (!stralloc_cat0(&sa)) goto err; if (fs_isdir(sa.x)) if (!fs_copy_r(sa.x, ".")) goto err; @@ -419,7 +419,7 @@ pack_env(pack *p, const char *def, const char *out) if (!stralloc_cats(&path, p->name)) goto err; if (!stralloc_cats(&path, "/")) goto err; if (!stralloc_cats(&path, p->ver)) goto err; - if (!stralloc_0(&path)) goto err; + if (!stralloc_cat0(&path)) goto err; if (!pack_envset("PREFIX", path.x)) goto err; errno = 0; @@ -431,19 +431,18 @@ pack_env(pack *p, const char *def, const char *out) while (stralloc_zero(&line), (r = buffer_getline(&b, &line)) > 0) { pack new; - if (!stralloc_0(&line)) goto err; - if (line.x[m] != '\n' && line.x[m] != '\0') goto err; + if (!stralloc_cat0(&line)) goto err; m = pack_scan(&new, line.x); if (m == 0) goto err; + if (line.x[m] != '\n' && line.x[m] != '\0') goto err; if (!pack_version(&new, def)) goto err; path.n = n; if (!stralloc_cats(&path, new.name)) goto err; if (!stralloc_cats(&path, "/")) goto err; if (!stralloc_cats(&path, new.ver)) goto err; - if (!stralloc_0(&path)) goto err; - pack_envset(new.name, path.x); + if (!stralloc_cat0(&path)) goto err; + if (!pack_envset(new.name, path.x)) goto err; } - ret = (r == 0); err: stralloc_free(&path); diff --git a/stralloc.h b/stralloc.h @@ -12,7 +12,7 @@ typedef struct stralloc { #define STRALLOC_ZERO { 0, 0, 0 } -#define stralloc_0(sa) stralloc_catb((sa), "", 1) +#define stralloc_cat0(sa) stralloc_catb((sa), "", 1) #define stralloc_cat(sa1, sa2) stralloc_catb((sa1), (sa2)->x, (sa2)->n) #define stralloc_catint(sa, i) stralloc_catlong0((sa), (i), 0) #define stralloc_catint0(sa, i, n) stralloc_catlong0((sa), (i), (n))