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

complete reframe of resolve API function: allow to use different struct of...

complete reframe of resolve API function: allow to use different struct of resolve in function of the object to deal with. Split service and tree resolve function to separated file.
parent fa66765e
No related branches found
No related tags found
No related merge requests found
...@@ -27,6 +27,9 @@ ...@@ -27,6 +27,9 @@
#include <66/ssexec.h> #include <66/ssexec.h>
#include <66/parser.h> #include <66/parser.h>
#include <66/tree.h>
#include <66/service.h>
#define SS_RESOLVE "/.resolve" #define SS_RESOLVE "/.resolve"
#define SS_RESOLVE_LEN (sizeof SS_RESOLVE - 1) #define SS_RESOLVE_LEN (sizeof SS_RESOLVE - 1)
...@@ -38,118 +41,57 @@ ...@@ -38,118 +41,57 @@
#define SS_SIMPLE 0 #define SS_SIMPLE 0
#define SS_DOUBLE 1 #define SS_DOUBLE 1
typedef struct ss_resolve_s ss_resolve_t, *ss_resolve_t_ref ; typedef struct resolve_wrapper_s resolve_wrapper_t, *resolve_wrapper_t_ref ;
struct ss_resolve_s struct resolve_wrapper_s
{ {
uint32_t salen ; uint8_t type ;
stralloc sa ; void *obj ;
uint32_t name ;
uint32_t description ;
uint32_t version ;
uint32_t logger ;
uint32_t logreal ;
uint32_t logassoc ;
uint32_t dstlog ;
uint32_t deps ; // for module -> list of s6-rc service
uint32_t optsdeps ; //optional dependencies
uint32_t extdeps ; //external dependencies
uint32_t contents ; // module -> list of s6-rc and s6 service
uint32_t src ; //frontend source
uint32_t srconf ; //configuration file source
uint32_t live ; //run/66
uint32_t runat ; //livetree->longrun,scandir->svc
uint32_t tree ; //var/lib/66/system/tree
uint32_t treename ;
uint32_t state ; //run/66/state/uid/treename/
uint32_t exec_run ;
uint32_t exec_log_run ;
uint32_t real_exec_run ;
uint32_t real_exec_log_run ;
uint32_t exec_finish ;
uint32_t real_exec_finish ;
uint32_t type ;
uint32_t ndeps ;
uint32_t noptsdeps ;
uint32_t nextdeps ;
uint32_t ncontents ;
uint32_t down ;
uint32_t disen ;//disable->0,enable->1
} ; } ;
#define RESOLVE_ZERO { 0,STRALLOC_ZERO,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
typedef enum ss_resolve_enum_e ss_resolve_enum_t, *ss_resolve_enum_t_ref; #define RESOLVE_SET_SAWRES(wres) \
enum ss_resolve_enum_e stralloc_ref sawres ; \
{ if (wres->type == SERVICE_STRUCT) sawres = (&((resolve_service_t *)wres->obj)->sa) ; \
SS_RESOLVE_ENUM_NAME = 0, else if (wres->type == TREE_STRUCT) sawres = (&((resolve_tree_t *)wres->obj)->sa) ;
SS_RESOLVE_ENUM_DESCRIPTION,
SS_RESOLVE_ENUM_VERSION,
SS_RESOLVE_ENUM_LOGGER,
SS_RESOLVE_ENUM_LOGREAL,
SS_RESOLVE_ENUM_LOGASSOC,
SS_RESOLVE_ENUM_DSTLOG,
SS_RESOLVE_ENUM_DEPS,
SS_RESOLVE_ENUM_OPTSDEPS,
SS_RESOLVE_ENUM_EXTDEPS,
SS_RESOLVE_ENUM_CONTENTS,
SS_RESOLVE_ENUM_SRC,
SS_RESOLVE_ENUM_SRCONF,
SS_RESOLVE_ENUM_LIVE,
SS_RESOLVE_ENUM_RUNAT,
SS_RESOLVE_ENUM_TREE,
SS_RESOLVE_ENUM_TREENAME,
SS_RESOLVE_ENUM_STATE,
SS_RESOLVE_ENUM_EXEC_RUN,
SS_RESOLVE_ENUM_EXEC_LOG_RUN,
SS_RESOLVE_ENUM_REAL_EXEC_RUN,
SS_RESOLVE_ENUM_REAL_EXEC_LOG_RUN,
SS_RESOLVE_ENUM_EXEC_FINISH,
SS_RESOLVE_ENUM_REAL_EXEC_FINISH,
SS_RESOLVE_ENUM_TYPE,
SS_RESOLVE_ENUM_NDEPS,
SS_RESOLVE_ENUM_NOPTSDEPS,
SS_RESOLVE_ENUM_NEXTDEPS,
SS_RESOLVE_ENUM_NCONTENTS,
SS_RESOLVE_ENUM_DOWN,
SS_RESOLVE_ENUM_DISEN,
SS_RESOLVE_ENUM_ENDOFKEY
} ;
typedef struct ss_resolve_field_table_s ss_resolve_field_table_t, *ss_resolve_field_table_t_ref ;
struct ss_resolve_field_table_s
{
char *field ;
} ;
extern ss_resolve_field_table_t ss_resolve_field_table[] ; /**
*
* General API
*
* */
extern resolve_wrapper_t *resolve_set_struct(uint8_t type, void *s) ;
extern int resolve_init(resolve_wrapper_t *wres) ;
extern int resolve_read(resolve_wrapper_t *wres, char const *src, char const *name) ;
extern int resolve_write(resolve_wrapper_t *wres, char const *dst, char const *name) ;
extern int resolve_check(char const *src, char const *name) ;
extern int resolve_append(genalloc *ga, resolve_wrapper_t *wres) ;
extern int resolve_search(genalloc *ga, char const *name, uint8_t type) ;
extern int resolve_cmp(genalloc *ga, char const *name, uint8_t type) ;
extern void resolve_rmfile(char const *src,char const *name) ;
extern ssize_t resolve_add_string(resolve_wrapper_t *wres, char const *data) ;
/**
*
* Freed
*
* */
/** Graph struct */ extern void resolve_free(resolve_wrapper_t *wres) ;
typedef struct ss_resolve_graph_ndeps_s ss_resolve_graph_ndeps_t ; extern void resolve_deep_free(uint8_t type, genalloc *g) ;
struct ss_resolve_graph_ndeps_s
{
uint32_t idx ;//uint32_t
genalloc ndeps ;//uint32_t
} ;
#define RESOLVE_GRAPH_NDEPS_ZERO { 0 , GENALLOC_ZERO }
typedef struct ss_resolve_graph_s ss_resolve_graph_t, *ss_resolve_graph_t_ref ; /**
struct ss_resolve_graph_s *
{ * CDB
genalloc name ;//ss_resolve_t *
genalloc cp ; //ss_resolve_graph_ndeps_t * */
genalloc sorted ;//ss_resolve_t
} ;
#define RESOLVE_GRAPH_ZERO { GENALLOC_ZERO , GENALLOC_ZERO , GENALLOC_ZERO }
typedef enum visit_e visit ; extern int resolve_read_cdb(resolve_wrapper_t *wres, char const *name) ;
enum visit_e extern int resolve_write_cdb(resolve_wrapper_t *wres, char const *dst, char const *name) ;
{ extern int resolve_add_cdb(cdbmaker *c, char const *key, char const *data) ;
SS_WHITE = 0, extern int resolve_add_cdb_uint(cdbmaker *c, char const *key, uint32_t data) ;
SS_GRAY, extern int resolve_find_cdb(stralloc *result, cdb const *c, char const *key) ;
SS_BLACK
} ;
/*
extern ss_resolve_t const ss_resolve_zero ; extern ss_resolve_t const ss_resolve_zero ;
extern void ss_resolve_init(ss_resolve_t *res) ; extern void ss_resolve_init(ss_resolve_t *res) ;
extern void ss_resolve_free(ss_resolve_t *res) ; extern void ss_resolve_free(ss_resolve_t *res) ;
...@@ -182,21 +124,14 @@ extern int ss_resolve_sort_byfile_first(stralloc *sort, char const *src) ; ...@@ -182,21 +124,14 @@ extern int ss_resolve_sort_byfile_first(stralloc *sort, char const *src) ;
extern int ss_resolve_svtree(stralloc *svtree,char const *svname,char const *tree) ; extern int ss_resolve_svtree(stralloc *svtree,char const *svname,char const *tree) ;
extern int ss_resolve_modify_field(ss_resolve_t *res, ss_resolve_enum_t field, char const *data) ; extern int ss_resolve_modify_field(ss_resolve_t *res, ss_resolve_enum_t field, char const *data) ;
extern int ss_resolve_put_field_to_sa(stralloc *sa,ss_resolve_t *res, ss_resolve_enum_t field) ; extern int ss_resolve_put_field_to_sa(stralloc *sa,ss_resolve_t *res, ss_resolve_enum_t field) ;
*/
/** Graph function */ /** cdb
extern void ss_resolve_graph_ndeps_free(ss_resolve_graph_ndeps_t *graph) ;
extern void ss_resolve_graph_free(ss_resolve_graph_t *graph) ;
extern int ss_resolve_graph_src(ss_resolve_graph_t *graph, char const *dir, unsigned int reverse, unsigned int what) ;
extern int ss_resolve_graph_build(ss_resolve_graph_t *graph,ss_resolve_t *res,char const *src,unsigned int reverse) ;
extern int ss_resolve_graph_sort(ss_resolve_graph_t *graph) ;
extern int ss_resolve_dfs(ss_resolve_graph_t *graph, unsigned int idx, visit *c,unsigned int *ename,unsigned int *edeps) ;
extern int ss_resolve_graph_publish(ss_resolve_graph_t *graph,unsigned int reverse) ;
/** cdb */
extern int ss_resolve_read_cdb(ss_resolve_t *dres, char const *name) ; extern int ss_resolve_read_cdb(ss_resolve_t *dres, char const *name) ;
extern int ss_resolve_write_cdb(ss_resolve_t *res, char const *dst, char const *name) ; extern int ss_resolve_write_cdb(ss_resolve_t *res, char const *dst, char const *name) ;
extern int ss_resolve_add_cdb(cdbmaker *c,char const *key,char const *data) ; extern int ss_resolve_add_cdb(cdbmaker *c,char const *key,char const *data) ;
extern int ss_resolve_add_cdb_uint(cdbmaker *c, char const *key,uint32_t data) ; extern int ss_resolve_add_cdb_uint(cdbmaker *c, char const *key,uint32_t data) ;
extern int ss_resolve_find_cdb(stralloc *result, cdb const *c,char const *key) ; extern int ss_resolve_find_cdb(stralloc *result, cdb const *c,char const *key) ;
*/
#endif #endif
...@@ -15,9 +15,176 @@ ...@@ -15,9 +15,176 @@
#ifndef SS_SERVICE_H #ifndef SS_SERVICE_H
#define SS_SERVICE_H #define SS_SERVICE_H
#include <stdint.h>
#include <skalibs/stralloc.h> #include <skalibs/stralloc.h>
#include <skalibs/genalloc.h>
#include <skalibs/cdb.h>
#include <skalibs/cdbmake.h>
#include <66/parser.h>
#include <66/ssexec.h>
/** Graph struct */
typedef struct ss_resolve_graph_ndeps_s ss_resolve_graph_ndeps_t ;
struct ss_resolve_graph_ndeps_s
{
uint32_t idx ;//uint32_t
genalloc ndeps ;//uint32_t
} ;
#define RESOLVE_GRAPH_NDEPS_ZERO { 0 , GENALLOC_ZERO }
typedef struct ss_resolve_graph_s ss_resolve_graph_t, *ss_resolve_graph_t_ref ;
struct ss_resolve_graph_s
{
genalloc name ;//resolve_service_t
genalloc cp ; //ss_resolve_graph_ndeps_t
genalloc sorted ;//resolve_service_t
} ;
#define RESOLVE_GRAPH_ZERO { GENALLOC_ZERO , GENALLOC_ZERO , GENALLOC_ZERO }
typedef enum visit_e visit ;
enum visit_e
{
SS_WHITE = 0,
SS_GRAY,
SS_BLACK
} ;
#define SERVICE_STRUCT 0
typedef struct resolve_service_s resolve_service_t, *resolve_service_t_ref ;
struct resolve_service_s
{
uint32_t salen ;
stralloc sa ;
uint32_t name ;
uint32_t description ;
uint32_t version ;
uint32_t logger ;
uint32_t logreal ;
uint32_t logassoc ;
uint32_t dstlog ;
uint32_t deps ; // for module -> list of s6-rc service
uint32_t optsdeps ; //optional dependencies
uint32_t extdeps ; //external dependencies
uint32_t contents ; // module -> list of s6-rc and s6 service
uint32_t src ; //frontend source
uint32_t srconf ; //configuration file source
uint32_t live ; //run/66
uint32_t runat ; //livetree->longrun,scandir->svc
uint32_t tree ; //var/lib/66/system/tree
uint32_t treename ;
uint32_t state ; //run/66/state/uid/treename/
uint32_t exec_run ;
uint32_t exec_log_run ;
uint32_t real_exec_run ;
uint32_t real_exec_log_run ;
uint32_t exec_finish ;
uint32_t real_exec_finish ;
uint32_t type ;
uint32_t ndeps ;
uint32_t noptsdeps ;
uint32_t nextdeps ;
uint32_t ncontents ;
uint32_t down ;
uint32_t disen ;//disable->0,enable->1
} ;
#define RESOLVE_SERVICE_ZERO { 0,STRALLOC_ZERO,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
typedef enum resolve_service_enum_e resolve_service_enum_t, *resolve_service_enum_t_ref;
enum resolve_service_enum_e
{
SERVICE_ENUM_NAME = 0,
SERVICE_ENUM_DESCRIPTION,
SERVICE_ENUM_VERSION,
SERVICE_ENUM_LOGGER,
SERVICE_ENUM_LOGREAL,
SERVICE_ENUM_LOGASSOC,
SERVICE_ENUM_DSTLOG,
SERVICE_ENUM_DEPS,
SERVICE_ENUM_OPTSDEPS,
SERVICE_ENUM_EXTDEPS,
SERVICE_ENUM_CONTENTS,
SERVICE_ENUM_SRC,
SERVICE_ENUM_SRCONF,
SERVICE_ENUM_LIVE,
SERVICE_ENUM_RUNAT,
SERVICE_ENUM_TREE,
SERVICE_ENUM_TREENAME,
SERVICE_ENUM_STATE,
SERVICE_ENUM_EXEC_RUN,
SERVICE_ENUM_EXEC_LOG_RUN,
SERVICE_ENUM_REAL_EXEC_RUN,
SERVICE_ENUM_REAL_EXEC_LOG_RUN,
SERVICE_ENUM_EXEC_FINISH,
SERVICE_ENUM_REAL_EXEC_FINISH,
SERVICE_ENUM_TYPE,
SERVICE_ENUM_NDEPS,
SERVICE_ENUM_NOPTSDEPS,
SERVICE_ENUM_NEXTDEPS,
SERVICE_ENUM_NCONTENTS,
SERVICE_ENUM_DOWN,
SERVICE_ENUM_DISEN,
SERVICE_ENUM_ENDOFKEY
} ;
typedef struct resolve_service_field_table_s resolve_service_field_table_t, *resolve_service_field_table_t_ref ;
struct resolve_service_field_table_s
{
char *field ;
} ;
extern resolve_service_field_table_t resolve_service_field_table[] ;
extern int service_isenabled(char const *sv) ;
extern int service_isenabledat(stralloc *tree, char const *sv) ;
extern int service_frontend_src(stralloc *sasrc, char const *name, char const *src) ;
extern int service_frontend_path(stralloc *sasrc,char const *sv, uid_t owner,char const *directory_forced) ;
extern int service_endof_dir(char const *dir, char const *name) ;
extern int service_cmp_basedir(char const *dir) ;
/**
*
* Resolve API
*
* */
extern int service_read_cdb(cdb *c, resolve_service_t *res) ;
extern int service_write_cdb(cdbmaker *c, resolve_service_t *sres) ;
extern int service_resolve_copy(resolve_service_t *dst, resolve_service_t *res) ;
extern int service_resolve_sort_bytype(genalloc *gares, stralloc *list, char const *src) ;
extern int service_resolve_svtree(stralloc *svtree, char const *svname, char const *tree) ;
extern int service_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst) ;
extern int service_resolve_setlognwrite(resolve_service_t *sv, char const *dst) ;
extern int service_resolve_write_master(ssexec_t *info, ss_resolve_graph_t *graph, char const *dir, unsigned int reverse) ;
extern int service_resolve_modify_field(resolve_service_t *res, resolve_service_enum_t field, char const *data) ;
extern int service_resolve_field_to_sa(stralloc *sa, resolve_service_t *res, resolve_service_enum_t field) ;
/**
*
* obsolete function
*
*
* */
extern int service_resolve_add_deps(genalloc *tokeep, resolve_service_t *res, char const *src) ;
extern int service_resolve_add_rdeps(genalloc *tokeep, resolve_service_t *res, char const *src) ;
extern int service_resolve_add_logger(genalloc *ga,char const *src) ;
/** Graph function */
extern void ss_resolve_graph_ndeps_free(ss_resolve_graph_ndeps_t *graph) ;
extern void ss_resolve_graph_free(ss_resolve_graph_t *graph) ;
extern int ss_resolve_graph_src(ss_resolve_graph_t *graph, char const *dir, unsigned int reverse, unsigned int what) ;
int service_isenabled(char const *sv) ; extern int ss_resolve_graph_build(ss_resolve_graph_t *graph,resolve_service_t *res,char const *src,unsigned int reverse) ;
int service_isenabledat(stralloc *tree, char const *sv) ; extern int ss_resolve_graph_sort(ss_resolve_graph_t *graph) ;
extern int ss_resolve_dfs(ss_resolve_graph_t *graph, unsigned int idx, visit *c,unsigned int *ename,unsigned int *edeps) ;
extern int ss_resolve_graph_publish(ss_resolve_graph_t *graph,unsigned int reverse) ;
#endif #endif
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#include <skalibs/genalloc.h> #include <skalibs/genalloc.h>
#include <66/ssexec.h> #include <66/ssexec.h>
#include <66/resolve.h> #include <66/service.h>
#define MYUID getuid() #define MYUID getuid()
#define YOURUID(passto,owner) youruid(passto,owner) #define YOURUID(passto,owner) youruid(passto,owner)
...@@ -44,11 +44,15 @@ extern int set_livestate(stralloc *live,uid_t owner) ; ...@@ -44,11 +44,15 @@ extern int set_livestate(stralloc *live,uid_t owner) ;
extern int set_ownerhome(stralloc *base,uid_t owner) ; extern int set_ownerhome(stralloc *base,uid_t owner) ;
extern int set_ownersysdir(stralloc *base,uid_t owner) ; extern int set_ownersysdir(stralloc *base,uid_t owner) ;
extern int read_svfile(stralloc *sasv,char const *name,char const *src) ; extern int read_svfile(stralloc *sasv,char const *name,char const *src) ;
extern int module_in_cmdline(genalloc *gares, ss_resolve_t *res, char const *dir) ; extern int module_in_cmdline(genalloc *gares, resolve_service_t *res, char const *dir) ;
extern int module_search_service(char const *src, genalloc *gares, char const *name,uint8_t *found, char module_name[256]) ; extern int module_search_service(char const *src, genalloc *gares, char const *name,uint8_t *found, char module_name[256]) ;
/** ss_instance.c file */ /** ss_instance.c file */
extern int instance_check(char const *svname) ; extern int instance_check(char const *svname) ;
extern int instance_splitname(stralloc *sa,char const *name,int len,int what) ; extern int instance_splitname(stralloc *sa,char const *name,int len,int what) ;
extern int instance_create(stralloc *sasv,char const *svname, char const *regex, int len) ; extern int instance_create(stralloc *sasv,char const *svname, char const *regex, int len) ;
extern int module_path(stralloc *sdir, stralloc *mdir, char const *sv,char const *frontend_src, uid_t owner) ;
extern int sa_pointo(stralloc *sa, ssexec_t *info, int type, unsigned int where) ;
extern int create_live(ssexec_t *info) ;
#endif #endif
/*
* resolve.c
*
* Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
*
* All rights reserved.
*
* This file is part of Obarun. It is subject to the license terms in
* the LICENSE file found in the top-level directory of this
* distribution.
* This file may not be copied, modified, propagated, or distributed
* except according to the terms contained in the LICENSE file./
*/
#include <string.h>
#include <stdint.h>
#include <unistd.h>//close, fsync
#include <stdlib.h>//mkstemp, malloc, free
#include <sys/types.h>//ssize_t
#include <stdio.h>//rename
#include <oblibs/log.h>
#include <oblibs/string.h>
#include <oblibs/types.h>
#include <skalibs/stralloc.h>
#include <skalibs/genalloc.h>
#include <skalibs/cdb.h>
#include <skalibs/djbunix.h>
#include <skalibs/cdbmake.h>
#include <skalibs/posixplz.h>//unlink
#include <skalibs/types.h>//uint##_pack
#include <66/resolve.h>
#include <66/service.h>
#include <66/tree.h>
/**
*
* MAIN API
*
* */
resolve_wrapper_t *resolve_set_struct(uint8_t type, void *s)
{
log_flow() ;
resolve_wrapper_t *wres = malloc(sizeof(resolve_wrapper_t)) ;
wres->obj = s ;
wres->type = type ;
return wres ;
} ;
int resolve_init(resolve_wrapper_t *wres)
{
log_flow() ;
RESOLVE_SET_SAWRES(wres) ;
sawres->len = 0 ;
return resolve_add_string(wres,"") ;
}
int resolve_read(resolve_wrapper_t *wres, char const *src, char const *name)
{
log_flow() ;
size_t srclen = strlen(src) ;
size_t namelen = strlen(name) ;
char tmp[srclen + SS_RESOLVE_LEN + 1 + namelen + 1] ;
auto_strings(tmp,src,SS_RESOLVE,"/",name) ;
if (!resolve_read_cdb(wres,tmp))
return 0 ;
return 1 ;
}
int resolve_write(resolve_wrapper_t *wres, char const *dst, char const *name)
{
log_flow() ;
size_t dstlen = strlen(dst) ;
size_t namelen = strlen(name) ;
char tmp[dstlen + SS_RESOLVE_LEN + 1 + namelen + 1] ;
auto_strings(tmp,dst,SS_RESOLVE,"/") ;
if (!resolve_write_cdb(wres,tmp,name))
return 0 ;
return 1 ;
}
int resolve_check(char const *src, char const *name)
{
log_flow() ;
int r ;
size_t srclen = strlen(src) ;
size_t namelen = strlen(name) ;
char tmp[srclen + SS_RESOLVE_LEN + 1 + namelen + 1] ;
auto_strings(tmp, src, SS_RESOLVE, "/", name) ;
r = scan_mode(tmp,S_IFREG) ;
if (r <= 0)
return 0 ;
return 1 ;
}
int resolve_append(genalloc *ga, resolve_wrapper_t *wres)
{
log_flow() ;
int e = 0 ;
if (wres->type == SERVICE_STRUCT) {
resolve_service_t cp = RESOLVE_SERVICE_ZERO ;
if (!service_resolve_copy(&cp, ((resolve_service_t *)wres->obj)))
goto err ;
if (!genalloc_append(resolve_service_t, ga, &cp))
goto err ;
} else if (wres->type == TREE_STRUCT) {
resolve_tree_t cp = RESOLVE_TREE_ZERO ;
if (!tree_resolve_copy(&cp, ((resolve_tree_t *)wres->obj)))
goto err ;
if (!genalloc_append(resolve_tree_t, ga, &cp))
goto err ;
}
e = 1 ;
err:
return e ;
}
int resolve_search(genalloc *ga, char const *name, uint8_t type)
{
log_flow() ;
size_t len, pos = 0 ;
if (type == SERVICE_STRUCT) {
len = genalloc_len(resolve_service_t, ga) ;
for (;pos < len ; pos++) {
char *s = genalloc_s(resolve_service_t,ga)[pos].sa.s + genalloc_s(resolve_service_t,ga)[pos].name ;
if (!strcmp(name,s))
return pos ;
}
} else if (type == TREE_STRUCT) {
len = genalloc_len(resolve_tree_t, ga) ;
for (;pos < len ; pos++) {
char *s = genalloc_s(resolve_tree_t,ga)[pos].sa.s + genalloc_s(resolve_tree_t,ga)[pos].name ;
if (!strcmp(name,s))
return pos ;
}
}
return -1 ;
}
int resolve_cmp(genalloc *ga, char const *name, uint8_t type)
{
log_flow() ;
size_t len, pos = 0 ;
if (type == SERVICE_STRUCT) {
len = genalloc_len(resolve_service_t, ga) ;
for (;pos < len ; pos++) {
char *str = genalloc_s(resolve_service_t, ga)[pos].sa.s ;
char *s = str + genalloc_s(resolve_service_t, ga)[pos].name ;
if (!strcmp(name,s))
return 1 ;
}
} else if (type == TREE_STRUCT) {
len = genalloc_len(resolve_tree_t, ga) ;
for (;pos < len ; pos++) {
char *str = genalloc_s(resolve_tree_t, ga)[pos].sa.s ;
char *s = str + genalloc_s(resolve_tree_t, ga)[pos].name ;
if (!strcmp(name,s))
return 1 ;
}
}
return 0 ;
}
void resolve_rmfile(char const *src,char const *name)
{
log_flow() ;
size_t srclen = strlen(src) ;
size_t namelen = strlen(name) ;
char tmp[srclen + SS_RESOLVE_LEN + 1 + namelen +1] ;
auto_strings(tmp, src, SS_RESOLVE, "/", name) ;
unlink_void(tmp) ;
}
ssize_t resolve_add_string(resolve_wrapper_t *wres, char const *data)
{
log_flow() ;
RESOLVE_SET_SAWRES(wres) ;
ssize_t baselen = sawres->len ;
if (!data) {
if (!stralloc_catb(sawres,"",1))
log_warnusys_return(LOG_EXIT_LESSONE,"stralloc") ;
return baselen ;
}
size_t datalen = strlen(data) ;
if (!stralloc_catb(sawres,data,datalen + 1))
log_warnusys_return(LOG_EXIT_LESSONE,"stralloc") ;
return baselen ;
}
/**
*
* FREED
*
* */
void resolve_free(resolve_wrapper_t *wres)
{
log_flow() ;
RESOLVE_SET_SAWRES(wres) ;
stralloc_free(sawres) ;
free(wres) ;
}
void resolve_deep_free(uint8_t type, genalloc *g)
{
log_flow() ;
size_t pos = 0 ;
if (type == SERVICE_STRUCT) {
for (; pos < genalloc_len(resolve_service_t, g) ; pos++)
stralloc_free(&genalloc_s(resolve_service_t, g)[pos].sa) ;
genalloc_free(resolve_service_t, g) ;
} else if (type == TREE_STRUCT) {
for (; pos < genalloc_len(resolve_tree_t, g) ; pos++)
stralloc_free(&genalloc_s(resolve_tree_t, g)[pos].sa) ;
genalloc_free(resolve_tree_t, g) ;
}
}
/**
*
* CDB
*
* */
int resolve_read_cdb(resolve_wrapper_t *wres, char const *name)
{
log_flow() ;
int fd, e = 0 ;
cdb c = CDB_ZERO ;
fd = open_readb(name) ;
if (fd < 0) {
log_warnusys("open: ",name) ;
goto err_fd ;
}
if (!cdb_init_fromfd(&c, fd)) {
log_warnusys("cdb_init: ", name) ;
goto err ;
}
if (wres->type == SERVICE_STRUCT) {
if (!service_read_cdb(&c, ((resolve_service_t *)wres->obj)))
goto err ;
} else if (wres->type == TREE_STRUCT){
if (!tree_read_cdb(&c, ((resolve_tree_t *)wres->obj)))
goto err ;
}
e = 1 ;
err:
close(fd) ;
err_fd:
cdb_free(&c) ;
return e ;
}
int resolve_write_cdb(resolve_wrapper_t *wres, char const *dst, char const *name)
{
log_flow() ;
int fd ;
size_t dstlen = strlen(dst), namelen = strlen(name);
cdbmaker c = CDBMAKER_ZERO ;
char tfile[dstlen + 1 + namelen + namelen + 9] ;
char dfile[dstlen + 1 + namelen + 1] ;
auto_strings(dfile,dst,"/",name) ;
auto_strings(tfile,dst,"/",name,":",name,":","XXXXXX") ;
fd = mkstemp(tfile) ;
if (fd < 0 || ndelay_off(fd)) {
log_warnusys("mkstemp: ", tfile) ;
goto err_fd ;
}
if (!cdbmake_start(&c, fd)) {
log_warnusys("cdbmake_start") ;
goto err ;
}
if (wres->type == SERVICE_STRUCT) {
if (!service_write_cdb(&c, ((resolve_service_t *)wres->obj)))
goto err ;
} else if (wres->type == TREE_STRUCT) {
if (!tree_write_cdb(&c, ((resolve_tree_t *)wres->obj)))
goto err ;
}
if (!cdbmake_finish(&c) || fsync(fd) < 0) {
log_warnusys("write to: ", tfile) ;
goto err ;
}
close(fd) ;
if (rename(tfile, dfile) < 0) {
log_warnusys("rename ", tfile, " to ", dfile) ;
goto err_fd ;
}
return 1 ;
err:
close(fd) ;
err_fd:
unlink_void(tfile) ;
return 0 ;
}
int resolve_add_cdb(cdbmaker *c, char const *key, char const *data)
{
log_flow() ;
size_t klen = strlen(key) ;
size_t dlen = strlen(data) ;
if (!cdbmake_add(c,key,klen,dlen ? data : 0,dlen))
log_warnsys_return(LOG_EXIT_ZERO,"cdb_make_add: ",key) ;
return 1 ;
}
int resolve_add_cdb_uint(cdbmaker *c, char const *key, uint32_t data)
{
log_flow() ;
char pack[4] ;
size_t klen = strlen(key) ;
uint32_pack_big(pack, data) ;
if (!cdbmake_add(c,key,klen,pack,4))
log_warnsys_return(LOG_EXIT_ZERO,"cdb_make_add: ",key) ;
return 1 ;
}
int resolve_find_cdb(stralloc *result, cdb const *c, char const *key)
{
log_flow() ;
uint32_t x = 0 ;
size_t klen = strlen(key) ;
cdb_data cdata ;
result->len = 0 ;
int r = cdb_find(c, &cdata, key, klen) ;
if (r == -1)
log_warnusys_return(LOG_EXIT_LESSONE,"search on cdb key: ",key) ;
if (!r)
log_warnusys_return(LOG_EXIT_ZERO,"unknown cdb key: ",key) ;
char pack[cdata.len + 1] ;
memcpy(pack,cdata.s, cdata.len) ;
pack[cdata.len] = 0 ;
uint32_unpack_big(pack, &x) ;
if (!auto_stra(result,pack))
log_warnusys_return(LOG_EXIT_LESSONE,"stralloc") ;
return x ;
}
This diff is collapsed.
/*
* service.c
*
* Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
*
* All rights reserved.
*
* This file is part of Obarun. It is subject to the license terms in
* the LICENSE file found in the top-level directory of this
* distribution.
* This file may not be copied, modified, propagated, or distributed
* except according to the terms contained in the LICENSE file./
*/
#include <unistd.h>
#include <sys/stat.h>
#include <oblibs/log.h>
#include <oblibs/string.h>
#include <oblibs/types.h>
#include <oblibs/sastr.h>
#include <skalibs/stralloc.h>
#include <66/utils.h>
#include <66/constants.h>
#include <66/resolve.h>
#include <66/ssexec.h>
/** @Return 0 if not found
* @Return 1 if found
* @Return 2 if found but marked disabled
* @Return -1 system error */
int service_isenabled(char const *sv)
{
log_flow() ;
stralloc sa = STRALLOC_ZERO ;
ss_resolve_t res = RESOLVE_ZERO ;
size_t newlen = 0, pos = 0 ;
int e = -1 ;
char const *exclude[3] = { SS_BACKUP + 1, SS_RESOLVE + 1, 0 } ;
if (!set_ownersysdir(&sa, getuid())) {
log_warnusys("set owner directory") ;
stralloc_free(&sa) ;
return 0 ;
}
char tmp[sa.len + SS_SYSTEM_LEN + 2] ;
auto_strings(tmp, sa.s, SS_SYSTEM) ;
// no tree exist yet
if (!scan_mode(tmp, S_IFDIR))
goto empty ;
auto_strings(tmp, sa.s, SS_SYSTEM, "/") ;
newlen = sa.len + SS_SYSTEM_LEN + 1 ;
sa.len = 0 ;
if (!sastr_dir_get(&sa, tmp, exclude, S_IFDIR)) {
log_warnu("get list of trees from: ", tmp) ;
goto freed ;
}
FOREACH_SASTR(&sa, pos) {
char *treename = sa.s + pos ;
char trees[newlen + strlen(treename) + SS_SVDIRS_LEN + 1] ;
auto_strings(trees, tmp, treename, SS_SVDIRS) ;
if (ss_resolve_check(trees, sv)) {
if (!ss_resolve_read(&res, trees, sv)) {
log_warnu("read resolve file: ", trees, "/", sv) ;
goto freed ;
}
if (res.disen) {
log_trace(sv, " enabled at tree: ", treename) ;
e = 1 ;
goto freed ;
} else {
e = 2 ;
goto freed ;
}
}
}
empty:
e = 0 ;
freed:
stralloc_free(&sa) ;
ss_resolve_free(&res) ;
return e ;
}
/** @Return 0 if not found
* @Return 1 if found
* @Return 2 if found but marked disabled
* @Return -1 system error */
int service_isenabledat(stralloc *tree, char const *sv)
{
log_flow() ;
stralloc sa = STRALLOC_ZERO ;
ss_resolve_t res = RESOLVE_ZERO ;
size_t newlen = 0, pos = 0 ;
int e = -1 ;
char const *exclude[3] = { SS_BACKUP + 1, SS_RESOLVE + 1, 0 } ;
if (!set_ownersysdir(&sa, getuid())) {
log_warnusys("set owner directory") ;
stralloc_free(&sa) ;
return 0 ;
}
char tmp[sa.len + SS_SYSTEM_LEN + 2] ;
auto_strings(tmp, sa.s, SS_SYSTEM) ;
// no tree exist yet
if (!scan_mode(tmp, S_IFDIR))
goto empty ;
auto_strings(tmp, sa.s, SS_SYSTEM, "/") ;
newlen = sa.len + SS_SYSTEM_LEN + 1 ;
sa.len = 0 ;
if (!sastr_dir_get(&sa, tmp, exclude, S_IFDIR)) {
log_warnu("get list of trees from: ", tmp) ;
goto freed ;
}
FOREACH_SASTR(&sa, pos) {
char *treename = sa.s + pos ;
char trees[newlen + strlen(treename) + SS_SVDIRS_LEN + 1] ;
auto_strings(trees, tmp, treename, SS_SVDIRS) ;
if (ss_resolve_check(trees, sv)) {
if (!ss_resolve_read(&res, trees, sv)) {
log_warnu("read resolve file: ", trees, "/", sv) ;
goto freed ;
}
if (res.disen) {
log_trace(sv, " enabled at tree: ", treename) ;
e = 1 ;
} else {
log_trace(sv, " disabled at tree: ", treename) ;
e = 2 ;
}
if (!auto_stra(tree, treename)) {
e = -1 ;
goto freed ;
}
goto freed ;
}
}
empty:
e = 0 ;
freed:
stralloc_free(&sa) ;
ss_resolve_free(&res) ;
return e ;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment