static void reset_service (const char *name, intptr_t mode) { aa_service *s; int si; int r; int old_event; int event; r = aa_get_service (name, &si, 1); if (r < 0) { aa_put_err (name, errmsg[-r], 1); return; } r = aa_preload_service (si); if (r < 0) { aa_put_err (name, errmsg[-r], 1); return; } s = aa_service (si); if (aa_service_status_read (&s->st, aa_service_name (s)) < 0 && errno != ENOENT) { int e = errno; aa_put_err (name, "Failed to read service status file: ", 0); aa_bs_noflush (AA_ERR, error_str (e)); aa_end_err (); return; } if (s->st.type == AA_TYPE_LONGRUN) { aa_put_err (name, "Can only reset ont-shot services", 1); return; } /* Starting/Stopping cannot be reset */ if (s->st.event == AA_EVT_STARTING || s->st.event == AA_EVT_STOPPING) return; if (mode == MODE_AUTO) { if (s->st.event == AA_EVT_STARTING_FAILED || s->st.event == AA_EVT_START_FAILED) event = AA_EVT_STARTED; else if (s->st.event == AA_EVT_STOPPING_FAILED || s->st.event == AA_EVT_STOP_FAILED) event = AA_EVT_STOPPED; else return; } else event = (mode == MODE_STARTED) ? AA_EVT_STARTED : AA_EVT_STOPPED; if (s->st.event == event) return; tain_now_g (); old_event = s->st.event; s->st.event = event; s->st.stamp = STAMP; aa_service_status_set_msg (&s->st, ""); if (aa_service_status_write (&s->st, aa_service_name (s)) < 0) { int e = errno; aa_put_err (name, "Failed to write service status file: ", 0); aa_bs_noflush (AA_ERR, error_str (e)); aa_end_err (); } else { aa_put_title (1, name, "", 0); aa_is_noflush (AA_OUT, ANSI_HIGHLIGHT_OFF); aa_bs_noflush (AA_OUT, eventmsg[old_event]); aa_is_noflush (AA_OUT, ANSI_HIGHLIGHT_ON); aa_bs_noflush (AA_OUT, " -> "); aa_bs_noflush (AA_OUT, eventmsg[event]); aa_end_title (); } }
static int add_service (const char *name, void *data) { int si = -1; int type; int r; type = aa_get_service (name, &si, 1); if (type < 0) r = type; else r = aa_mark_service (mode, si, type == AA_SERVICE_FROM_MAIN, no_wants, autoload_cb); if (r < 0) { if (r == -ERR_UNKNOWN) { put_err_service (name, ERR_UNKNOWN, 1); add_name_to_ga (name, &ga_unknown); } else if (r == -ERR_IO) { /* ERR_IO from aa_get_service() means we don't have a si (it is * actually set to the return value); but from aa_mark_service() * (e.g. to read "needs") then we do */ if (si < 0) { put_err_service (name, ERR_IO, 1); add_name_to_ga (name, &ga_io); } else { int e = errno; put_err_service (name, ERR_IO, 0); add_err (": "); add_err (strerror (e)); end_err (); add_to_list (&ga_failed, si, 0); check_essential (si); } } else if (r == -ERR_ALREADY_UP) { if (!(mode & AA_MODE_IS_DRY)) put_title (1, name, errmsg[-r], 1); ++nb_already; r = 0; } else { aa_service *s = aa_service (si); const char *msg = aa_service_status_get_msg (&s->st); int has_msg; has_msg = s->st.event == AA_EVT_ERROR && s->st.code == -r && !!msg; put_err_service (name, -r, !has_msg); if (has_msg) { add_err (": "); add_err (msg); end_err (); } add_to_list ((r == -ERR_DEPEND) ? &ga_depend : &ga_failed, si, 0); check_essential (si); } } else r = 0; return r; }