Skip to content
Snippets Groups Projects
Commit da5e6ec8 authored by Eric Vidal's avatar Eric Vidal :speech_balloon:
Browse files

rename resolve.c to ss_resolve.c, implement module, add ss_resolve_sort_bytype

parent c4526fb9
Branches
Tags
No related merge requests found
/* /*
* resolve.c * ss_resolve.c
* *
* Copyright (c) 2018-2020 Eric Vidal <eric@obarun.org> * Copyright (c) 2018-2020 Eric Vidal <eric@obarun.org>
* *
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include <stdint.h> #include <stdint.h>
#include <stdlib.h>//realpath #include <stdlib.h>//realpath
#include <sys/types.h> #include <sys/types.h>
//#include <stdio.h> #include <stdio.h>
#include <oblibs/types.h> #include <oblibs/types.h>
#include <oblibs/log.h> #include <oblibs/log.h>
...@@ -426,6 +426,7 @@ int ss_resolve_pack(stralloc *sa, ss_resolve_t *res) ...@@ -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->deps) ||
!ss_resolve_add_uint32(sa,res->optsdeps) || !ss_resolve_add_uint32(sa,res->optsdeps) ||
!ss_resolve_add_uint32(sa,res->extdeps) || !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->src) ||
!ss_resolve_add_uint32(sa,res->srconf) || !ss_resolve_add_uint32(sa,res->srconf) ||
!ss_resolve_add_uint32(sa,res->live) || !ss_resolve_add_uint32(sa,res->live) ||
...@@ -439,6 +440,7 @@ int ss_resolve_pack(stralloc *sa, ss_resolve_t *res) ...@@ -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->ndeps) ||
!ss_resolve_add_uint32(sa,res->noptsdeps) || !ss_resolve_add_uint32(sa,res->noptsdeps) ||
!ss_resolve_add_uint32(sa,res->nextdeps) || !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->down) ||
!ss_resolve_add_uint32(sa,res->disen)) return 0 ; !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) ...@@ -513,6 +515,8 @@ int ss_resolve_read(ss_resolve_t *res, char const *src, char const *name)
global += 4 ; global += 4 ;
uint32_unpack_big(sa.s + global,&res->extdeps) ; uint32_unpack_big(sa.s + global,&res->extdeps) ;
global += 4 ; global += 4 ;
uint32_unpack_big(sa.s + global,&res->contents) ;
global += 4 ;
uint32_unpack_big(sa.s + global,&res->src) ; uint32_unpack_big(sa.s + global,&res->src) ;
global += 4 ; global += 4 ;
uint32_unpack_big(sa.s + global,&res->srconf) ; 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) ...@@ -541,6 +545,8 @@ int ss_resolve_read(ss_resolve_t *res, char const *src, char const *name)
global += 4 ; global += 4 ;
uint32_unpack_big(sa.s + global,&res->nextdeps) ; uint32_unpack_big(sa.s + global,&res->nextdeps) ;
global += 4 ; global += 4 ;
uint32_unpack_big(sa.s + global,&res->ncontents) ;
global += 4 ;
uint32_unpack_big(sa.s + global,&res->down) ; uint32_unpack_big(sa.s + global,&res->down) ;
global += 4 ; global += 4 ;
uint32_unpack_big(sa.s + global,&res->disen) ; uint32_unpack_big(sa.s + global,&res->disen) ;
...@@ -586,14 +592,13 @@ int ss_resolve_check(char const *src, char const *name) ...@@ -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) int ss_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst)
{ {
char ownerstr[UID_FMT] ; 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 ; ownerstr[ownerlen] = 0 ;
stralloc destlog = STRALLOC_ZERO ; stralloc destlog = STRALLOC_ZERO ;
stralloc ndeps = STRALLOC_ZERO ; stralloc ndeps = STRALLOC_ZERO ;
stralloc opt_deps = STRALLOC_ZERO ; stralloc other_deps = STRALLOC_ZERO ;
stralloc ext_deps = STRALLOC_ZERO ;
ss_state_t sta = STATE_ZERO ; ss_state_t sta = STATE_ZERO ;
ss_resolve_t res = RESOLVE_ZERO ; ss_resolve_t res = RESOLVE_ZERO ;
ss_resolve_init(&res) ; ss_resolve_init(&res) ;
...@@ -645,6 +650,7 @@ int ss_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst) ...@@ -645,6 +650,7 @@ int ss_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst)
res.ndeps = services->cname.nga ; res.ndeps = services->cname.nga ;
res.noptsdeps = services->cname.nopts ; res.noptsdeps = services->cname.nopts ;
res.nextdeps = services->cname.next ; res.nextdeps = services->cname.next ;
res.ncontents = services->cname.ncontents ;
if (services->flags[0]) res.down = 1 ; if (services->flags[0]) res.down = 1 ;
res.disen = 1 ; res.disen = 1 ;
if (res.type == TYPE_CLASSIC) if (res.type == TYPE_CLASSIC)
...@@ -678,10 +684,9 @@ int ss_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst) ...@@ -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 (!ss_state_write(&sta,res.sa.s + res.state,name)){ log_warnusys("write state file of: ",name) ; goto err ; }
} }
if (res.ndeps) 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--) for (;nid; id += strlen(deps.s + id) + 1, nid--)
{ {
if (!stralloc_catb(&ndeps,deps.s + id,strlen(deps.s + id)) || 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) ...@@ -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") ; if (!stralloc_0(&ndeps)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
res.deps = ss_resolve_add_string(&res,ndeps.s) ; res.deps = ss_resolve_add_string(&res,ndeps.s) ;
} }
if (res.noptsdeps) 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--) for (;nid; id += strlen(deps.s + id) + 1, nid--)
{ {
if (!stralloc_catb(&opt_deps,deps.s + id,strlen(deps.s + id)) || if (!stralloc_catb(&other_deps,deps.s + id,strlen(deps.s + id)) ||
!stralloc_catb(&opt_deps," ",1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; !stralloc_catb(&other_deps," ",1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
} }
opt_deps.len-- ; other_deps.len-- ;
if (!stralloc_0(&opt_deps)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; if (!stralloc_0(&other_deps)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
res.optsdeps = ss_resolve_add_string(&res,opt_deps.s) ; res.optsdeps = ss_resolve_add_string(&res,other_deps.s) ;
} }
if (res.nextdeps) 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--) for (;nid; id += strlen(deps.s + id) + 1, nid--)
{ {
if (!stralloc_catb(&ext_deps,deps.s + id,strlen(deps.s + id)) || if (!stralloc_catb(&other_deps,deps.s + id,strlen(deps.s + id)) ||
!stralloc_catb(&ext_deps," ",1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; !stralloc_catb(&other_deps," ",1)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
} }
ext_deps.len-- ; other_deps.len-- ;
if (!stralloc_0(&ext_deps)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; if (!stralloc_0(&other_deps)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
res.extdeps = ss_resolve_add_string(&res,ext_deps.s) ; 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]) if (services->opts[0])
{ {
// destination of the logger // destination of the logger
...@@ -769,7 +791,7 @@ int ss_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst) ...@@ -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 ; 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)) if (!ss_resolve_write(&res,dst,res.sa.s + res.name))
{ {
log_warnusys("write resolve file: ",dst,SS_RESOLVE,"/",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) ...@@ -777,17 +799,15 @@ int ss_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst)
} }
ss_resolve_free(&res) ; ss_resolve_free(&res) ;
stralloc_free(&opt_deps) ;
stralloc_free(&ext_deps) ;
stralloc_free(&ndeps) ; stralloc_free(&ndeps) ;
stralloc_free(&other_deps) ;
stralloc_free(&destlog) ; stralloc_free(&destlog) ;
return 1 ; return 1 ;
err: err:
ss_resolve_free(&res) ; ss_resolve_free(&res) ;
stralloc_free(&opt_deps) ;
stralloc_free(&ext_deps) ;
stralloc_free(&ndeps) ; stralloc_free(&ndeps) ;
stralloc_free(&other_deps) ;
stralloc_free(&destlog) ; stralloc_free(&destlog) ;
return 0 ; return 0 ;
} }
...@@ -883,6 +903,7 @@ int ss_resolve_copy(ss_resolve_t *dst,ss_resolve_t *res) ...@@ -883,6 +903,7 @@ int ss_resolve_copy(ss_resolve_t *dst,ss_resolve_t *res)
dst->deps = res->deps ; dst->deps = res->deps ;
dst->optsdeps = res->optsdeps ; dst->optsdeps = res->optsdeps ;
dst->extdeps = res->extdeps ; dst->extdeps = res->extdeps ;
dst->contents = res->contents ;
dst->src = res->src ; dst->src = res->src ;
dst->srconf = res->srconf ; dst->srconf = res->srconf ;
dst->live = res->live ; dst->live = res->live ;
...@@ -896,6 +917,7 @@ int ss_resolve_copy(ss_resolve_t *dst,ss_resolve_t *res) ...@@ -896,6 +917,7 @@ int ss_resolve_copy(ss_resolve_t *dst,ss_resolve_t *res)
dst->ndeps = res->ndeps ; dst->ndeps = res->ndeps ;
dst->noptsdeps = res->noptsdeps ; dst->noptsdeps = res->noptsdeps ;
dst->nextdeps = res->nextdeps ; dst->nextdeps = res->nextdeps ;
dst->ncontents = res->ncontents ;
dst->down = res->down ; dst->down = res->down ;
dst->disen = res->disen ; dst->disen = res->disen ;
...@@ -940,7 +962,7 @@ int ss_resolve_add_deps(genalloc *tokeep,ss_resolve_t *res, char const *src) ...@@ -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_cmp(tokeep,dname))
{ {
if (!ss_resolve_append(tokeep,&dres)) goto err ; if (!ss_resolve_append(tokeep,&dres)) goto err ;
} }
ss_resolve_free(&dres) ; ss_resolve_free(&dres) ;
} }
} }
...@@ -1251,3 +1273,48 @@ int ss_resolve_write_master(ssexec_t *info,ss_resolve_graph_t *graph,char const ...@@ -1251,3 +1273,48 @@ int ss_resolve_write_master(ssexec_t *info,ss_resolve_graph_t *graph,char const
stralloc_free(&gain) ; stralloc_free(&gain) ;
return 0 ; 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 ;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment