[Replicant] [libsamsung-ipc] [PATCH 13/26] tools: ipc-modem: use the log callback instead of printf
Denis 'GNUtoo' Carikli
GNUtoo at cyberdimension.org
Mon Mar 28 20:20:27 UTC 2022
This enables to add other log callbacks than printf / stdout later on.
The ipc_modem_log function is inspired from ipc_client_log.
This change should contain no functional changes.
Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo at cyberdimension.org>
---
tools/ipc-modem.c | 251 ++++++++++++++++++++++++++++++----------------
tools/ipc-modem.h | 8 ++
2 files changed, 173 insertions(+), 86 deletions(-)
diff --git a/tools/ipc-modem.c b/tools/ipc-modem.c
index 31fd54e..d882400 100644
--- a/tools/ipc-modem.c
+++ b/tools/ipc-modem.c
@@ -22,6 +22,7 @@
#include <fcntl.h>
#include <getopt.h>
#include <pthread.h>
+#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
@@ -155,7 +156,7 @@ void modem_set_sec_pin_status(struct ipc_client *client, char *pin1, char *pin2)
{
struct ipc_sec_pin_status_request_data pin_status;
- printf("[I] Sending PIN1 unlock request\n");
+ ipc_modem_log(client, MODEM_LOG_INFO, "Sending PIN1 unlock request\n");
ipc_sec_pin_status_setup(&pin_status, IPC_SEC_PIN_TYPE_PIN1, pin1,
pin2);
@@ -176,37 +177,51 @@ void modem_response_sec(struct ipc_client *client, struct ipc_message *resp)
switch (sim_status->status) {
case IPC_SEC_PIN_STATUS_CARD_NOT_PRESENT:
- printf("[I] SIM card is definitely absent\n");
+ ipc_modem_log(client, MODEM_LOG_INFO,
+ "SIM card is definitely absent\n");
break;
case IPC_SEC_PIN_STATUS_LOCK_SC:
switch (sim_status->facility_lock) {
case IPC_SEC_FACILITY_LOCK_TYPE_SC_PIN1_REQ:
- printf("[I] "
- "We need the PIN1 to unlock the card!"
- "\n");
+ ipc_modem_log(
+ client,
+ MODEM_LOG_INFO,
+ "We need the PIN1 to unlock the card!"
+ "\n");
if (strlen(sim_pin) > 0) {
modem_set_sec_pin_status(client,
sim_pin, NULL);
} else {
- printf("[E] No SIM Pin, use --pin\n");
+ ipc_modem_log(
+ client,
+ MODEM_LOG_ERROR,
+ "No SIM Pin, use --pin\n");
}
break;
case IPC_SEC_FACILITY_LOCK_TYPE_SC_PUK_REQ:
- printf("[I] Please provide the SIM card PUK!"
- "\n");
+ ipc_modem_log(
+ client,
+ MODEM_LOG_INFO,
+ "Please provide the SIM card PUK!"
+ "\n");
break;
case IPC_SEC_FACILITY_LOCK_TYPE_SC_CARD_BLOCKED:
- printf("[I] Ouch, the SIM Card is blocked.\n");
+ ipc_modem_log(
+ client,
+ MODEM_LOG_INFO,
+ "Ouch, the SIM Card is blocked.\n");
break;
}
break;
case IPC_SEC_PIN_STATUS_INIT_COMPLETE:
- printf("[3] SIM init complete\n");
+ ipc_modem_log(client, "3", "SIM init complete\n");
if (state == MODEM_STATE_NORMAL)
state = MODEM_STATE_SIM_OK;
break;
case IPC_SEC_PIN_STATUS_PB_INIT_COMPLETE:
- printf("[I] SIM Phone Book init complete\n");
+ ipc_modem_log(client,
+ MODEM_LOG_INFO,
+ "SIM Phone Book init complete\n");
break;
}
break;
@@ -214,11 +229,15 @@ void modem_response_sec(struct ipc_client *client, struct ipc_message *resp)
type = *((char *) resp->data);
switch (type) {
case IPC_SEC_SIM_CARD_TYPE_UNKNOWN:
- printf("[I] No SIM card type: unknown (absent?)\n");
+ ipc_modem_log(
+ client,
+ MODEM_LOG_INFO,
+ "No SIM card type: unknown (absent?)\n");
break;
case IPC_SEC_SIM_CARD_TYPE_SIM:
case IPC_SEC_SIM_CARD_TYPE_USIM:
- printf("[I] SIM card found\n");
+ ipc_modem_log(client,
+ MODEM_LOG_INFO, "SIM card found\n");
break;
}
break;
@@ -230,12 +249,14 @@ void modem_response_sms(struct ipc_client *client, struct ipc_message *resp)
switch (resp->command) {
case IPC_SMS_DEVICE_READY:
if (state == MODEM_STATE_LPM) {
- printf("[4] "
- "Modem is ready, requesting normal power mode"
- "\n");
+ ipc_modem_log(
+ client,
+ "4",
+ "Modem is ready, requesting normal power mode"
+ "\n");
modem_exec_power_normal(client);
} else if (state == MODEM_STATE_SIM_OK) {
- printf("[5] Modem is fully ready\n");
+ ipc_modem_log(client, "5", "Modem is fully ready\n");
modem_set_sms_device_ready(client);
}
break;
@@ -256,7 +277,8 @@ void modem_response_call(struct ipc_client *client, struct ipc_message *resp)
*/
break;
case IPC_CALL_INCOMING:
- printf("[I] Got an incoming call!\n");
+ ipc_modem_log(client,
+ MODEM_LOG_INFO, "Got an incoming call!\n");
in_call = 1;
modem_get_call_list(client);
break;
@@ -264,13 +286,18 @@ void modem_response_call(struct ipc_client *client, struct ipc_message *resp)
stat = (struct ipc_call_status_data *)resp->data;
if (stat->status == IPC_CALL_STATUS_DIALING) {
- printf("[I] Sending clock ctrl and restore alsa\n");
+ ipc_modem_log(
+ client,
+ MODEM_LOG_INFO,
+ "Sending clock ctrl and restore alsa\n");
modem_snd_clock_ctrl(client);
/*
* system("alsa_ctl -f /data/alsa_state_modem restore");
*/
- printf("[I] CALL STATUS DIALING!!!\n");
+ ipc_modem_log(client,
+ MODEM_LOG_INFO,
+ "CALL STATUS DIALING!!!\n");
modem_snd_spkr_volume_ctrl(client);
modem_snd_audio_path_ctrl(client);
@@ -279,12 +306,16 @@ void modem_response_call(struct ipc_client *client, struct ipc_message *resp)
}
if (stat->status == IPC_CALL_STATUS_CONNECTED) {
- printf("[I] CALL STATUS CONNECTED!!!\n");
+ ipc_modem_log(client,
+ MODEM_LOG_INFO,
+ "CALL STATUS CONNECTED!!!\n");
modem_snd_no_mic_mute(client);
}
if (stat->status == IPC_CALL_STATUS_RELEASED) {
- printf("[I] CALL STATUS RELEASED!!!\n");
+ ipc_modem_log(client,
+ MODEM_LOG_INFO,
+ "CALL STATUS RELEASED!!!\n");
modem_snd_no_mic_mute(client);
}
break;
@@ -298,7 +329,7 @@ void modem_response_pwr(__attribute__((unused)) struct ipc_client *client,
switch (resp->command) {
case IPC_PWR_PHONE_PWR_UP:
- printf("[2] Phone is powered up (LPM)!\n");
+ ipc_modem_log(client, "2", "Phone is powered up (LPM)!\n");
state = MODEM_STATE_LPM;
break;
@@ -308,10 +339,15 @@ void modem_response_pwr(__attribute__((unused)) struct ipc_client *client,
switch (state_n) {
/* FIXME: Broken */
case IPC_PWR_PHONE_STATE_NORMAL:
- printf("Power state is now: NORMAL\n");
+ ipc_modem_log(client,
+ MODEM_LOG_INFO,
+ "Power state is now: NORMAL\n");
break;
case IPC_PWR_PHONE_STATE_LPM:
- printf("Power state is now: LPM (Low Power Mode)?\n");
+ ipc_modem_log(
+ client,
+ MODEM_LOG_INFO,
+ "Power state is now: LPM (Low Power Mode)?\n");
break;
}
#endif
@@ -331,17 +367,24 @@ void modem_response_net(__attribute__((unused)) struct ipc_client *client,
case IPC_NET_REGIST:
regi = (struct ipc_net_regist_response_data *) resp->data;
if (regi->status == IPC_NET_REGISTRATION_STATUS_HOME)
- printf("[I] Registered with network successfully!\n");
+ ipc_modem_log(
+ client,
+ MODEM_LOG_INFO,
+ "Registered with network successfully!\n");
break;
case IPC_NET_SERVING_NETWORK:
memcpy(mnc, (char *)((char *) resp->data + 3), 5);
mnc[5] = 0;
- printf("[6] Registered with network! "
- "Got PLMN (Mobile Network Code): '%s'\n",
- mnc);
+ ipc_modem_log(client,
+ "6",
+ "Registered with network! "
+ "Got PLMN (Mobile Network Code): '%s'\n",
+ mnc);
if (call_done == 0) {
- printf("Requesting outgoing call to %s!\n",
- call_number);
+ ipc_modem_log(client,
+ MODEM_LOG_INFO,
+ "Requesting outgoing call to %s!\n",
+ call_number);
modem_exec_call_out(client, call_number);
}
call_done = 1;
@@ -391,8 +434,10 @@ int modem_read_loop(struct ipc_client *client)
rc = ipc_client_recv(client, &resp);
if (rc < 0) {
- printf("[E] "
- "Can't RECV from modem: please run this again"
+ ipc_modem_log(
+ client,
+ MODEM_LOG_ERROR,
+ "Can't RECV from modem: please run this again"
"\n");
break;
}
@@ -409,15 +454,15 @@ int modem_read_loop(struct ipc_client *client)
int modem_dummy_read_loop(__attribute__((unused)) struct ipc_client *client)
{
while (true) {
- printf("[I] %s: looping\n", __func__);
+ ipc_modem_log(client,
+ MODEM_LOG_INFO, "%s: looping\n", __func__);
sleep(1);
}
return 0;
}
-void modem_log_handler(__attribute__((unused)) void *user_data,
- const char *msg)
+void modem_log_handler(void *user_data, const char *msg)
{
int i, l;
char *message;
@@ -433,7 +478,10 @@ void modem_log_handler(__attribute__((unused)) void *user_data,
break;
}
- printf("[D] %s\n", message);
+ if (user_data)
+ printf("[%s] %s\n", (char *)user_data, message);
+ else
+ printf("[%s] %s\n", MODEM_LOG_DEBUG, message);
}
free(message);
@@ -444,6 +492,19 @@ void modem_log_handler_quiet(__attribute__((unused)) void *user_data,
{
}
+void ipc_modem_log(__attribute__((unused)) struct ipc_client *client,
+ char *prefix, const char *message, ...)
+{
+ va_list args;
+ char buffer[4096];
+
+ va_start(args, message);
+ vsnprintf((char *) &buffer, sizeof(buffer), message, args);
+ va_end(args);
+
+ modem_log_handler(prefix, buffer);
+}
+
int modem_start(struct ipc_client *client)
{
int rc = -1;
@@ -491,106 +552,104 @@ void print_help(void)
"\t--pin=[PIN] provide SIM card PIN\n");
}
-int handle_command(struct cmdline_opts *cmdline_opts)
+int handle_command(struct ipc_client *client,
+ struct cmdline_opts *cmdline_opts)
{
- struct ipc_client *client_fmt;
int rc = 0;
- if (cmdline_opts->dry_run)
- client_fmt = ipc_client_create(IPC_CLIENT_TYPE_DUMMY);
- else
- client_fmt = ipc_client_create(IPC_CLIENT_TYPE_FMT);
-
- if (client_fmt == 0) {
- printf("[E] Could not create IPC client; aborting ...\n");
- goto modem_quit;
- }
-
- if (cmdline_opts->debug == 0) {
- ipc_client_log_callback_register(client_fmt,
- modem_log_handler_quiet, NULL);
- } else {
- ipc_client_log_callback_register(client_fmt, modem_log_handler,
- NULL);
- }
-
switch (cmdline_opts->command) {
case CMD_POWER_ON:
if (cmdline_opts->dry_run)
break;
- rc = ipc_client_power_on(client_fmt);
+ rc = ipc_client_power_on(client);
if (rc < 0)
- printf("[E] Something went wrong "
- "while powering modem on\n");
+ ipc_modem_log(client, "[E]",
+ "[E] Something went wrong "
+ "while powering modem on\n");
goto modem_quit;
case CMD_POWER_OFF:
if (cmdline_opts->dry_run)
break;
- rc = ipc_client_power_off(client_fmt);
+ rc = ipc_client_power_off(client);
if (rc < 0)
- printf("[E] Something went wrong "
- "while powering modem off\n");
+ ipc_modem_log(client,
+ MODEM_LOG_ERROR,
+ "Something went wrong "
+ "while powering modem off\n");
goto modem_quit;
case CMD_BOOT:
if (cmdline_opts->dry_run)
break;
- rc = ipc_client_boot(client_fmt);
+ rc = ipc_client_boot(client);
if (rc < 0)
- printf("[E] Something went wrong "
- "while bootstrapping modem\n");
+ ipc_modem_log(client,
+ MODEM_LOG_ERROR,
+ "Something went wrong "
+ "while bootstrapping modem\n");
break;
case CMD_START:
if (cmdline_opts->dry_run) {
- printf("[1] "
- "Starting dummy modem_read_loop on %s client\n",
+ ipc_modem_log(
+ client,
+ "1",
+ "Starting dummy modem_read_loop on %s client\n",
"FMT");
- modem_dummy_read_loop(client_fmt);
+ modem_dummy_read_loop(client);
break;
}
- printf("[0] Starting modem on FMT client\n");
+ ipc_modem_log(client,
+ "0", "Starting modem on FMT client\n");
- rc = modem_start(client_fmt);
+ rc = modem_start(client);
if (rc < 0) {
- printf("[E] Something went wrong\n");
- modem_stop(client_fmt);
+ ipc_modem_log(client,
+ MODEM_LOG_ERROR,
+ "Something went wrong\n");
+ modem_stop(client);
return 1;
}
- printf("[1] Starting modem_read_loop on FMT client\n");
- modem_read_loop(client_fmt);
+ ipc_modem_log(client,
+ "1",
+ "Starting modem_read_loop on FMT client\n");
+ modem_read_loop(client);
- modem_stop(client_fmt);
+ modem_stop(client);
break;
default:
/* We should handle all commands */
- printf("[E] %s: Unknown command %d\n", __func__,
- cmdline_opts->command);
+ ipc_modem_log(client,
+ MODEM_LOG_ERROR,
+ "%s: Unknown command %d\n", __func__,
+ cmdline_opts->command);
assert(false);
}
modem_quit:
- if (client_fmt != 0)
- ipc_client_destroy(client_fmt);
+ if (client != 0)
+ ipc_client_destroy(client);
return rc;
}
-void print_cmdline_opts(struct cmdline_opts *cmdline_opts)
+void print_cmdline_opts(struct ipc_client *client,
+ struct cmdline_opts *cmdline_opts)
{
if (cmdline_opts->debug)
- printf("[I] Debug enabled\n");
+ ipc_modem_log(client, MODEM_LOG_INFO, "Debug enabled\n");
if (cmdline_opts->debug && cmdline_opts->dry_run)
- printf("[I] dry-run mode\n");
+ ipc_modem_log(client, MODEM_LOG_INFO, "dry-run mode\n");
}
int main(int argc, char *argv[])
{
struct cmdline_opts cmdline_opts;
+ struct ipc_client *client;
int c = 0;
int opt_i = 0;
@@ -650,6 +709,23 @@ int main(int argc, char *argv[])
}
}
+ if (cmdline_opts.dry_run)
+ client = ipc_client_create(IPC_CLIENT_TYPE_DUMMY);
+ else
+ client = ipc_client_create(IPC_CLIENT_TYPE_FMT);
+
+ if (client == 0) {
+ printf("[E] Could not create IPC client; aborting ...\n");
+ return 1;
+ }
+
+ if (cmdline_opts.debug == 0)
+ ipc_client_log_callback_register(client,
+ modem_log_handler_quiet, NULL);
+ else
+ ipc_client_log_callback_register(client, modem_log_handler,
+ NULL);
+
while (optind < argc) {
if (strncmp(argv[optind], "boot", 9) == 0) {
cmdline_opts.command = CMD_BOOT;
@@ -664,7 +740,10 @@ int main(int argc, char *argv[])
cmdline_opts.command = CMD_START;
break;
} else {
- printf("[E] Unknown argument: '%s'\n", argv[optind]);
+ ipc_modem_log(client,
+ MODEM_LOG_ERROR,
+ "Unknown argument: '%s'\n",
+ argv[optind]);
print_help();
return 1;
}
@@ -681,7 +760,7 @@ int main(int argc, char *argv[])
return 1;
}
- print_cmdline_opts(&cmdline_opts);
+ print_cmdline_opts(client, &cmdline_opts);
- return handle_command(&cmdline_opts);
+ return handle_command(client, &cmdline_opts);
}
diff --git a/tools/ipc-modem.h b/tools/ipc-modem.h
index 6d54375..69b9f64 100644
--- a/tools/ipc-modem.h
+++ b/tools/ipc-modem.h
@@ -25,6 +25,10 @@
#define MODEM_STATE_NORMAL 2
#define MODEM_STATE_SIM_OK 4
+#define MODEM_LOG_ERROR "E"
+#define MODEM_LOG_INFO "I"
+#define MODEM_LOG_DEBUG "D"
+
enum command {
CMD_NONE,
CMD_START,
@@ -39,4 +43,8 @@ struct cmdline_opts {
bool dry_run;
};
+
+void ipc_modem_log(struct ipc_client *client,
+ char *prefix, const char *message, ...);
+
#endif /* IPC_MODEM */
--
2.35.1
More information about the Replicant
mailing list