コード例 #1
0
static int pppoe_payload_parse(PPPoETags *tags, struct pppoe_hdr *header) {
        struct pppoe_tag *tag;
        int r;

        assert(tags);

        pppoe_tags_clear(tags);

        PPPOE_TAGS_FOREACH(tag, header) {
                switch (PPPOE_TAG_TYPE(tag)) {
                case PTT_SRV_NAME:
                        r = pppoe_tag_parse_string(tag, &tags->service_name);
                        if (r < 0)
                                return r;

                        break;
                case PTT_AC_NAME:
                        r = pppoe_tag_parse_string(tag, &tags->ac_name);
                        if (r < 0)
                                return r;

                        break;
                case PTT_HOST_UNIQ:
                        r = pppoe_tag_parse_binary(tag, &tags->host_uniq, &tags->host_uniq_len);
                        if (r < 0)
                                return r;

                        break;
                case PTT_AC_COOKIE:
                        r = pppoe_tag_parse_binary(tag, &tags->cookie, &tags->cookie_len);
                        if (r < 0)
                                return r;

                        break;
                case PTT_SRV_ERR:
                case PTT_SYS_ERR:
                case PTT_GEN_ERR:
                {
                        _cleanup_free_ char *error = NULL;

                        /* TODO: do something more sensible with the error messages */
                        r = pppoe_tag_parse_string(tag, &error);
                        if (r < 0)
                                return r;

                        if (strlen(error) > 0 && utf8_is_valid(error))
                                log_debug("PPPoE: error - '%s'", error);
                        else
                                log_debug("PPPoE: error");

                        break;
                }
                default:
                        log_debug("PPPoE: ignoring unknown PPPoE tag type: 0x%.2x", PPPOE_TAG_TYPE(tag));
                }
        }

        return 0;
}
コード例 #2
0
sd_pppoe *sd_pppoe_unref(sd_pppoe *ppp) {
        if (ppp && REFCNT_DEC(ppp->n_ref) <= 0) {
                pppoe_tags_clear(&ppp->tags);
                free(ppp->ifname);
                free(ppp->service_name);
                sd_pppoe_stop(ppp);
                sd_pppoe_detach_event(ppp);

                free(ppp);
        }

        return NULL;
}
コード例 #3
0
ファイル: sd-pppoe.c プロジェクト: rowhit/systemd
sd_pppoe *sd_pppoe_unref(sd_pppoe *ppp) {

        if (!ppp)
                return NULL;

        assert(ppp->n_ref > 0);
        ppp->n_ref--;

        if (ppp->n_ref > 0)
                return NULL;

        pppoe_tags_clear(&ppp->tags);
        free(ppp->ifname);
        free(ppp->service_name);
        sd_pppoe_stop(ppp);
        sd_pppoe_detach_event(ppp);

        free(ppp);
        return NULL;
}