From da5e6ec8e52271f742ff77d565316aa7e59a17bb Mon Sep 17 00:00:00 2001 From: obarun <eric@obarun.org> Date: Sat, 18 Apr 2020 11:17:00 +1100 Subject: [PATCH] rename resolve.c to ss_resolve.c, implement module, add ss_resolve_sort_bytype --- src/lib66/{resolve.c => ss_resolve.c} | 121 ++++++++++++++++++++------ 1 file changed, 94 insertions(+), 27 deletions(-) rename src/lib66/{resolve.c => ss_resolve.c} (91%) diff --git a/src/lib66/resolve.c b/src/lib66/ss_resolve.c similarity index 91% rename from src/lib66/resolve.c rename to src/lib66/ss_resolve.c index 5604155d..46e98f79 100644 --- a/src/lib66/resolve.c +++ b/src/lib66/ss_resolve.c @@ -1,5 +1,5 @@ /* - * resolve.c + * ss_resolve.c * * Copyright (c) 2018-2020 Eric Vidal <eric@obarun.org> * @@ -17,7 +17,7 @@ #include <stdint.h> #include <stdlib.h>//realpath #include <sys/types.h> -//#include <stdio.h> +#include <stdio.h> #include <oblibs/types.h> #include <oblibs/log.h> @@ -426,6 +426,7 @@ int ss_resolve_pack(stralloc *sa, ss_resolve_t *res) !ss_resolve_add_uint32(sa,res->deps) || !ss_resolve_add_uint32(sa,res->optsdeps) || !ss_resolve_add_uint32(sa,res->extdeps) || + !ss_resolve_add_uint32(sa,res->contents) || !ss_resolve_add_uint32(sa,res->src) || !ss_resolve_add_uint32(sa,res->srconf) || !ss_resolve_add_uint32(sa,res->live) || @@ -439,6 +440,7 @@ int ss_resolve_pack(stralloc *sa, ss_resolve_t *res) !ss_resolve_add_uint32(sa,res->ndeps) || !ss_resolve_add_uint32(sa,res->noptsdeps) || !ss_resolve_add_uint32(sa,res->nextdeps) || + !ss_resolve_add_uint32(sa,res->ncontents) || !ss_resolve_add_uint32(sa,res->down) || !ss_resolve_add_uint32(sa,res->disen)) return 0 ; @@ -513,6 +515,8 @@ int ss_resolve_read(ss_resolve_t *res, char const *src, char const *name) global += 4 ; uint32_unpack_big(sa.s + global,&res->extdeps) ; global += 4 ; + uint32_unpack_big(sa.s + global,&res->contents) ; + global += 4 ; uint32_unpack_big(sa.s + global,&res->src) ; global += 4 ; uint32_unpack_big(sa.s + global,&res->srconf) ; @@ -541,6 +545,8 @@ int ss_resolve_read(ss_resolve_t *res, char const *src, char const *name) global += 4 ; uint32_unpack_big(sa.s + global,&res->nextdeps) ; global += 4 ; + uint32_unpack_big(sa.s + global,&res->ncontents) ; + global += 4 ; uint32_unpack_big(sa.s + global,&res->down) ; global += 4 ; uint32_unpack_big(sa.s + global,&res->disen) ; @@ -586,14 +592,13 @@ int ss_resolve_check(char const *src, char const *name) int ss_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst) { char ownerstr[UID_FMT] ; - size_t ownerlen = uid_fmt(ownerstr,info->owner) ; + size_t ownerlen = uid_fmt(ownerstr,info->owner), id, nid ; ownerstr[ownerlen] = 0 ; stralloc destlog = STRALLOC_ZERO ; stralloc ndeps = STRALLOC_ZERO ; - stralloc opt_deps = STRALLOC_ZERO ; - stralloc ext_deps = STRALLOC_ZERO ; - + stralloc other_deps = STRALLOC_ZERO ; + ss_state_t sta = STATE_ZERO ; ss_resolve_t res = RESOLVE_ZERO ; ss_resolve_init(&res) ; @@ -645,6 +650,7 @@ int ss_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst) res.ndeps = services->cname.nga ; res.noptsdeps = services->cname.nopts ; res.nextdeps = services->cname.next ; + res.ncontents = services->cname.ncontents ; if (services->flags[0]) res.down = 1 ; res.disen = 1 ; if (res.type == TYPE_CLASSIC) @@ -678,10 +684,9 @@ int ss_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst) if (!ss_state_write(&sta,res.sa.s + res.state,name)){ log_warnusys("write state file of: ",name) ; goto err ; } } - if (res.ndeps) { - size_t id = services->cname.idga, nid = res.ndeps ; + id = services->cname.idga, nid = res.ndeps ; for (;nid; id += strlen(deps.s + id) + 1, nid--) { if (!stralloc_catb(&ndeps,deps.s + id,strlen(deps.s + id)) || @@ -691,31 +696,48 @@ int ss_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst) if (!stralloc_0(&ndeps)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; res.deps = ss_resolve_add_string(&res,ndeps.s) ; } - + if (res.noptsdeps) { - size_t id = services->cname.idopts, nid = res.noptsdeps ; + id = services->cname.idopts, nid = res.noptsdeps ; for (;nid; id += strlen(deps.s + id) + 1, nid--) { - if (!stralloc_catb(&opt_deps,deps.s + id,strlen(deps.s + id)) || - !stralloc_catb(&opt_deps," ",1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; + if (!stralloc_catb(&other_deps,deps.s + id,strlen(deps.s + id)) || + !stralloc_catb(&other_deps," ",1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; } - opt_deps.len-- ; - if (!stralloc_0(&opt_deps)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; - res.optsdeps = ss_resolve_add_string(&res,opt_deps.s) ; + other_deps.len-- ; + if (!stralloc_0(&other_deps)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; + res.optsdeps = ss_resolve_add_string(&res,other_deps.s) ; } + if (res.nextdeps) { - size_t id = services->cname.idext, nid = res.nextdeps ; + other_deps.len = 0 ; + id = services->cname.idext, nid = res.nextdeps ; for (;nid; id += strlen(deps.s + id) + 1, nid--) { - if (!stralloc_catb(&ext_deps,deps.s + id,strlen(deps.s + id)) || - !stralloc_catb(&ext_deps," ",1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; + if (!stralloc_catb(&other_deps,deps.s + id,strlen(deps.s + id)) || + !stralloc_catb(&other_deps," ",1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; } - ext_deps.len-- ; - if (!stralloc_0(&ext_deps)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; - res.extdeps = ss_resolve_add_string(&res,ext_deps.s) ; + other_deps.len-- ; + if (!stralloc_0(&other_deps)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; + res.extdeps = ss_resolve_add_string(&res,other_deps.s) ; } + + if (res.ncontents) + { + other_deps.len = 0 ; + id = services->cname.idcontents, nid = res.ncontents ; + for (;nid; id += strlen(deps.s + id) + 1, nid--) + { + if (!stralloc_catb(&other_deps,deps.s + id,strlen(deps.s + id)) || + !stralloc_catb(&other_deps," ",1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; + } + other_deps.len-- ; + if (!stralloc_0(&other_deps)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; + res.contents = ss_resolve_add_string(&res,other_deps.s) ; + } + if (services->opts[0]) { // destination of the logger @@ -769,7 +791,7 @@ int ss_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst) if (!ss_resolve_setlognwrite(&res,dst,info)) goto err ; } } - /** may on workdir so a copy with made to source, write it SIMPLE */ + if (!ss_resolve_write(&res,dst,res.sa.s + res.name)) { log_warnusys("write resolve file: ",dst,SS_RESOLVE,"/",res.sa.s + res.name) ; @@ -777,17 +799,15 @@ int ss_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst) } ss_resolve_free(&res) ; - stralloc_free(&opt_deps) ; - stralloc_free(&ext_deps) ; stralloc_free(&ndeps) ; + stralloc_free(&other_deps) ; stralloc_free(&destlog) ; return 1 ; err: ss_resolve_free(&res) ; - stralloc_free(&opt_deps) ; - stralloc_free(&ext_deps) ; stralloc_free(&ndeps) ; + stralloc_free(&other_deps) ; stralloc_free(&destlog) ; return 0 ; } @@ -883,6 +903,7 @@ int ss_resolve_copy(ss_resolve_t *dst,ss_resolve_t *res) dst->deps = res->deps ; dst->optsdeps = res->optsdeps ; dst->extdeps = res->extdeps ; + dst->contents = res->contents ; dst->src = res->src ; dst->srconf = res->srconf ; dst->live = res->live ; @@ -896,6 +917,7 @@ int ss_resolve_copy(ss_resolve_t *dst,ss_resolve_t *res) dst->ndeps = res->ndeps ; dst->noptsdeps = res->noptsdeps ; dst->nextdeps = res->nextdeps ; + dst->ncontents = res->ncontents ; dst->down = res->down ; dst->disen = res->disen ; @@ -940,7 +962,7 @@ int ss_resolve_add_deps(genalloc *tokeep,ss_resolve_t *res, char const *src) if (!ss_resolve_cmp(tokeep,dname)) { if (!ss_resolve_append(tokeep,&dres)) goto err ; - } + } ss_resolve_free(&dres) ; } } @@ -1251,3 +1273,48 @@ int ss_resolve_write_master(ssexec_t *info,ss_resolve_graph_t *graph,char const stralloc_free(&gain) ; return 0 ; } + +int ss_resolve_sort_bytype(genalloc *gares,stralloc *list,char const *src) +{ + size_t pos = 0 ; + ss_resolve_t res = RESOLVE_ZERO ; + + /** search for classic first */ + for (pos = 0 ;pos < list->len; pos += strlen(list->s + pos) + 1) + { + char *name = list->s + pos ; + if (!ss_resolve_read(&res,src,name)) + log_warnu_return(LOG_EXIT_ZERO,"read resolve file of: ",name) ; + if (res.type == TYPE_CLASSIC) + if (ss_resolve_search(gares,name) == -1) + if (!ss_resolve_append(gares,&res)) + log_warnu_return(LOG_EXIT_ZERO,"append genalloc") ; + } + + /** second pass for module */ + for (pos = 0 ;pos < list->len; pos += strlen(list->s + pos) + 1) + { + char *name = list->s + pos ; + if (!ss_resolve_read(&res,src,name)) + log_warnu_return(LOG_EXIT_ZERO,"read resolve file of: ",name) ; + if (res.type == TYPE_MODULE) + if (ss_resolve_search(gares,name) == -1) + if (!ss_resolve_append(gares,&res)) + log_warnu_return(LOG_EXIT_ZERO,"append genalloc") ; + } + + /** finally add s6-rc services */ + for (pos = 0 ;pos < list->len; pos += strlen(list->s + pos) + 1) + { + char *name = list->s + pos ; + if (!ss_resolve_read(&res,src,name)) + log_warnu_return(LOG_EXIT_ZERO,"read resolve file of: ",name) ; + if (res.type != TYPE_CLASSIC && res.type != TYPE_MODULE) + if (ss_resolve_search(gares,name) == -1) + if (!ss_resolve_append(gares,&res)) + log_warnu_return(LOG_EXIT_ZERO,"append genalloc") ; + } + + ss_resolve_free(&res) ; + return 1 ; +} -- GitLab