예제 #1
0
파일: aa-start.c 프로젝트: jjk-jacky/anopa
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);
}
예제 #2
0
파일: aa-start.c 프로젝트: jjk-jacky/anopa
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;
    }
}
예제 #3
0
파일: aa-start.c 프로젝트: jjk-jacky/anopa
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);
    }
}
예제 #4
0
파일: aa-reset.c 프로젝트: linsam/anopa
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 ();
    }
}