static void scan_cb (int si, int sni) { put_err_service (aa_service_name (aa_service (si)), ERR_DEPEND, 0); add_err (": "); add_err (aa_service_name (aa_service (sni))); end_err (); add_to_list (&ga_depend, si, 0); check_essential (si); }
void check_essential (int si) { if (rc == 0) { struct stat st; const char *name = aa_service_name (aa_service (si)); size_t l_name = strlen (name); char buf[l_name + 1 + sizeof (ESSENTIAL_FILENAME)]; byte_copy (buf, l_name, name); byte_copy (buf + l_name, 1 + sizeof (ESSENTIAL_FILENAME), "/" ESSENTIAL_FILENAME); if (stat (buf, &st) < 0) { if (errno != ENOENT) { int e = errno; put_warn (name, "Failed to stat " ESSENTIAL_FILENAME ": ", 0); add_warn (strerror (e)); end_warn (); } } else rc = 1; } }
static void autoload_cb (int si, aa_al al, const char *name, int err) { if (verbose) { int aa = (mode & AA_MODE_IS_DRY) ? AA_ERR : AA_OUT; aa_bs_noflush (aa, "auto-add: "); aa_bs_noflush (aa, aa_service_name (aa_service (si))); aa_bs_noflush (aa, (al == AA_AUTOLOAD_NEEDS) ? " needs " : " wants "); aa_bs_noflush (aa, name); aa_bs_flush (aa, "\n"); } if (al == AA_AUTOLOAD_WANTS && err > 0) { put_warn (aa_service_name (aa_service (si)), "Skipping wanted service ", 0); add_warn (name); add_warn (": "); add_warn (errmsg[err]); end_warn (); add_name_to_ga (name, &ga_skipped); } }
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 (); } }