From 33f35ae8c18577dba1b138be1e482f6d825fbb9b Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Thu, 28 Aug 2014 02:03:35 +0200 Subject: [PATCH] Implemented hanging up ppp connections (not fully functional) --- tools/common.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tools/common.c b/tools/common.c index b480f20..d3b83e5 100644 --- a/tools/common.c +++ b/tools/common.c @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -102,6 +103,7 @@ static int _helper_error(Phone * phone, char const * message, int ret) /* helper_request */ static int _request_call(Phone * phone, ModemRequest * request); +static int _request_call_hangup(Phone * phone, ModemRequest * request); static int _request_authenticate(Phone * phone, ModemRequest * request); static int _helper_request(Phone * phone, ModemRequest * request) @@ -112,6 +114,8 @@ static int _helper_request(Phone * phone, ModemRequest * request) return _request_authenticate(phone, request); case MODEM_REQUEST_CALL: return _request_call(phone, request); + case MODEM_REQUEST_CALL_HANGUP: + return _request_call_hangup(phone, request); default: /* FIXME implement more */ return -error_set_code(1, "Not implemented"); @@ -137,6 +141,40 @@ static int _request_call(Phone * phone, ModemRequest * request) return 0; } +static int _request_call_hangup(Phone * phone, ModemRequest * request) +{ + int ret = 0; + char const * interface; + String * path; + FILE * fp; + char buf[16]; + pid_t pid; + + if((interface = config_get(phone->config, "gprs", "interface")) == NULL) + return -error_set_code(1, "Unknown interface"); + if((path = string_new_append("/var/run/", interface, ".pid", NULL)) + == NULL) + return -1; + /* FIXME likely to not be readable */ + if((fp = fopen(path, "r")) == NULL) + ret = -error_set_code(1, "%s: %s", path, strerror(errno)); + else if(fread(buf, sizeof(*buf), sizeof(buf), fp) == 0) + ret = -error_set_code(1, "%s: %s", path, strerror(errno)); + else + { + buf[sizeof(buf) - 1] = '\0'; + if(sscanf(buf, "%u", &pid) != 1) + ret = -error_set_code(1, "%s", strerror(errno)); + else if(kill(pid, SIGHUP) != 0) + ret = -error_set_code(1, "%u: %s", pid, + strerror(errno)); + } + if(fp != NULL) + fclose(fp); + string_delete(path); + return ret; +} + /* helper_trigger */ static int _trigger_connection(Phone * phone, ModemEventType type);