diff --git a/src/lib66/rc/rc_send.c b/src/lib66/rc/rc_send.c index 1f1f682ec42366dacb08bfa4ac3e9f2a6c7b1465..95a0bd1b54e9ac9dc77f2dfd4e3664a9bcc93c1a 100644 --- a/src/lib66/rc/rc_send.c +++ b/src/lib66/rc/rc_send.c @@ -24,24 +24,24 @@ #include <66/service.h> #include <66/ssexec.h> -int rc_send(ssexec_t *info,genalloc *ga,char const *sig,char const *const *envp) +int rc_send(ssexec_t *info, resolve_service_t *sv, unsigned int len, char const *sig) { log_flow() ; - size_t i = 0 ; - int nargc = 3 + genalloc_len(resolve_service_t,ga) ; + unsigned int pos = 0 ; + int nargc = 3 + len ; char const *newargv[nargc] ; unsigned int m = 0 ; - newargv[m++] = "fake_name" ; + newargv[m++] = "rc_send" ; newargv[m++] = sig ; - for (; i < genalloc_len(resolve_service_t,ga) ; i++) - newargv[m++] = genalloc_s(resolve_service_t,ga)[i].sa.s + genalloc_s(resolve_service_t,ga)[i].name ; + for (; pos < len ; pos++) + newargv[m++] = sv[pos].sa.s + sv[pos].name ; newargv[m++] = 0 ; - if (ssexec_dbctl(nargc,newargv,envp,info)) + if (ssexec_dbctl(nargc, newargv, (char const *const *) environ, info)) return 0 ; return 1 ; diff --git a/src/lib66/rc/rc_unsupervise.c b/src/lib66/rc/rc_unsupervise.c index eb6a20fe4d53707258920c1286ee4633b5aed002..a48f524fca9cf5ebe24b0ac1a8a4380d2c04aa05 100644 --- a/src/lib66/rc/rc_unsupervise.c +++ b/src/lib66/rc/rc_unsupervise.c @@ -31,84 +31,78 @@ #include <s6-rc/s6rc-servicedir.h> -int rc_unsupervise(ssexec_t *info,genalloc *ga,char const *sig,char const *const *envp) +int rc_unsupervise(ssexec_t *info, resolve_service_t *sv, unsigned int len) { log_flow() ; - size_t i = 0 ; + unsigned int pos = 0, e = 0 ; resolve_service_t_ref pres ; - stralloc sares = STRALLOC_ZERO ; ss_state_t sta = STATE_ZERO ; char prefix[info->treename.len + 2] ; - memcpy(prefix,info->treename.s,info->treename.len) ; - memcpy(prefix + info->treename.len,"-",1) ; - prefix[info->treename.len + 1] = 0 ; + auto_strings(prefix, info->treename.s, "-") ; char live[info->livetree.len + 1 + info->treename.len + 1 ]; - memcpy(live,info->livetree.s,info->livetree.len) ; - live[info->livetree.len] = '/' ; - memcpy(live + info->livetree.len + 1,info->treename.s,info->treename.len) ; - live[info->livetree.len + 1 + info->treename.len] = 0 ; - - if (!db_switch_to(info,envp,SS_SWSRC)) - { - log_warnu("switch ",info->treename.s," to source") ; + auto_strings(live, info->livetree.s, "/", info->treename.s) ; + + if (!db_switch_to(info, SS_SWSRC)) { + log_warnu("switch ", info->treename.s, " to source") ; goto err ; } - if (!rc_send(info,ga,sig,envp)) - { + if (!rc_send(info, ga, sig, envp)) { log_warnu("stop services") ; goto err ; } - for (; i < genalloc_len(resolve_service_t,ga) ; i++) - { - char const *string = genalloc_s(resolve_service_t,ga)[i].sa.s ; - char const *name = string + genalloc_s(resolve_service_t,ga)[i].name ; - log_trace("delete directory service: ",string + genalloc_s(resolve_service_t,ga)[i].runat) ; - s6rc_servicedir_unsupervise(live,prefix,name,0) ; - if (rm_rf(string + genalloc_s(resolve_service_t,ga)[i].runat) < 0) goto err ; - } - if (!sa_pointo(&sares,info,SS_NOTYPE,SS_RESOLVE_SRC)) - { - log_warnusys("set revolve pointer to source") ; - goto err ; + for (; pos < len ; pos++) { + + pres = &sv[pos] ; + char const *string = pres->sa.s ; + char const *name = string + pres->name ; + + log_trace("delete directory service: ", string + pres->runat) ; + s6rc_servicedir_unsupervise(live, prefix, name, 0) ; + + if (rm_rf(string + pres->runat) < 0) + goto err ; } - for (i = 0 ; i < genalloc_len(resolve_service_t,ga) ; i++) - { - pres = &genalloc_s(resolve_service_t,ga)[i] ; + + char res_s[info->base.len + SS_SYSTEM + 1 + info->treename.len + SS_SVDIRS_LEN + 1] ; + auto_strings(res_s, info->base.s, SS_SYSTEM, "/", info->treename.s, SS_SVDIRS) ; + + for (pos = 0 ; pos < len ; pos++) { + + pres = &sv[pos] ; char const *string = pres->sa.s ; char const *name = string + pres->name ; char const *state = string + pres->state ; // remove the resolve/state file if the service is disabled if (!pres->disen) { - log_trace("Delete resolve file of: ",name) ; - resolve_rmfile(sares.s,name) ; - log_trace("Delete state file of: ",name) ; - state_rmfile(state,name) ; + log_trace("Delete resolve file of: ", name) ; + resolve_rmfile(res_s, name) ; + log_trace("Delete state file of: ", name) ; + state_rmfile(state, name) ; } else { - state_setflag(&sta,SS_FLAGS_RELOAD,SS_FLAGS_FALSE) ; - state_setflag(&sta,SS_FLAGS_INIT,SS_FLAGS_TRUE) ; - // state_setflag(&sta,SS_FLAGS_UNSUPERVISE,SS_FLAGS_FALSE) ; - state_setflag(&sta,SS_FLAGS_STATE,SS_FLAGS_FALSE) ; - state_setflag(&sta,SS_FLAGS_PID,SS_FLAGS_FALSE) ; + state_setflag(&sta, SS_FLAGS_RELOAD, SS_FLAGS_FALSE) ; + state_setflag(&sta, SS_FLAGS_INIT, SS_FLAGS_TRUE) ; + // state_setflag(&sta, SS_FLAGS_UNSUPERVISE, SS_FLAGS_FALSE) ; + state_setflag(&sta, SS_FLAGS_STATE, SS_FLAGS_FALSE) ; + state_setflag(&sta, SS_FLAGS_PID, SS_FLAGS_FALSE) ; log_trace("Write state file of: ",name) ; - if (!state_write(&sta,state,name)) + if (!state_write(&sta, state, name)) { - log_warnusys("write state file of: ",name) ; + log_warnusys("write state file of: ", name) ; goto err ; } } - log_info("Unsupervised successfully: ",name) ; + log_info("Unsupervised successfully: ", name) ; } - stralloc_free(&sares) ; - return 1 ; + e = 1 ; + err: - stralloc_free(&sares) ; - return 0 ; + return e ; }