summaryrefslogtreecommitdiffstats
path: root/gatchat
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2011-05-25 05:32:05 -0500
committerDenis Kenzior <denkenz@gmail.com>2011-05-25 05:32:05 -0500
commitbc52e40801666f2ffd5806f7ea8723e438c0a55b (patch)
tree4dc2ad6b8370395bd4bf654afa49901c3a3c1920 /gatchat
parent92e0657eed0b0777e5a7e3502b450aa42921fc8c (diff)
downloadofono-bc52e40801666f2ffd5806f7ea8723e438c0a55b.tar.bz2
gsmdial: Send escape sequence followed by ATH/ATO
This functionality can be triggered by sending SIGUSR1 / SIGUSR2 to gsmdial. e.g. kill -10 <pid> and kill -12 <pid>
Diffstat (limited to 'gatchat')
-rw-r--r--gatchat/gsmdial.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/gatchat/gsmdial.c b/gatchat/gsmdial.c
index f8a980ad..11169840 100644
--- a/gatchat/gsmdial.c
+++ b/gatchat/gsmdial.c
@@ -89,6 +89,40 @@ static void power_down(gboolean ok, GAtResult *result, gpointer user_data)
g_main_loop_quit(event_loop);
}
+static void kill_ppp(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ g_print("kill_ppp: %d\n", ok);
+
+ if (ok == FALSE)
+ return;
+
+ g_at_ppp_unref(ppp);
+ ppp = NULL;
+}
+
+static void ppp_suspend_ath0(gpointer user_data)
+{
+ g_at_chat_resume(modem);
+ g_at_chat_send(modem, "ATH0", none_prefix, kill_ppp, NULL, NULL);
+}
+
+static void resume_ppp(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ g_print("resume_ppp: %d\n", ok);
+
+ if (ok == FALSE)
+ return;
+
+ g_at_chat_suspend(modem);
+ g_at_ppp_resume(ppp);
+}
+
+static void ppp_suspend_ato0(gpointer user_data)
+{
+ g_at_chat_resume(modem);
+ g_at_chat_send(modem, "ATO0", none_prefix, resume_ppp, NULL, NULL);
+}
+
static gboolean signal_cb(GIOChannel *channel, GIOCondition cond, gpointer data)
{
static int terminated = 0;
@@ -120,6 +154,20 @@ static gboolean signal_cb(GIOChannel *channel, GIOCondition cond, gpointer data)
terminated++;
break;
+ case SIGUSR1:
+ if (ppp == NULL)
+ break;
+
+ g_at_ppp_set_suspend_function(ppp, ppp_suspend_ato0, NULL);
+ g_at_ppp_suspend(ppp);
+ break;
+ case SIGUSR2:
+ if (ppp == NULL)
+ break;
+
+ g_at_ppp_set_suspend_function(ppp, ppp_suspend_ath0, NULL);
+ g_at_ppp_suspend(ppp);
+ break;
default:
break;
}
@@ -689,6 +737,7 @@ int main(int argc, char **argv)
sigemptyset(&mask);
sigaddset(&mask, SIGTERM);
sigaddset(&mask, SIGINT);
+ sigaddset(&mask, SIGUSR1);
sigaddset(&mask, SIGUSR2);
sigaddset(&mask, SIGPIPE);