diff --git a/Makefile b/Makefile index fdeb6cf68aebaf24c1341bd71521d2b5a7a0ca9f..380a242cbff5adc7d2f1e40c8176f4e228381ef4 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,6 @@ # HEADERS := $(shell ls ./*.h) SRCS := $(shell ls ./*.c) -LIBVOICE := ./libvoice/libvoice.so VOICEMNGR := voicemngr CFLAGS += -O2 -fcaller-saves -fsection-anchors @@ -28,10 +27,10 @@ all: debug $(VOICEMNGR) %.o: %.c $(HEADERS) Makefile $(CC) $(CFLAGS) -c -o $@ $< -$(LIBVOICE): +LIBVOICE: $(MAKE) -C libvoice -$(VOICEMNGR): $(LIBVOICE) $(OBJS) +$(VOICEMNGR): LIBVOICE $(OBJS) $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) clean: diff --git a/libvoice/common.c b/libvoice/common.c index cee4598c612547b538d134e68b4b9c3febdb0cc4..a7d1311c149ffa0e3a9bed346c6c53cf9c3f42aa 100644 --- a/libvoice/common.c +++ b/libvoice/common.c @@ -81,12 +81,12 @@ void (*voice_cb_event_report)(int line, const char *event, int data) = NULL; // Callback function which is invoked when an encoded media packet is generated by the voice engine void (*voice_cb_egress_media)(const struct media_packet_t *packet, int size) = NULL; -void voice_syslog(const char *fmt, ...) +void voice_syslog(int level, const char *fmt, ...) { va_list ap; va_start(ap, fmt); - vsyslog(LOG_DEBUG, fmt, ap); + vsyslog(level, fmt, ap); va_end(ap); } @@ -115,7 +115,7 @@ int voice_line_preinit(void) { // Initialize all contents as 0 by calloc lines = calloc(terminal_info.num_voice_ports, sizeof(struct line_t)); if(!lines) { - ENDPT_DBG("%s: out out memory\n", __func__); + ENDPT_ERR("%s: out out memory\n", __func__); return -1; } for(i = 0; i < terminal_info.num_voice_ports; i++) { diff --git a/libvoice/libvoice.h b/libvoice/libvoice.h index 710014569ac88c0c3777fda0b5241f03bf104734..2920b014d72d281b1f02d4c48b3a15e40ad510e3 100644 --- a/libvoice/libvoice.h +++ b/libvoice/libvoice.h @@ -8,6 +8,7 @@ #include <stdint.h> #include <sys/time.h> #include <time.h> +#include <syslog.h> #include <libpicoevent.h> #include "voice-types.h" @@ -227,10 +228,15 @@ struct codec_capability { printf(fmt, ##__VA_ARGS__); \ } while (0) #else -#define ENDPT_DBG(...) voice_syslog("voice: " __VA_ARGS__) +#define ENDPT_DBG(format, ...) voice_syslog(LOG_DEBUG, "%s:%d %s: " format, \ + __FILE__, __LINE__, __func__, ##__VA_ARGS__) #endif #define CHECK_POINT() ENDPT_DBG("Check point at %s@%s:%d\n", __func__, __FILE__, __LINE__) +#define ENDPT_INFO(...) voice_syslog(LOG_INFO, __VA_ARGS__) +#define ENDPT_WARN(...) voice_syslog(LOG_WARNING, __VA_ARGS__) +#define ENDPT_ERR(...) voice_syslog(LOG_ERR, __VA_ARGS__) + extern struct terminal_info_t terminal_info; extern struct line_t *lines; extern struct connection_t *connections; @@ -264,7 +270,7 @@ int voice_line_signal(int line, int connection, enum VOICE_SIGNAL signal, int st int voice_line_simulate_hook(int line, enum VOICE_EVENT event); // Misc -void voice_syslog(const char *fmt, ...); +void voice_syslog(int level, const char *fmt, ...); int voice_engine_shutdown(void); int voice_get_min_tx_gain(void); int voice_get_max_tx_gain(void); diff --git a/line-dect.c b/line-dect.c index a9c97d47e786806eccad8e6fa6097c091a7e2789..efec60b56418fcb385ab3542b1a0c79f911f8c29 100644 --- a/line-dect.c +++ b/line-dect.c @@ -52,8 +52,8 @@ int ubus_process_queued_reqs_to_dectmngr(void) { if (!req) return 0; - ENDPT_DBG("%s: Poped DECT req %p from list, action: %d pcmId: %d, caller_id: %s, callerName: %s\n", __func__, req, req->action, - req->pcm_id, req->caller_id, req->caller_name); + ENDPT_DBG("Poped DECT req %p from list, action: %d pcmId: %d, caller_id: %s, callerName: %s\n", + req, req->action, req->pcm_id, req->caller_id, req->caller_name); pcm_states_dump(__func__, req->line); switch (req->action) { @@ -102,7 +102,7 @@ int simulate_digits_pressing(int line, const char *pressed_digits) { if(lines[line].type != VOICE_LINE_DECT) return 0; - ENDPT_DBG("%s(): line: %d pressed_digits: %s\n", __func__, line, (pressed_digits ? pressed_digits : "")); + ENDPT_DBG("line: %d pressed_digits: %s\n", line, (pressed_digits ? pressed_digits : "")); // Store digits in a list. if(pressed_digits && lines[line].pending_digits) { @@ -138,7 +138,7 @@ int ubus_cb_dectmngr_replied(struct line_req_t *req, enum ubus_msg_status reply_ if(!req) return -1; - ENDPT_DBG("%s got answer req %p from dectmngr, action: %d, line: %d, pcmId: %d, conId: %d\n", __func__, + ENDPT_DBG("got answer req %p from dectmngr, action: %d, line: %d, pcmId: %d, conId: %d\n", req, req->action, req->line, req->pcm_id, req->connection_id); pcm_states_dump(__func__, req->line); @@ -190,10 +190,12 @@ int ubus_cb_asterisk_replied(struct line_event_t *lineEv, enum ubus_msg_status r struct line_req_t *req; int epEvntIdx, dectEvntIdx; - if(!lineEv || !voice_line_is_ready(lineEv->line)) + if(!lineEv || !voice_line_is_ready(lineEv->line)) { + ENDPT_ERR("Invalid argument\n"); return -1; + } - ENDPT_DBG("%s started\n", __func__); + ENDPT_DBG("started\n"); if(lines[lineEv->line].simulated_hook) { voice_hook_simulation_maintain(lineEv->line); @@ -218,7 +220,7 @@ int ubus_cb_asterisk_replied(struct line_event_t *lineEv, enum ubus_msg_status r return 0; // None found, then do nothing assert(req->ubus.ctx); - ENDPT_DBG("%s: poped Asterisk req %p line %d event %s from list, action %d\n", __func__, + ENDPT_DBG("poped Asterisk req %p line %d event %s from list, action %d\n", req, lineEv->line, lineEv->name, req->action); if(reply_status == UBUS_STATUS_OK) { diff --git a/line.c b/line.c index 9de1438f0325776b28b8c0f0b90c17fbffa1d634..5ee913e7f2048b0411e73e8d11b88cf1dd37b6d8 100644 --- a/line.c +++ b/line.c @@ -87,7 +87,7 @@ static int perhaps_simulate_busy(int line, struct voice_ubus_req_t *ubus_req) msg->line = line; send_event_main(msg, EVENT_MAIN_LINE); } else { - ENDPT_DBG("%s: out of memory\n", __func__); + ENDPT_ERR("%s: out of memory\n", __func__); } return 1; @@ -97,13 +97,13 @@ static int perhaps_simulate_busy(int line, struct voice_ubus_req_t *ubus_req) static int dect_tone_play(int line, int pcm, enum VOICE_SIGNAL signal, const char *data, struct voice_ubus_req_t *ubus_req) { struct line_req_t *line_req = NULL; - ENDPT_DBG("%s: line=%d, pcm=%d, data=%s\n", __func__, line, pcm, data); + ENDPT_DBG("line=%d, pcm=%d, data=%s\n", line, pcm, data); pcm_states_dump(__func__, line); assert(ubus_req); line_req = calloc(1, sizeof(struct line_req_t)); if(!line_req) { - ENDPT_DBG("%s: out of memory\n", __func__); + ENDPT_ERR("%s: out of memory\n", __func__); return -1; } line_req->line = line; @@ -120,7 +120,7 @@ static int dect_tone_play(int line, int pcm, enum VOICE_SIGNAL signal, const cha return -1; } - ENDPT_DBG("%s: line %d set pcm to %d\n", __func__, line, line_req->pcm_id); + ENDPT_DBG("line %d set pcm to %d\n", line, line_req->pcm_id); memcpy(&line_req->ubus, ubus_req, sizeof(struct voice_ubus_req_t)); assert(lines[line].type == VOICE_LINE_DECT); @@ -158,7 +158,7 @@ static int line_signal_ring(int line, int pcm, enum VOICE_SIGNAL signal, const c struct line_req_t *line_req = NULL; int start_ring = data && strcmp(data, "0") != 0; - ENDPT_DBG("%s: line=%d, pcm=%d, data=%s\n", __func__, line, pcm, data); + ENDPT_DBG("line=%d, pcm=%d, data=%s\n", line, pcm, data); pcm_states_dump(__func__, line); // Relay the request to dectmngr if the line is DECT @@ -166,13 +166,13 @@ static int line_signal_ring(int line, int pcm, enum VOICE_SIGNAL signal, const c assert(ubus_req); line_req = calloc(1, sizeof(struct line_req_t)); if(!line_req) { - ENDPT_DBG("%s: out of memory\n", __func__); + ENDPT_ERR("%s: out of memory\n", __func__); return -1; } line_req->line = line; line_req->connection_id = -1; line_req->pcm_id = pcm; - ENDPT_DBG("%s: line %d set pcm to %d\n", __func__, line, line_req->pcm_id); + ENDPT_DBG("line %d set pcm to %d\n", line, line_req->pcm_id); memcpy(&line_req->ubus, ubus_req, sizeof(struct voice_ubus_req_t)); // Parse the called ID string generated by Asterisk @@ -240,7 +240,7 @@ static int line_signal_answer(int line, int pcm, const char *data, struct voice_ { struct line_req_t *line_req = NULL; - ENDPT_DBG("%s() line %d pcm: %d data: %s\n", __func__, line, pcm, data); + ENDPT_DBG("line %d pcm: %d data: %s\n", line, pcm, data); pcm_states_dump(__func__, line); assert(ubus_req); @@ -269,12 +269,12 @@ int line_signal(int line, const char *signame, const char *data, struct voice_ub const struct voice_signal_t *sig; int res = 0; - ENDPT_DBG("%s: line=%d(type:%d), signame=%s, data=%s\n", __func__, line, lines[line].type, signame, data); + ENDPT_DBG("line=%d(type:%d), signame=%s, data=%s\n", line, lines[line].type, signame, data); for(sig = signal_map; sig->signal != VOICE_SIG_LAST && strcmp(signame, sig->name) != 0; sig++) continue; if(sig->signal == VOICE_SIG_LAST) { - ENDPT_DBG("%s: signal %s is not supported\n", __func__, signame); + ENDPT_ERR("%s: signal %s is not supported\n", __func__, signame); return -1; } @@ -362,9 +362,9 @@ int line_signal(int line, const char *signame, const char *data, struct voice_ub } if (res == 0) { - ENDPT_DBG("%s: signal %s(%s) was set for line %d\n", __func__, sig->name, data, line); + ENDPT_INFO("signal %s(%s) was set for line %d\n", sig->name, data, line); } else { - ENDPT_DBG("%s: error setting signal %s(%s)\n", __func__, sig->name, data); + ENDPT_ERR("%s: error setting signal %s(%s)\n", __func__, sig->name, data); } return res; @@ -398,7 +398,7 @@ int line_new_connection_by_asterisk(int line, int connection, struct voice_ubus_ * chance to relay it to dectmngr. */ line_req = calloc(1, sizeof(struct line_req_t)); if(!line_req) { - ENDPT_DBG("%s: out of memory\n", __func__); + ENDPT_ERR("%s: out of memory\n", __func__); return -1; } line_req->line = line; @@ -425,7 +425,7 @@ int line_connection_parm_update_by_asterisk(int line, int connection, struct con if (!voice_line_is_ready(line)) return -1; - ENDPT_DBG("parm_update request for %s line: %d, connection: %d, mask: %d, codec: %d, ptime: %d \n", __func__, line, connection, data->mask, data->codec, data->ptime); + ENDPT_DBG("parm_update request for line: %d, connection: %d, mask: %d, codec: %d, ptime: %d \n", line, connection, data->mask, data->codec, data->ptime); pcm_states_dump(__func__, line); res = voice_connection_parm_update(line, line, data); @@ -554,8 +554,7 @@ int line_update_connection_by_pbx(int line, int pcm_callid) if (!voice_line_is_ready(line)) return -1; - ENDPT_DBG("%s Received update connection for line: %d with pcm_callid: %d\n", - __func__, line, pcm_callid); + ENDPT_DBG("Received update connection for line: %d with pcm_callid: %d\n", line, pcm_callid); pcm_states_dump(__func__, line); if(lines[line].type != VOICE_LINE_DECT) @@ -580,7 +579,7 @@ int line_new_connection_by_dect(int line, const char *cid, int pcm, struct voice if (!voice_line_is_ready(line) || lines[line].type != VOICE_LINE_DECT) return -1; - ENDPT_DBG("%s: line=%d, pcm=%d, cid=%s\n", __func__, line, pcm, cid); + ENDPT_DBG("line=%d, pcm=%d, cid=%s\n", line, pcm, cid); pcm_states_dump(__func__, line); if (pcm <= PCM_1) { @@ -640,17 +639,17 @@ int line_close_connection_by_dect(int line, int pcm, struct voice_ubus_req_t *ub return -1; if(lines[line].type != VOICE_LINE_DECT) { - ENDPT_DBG("%s: lines[%d].type != VOICE_LINE_DECT\n", __func__, line); + ENDPT_ERR("%s: lines[%d].type != VOICE_LINE_DECT\n", __func__, line); return -1; } - ENDPT_DBG("%s() for line %d, pcm: %d\n", __func__, line, pcm); + ENDPT_DBG("line %d: pcm = %d\n", line, pcm); pcm_states_dump(__func__, line); if (pcm == CALL_DECT_UNAVAILABLE) { struct line_event_t *msg; - ENDPT_DBG("%s: There is no available DECT handsets for the call. " - "Send DECT_UNAVAILABLE event to Asterisk\n", __func__); + ENDPT_DBG("There is no available DECT handsets for the call. " + "Send DECT_UNAVAILABLE event to Asterisk\n"); msg = malloc(sizeof(struct line_event_t)); if (msg) { @@ -668,8 +667,8 @@ int line_close_connection_by_dect(int line, int pcm, struct voice_ubus_req_t *ub if (get_callid_state(lines[line].pcm_callid[(pcm >> 16)]) == CALLID_OBTAINING) { struct line_event_t *msg; - ENDPT_DBG("%s: DECT handsets may have not answered the call yet. " - "Send CALL_REJECT event to Asterisk\n", __func__); + ENDPT_DBG("DECT handsets may have not answered the call yet. " + "Send CALL_REJECT event to Asterisk\n"); msg = malloc(sizeof(struct line_event_t)); if (msg) { diff --git a/main.c b/main.c index f38988ea2ddeb495b0d3ad4bd756f231b6cc2ef7..e94468f1cdd86a34cd21984d35c75cbd84b0fc3c 100644 --- a/main.c +++ b/main.c @@ -23,6 +23,8 @@ #define UCI_CONFIG_DIR "/etc/config/" #endif + +static int log_level = LOG_INFO; static int audio_rx_fd; static int audio_tx_fd; static int event_fd; @@ -48,7 +50,7 @@ void send_media_to_voice_engine(pe_packet_t *p) { conIdx = voice_connection_find(packet->line, packet->connection_id); if (conIdx == -1 || (packet->rtp[0] != 0x80 && packet->rtp[0] != 0x81) || !packet->rtp_size) { - ENDPT_DBG("%s: bad packet\n", __func__); + ENDPT_ERR("%s: bad packet\n", __func__); return; } @@ -107,7 +109,7 @@ static void event_stream_handler(pe_stream_t *stream __attribute__((unused)), pe break; default: - ENDPT_DBG("Warning: unknown event '%c'\n", *event->in); + ENDPT_WARN("unknown event '%c'\n", *event->in); break; } } @@ -198,7 +200,7 @@ static void voicemngr_event_report(int line, const char *event, int data) { struct line_event_t *msg = malloc(sizeof(struct line_event_t)); if (!msg) { - ENDPT_DBG("%s: out of memory\n", __func__); + ENDPT_ERR("%s: out of memory\n", __func__); return; } msg->name = event; @@ -215,7 +217,7 @@ static int voicemngr_get_voice_port_cfg(const char *hw_board_voice_names, struct char *str, *token, *saveptr; if (!hw_board_voice_names || *hw_board_voice_names == '\0') { - ENDPT_DBG("%s: environmental variable hw_board_VoicePortNames is not defined or empty\n", __func__); + ENDPT_ERR("%s: environmental variable hw_board_VoicePortNames is not defined or empty\n", __func__); return -1; } @@ -225,28 +227,28 @@ static int voicemngr_get_voice_port_cfg(const char *hw_board_voice_names, struct * might cause the wrong value being returned when running the program multiple times */ duplication = strdup(hw_board_voice_names); if (!duplication) { - ENDPT_DBG("%s: out of memory\n", __func__); + ENDPT_ERR("%s: out of memory\n", __func__); return -1; } - ENDPT_DBG("%s: hw_board_voice_names=[%s]\n", __func__, hw_board_voice_names); + ENDPT_DBG("hw_board_voice_names=[%s]\n", hw_board_voice_names); for (str = duplication; (token = strtok_r(str, " ,;:\t", &saveptr)) != NULL; str = NULL) { if ((size_t)voice_port_cfg->num_voice_ports >= sizeof(voice_port_cfg->voice_ports) / sizeof(voice_port_cfg->voice_ports)[0]) { - ENDPT_DBG("%s: too many voice ports\n", __func__); + ENDPT_ERR("%s: too many voice ports\n", __func__); res = -1; break; } if (strcasestr(token, "Tel") != NULL || strcasestr(token, "FXS") != NULL) { - ENDPT_DBG("%s: port %d is FXS\n", __func__, voice_port_cfg->num_voice_ports); + ENDPT_INFO("%s: port %d is FXS\n", __func__, voice_port_cfg->num_voice_ports); voice_port_cfg->voice_ports[voice_port_cfg->num_voice_ports++] = VOICE_LINE_FXS; voice_port_cfg->num_fxs++; } else if (strcasestr(token, "DECT") != NULL) { - ENDPT_DBG("%s: port %d is DECT\n", __func__, voice_port_cfg->num_voice_ports); + ENDPT_INFO("%s: port %d is DECT\n", __func__, voice_port_cfg->num_voice_ports); voice_port_cfg->voice_ports[voice_port_cfg->num_voice_ports++] = VOICE_LINE_DECT; voice_port_cfg->num_dect++; } else { - ENDPT_DBG("%s: invalid port type, %s\n", __func__, token); + ENDPT_ERR("%s: invalid port type, %s\n", __func__, token); res = -1; break; } @@ -256,7 +258,8 @@ static int voicemngr_get_voice_port_cfg(const char *hw_board_voice_names, struct return res; } -int main(void) { +int main(int argc, char **argv) { + (void) argc; struct uci_context *context = NULL; struct uci_package *package = NULL; struct terminal_info_t voice_port_cfg; @@ -265,17 +268,20 @@ int main(void) { const char *hw_board_has_dect; const char *hw_board_voice_names; + openlog(argv[0], LOG_PID, LOG_DAEMON); + setlogmask(LOG_UPTO(log_level)); + // Load the UCI package context = uci_alloc_context(); if (!context) { - ENDPT_DBG("uci_alloc_context() failed\n"); + ENDPT_ERR("uci_alloc_context() failed\n"); return EXIT_FAILURE; } uci_set_confdir(context, UCI_CONFIG_DIR); res = uci_load(context, uciStrConfig, &package); if (res != 0 || !package) { uci_get_errorstr(context, &error, ""); - ENDPT_DBG("Failed to load uci package %s, %s\n", uciStrConfig, error); + ENDPT_ERR("Failed to load uci package %s, %s\n", uciStrConfig, error); free(error); uci_free_context(context); context = NULL; @@ -288,7 +294,7 @@ int main(void) { // Check that ASCII to DTMF convertion works. if(!isdigit('0') || !isalpha('a')) { - ENDPT_DBG("Source has invalid encoding.\n"); + ENDPT_ERR("Source has invalid encoding.\n"); goto __error_ret; } @@ -327,12 +333,12 @@ int main(void) { // Enable UBUS when all initializations have finished if(ubus_enable_receive()) goto __error_ret; - ENDPT_DBG("voicemngr has started successfully\n"); + ENDPT_INFO("voicemngr has started successfully\n"); // Listen for events and dispatch them to handlers. Run forever and does not return. pe_base_dispatch(picoBase); - ENDPT_DBG("pe_base_dispatch() exited unexpectedly\n"); + ENDPT_WARN("pe_base_dispatch() exited unexpectedly\n"); __error_ret: if (package) diff --git a/ubus.c b/ubus.c index 95ff9fce05736255b8fc0ad7d15fc0c7410870f6..b10ff710c52d346fbbcb67d1f78a25d74fed7b1d 100644 --- a/ubus.c +++ b/ubus.c @@ -135,6 +135,7 @@ static const char broadcast_path[] = "voice.endpoint"; // UBUS path name for b static const char uciStrComSect[] = "tel_options"; // Common endpoint section name static const char uciStrLineSect[] = "extension"; // Line specific section name static const char uciStrCountry[] = "country"; // Endpoint country +static const char uciStrLoglevel[] = "vmloglevel"; // syslog level of voicemngr static const char ubusStrObjAdd[] = "ubus.object.add"; // UBUS objects added to global context static const char ubusStrObjRm[] = "ubus.object.remove"; // UBUS objects added removed from global context @@ -232,7 +233,7 @@ static void timerHandler(pe_stream_t *stream, pe_event_t *event __attribute__((u expired = 0; res = read(outReq->timerFd, &expired, sizeof(expired)); if(res == -1 && errno != EAGAIN) { - perror("Error, reading timer fd"); + ENDPT_ERR("reading timer fd: %s", strerror(errno)); } if(!expired) return; @@ -336,7 +337,7 @@ static void uci_query_lineX(struct uci_context *context, struct uci_section *sec char *error; if(phoneLine < 0 || phoneLine >= terminal_info.num_voice_ports) { - ENDPT_DBG("Error, invalid phone line %d\n", phoneLine); + ENDPT_ERR("Error, invalid phone line %d\n", phoneLine); return; } @@ -344,7 +345,7 @@ static void uci_query_lineX(struct uci_context *context, struct uci_section *sec strVal = uci_lookup_option_string(context, section, option); if (!strVal || !*strVal) { uci_get_errorstr(context, &error, ""); - ENDPT_DBG("Failed to look up line option %s, %s\n", option, error); + ENDPT_ERR("Failed to look up line option %s, %s\n", option, error); free(error); } else { ENDPT_DBG(" %s=%s\n", option, strVal); @@ -356,7 +357,7 @@ static void uci_query_lineX(struct uci_context *context, struct uci_section *sec strVal = uci_lookup_option_string(context, section, option); if (!strVal || !*strVal) { uci_get_errorstr(context, &error, ""); - ENDPT_DBG("Failed to look up line option %s, %s\n", option, error); + ENDPT_ERR("Failed to look up line option %s, %s\n", option, error); free(error); } else { intVal = strtol(strVal, NULL, 10); @@ -365,7 +366,7 @@ static void uci_query_lineX(struct uci_context *context, struct uci_section *sec lines[phoneLine].line_conf.silence = (intVal ? 1 : 0); ENDPT_DBG(" %s=%d\n", option, intVal); } else { - ENDPT_DBG(" Error: %s range is 0-1\n", option); + ENDPT_ERR("Error comfort_noise value: '%s', not in range '0' - '1'\n", strVal); } } @@ -373,7 +374,7 @@ static void uci_query_lineX(struct uci_context *context, struct uci_section *sec strVal = uci_lookup_option_string(context, section, option); if (!strVal || !*strVal) { uci_get_errorstr(context, &error, ""); - ENDPT_DBG("Failed to look up line option %s, %s\n", option, error); + ENDPT_ERR("Failed to look up line option %s, %s\n", option, error); free(error); } else { intVal = strtol(strVal, NULL, 10); @@ -381,7 +382,7 @@ static void uci_query_lineX(struct uci_context *context, struct uci_section *sec lines[phoneLine].line_conf.echo_cancel = (intVal ? 1 : 0); ENDPT_DBG(" %s=%d\n", option, intVal); } else { - ENDPT_DBG(" Error: %s range is 0-1\n", option); + ENDPT_ERR("Error echo_cancel value: '%s', not in range '0' - '1'\n", strVal); } } @@ -389,7 +390,7 @@ static void uci_query_lineX(struct uci_context *context, struct uci_section *sec strVal = uci_lookup_option_string(context, section, option); if (!strVal || !*strVal) { uci_get_errorstr(context, &error, ""); - ENDPT_DBG("Failed to look up line option %s, %s\n", option, error); + ENDPT_ERR("Failed to look up line option %s, %s\n", option, error); free(error); } else { intVal = strtol(strVal, NULL, 10); @@ -397,7 +398,7 @@ static void uci_query_lineX(struct uci_context *context, struct uci_section *sec lines[phoneLine].line_conf.txgain = intVal; ENDPT_DBG(" %s=%d\n", option, intVal); } else { - ENDPT_DBG(" Error: %s range is %d - %d\n", option, voice_get_min_tx_gain(), voice_get_max_tx_gain()); + ENDPT_ERR("Error txgain value: '%s', not in range %d - %d\n", strVal, voice_get_min_tx_gain(), voice_get_max_tx_gain()); } } @@ -405,7 +406,7 @@ static void uci_query_lineX(struct uci_context *context, struct uci_section *sec strVal = uci_lookup_option_string(context, section, option); if (!strVal || !*strVal) { uci_get_errorstr(context, &error, ""); - ENDPT_DBG("Failed to look up line option %s, %s\n", option, error); + ENDPT_ERR("Failed to look up line option %s, %s\n", option, error); free(error); } else { intVal = strtol(strVal, NULL, 10); @@ -413,7 +414,7 @@ static void uci_query_lineX(struct uci_context *context, struct uci_section *sec lines[phoneLine].line_conf.rxgain = intVal; ENDPT_DBG(" %s=%d\n", option, intVal); } else { - ENDPT_DBG(" Error: %s range is %d - %d\n", option, voice_get_min_rx_gain(), voice_get_max_rx_gain()); + ENDPT_ERR("Error value: %s='%s', not in range %d - %d\n", option, strVal, voice_get_min_rx_gain(), voice_get_max_rx_gain()); } } @@ -516,19 +517,19 @@ static int ubus_request_signal(struct ubus_context *uctx, struct ubus_object *ob /* Check that we have all arguments */ if (!keys[SIGNAL_LINE] || !keys[SIGNAL_TYPE] || !keys[SIGNAL_STATE]) { - ENDPT_DBG("Error! missing argument\n"); + ENDPT_ERR("Error! missing argument\n"); return UBUS_STATUS_INVALID_ARGUMENT; } /* Check that endpt exist */ line = blobmsg_get_u32(keys[SIGNAL_LINE]); if (line < 0 || line >= terminal_info.num_voice_ports) { - ENDPT_DBG("Error! No such line value: %d\n", line); + ENDPT_ERR("Error! No such line value: %d\n", line); return UBUS_STATUS_INVALID_ARGUMENT; } signame = blobmsg_get_string(keys[SIGNAL_TYPE]); - ENDPT_DBG("%s() %d %s\n", __func__, line, signame); + ENDPT_DBG("line=%d, signame=%s\n", line, signame); // on or off signal? enable = "0"; @@ -540,7 +541,7 @@ static int ubus_request_signal(struct ubus_context *uctx, struct ubus_object *ob if (keys[SIGNAL_DATA]) data = blobmsg_get_string(keys[SIGNAL_DATA]); } else if (strcmp(state, "off")) { - ENDPT_DBG("Error! invalid state %s\n", state); + ENDPT_ERR("Error! invalid state %s\n", state); return UBUS_STATUS_INVALID_ARGUMENT; } @@ -573,20 +574,20 @@ static int ubus_request_connection(struct ubus_context *uctx, struct ubus_object /* Check that we have all arguments */ if (!keys[CONNECTION_LINE] || !keys[CONNECTION_ACTION] || !keys[CONNECTION_ID]) { - ENDPT_DBG("Error! missing argument\n"); + ENDPT_ERR("Error! missing argument\n"); return UBUS_STATUS_INVALID_ARGUMENT; } /* Check that endpt exist */ line = blobmsg_get_u32(keys[CONNECTION_LINE]); if (line < 0 || line >= terminal_info.num_voice_ports) { - ENDPT_DBG("Error! No such line value: %d\n", line); + ENDPT_ERR("Error! No such line value: %d\n", line); return UBUS_STATUS_INVALID_ARGUMENT; } id = blobmsg_get_u32(keys[CONNECTION_ID]); if (id < 0) { - ENDPT_DBG("Error! Invalid connection id: %d\n", id); + ENDPT_ERR("Error! Invalid connection id: %d\n", id); return UBUS_STATUS_INVALID_ARGUMENT; } @@ -612,7 +613,7 @@ static int ubus_request_connection(struct ubus_context *uctx, struct ubus_object data.mask = data.mask|UBUS_DATA_PTIME_BIT; } - ENDPT_DBG("%s() line: %d connection_id: %d action: %s\n", __func__, line, id, action_str); + ENDPT_DBG("line: %d connection_id: %d action: %s\n", line, id, action_str); if (strcmp("create", action_str) == 0) { if(line_new_connection_by_asterisk(line, id, &ubusReq)) return UBUS_STATUS_UNKNOWN_ERROR; @@ -632,11 +633,11 @@ static int ubus_request_connection(struct ubus_context *uctx, struct ubus_object if(line_update_connection_by_pbx(line, id)) return UBUS_STATUS_UNKNOWN_ERROR; } else if (strcmp("parm_update", action_str) == 0) { - ENDPT_DBG("parm_update request for %s line: %d, id: %d, mask: %d, codec: %d, ptime: %d \n", __func__, line, id, data.mask, data.codec, data.ptime); + ENDPT_DBG("parm_update request for line: %d, id: %d, mask: %d, codec: %d, ptime: %d \n", line, id, data.mask, data.codec, data.ptime); if(line_connection_parm_update_by_asterisk(line, id, &data)) return UBUS_STATUS_UNKNOWN_ERROR; } else { - ENDPT_DBG("Error! No such action: %s\n", action_str); + ENDPT_ERR("Error! No such action: %s\n", action_str); return UBUS_STATUS_INVALID_ARGUMENT; } @@ -683,7 +684,7 @@ static int ubus_request_status(struct ubus_context *uctx, struct ubus_object *ob blobmsg_add_u32(&blob, "offhook", voice_line_is_offhook(line + unpopulatedDectEndpoints)); res = UBUS_STATUS_OK; } else { - ENDPT_DBG("Error! No such line value: %d\n", line); + ENDPT_ERR("Error! No such line value: %d\n", line); res = UBUS_STATUS_INVALID_ARGUMENT; } } else { @@ -723,14 +724,14 @@ static int ubus_request_rtp_stats(struct ubus_context *uctx, struct ubus_object /* Check that we have all arguments */ if (!keys[RTP_STATS_LINE] || !keys[RTP_STATS_RESET]) { - ENDPT_DBG("Error! missing argument\n"); + ENDPT_ERR("Error! missing argument\n"); return UBUS_STATUS_INVALID_ARGUMENT; } /* Check that endpt exist */ line = blobmsg_get_u32(keys[RTP_STATS_LINE]); if (line < 0 || line >= terminal_info.num_voice_ports) { - ENDPT_DBG("Error! No such line value: %d\n", line); + ENDPT_ERR("Error! No such line value: %d\n", line); return UBUS_STATUS_INVALID_ARGUMENT; } @@ -740,7 +741,7 @@ static int ubus_request_rtp_stats(struct ubus_context *uctx, struct ubus_object for(conIdx = 0; conIdx < max_num_connections && connections[conIdx].line != line; conIdx++) continue; if (conIdx >= max_num_connections) { - ENDPT_DBG("Error: connection is not found on line %d from maximum %d existing connections\n", + ENDPT_ERR("Error: connection is not found on line %d from maximum %d existing connections\n", line, max_num_connections); return UBUS_STATUS_UNKNOWN_ERROR; } @@ -822,11 +823,11 @@ static int ubus_request_codec_capability(struct ubus_context *uctx, struct ubus_ { static const char *codecfile = "/lib/voice/codecs.json"; - ENDPT_DBG("Codec capability query failed (%d) and get the information from %s\n", status, codecfile); + ENDPT_INFO("Codec capability query failed (%d). Use the information from %s\n", status, codecfile); int res = blobmsg_add_json_from_file(&blob, codecfile); if(!res) { - ENDPT_DBG("%s is missing or invalid\n", codecfile); + ENDPT_ERR("%s is missing or invalid\n", codecfile); return UBUS_STATUS_UNKNOWN_ERROR; } } @@ -930,7 +931,7 @@ static int ubus_request_call(struct ubus_context *uctx, struct ubus_object *obj static void got_asterisk_complete(struct ubus_request *req, int ret __attribute__((unused))) { if(req->peer != asterisk_id || req->status_code != UBUS_STATUS_OK) { - ENDPT_DBG("Failed sending event to Asterisk\n"); + ENDPT_ERR("Failed sending event to Asterisk\n"); } ubus_cb_asterisk_replied((struct line_event_t*) req->priv, req->status_code); @@ -968,7 +969,7 @@ int ubus_call_asterisk(const struct line_event_t* const ev) res = ubus_invoke_async(ctx, asterisk_id, "event", bb.head, req); if(res != UBUS_STATUS_OK) { - ENDPT_DBG("Error invoking\n"); + ENDPT_ERR("Error ubus invoking\n"); res = -1; goto out; } @@ -1004,7 +1005,7 @@ int ubus_broadcast_event(const struct line_event_t* const ev) blobmsg_add_string(&blob, "event", ev->name); if(ubus_send_event(ctx, broadcast_path, blob.head) != UBUS_STATUS_OK) { - ENDPT_DBG("Error sending ubus message %s\n", ev->name); + ENDPT_ERR("Error sending ubus message %s\n", ev->name); res = -1; } @@ -1112,7 +1113,7 @@ int ubus_call_dectmngr(int terminal, int add, int release, const char *cid, cons res = ubus_invoke_async(ctx, dectmngr_id, "call", bb.head, req); if(res != UBUS_STATUS_OK) { - ENDPT_DBG("Error invoking\n"); + ENDPT_ERR("Error ubus invoking\n"); res = -1; goto out; } @@ -1149,17 +1150,17 @@ int perhaps_erase_unused_lines(struct uci_context *context) strncpy(uciSection2, uciSection, sizeof(uciSection2)); // uci_lookup_ptr() can modify uciSection if (uci_lookup_ptr(context, &ptr, uciSection, true) == UCI_OK) { if(uci_delete(context, &ptr) == 0) { - ENDPT_DBG("Remove voice line %s since DECT is not supported\n", uciSection2); + ENDPT_INFO("Remove voice line %s, since DECT is not supported\n", uciSection2); didErase++; } else { uci_get_errorstr(context, &error, ""); - ENDPT_DBG("Failed to remove the uci section %s, %s\n", uciSection2, error); + ENDPT_ERR("Failed to remove the uci section %s, %s\n", uciSection2, error); free(error); return -1; } } else { uci_get_errorstr(context, &error, ""); - ENDPT_DBG("Failed to look up the uci section %s, %s\n", uciSection2, error); + ENDPT_ERR("Failed to look up the uci section %s, %s\n", uciSection2, error); free(error); return -1; } @@ -1170,13 +1171,13 @@ int perhaps_erase_unused_lines(struct uci_context *context) if (uci_lookup_ptr(context, &ptr, uciSection, true) == UCI_OK) { if(uci_commit(context, &ptr.p, false) != UCI_OK) { uci_get_errorstr(context, &error, ""); - ENDPT_DBG("Failed to commit uci package %s, %s\n", uciStrConfig, error); + ENDPT_ERR("Failed to commit uci package %s, %s\n", uciStrConfig, error); free(error); return -1; } } else { uci_get_errorstr(context, &error, ""); - ENDPT_DBG("Failed to look up package %s, %s\n", uciStrConfig, error); + ENDPT_ERR("Failed to look up package %s, %s\n", uciStrConfig, error); free(error); return -1; } @@ -1191,6 +1192,7 @@ int config_init(struct uci_context *context, struct uci_package *package) struct uci_section *section = NULL; char *error; const char *country; + const char *loglevel; char uciSection[sizeof(uciStrLineSect) + 10]; int line; @@ -1198,28 +1200,36 @@ int config_init(struct uci_context *context, struct uci_package *package) section = uci_lookup_section(context, package, uciStrComSect); if (!section) { uci_get_errorstr(context, &error, ""); - ENDPT_DBG("Failed to look up section %s.%s, %s\n", uciStrConfig, uciStrComSect, error); + ENDPT_ERR("Failed to look up section %s.%s, %s\n", uciStrConfig, uciStrComSect, error); free(error); return -1; } country = uci_lookup_option_string(context, section, uciStrCountry); if (!country || !*country) { uci_get_errorstr(context, &error, ""); - ENDPT_DBG("Failed to look up option %s.%s.%s, %s\n", uciStrConfig, uciStrComSect, uciStrCountry, error); + ENDPT_ERR("Failed to look up option %s.%s.%s, %s\n", uciStrConfig, uciStrComSect, uciStrCountry, error); free(error); return -1; } if (voice_set_country(country) != 0) { + ENDPT_ERR("Failed to set country %s\n", country); return -1; } + // configure the syslog level for voicemngr + loglevel = uci_lookup_option_string(context, section, uciStrLoglevel); + if (loglevel && *loglevel) { + ENDPT_INFO("syslog level is set to %s\n", loglevel); + setlogmask(LOG_UPTO(atoi(loglevel) & LOG_PRIMASK)); + } + // Configure the voice lines for (line = 0; line < terminal_info.num_voice_ports; line++) { snprintf(uciSection, sizeof(uciSection), "%s%d", uciStrLineSect, line); section = uci_lookup_section(context, package, uciSection); if (!section) { uci_get_errorstr(context, &error, ""); - ENDPT_DBG("Failed to look up section %s.%s, %s\n", uciStrConfig, uciSection, error); + ENDPT_ERR("Failed to look up section %s.%s, %s\n", uciStrConfig, uciSection, error); free(error); return -1; } @@ -1246,17 +1256,17 @@ int ubus_disable_receive(void) { res = 0; if(ubus_remove_object(ctx, &rpcObj) != UBUS_STATUS_OK) { - ENDPT_DBG("Error deregistering ubus endpt object\n"); + ENDPT_ERR("Error deregistering ubus endpt object\n"); res = -1; } if(ubus_unregister_event_handler(ctx, &ObjRmListener) != UBUS_STATUS_OK) { - ENDPT_DBG("Error deregistering ubus event handler %s", ubusStrObjRm); + ENDPT_ERR("Error deregistering ubus event handler %s", ubusStrObjRm); res = -1; } if(ubus_unregister_event_handler(ctx, &ObjAddListener) != UBUS_STATUS_OK) { - ENDPT_DBG("Error deregistering ubus event handler %s", ubusStrObjAdd); + ENDPT_ERR("Error deregistering ubus event handler %s", ubusStrObjAdd); res = -1; } @@ -1279,7 +1289,7 @@ int ubus_enable_receive(void) { ObjAddListener.cb = ubus_event_new_obj; if(ubus_register_event_handler(ctx, &ObjAddListener, ubusStrObjAdd) != UBUS_STATUS_OK) { - ENDPT_DBG("Error registering ubus event handler %s", ubusStrObjAdd); + ENDPT_ERR("Error registering ubus event handler %s", ubusStrObjAdd); return -1; } @@ -1287,13 +1297,13 @@ int ubus_enable_receive(void) { ObjRmListener.cb = ubus_event_new_obj; if(ubus_register_event_handler(ctx, &ObjRmListener, ubusStrObjRm) != UBUS_STATUS_OK) { - ENDPT_DBG("Error registering ubus event handler %s", ubusStrObjRm); + ENDPT_ERR("Error registering ubus event handler %s", ubusStrObjRm); return -1; } // Invoke our RPC handler when ubus calls (not events) arrive if (ubus_add_object(ctx, &rpcObj) != UBUS_STATUS_OK) { - ENDPT_DBG("Failed to register UBUS endpt object\n"); + ENDPT_ERR("Failed to register UBUS endpt object\n"); return -1; } @@ -1323,7 +1333,7 @@ int ubus_init(void) { ubus_pending_requests = pe_list_new(); if(!ubus_pending_requests) { - ENDPT_DBG("%s: out of memory\n", __func__); + ENDPT_ERR("%s: out of memory\n", __func__); return -1; }