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

revamp of the resolve struct

parent a10c45b4
No related branches found
No related tags found
No related merge requests found
......@@ -22,201 +22,422 @@
resolve_field_table_t resolve_service_field_table[] = {
[SERVICE_ENUM_NAME] = { .field = "name" },
[SERVICE_ENUM_DESCRIPTION] = { .field = "description" },
[SERVICE_ENUM_VERSION] = { .field = "version" },
[SERVICE_ENUM_LOGGER] = { .field = "logger" },
[SERVICE_ENUM_LOGREAL] = { .field = "logreal" },
[SERVICE_ENUM_LOGASSOC] = { .field = "logassoc" },
[SERVICE_ENUM_DSTLOG] = { .field = "dstlog" },
[SERVICE_ENUM_DEPENDS] = { .field = "depends" },
[SERVICE_ENUM_REQUIREDBY] = { .field = "requiredby" },
[SERVICE_ENUM_OPTSDEPS] = { .field = "optsdeps" },
[SERVICE_ENUM_EXTDEPS] = { .field = "extdeps" },
[SERVICE_ENUM_CONTENTS] = { .field = "contents" },
[SERVICE_ENUM_SRC] = { .field = "src" },
[SERVICE_ENUM_SRCONF] = { .field = "srconf" },
[SERVICE_ENUM_LIVE] = { .field = "live" },
[SERVICE_ENUM_RUNAT] = { .field = "runat" },
[SERVICE_ENUM_TREE] = { .field = "tree" },
[SERVICE_ENUM_TREENAME] = { .field = "treename" },
[SERVICE_ENUM_STATE] = { .field = "state" },
[SERVICE_ENUM_EXEC_RUN] = { .field = "exec_run" },
[SERVICE_ENUM_EXEC_LOG_RUN] = { .field = "exec_log_run" },
[SERVICE_ENUM_REAL_EXEC_RUN] = { .field = "real_exec_run" },
[SERVICE_ENUM_REAL_EXEC_LOG_RUN] = { .field = "real_exec_log_run" },
[SERVICE_ENUM_EXEC_FINISH] = { .field = "exec_finish" },
[SERVICE_ENUM_REAL_EXEC_FINISH] = { .field = "real_exec_finish" },
[SERVICE_ENUM_TYPE] = { .field = "type" },
[SERVICE_ENUM_NDEPENDS] = { .field = "ndepends" },
[SERVICE_ENUM_NREQUIREDBY] = { .field = "nrequiredby" },
[SERVICE_ENUM_NOPTSDEPS] = { .field = "noptsdeps" },
[SERVICE_ENUM_NEXTDEPS] = { .field = "nextdeps" },
[SERVICE_ENUM_NCONTENTS] = { .field = "ncontents" },
[SERVICE_ENUM_DOWN] = { .field = "down" },
[SERVICE_ENUM_DISEN] = { .field = "disen" },
[SERVICE_ENUM_ENDOFKEY] = { .field = 0 }
[E_RESOLVE_SERVICE_NAME] = { .field = "name" },
[E_RESOLVE_SERVICE_DESCRIPTION] = { .field = "description" },
[E_RESOLVE_SERVICE_VERSION] = { .field = "version" },
[E_RESOLVE_SERVICE_TYPE] = { .field = "type" },
[E_RESOLVE_SERVICE_NOTIFY] = { .field = "notify" },
[E_RESOLVE_SERVICE_MAXDEATH] = { .field = "maxdeath" },
[E_RESOLVE_SERVICE_EARLIER] = { .field = "earlier" },
[E_RESOLVE_SERVICE_HIERCOPY] = { .field = "hiercopy" },
[E_RESOLVE_SERVICE_INTREE] = { .field = "intree" },
[E_RESOLVE_SERVICE_OWNERSTR] = { .field = "ownerstr" },
[E_RESOLVE_SERVICE_OWNER] = { .field = "owner" },
[E_RESOLVE_SERVICE_TREENAME] = { .field = "treename" },
[E_RESOLVE_SERVICE_USER] = { .field = "user" },
[E_RESOLVE_SERVICE_INMODULE] = { .field = "inmodule" },
// path
[E_RESOLVE_SERVICE_HOME] = { .field = "home" },
[E_RESOLVE_SERVICE_FRONTEND] = { .field = "frontend" },
[E_RESOLVE_SERVICE_TREE] = { .field = "tree" },
[E_RESOLVE_SERVICE_STATUS] = { .field = "status" },
// dependencies
[E_RESOLVE_SERVICE_DEPENDS] = { .field = "depends" },
[E_RESOLVE_SERVICE_REQUIREDBY] = { .field = "requiredby" },
[E_RESOLVE_SERVICE_OPTSDEPS] = { .field = "optsdeps" },
[E_RESOLVE_SERVICE_NDEPENDS] = { .field = "ndepends" },
[E_RESOLVE_SERVICE_NREQUIREDBY] = { .field = "nrequiredby" },
[E_RESOLVE_SERVICE_NOPTSDEPS] = { .field = "noptsdeps" },
// execute
[E_RESOLVE_SERVICE_RUN] = { .field = "run" },
[E_RESOLVE_SERVICE_RUN_USER] = { .field = "run_user" },
[E_RESOLVE_SERVICE_RUN_BUILD] = { .field = "run_build" },
[E_RESOLVE_SERVICE_RUN_SHEBANG] = { .field = "run_shebang" },
[E_RESOLVE_SERVICE_RUN_RUNAS] = { .field = "run_runas" },
[E_RESOLVE_SERVICE_FINISH] = { .field = "finish" },
[E_RESOLVE_SERVICE_FINISH_USER] = { .field = "finish_user" },
[E_RESOLVE_SERVICE_FINISH_BUILD] = { .field = "finish_build" },
[E_RESOLVE_SERVICE_FINISH_SHEBANG] = { .field = "finish_shebang" },
[E_RESOLVE_SERVICE_FINISH_RUNAS] = { .field = "finish_runas" },
[E_RESOLVE_SERVICE_TIMEOUTKILL] = { .field = "timeoutkill" },
[E_RESOLVE_SERVICE_TIMEOUTFINISH] = { .field = "timeoutfinish" },
[E_RESOLVE_SERVICE_TIMEOUTUP] = { .field = "timeoutup" },
[E_RESOLVE_SERVICE_TIMEOUTDOWN] = { .field = "timeoutdown" },
[E_RESOLVE_SERVICE_DOWN] = { .field = "down" },
[E_RESOLVE_SERVICE_DOWNSIGNAL] = { .field = "downsignal" },
// live
[E_RESOLVE_SERVICE_LIVEDIR] = { .field = "livedir" },
[E_RESOLVE_SERVICE_SCANDIR] = { .field = "scandirdir" },
[E_RESOLVE_SERVICE_STATEDIR] = { .field = "statedir" },
[E_RESOLVE_SERVICE_EVENTDIR] = { .field = "eventdir" },
[E_RESOLVE_SERVICE_NOTIFDIR] = { .field = "notifdir" },
[E_RESOLVE_SERVICE_SUPERVISEDIR] = { .field = "supervisedir" },
[E_RESOLVE_SERVICE_FDHOLDERDIR] = { .field = "fdholderdir" },
[E_RESOLVE_SERVICE_ONESHOTDDIR] = { .field = "oneshotddir" },
// logger
[E_RESOLVE_SERVICE_LOGNAME] = { .field = "logname" },
[E_RESOLVE_SERVICE_LOGDESTINATION] = { .field = "logdestination" },
[E_RESOLVE_SERVICE_LOGBACKUP] = { .field = "logbackup" },
[E_RESOLVE_SERVICE_LOGMAXSIZE] = { .field = "logmaxsize" },
[E_RESOLVE_SERVICE_LOGTIMESTAMP] = { .field = "logtimestamp" },
[E_RESOLVE_SERVICE_LOGWANT] = { .field = "logwant" },
[E_RESOLVE_SERVICE_LOGRUN] = { .field = "logrun" },
[E_RESOLVE_SERVICE_LOGRUN_USER] = { .field = "logrun_user" },
[E_RESOLVE_SERVICE_LOGRUN_BUILD] = { .field = "logrun_build" },
[E_RESOLVE_SERVICE_LOGRUN_SHEBANG] = { .field = "logrun_shebang" },
[E_RESOLVE_SERVICE_LOGRUN_RUNAS] = { .field = "logrun_runas" },
[E_RESOLVE_SERVICE_LOGTIMEOUTKILL] = { .field = "logtimeoutkill" },
[E_RESOLVE_SERVICE_LOGTIMEOUTFINISH] = { .field = "logtimeoutfinish" },
// environment
[E_RESOLVE_SERVICE_ENV] = { .field = "env" },
[E_RESOLVE_SERVICE_ENVDIR] = { .field = "envdir" },
[E_RESOLVE_SERVICE_ENV_OVERWRITE] = { .field = "env_overwrite" },
// regex
[E_RESOLVE_SERVICE_REGEX_CONFIGURE] = { .field = "configure" },
[E_RESOLVE_SERVICE_REGEX_DIRECTORIES] = { .field = "directories" },
[E_RESOLVE_SERVICE_REGEX_FILES] = { .field = "files" },
[E_RESOLVE_SERVICE_REGEX_INFILES] = { .field = "infiles" },
[E_RESOLVE_SERVICE_REGEX_NDIRECTORIES] = { .field = "ndirectories" },
[E_RESOLVE_SERVICE_REGEX_NFILES] = { .field = "nfiles" },
[E_RESOLVE_SERVICE_REGEX_NINFILES] = { .field = "ninfiles" },
[E_RESOLVE_SERVICE_ENDOFKEY] = { .field = 0 }
} ;
uint32_t resolve_add_uint(char const *data)
{
uint32_t u ;
if (!data)
data = "0" ;
if (!uint0_scan(data, &u))
return 0 ;
return u ;
}
int service_resolve_modify_field(resolve_service_t *res, resolve_service_enum_t field, char const *data)
{
log_flow() ;
uint32_t ifield ;
int e = 0 ;
resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, res) ;
switch(field) {
case SERVICE_ENUM_NAME:
res->name = resolve_add_string(wres,data) ;
// configuration
case E_RESOLVE_SERVICE_NAME:
res->name = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_DESCRIPTION:
res->description = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_DESCRIPTION:
res->description = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_VERSION:
res->version = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_VERSION:
res->version = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_TYPE:
res->type = resolve_add_uint(data) ;
break ;
case SERVICE_ENUM_LOGGER:
res->logger = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_NOTIFY:
res->notify = resolve_add_uint(data) ;
break ;
case SERVICE_ENUM_LOGREAL:
res->logreal = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_MAXDEATH:
res->maxdeath = resolve_add_uint(data) ; ;
break ;
case SERVICE_ENUM_LOGASSOC:
res->logassoc = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_EARLIER:
res->earlier = resolve_add_uint(data) ; ;
break ;
case SERVICE_ENUM_DSTLOG:
res->dstlog = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_HIERCOPY:
res->hiercopy = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_DEPENDS:
res->depends = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_INTREE:
res->intree = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_REQUIREDBY:
res->requiredby = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_OWNERSTR:
res->ownerstr = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_OPTSDEPS:
res->optsdeps = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_OWNER:
res->owner = resolve_add_uint(data) ;
break ;
case SERVICE_ENUM_EXTDEPS:
res->extdeps = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_TREENAME:
res->treename = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_CONTENTS:
res->contents = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_USER:
res->user = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_SRC:
res->src = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_INMODULE:
res->inmodule = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_SRCONF:
res->srconf = resolve_add_string(wres,data) ;
// path
case E_RESOLVE_SERVICE_HOME:
res->path.home = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_LIVE:
res->live = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_FRONTEND:
res->path.frontend = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_RUNAT:
res->runat = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_TREE:
res->path.tree = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_TREE:
res->tree = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_STATUS:
res->path.status = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_TREENAME:
res->treename = resolve_add_string(wres,data) ;
// dependencies
case E_RESOLVE_SERVICE_DEPENDS:
res->dependencies.depends = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_STATE:
res->state = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_REQUIREDBY:
res->dependencies.requiredby = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_EXEC_RUN:
res->exec_run = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_OPTSDEPS:
res->dependencies.optsdeps = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_EXEC_LOG_RUN:
res->exec_log_run = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_NDEPENDS:
res->dependencies.ndepends = resolve_add_uint(data) ;
break ;
case SERVICE_ENUM_REAL_EXEC_RUN:
res->real_exec_run = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_NREQUIREDBY:
res->dependencies.nrequiredby = resolve_add_uint(data) ;
break ;
case SERVICE_ENUM_REAL_EXEC_LOG_RUN:
res->real_exec_log_run = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_NOPTSDEPS:
res->dependencies.noptsdeps = resolve_add_uint(data) ;
break ;
case SERVICE_ENUM_EXEC_FINISH:
res->exec_finish = resolve_add_string(wres,data) ;
// execute
case E_RESOLVE_SERVICE_RUN:
res->execute.run.run = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_REAL_EXEC_FINISH:
res->real_exec_finish = resolve_add_string(wres,data) ;
case E_RESOLVE_SERVICE_RUN_USER:
res->execute.run.run_user = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_TYPE:
if (!uint0_scan(data, &ifield)) goto err ;
res->type = ifield ;
case E_RESOLVE_SERVICE_RUN_BUILD:
res->execute.run.build = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_NDEPENDS:
if (!uint0_scan(data, &ifield)) goto err ;
res->ndepends = ifield ;
case E_RESOLVE_SERVICE_RUN_SHEBANG:
res->execute.run.shebang = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_NREQUIREDBY:
if (!uint0_scan(data, &ifield)) goto err ;
res->nrequiredby = ifield ;
case E_RESOLVE_SERVICE_RUN_RUNAS:
res->execute.run.runas = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_NOPTSDEPS:
if (!uint0_scan(data, &ifield)) goto err ;
res->noptsdeps = ifield ;
case E_RESOLVE_SERVICE_FINISH:
res->execute.finish.run = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_NEXTDEPS:
if (!uint0_scan(data, &ifield)) goto err ;
res->nextdeps = ifield ;
case E_RESOLVE_SERVICE_FINISH_USER:
res->execute.finish.run_user = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_NCONTENTS:
if (!uint0_scan(data, &ifield)) goto err ;
res->ncontents = ifield ;
case E_RESOLVE_SERVICE_FINISH_BUILD:
res->execute.finish.build = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_DOWN:
if (!uint0_scan(data, &ifield)) goto err ;
res->down = ifield ;
case E_RESOLVE_SERVICE_FINISH_SHEBANG:
res->execute.finish.shebang = resolve_add_string(wres, data) ;
break ;
case SERVICE_ENUM_DISEN:
if (!uint0_scan(data, &ifield)) goto err ;
res->disen = ifield ;
case E_RESOLVE_SERVICE_FINISH_RUNAS:
res->execute.finish.runas = resolve_add_string(wres, data) ;
break ;
default:
case E_RESOLVE_SERVICE_TIMEOUTKILL:
res->execute.timeout.kill = resolve_add_uint(data) ;
break ;
case E_RESOLVE_SERVICE_TIMEOUTFINISH:
res->execute.timeout.finish = resolve_add_uint(data) ;
break ;
case E_RESOLVE_SERVICE_TIMEOUTUP:
res->execute.timeout.up = resolve_add_uint(data) ;
break ;
case E_RESOLVE_SERVICE_TIMEOUTDOWN:
res->execute.timeout.down = resolve_add_uint(data) ;
break ;
case E_RESOLVE_SERVICE_DOWN:
res->execute.down = resolve_add_uint(data) ;
break ;
case E_RESOLVE_SERVICE_DOWNSIGNAL:
res->execute.downsignal = resolve_add_uint(data) ;
break ;
// live
case E_RESOLVE_SERVICE_LIVEDIR:
res->live.livedir = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_SCANDIR:
res->live.scandir = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_STATEDIR:
res->live.statedir = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_EVENTDIR:
res->live.eventdir = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_NOTIFDIR:
res->live.notifdir = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_SUPERVISEDIR:
res->live.supervisedir = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_FDHOLDERDIR:
res->live.fdholderdir = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_ONESHOTDDIR:
res->live.oneshotddir = resolve_add_string(wres, data) ;
break ;
// logger
case E_RESOLVE_SERVICE_LOGNAME:
res->logger.name = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_LOGDESTINATION:
res->logger.destination = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_LOGBACKUP:
res->logger.backup = resolve_add_uint(data) ;
break ;
case E_RESOLVE_SERVICE_LOGMAXSIZE:
res->logger.maxsize = resolve_add_uint(data) ;
break ;
case E_RESOLVE_SERVICE_LOGTIMESTAMP:
res->logger.timestamp = resolve_add_uint(data) ;
break ;
case E_RESOLVE_SERVICE_LOGWANT:
res->logger.want = resolve_add_uint(data) ;
break ;
case E_RESOLVE_SERVICE_LOGRUN:
res->logger.execute.run.run = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_LOGRUN_USER:
res->logger.execute.run.run_user = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_LOGRUN_BUILD:
res->logger.execute.run.build = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_LOGRUN_SHEBANG:
res->logger.execute.run.shebang = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_LOGRUN_RUNAS:
res->logger.execute.run.runas = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_LOGTIMEOUTKILL:
res->logger.timeout.kill = resolve_add_uint(data) ;
break ;
case E_RESOLVE_SERVICE_LOGTIMEOUTFINISH:
res->logger.timeout.finish = resolve_add_uint(data) ;
break ;
// environment
case E_RESOLVE_SERVICE_ENV:
res->environ.env = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_ENVDIR:
res->environ.envdir = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_ENV_OVERWRITE:
res->environ.env_overwrite = resolve_add_uint(data) ;
break ;
// regex
case E_RESOLVE_SERVICE_REGEX_CONFIGURE:
res->regex.configure = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_REGEX_DIRECTORIES:
res->regex.directories = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_REGEX_FILES:
res->regex.files = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_REGEX_INFILES:
res->regex.infiles = resolve_add_string(wres, data) ;
break ;
case E_RESOLVE_SERVICE_REGEX_NDIRECTORIES:
res->regex.ndirectories = resolve_add_uint(data) ;
break ;
case E_RESOLVE_SERVICE_REGEX_NFILES:
res->regex.nfiles = resolve_add_uint(data) ;
break ;
case E_RESOLVE_SERVICE_REGEX_NINFILES:
res->regex.ninfiles = resolve_add_uint(data) ;
break ;
default:
return e ;
}
e = 1 ;
err:
free(wres) ;
return e ;
free(wres) ;
return e ;
}
......@@ -33,137 +33,164 @@ int service_resolve_read_cdb(cdb *c, resolve_service_t *res)
wres = resolve_set_struct(DATA_SERVICE, res) ;
/* name */
/* configuration */
resolve_find_cdb(&tmp,c,"name") ;
res->name = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* description */
resolve_find_cdb(&tmp,c,"description") ;
res->description = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* version */
resolve_find_cdb(&tmp,c,"version") ;
res->version = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
x = resolve_find_cdb(&tmp,c,"type") ;
res->type = x ;
x = resolve_find_cdb(&tmp,c,"notify") ;
res->notify = x ;
x = resolve_find_cdb(&tmp,c,"maxdeath") ;
res->maxdeath = x ;
x = resolve_find_cdb(&tmp,c,"earlier") ;
res->earlier = x ;
resolve_find_cdb(&tmp,c,"hiercopy") ;
res->hiercopy = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"intree") ;
res->intree = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"ownerstr") ;
res->ownerstr = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
x = resolve_find_cdb(&tmp,c,"owner") ;
res->owner = x ;
resolve_find_cdb(&tmp,c,"treename") ;
res->treename = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"user") ;
res->user = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"inmodule") ;
res->inmodule = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* path configuration */
resolve_find_cdb(&tmp,c,"home") ;
res->path.home = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"frontend") ;
res->path.frontend = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"tree") ;
res->path.tree = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"status") ;
res->path.status = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* logger */
resolve_find_cdb(&tmp,c,"logger") ;
res->logger = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* logreal */
resolve_find_cdb(&tmp,c,"logreal") ;
res->logreal = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* logassoc */
resolve_find_cdb(&tmp,c,"logassoc") ;
res->logassoc = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* dstlog */
resolve_find_cdb(&tmp,c,"dstlog") ;
res->dstlog = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* depends */
/* dependencies */
resolve_find_cdb(&tmp,c,"depends") ;
res->depends = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* requiredby */
res->dependencies.depends = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"requiredby") ;
res->requiredby = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* optsdeps */
res->dependencies.requiredby = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"optsdeps") ;
res->optsdeps = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* extdeps */
resolve_find_cdb(&tmp,c,"extdeps") ;
res->extdeps = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* contents */
resolve_find_cdb(&tmp,c,"contents") ;
res->contents = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* src */
resolve_find_cdb(&tmp,c,"src") ;
res->src = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* srconf */
resolve_find_cdb(&tmp,c,"srconf") ;
res->srconf = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* live */
resolve_find_cdb(&tmp,c,"live") ;
res->live = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* runat */
resolve_find_cdb(&tmp,c,"runat") ;
res->runat = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* tree */
resolve_find_cdb(&tmp,c,"tree") ;
res->tree = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* treename */
resolve_find_cdb(&tmp,c,"treename") ;
res->treename = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* state */
resolve_find_cdb(&tmp,c,"state") ;
res->state = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* exec_run */
resolve_find_cdb(&tmp,c,"exec_run") ;
res->exec_run = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* exec_log_run */
resolve_find_cdb(&tmp,c,"exec_log_run") ;
res->exec_log_run = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* real_exec_run */
resolve_find_cdb(&tmp,c,"real_exec_run") ;
res->real_exec_run = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* real_exec_log_run */
resolve_find_cdb(&tmp,c,"real_exec_log_run") ;
res->real_exec_log_run = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* exec_finish */
resolve_find_cdb(&tmp,c,"exec_finish") ;
res->exec_finish = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* real_exec_finish */
resolve_find_cdb(&tmp,c,"real_exec_finish") ;
res->real_exec_finish = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* type */
x = resolve_find_cdb(&tmp,c,"type") ;
res->type = x ;
/* ndepends */
res->dependencies.optsdeps = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
x = resolve_find_cdb(&tmp,c,"ndepends") ;
res->ndepends = x ;
/* nrequiredby */
res->dependencies.ndepends = x ;
x = resolve_find_cdb(&tmp,c,"nrequiredby") ;
res->nrequiredby = x ;
/* noptsdeps */
res->dependencies.nrequiredby = x ;
x = resolve_find_cdb(&tmp,c,"noptsdeps") ;
res->noptsdeps = x ;
/* nextdeps */
x = resolve_find_cdb(&tmp,c,"nextdeps") ;
res->nextdeps = x ;
res->dependencies.noptsdeps = x ;
/* execute */
resolve_find_cdb(&tmp,c,"run") ;
res->execute.run.run = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"run_user") ;
res->execute.run.run_user = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"run_build") ;
res->execute.run.build = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"run_shebang") ;
res->execute.run.shebang = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"run_runas") ;
res->execute.run.runas = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"finish") ;
res->execute.finish.run = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"finish_user") ;
res->execute.finish.run_user = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"finish_build") ;
res->execute.finish.build = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
x = resolve_find_cdb(&tmp,c,"finish_shebang") ;
res->execute.finish.shebang = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
x = resolve_find_cdb(&tmp,c,"finish_runas") ;
res->execute.finish.runas = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
x = resolve_find_cdb(&tmp,c,"timeoutkill") ;
res->execute.timeout.kill = x ;
x = resolve_find_cdb(&tmp,c,"timeoutfinish") ;
res->execute.timeout.finish = x ;
x = resolve_find_cdb(&tmp,c,"timeoutup") ;
res->execute.timeout.up = x ;
x = resolve_find_cdb(&tmp,c,"timeoutdown") ;
res->execute.timeout.down = x ;
x = resolve_find_cdb(&tmp,c,"down") ;
res->execute.down = x ;
x = resolve_find_cdb(&tmp,c,"downsignal") ;
res->execute.downsignal = x ;
/* ncontents */
x = resolve_find_cdb(&tmp,c,"ncontents") ;
res->ncontents = x ;
/* live */
resolve_find_cdb(&tmp,c,"livedir") ;
res->live.livedir = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"scandir") ;
res->live.scandir = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"statedir") ;
res->live.statedir = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"eventdir") ;
res->live.eventdir = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"notifdir") ;
res->live.notifdir = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"supervisedir") ;
res->live.supervisedir = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"fdholderdir") ;
res->live.fdholderdir = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"oneshotddir") ;
res->live.oneshotddir = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
/* down */
x = resolve_find_cdb(&tmp,c,"down") ;
res->down = x ;
/* logger */
resolve_find_cdb(&tmp,c,"logname") ;
res->logger.name = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"logdestination") ;
res->logger.destination = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
x = resolve_find_cdb(&tmp,c,"logbackup") ;
res->logger.backup = x ;
x = resolve_find_cdb(&tmp,c,"logmaxsize") ;
res->logger.maxsize = x ;
x = resolve_find_cdb(&tmp,c,"logtimestamp") ;
res->logger.timestamp = x ;
x = resolve_find_cdb(&tmp,c,"logwant") ;
res->logger.want = x ;
resolve_find_cdb(&tmp,c,"logrun") ;
res->logger.execute.run.run = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"logrun_user") ;
res->logger.execute.run.run_user = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"logrun_build") ;
res->logger.execute.run.build = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
x = resolve_find_cdb(&tmp,c,"logrun_shebang") ;
res->logger.execute.run.shebang = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
x = resolve_find_cdb(&tmp,c,"logrun_runas") ;
res->logger.execute.run.runas = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
x = resolve_find_cdb(&tmp,c,"logtimeoutkill") ;
res->logger.timeout.kill = x ;
x = resolve_find_cdb(&tmp,c,"logtimeoutfinish") ;
res->logger.timeout.finish = x ;
/* environment */
resolve_find_cdb(&tmp,c,"env") ;
res->environ.env = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"envdir") ;
res->environ.envdir = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
x = resolve_find_cdb(&tmp,c,"env_overwrite") ;
res->environ.env_overwrite = x ;
/* regex */
resolve_find_cdb(&tmp,c,"configure") ;
res->regex.configure = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"directories") ;
res->regex.directories = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"files") ;
res->regex.files = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
resolve_find_cdb(&tmp,c,"infiles") ;
res->regex.infiles = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
x = resolve_find_cdb(&tmp,c,"ndirectories") ;
res->regex.ndirectories = x ;
x = resolve_find_cdb(&tmp,c,"nfiles") ;
res->regex.nfiles = x ;
x = resolve_find_cdb(&tmp,c,"ninfiles") ;
res->regex.ninfiles = x ;
/* disen */
x = resolve_find_cdb(&tmp,c,"disen") ;
res->disen = x ;
free(wres) ;
stralloc_free(&tmp) ;
......
......@@ -19,8 +19,18 @@
#include <skalibs/stralloc.h>
#include <66/resolve.h>
#include <66/enum.h>
#include <66/service.h>
/***
*
*
*
* may not be used anymore
*
*
*
*
* */
int service_resolve_sort_bytype(stralloc *list, char const *src)
{
log_flow() ;
......@@ -70,7 +80,6 @@ int service_resolve_sort_bytype(stralloc *list, char const *src)
break ;
case TYPE_BUNDLE:
case TYPE_LONGRUN:
case TYPE_ONESHOT:
if (!stralloc_insertb(list, module_list, name, strlen(name) + 1))
......
/*
* service_resolve_write.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 <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <oblibs/log.h>
#include <oblibs/string.h>
#include <66/service.h>
#include <66/resolve.h>
#include <66/constants.h>
int service_resolve_write(resolve_service_t *res)
{
log_flow() ;
int r, e = 0 ;
char *name = res->sa.s + res->name ;
size_t namelen = strlen(name) ;
char sym[strlen(res->sa.s + res->path.home) + SS_SYSTEM_LEN + SS_RESOLVE_LEN + 1 + SS_SERVICE_LEN + 1 + namelen + 1] ;
char dst[strlen(res->sa.s + res->path.tree) + SS_SVDIRS_LEN + 1] ;
resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, res) ;
auto_strings(sym, res->sa.s + res->path.home, SS_SYSTEM, SS_RESOLVE, "/", SS_SERVICE, "/", name) ;
auto_strings(dst, res->sa.s + res->path.tree, SS_SVDIRS) ;
if (!resolve_write(wres, dst, name))
goto err ;
r = symlink(dst, sym) ;
if (r < 0 && errno != EEXIST) {
log_warnusys("point symlink: ", sym, " to: ", dst) ;
goto err ;
}
e = 1 ;
err:
free(wres) ;
return e ;
}
......@@ -26,107 +26,92 @@ int service_resolve_write_cdb(cdbmaker *c, resolve_service_t *sres)
char *str = sres->sa.s ;
/* name */
if (!resolve_add_cdb(c,"name",str + sres->name) ||
/* description */
!resolve_add_cdb(c,"description",str + sres->description) ||
/* version */
!resolve_add_cdb(c,"version",str + sres->version) ||
/* logger */
!resolve_add_cdb(c,"logger",str + sres->logger) ||
/* logreal */
!resolve_add_cdb(c,"logreal",str + sres->logreal) ||
/* logassoc */
!resolve_add_cdb(c,"logassoc",str + sres->logassoc) ||
/* dstlog */
!resolve_add_cdb(c,"dstlog",str + sres->dstlog) ||
/* depends */
!resolve_add_cdb(c,"depends",str + sres->depends) ||
/* deps */
!resolve_add_cdb(c,"requiredby",str + sres->requiredby) ||
/* optsdeps */
!resolve_add_cdb(c,"optsdeps",str + sres->optsdeps) ||
/* extdeps */
!resolve_add_cdb(c,"extdeps",str + sres->extdeps) ||
/* contents */
!resolve_add_cdb(c,"contents",str + sres->contents) ||
/* src */
!resolve_add_cdb(c,"src",str + sres->src) ||
/* srconf */
!resolve_add_cdb(c,"srconf",str + sres->srconf) ||
/* live */
!resolve_add_cdb(c,"live",str + sres->live) ||
/* runat */
!resolve_add_cdb(c,"runat",str + sres->runat) ||
/* tree */
!resolve_add_cdb(c,"tree",str + sres->tree) ||
/* treename */
!resolve_add_cdb(c,"treename",str + sres->treename) ||
/* dstlog */
!resolve_add_cdb(c,"dstlog",str + sres->dstlog) ||
/* state */
!resolve_add_cdb(c,"state",str + sres->state) ||
/* exec_run */
!resolve_add_cdb(c,"exec_run",str + sres->exec_run) ||
/* exec_log_run */
!resolve_add_cdb(c,"exec_log_run",str + sres->exec_log_run) ||
/* real_exec_run */
!resolve_add_cdb(c,"real_exec_run",str + sres->real_exec_run) ||
/* real_exec_log_run */
!resolve_add_cdb(c,"real_exec_log_run",str + sres->real_exec_log_run) ||
/* exec_finish */
!resolve_add_cdb(c,"exec_finish",str + sres->exec_finish) ||
/* real_exec_finish */
!resolve_add_cdb(c,"real_exec_finish",str + sres->real_exec_finish) ||
/* type */
!resolve_add_cdb_uint(c,"type",sres->type) ||
/* ndepends */
!resolve_add_cdb_uint(c,"ndepends",sres->ndepends) ||
/* ndeps */
!resolve_add_cdb_uint(c,"ndeps",sres->nrequiredby) ||
/* noptsdeps */
!resolve_add_cdb_uint(c,"noptsdeps",sres->noptsdeps) ||
/* nextdeps */
!resolve_add_cdb_uint(c,"nextdeps",sres->nextdeps) ||
/* ncontents */
!resolve_add_cdb_uint(c,"ncontents",sres->ncontents) ||
/* down */
!resolve_add_cdb_uint(c,"down",sres->down) ||
/* disen */
!resolve_add_cdb_uint(c,"disen",sres->disen)) return 0 ;
// configuration
if (!resolve_add_cdb(c, "name", str + sres->name) ||
!resolve_add_cdb(c, "description", str + sres->description) ||
!resolve_add_cdb(c, "version", str + sres->version) ||
!resolve_add_cdb_uint(c, "type", sres->type) ||
!resolve_add_cdb_uint(c, "notify", sres->notify) ||
!resolve_add_cdb_uint(c, "maxdeath", sres->maxdeath) ||
!resolve_add_cdb_uint(c, "earlier", sres->earlier) ||
!resolve_add_cdb(c, "hiercopy", str + sres->hiercopy) ||
!resolve_add_cdb(c, "intree", str + sres->intree) ||
!resolve_add_cdb(c, "ownerstr", str + sres->ownerstr) ||
!resolve_add_cdb_uint(c, "owner", sres->owner) ||
!resolve_add_cdb(c, "treename", str + sres->treename) ||
!resolve_add_cdb(c, "user", str + sres->user) ||
!resolve_add_cdb(c, "inmodule", str + sres->inmodule) ||
// path
!resolve_add_cdb(c, "home", str + sres->path.home) ||
!resolve_add_cdb(c, "frontend", str + sres->path.frontend) ||
!resolve_add_cdb(c, "tree", str + sres->path.tree) ||
!resolve_add_cdb(c, "status", str + sres->path.status) ||
// dependencies
!resolve_add_cdb(c, "depends", str + sres->dependencies.depends) ||
!resolve_add_cdb(c, "requiredby", str + sres->dependencies.requiredby) ||
!resolve_add_cdb(c, "optsdeps", str + sres->dependencies.optsdeps) ||
!resolve_add_cdb_uint(c, "ndepends", sres->dependencies.ndepends) ||
!resolve_add_cdb_uint(c, "nrequiredby", sres->dependencies.nrequiredby) ||
!resolve_add_cdb_uint(c, "noptsdeps", sres->dependencies.noptsdeps) ||
// execute
!resolve_add_cdb(c, "run", str + sres->execute.run.run) ||
!resolve_add_cdb(c, "run_user", str + sres->execute.run.run_user) ||
!resolve_add_cdb(c, "run_build", str + sres->execute.run.build) ||
!resolve_add_cdb(c, "run_shebang", str + sres->execute.run.shebang) ||
!resolve_add_cdb(c, "run_runas", str + sres->execute.run.runas) ||
!resolve_add_cdb(c, "finish", str + sres->execute.finish.run) ||
!resolve_add_cdb(c, "finish_user", str + sres->execute.finish.run_user) ||
!resolve_add_cdb(c, "finish_build", str + sres->execute.finish.build) ||
!resolve_add_cdb(c, "finish_shebang", str + sres->execute.finish.shebang) ||
!resolve_add_cdb(c, "finish_runas", str + sres->execute.finish.runas) ||
!resolve_add_cdb_uint(c, "timeoutkill", sres->execute.timeout.kill) ||
!resolve_add_cdb_uint(c, "timeoutfinish", sres->execute.timeout.finish) ||
!resolve_add_cdb_uint(c, "timeoutup", sres->execute.timeout.up) ||
!resolve_add_cdb_uint(c, "timeoutdown", sres->execute.timeout.down) ||
!resolve_add_cdb_uint(c, "down", sres->execute.down) ||
!resolve_add_cdb_uint(c, "downsignal", sres->execute.downsignal) ||
//live
!resolve_add_cdb(c, "livedir", str + sres->live.livedir) ||
!resolve_add_cdb(c, "scandir", str + sres->live.scandir) ||
!resolve_add_cdb(c, "statedir", str + sres->live.statedir) ||
!resolve_add_cdb(c, "eventdir", str + sres->live.eventdir) ||
!resolve_add_cdb(c, "notifdir", str + sres->live.notifdir) ||
!resolve_add_cdb(c, "supervisedir", str + sres->live.supervisedir) ||
!resolve_add_cdb(c, "fdholderdir", str + sres->live.fdholderdir) ||
!resolve_add_cdb(c, "oneshotddir", str + sres->live.oneshotddir) ||
// logger
!resolve_add_cdb(c, "logname", str + sres->logger.name) ||
!resolve_add_cdb(c, "logdestination", str + sres->logger.destination) ||
!resolve_add_cdb_uint(c, "logbackup", sres->logger.backup) ||
!resolve_add_cdb_uint(c, "logmaxsize", sres->logger.maxsize) ||
!resolve_add_cdb_uint(c, "logwant", sres->logger.want) ||
!resolve_add_cdb_uint(c, "logtimestamp", sres->logger.timestamp) ||
!resolve_add_cdb(c, "logrun", str + sres->logger.execute.run.run) ||
!resolve_add_cdb(c, "logrun_user", str + sres->logger.execute.run.run_user) ||
!resolve_add_cdb(c, "logrun_build", str + sres->logger.execute.run.build) ||
!resolve_add_cdb(c, "logrun_shebang", str + sres->logger.execute.run.shebang) ||
!resolve_add_cdb(c, "logrun_runas", str + sres->logger.execute.run.runas) ||
!resolve_add_cdb_uint(c, "logtimeoutkill", sres->logger.execute.timeout.kill) ||
!resolve_add_cdb_uint(c, "logtimeoutfinish", sres->logger.execute.timeout.finish) ||
// environ
!resolve_add_cdb(c, "env", str + sres->environ.env) ||
!resolve_add_cdb(c, "envdir", str + sres->environ.envdir) ||
!resolve_add_cdb_uint(c, "env_overwrite", sres->environ.env_overwrite) ||
// regex
!resolve_add_cdb(c, "configure", str + sres->regex.configure) ||
!resolve_add_cdb(c, "directories", str + sres->regex.directories) ||
!resolve_add_cdb(c, "files", str + sres->regex.files) ||
!resolve_add_cdb(c, "infiles", str + sres->regex.infiles) ||
!resolve_add_cdb_uint(c, "ndirectories", sres->regex.ndirectories) ||
!resolve_add_cdb_uint(c, "nfiles", sres->regex.nfiles) ||
!resolve_add_cdb_uint(c, "ninfiles", sres->regex.ninfiles)) return 0 ;
return 1 ;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment