static inline void conf_rsp(int level, l2cap_cmd_hdr *cmd, struct frame *frm) { l2cap_conf_rsp *h = frm->ptr; uint16_t scid = btohs(h->scid); uint16_t result = btohs(h->result); int clen = btohs(cmd->len) - L2CAP_CONF_RSP_SIZE; if (p_filter(FILT_L2CAP)) return; printf("Config rsp: scid 0x%4.4x flags 0x%2.2x result %d clen %d\n", scid, btohs(h->flags), result, clen); if (clen > 0) { if (result) { p_indent(level + 1, frm); printf("%s\n", confresult2str(result)); } if (result == 0x0003) conf_list(level + 1, h->data, clen); else conf_opt(level + 1, h->data, clen, frm->in, frm->handle, scid); } else { p_indent(level + 1, frm); printf("%s\n", confresult2str(result)); } }
conf_remote_t conf_remote_txn( conf_t *conf, knot_db_txn_t *txn, conf_val_t *id, size_t index) { assert(id != NULL && id->item != NULL); assert(id->item->type == YP_TSTR || (id->item->type == YP_TREF && id->item->var.r.ref->var.g.id->type == YP_TSTR)); conf_remote_t out = { { AF_UNSPEC } }; conf_val_t rundir_val = conf_get_txn(conf, txn, C_SRV, C_RUNDIR); char *rundir = conf_abs_path(&rundir_val, NULL); // Get indexed remote address. conf_val_t val = conf_id_get_txn(conf, txn, C_RMT, C_ADDR, id); for (size_t i = 0; val.code == KNOT_EOK && i < index; i++) { if (i == 0) { conf_val(&val); } conf_val_next(&val); } // Index overflow causes empty socket. out.addr = conf_addr(&val, rundir); // Get outgoing address if family matches (optional). val = conf_id_get_txn(conf, txn, C_RMT, C_VIA, id); while (val.code == KNOT_EOK) { struct sockaddr_storage via = conf_addr(&val, rundir); if (via.ss_family == out.addr.ss_family) { out.via = conf_addr(&val, rundir); break; } conf_val_next(&val); } // Get TSIG key (optional). conf_val_t key_id = conf_id_get_txn(conf, txn, C_RMT, C_KEY, id); if (key_id.code == KNOT_EOK) { out.key.name = (knot_dname_t *)conf_dname(&key_id); val = conf_id_get_txn(conf, txn, C_KEY, C_ALG, &key_id); out.key.algorithm = conf_opt(&val); val = conf_id_get_txn(conf, txn, C_KEY, C_SECRET, &key_id); out.key.secret.data = (uint8_t *)conf_bin(&val, &out.key.secret.size); } free(rundir); return out; }
static inline void conf_req(int level, l2cap_cmd_hdr *cmd, struct frame *frm) { l2cap_conf_req *h = frm->ptr; uint16_t dcid = btohs(h->dcid); int clen = btohs(cmd->len) - L2CAP_CONF_REQ_SIZE; if (p_filter(FILT_L2CAP)) return; printf("Config req: dcid 0x%4.4x flags 0x%2.2x clen %d\n", dcid, btohs(h->flags), clen); if (clen > 0) conf_opt(level + 1, h->data, clen, frm->in, dcid); }
int log_reconfigure(conf_t *conf, void *data) { // Data not used UNUSED(data); // Use defaults if no 'log' section is configured. if (conf_id_count(conf, C_LOG) == 0) { log_close(); log_init(); return KNOT_EOK; } // Find maximum log facility id unsigned files = 0; conf_iter_t iter = conf_iter(conf, C_LOG); while (iter.code == KNOT_EOK) { conf_val_t id = conf_iter_id(conf, &iter); if (get_logtype(conf_str(&id)) == LOGT_FILE) { ++files; } conf_iter_next(conf, &iter); } conf_iter_finish(conf, &iter); // Initialize logsystem struct log_sink *log = sink_setup(files); if (log == NULL) { return KNOT_ENOMEM; } // Setup logs iter = conf_iter(conf, C_LOG); while (iter.code == KNOT_EOK) { conf_val_t id = conf_iter_id(conf, &iter); const char *logname = conf_str(&id); // Get facility. int facility = get_logtype(logname); if (facility == LOGT_FILE) { facility = log_open_file(log, logname); if (facility < 0) { log_error("failed to open log, file '%s'", logname); conf_iter_next(conf, &iter); continue; } } conf_val_t level_val; unsigned level; // Set SERVER logging. level_val = conf_id_get(conf, C_LOG, C_SERVER, &id); level = conf_opt(&level_val); sink_levels_add(log, facility, LOG_SERVER, level); // Set ZONE logging. level_val = conf_id_get(conf, C_LOG, C_ZONE, &id); level = conf_opt(&level_val); sink_levels_add(log, facility, LOG_ZONE, level); // Set ANY logging. level_val = conf_id_get(conf, C_LOG, C_ANY, &id); level = conf_opt(&level_val); sink_levels_add(log, facility, LOG_ANY, level); conf_iter_next(conf, &iter); } conf_iter_finish(conf, &iter); sink_publish(log); return KNOT_EOK; }