static int set_caps()

in src/native/unix/native/jsvc-unix.c [308:355]


static int set_caps(int cap_type)
{
    cap_t c;
    int ncap;
    int flag = CAP_SET;
    cap_value_t *caps;

    if (ld_libcap()) {
        return set_legacy_caps(cap_type);
    }
    if (cap_type == CAPS_UID) {
        ncap = sizeof(caps_uid) / sizeof(cap_value_t);
        caps = caps_uid;
    }
    else if (cap_type == CAPS_UID_MIN) {
        ncap = sizeof(caps_uid_min) / sizeof(cap_value_t);
        caps = caps_uid_min;
    }
    else if (cap_type == CAPS_NO_UID) {
        ncap = sizeof(caps_no_uid) / sizeof(cap_value_t);
        caps = caps_no_uid;
    }
    else if (cap_type == CAPS_NO_UID_MIN) {
        ncap = sizeof(caps_no_uid_min) / sizeof(cap_value_t);
        caps = caps_no_uid_min;
    }
    else {
        ncap = sizeof(caps_no_uid_min) / sizeof(cap_value_t);
        caps = caps_no_uid_min;
        flag = CAP_CLEAR;
    }
    c = (*fp_cap_init) ();
    (*fp_cap_clear) (c);
    (*fp_cap_set_flag) (c, CAP_EFFECTIVE, ncap, caps, flag);
    (*fp_cap_set_flag) (c, CAP_INHERITABLE, ncap, caps, flag);
    (*fp_cap_set_flag) (c, CAP_PERMITTED, ncap, caps, flag);
    if ((*fp_cap_set_proc) (c) != 0) {
        return -1;
    }
    (*fp_cap_free) (c);
    if (cap_type == CAPS_UID || cap_type == CAPS_UID_MIN)
        log_debug("increased capability set.");
    else if (cap_type == CAPS_NO_UID || cap_type == CAPS_NO_UID_MIN)
        log_debug("decreased capability set.");
    else
        log_debug("dropped capabilities.");
    return 0;
}