summaryrefslogtreecommitdiff
path: root/libwmc
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2012-01-21 15:42:28 -0600
committerDan Williams <dcbw@redhat.com>2012-01-21 15:43:15 -0600
commit4d4d6072a12677dca0e5fceb9a3be41c03cc72b0 (patch)
tree5114cd2941e94d1c48e0ac90f5b2a586e2977370 /libwmc
parent4c5ef98525bbd8348611c0206ae6b30b47322803 (diff)
downloadModemManager-4d4d6072a12677dca0e5fceb9a3be41c03cc72b0.tar.gz
wmc: fix up for recent INIT and DEVICE_INFO changes
Send current time to modem during init, and don't try to grab MCC/MNC where its not supported.
Diffstat (limited to 'libwmc')
-rw-r--r--libwmc/src/commands.c37
1 files changed, 26 insertions, 11 deletions
diff --git a/libwmc/src/commands.c b/libwmc/src/commands.c
index 0628d4b6f..45976f19c 100644
--- a/libwmc/src/commands.c
+++ b/libwmc/src/commands.c
@@ -16,6 +16,7 @@
*/
#include <string.h>
+#include <time.h>
#include "commands.h"
#include "errors.h"
@@ -72,15 +73,23 @@ wmc_cmd_init_new (char *buf, size_t buflen, int wmc2)
if (wmc2) {
WmcCmdInit2 *cmd = (WmcCmdInit2 *) buf;
- const char data[] = { 0xda, 0x07, 0x0c, 0x00, 0x1e, 0x00, 0x09, 0x00, 0x39,
- 0x00, 0x18, 0x00, 0x04, 0x00 };
+ time_t now;
+ struct tm *tm;
wmc_return_val_if_fail (buflen >= sizeof (*cmd), 0);
+ now = time (NULL);
+ tm = localtime (&now);
+
memset (cmd, 0, sizeof (*cmd));
cmd->hdr.marker = WMC_CMD_MARKER;
cmd->hdr.cmd = WMC_CMD_INIT;
- memcpy (cmd->_unknown1, data, sizeof (data));
+ cmd->year = htole16 (tm->tm_year);
+ cmd->month = tm->tm_mon;
+ cmd->day = htobe16 (tm->tm_mday);
+ cmd->hours = htobe16 (tm->tm_hour);
+ cmd->minutes = htobe16 (tm->tm_min);
+ cmd->seconds = htobe16 (tm->tm_sec);
return sizeof (*cmd);
} else {
WmcCmdHeader *cmd = (WmcCmdHeader *) buf;
@@ -132,14 +141,18 @@ wmc_cmd_device_info_result (const char *buf, size_t buflen)
WmcResult *r = NULL;
WmcCmdDeviceInfoRsp *rsp = (WmcCmdDeviceInfoRsp *) buf;
WmcCmdDeviceInfo2Rsp *rsp2 = (WmcCmdDeviceInfo2Rsp *) buf;
+ WmcCmdDeviceInfo3Rsp *rsp3 = (WmcCmdDeviceInfo3Rsp *) buf;
char tmp[65];
wmc_return_val_if_fail (buf != NULL, NULL);
- if (check_command (buf, buflen, WMC_CMD_DEVICE_INFO, sizeof (WmcCmdDeviceInfo2Rsp)) < 0) {
- rsp2 = NULL;
- if (check_command (buf, buflen, WMC_CMD_DEVICE_INFO, sizeof (WmcCmdDeviceInfoRsp)) < 0)
- return NULL;
+ if (check_command (buf, buflen, WMC_CMD_DEVICE_INFO, sizeof (WmcCmdDeviceInfo3Rsp)) < 0) {
+ rsp3 = NULL;
+ if (check_command (buf, buflen, WMC_CMD_DEVICE_INFO, sizeof (WmcCmdDeviceInfo2Rsp)) < 0) {
+ rsp2 = NULL;
+ if (check_command (buf, buflen, WMC_CMD_DEVICE_INFO, sizeof (WmcCmdDeviceInfoRsp)) < 0)
+ return NULL;
+ }
}
r = wmc_result_new ();
@@ -180,17 +193,19 @@ wmc_cmd_device_info_result (const char *buf, size_t buflen)
wmc_assert (sizeof (rsp2->iccid) <= sizeof (tmp));
memcpy (tmp, rsp2->iccid, sizeof (rsp2->iccid));
wmc_result_add_string (r, WMC_CMD_DEVICE_INFO_ITEM_ICCID, tmp);
+ }
+ if (rsp3) {
/* MCC */
memset (tmp, 0, sizeof (tmp));
- wmc_assert (sizeof (rsp2->mcc) <= sizeof (tmp));
- memcpy (tmp, rsp2->mcc, sizeof (rsp2->mcc));
+ wmc_assert (sizeof (rsp3->mcc) <= sizeof (tmp));
+ memcpy (tmp, rsp3->mcc, sizeof (rsp3->mcc));
wmc_result_add_string (r, WMC_CMD_DEVICE_INFO_ITEM_MCC, tmp);
/* MNC */
memset (tmp, 0, sizeof (tmp));
- wmc_assert (sizeof (rsp2->mnc) <= sizeof (tmp));
- memcpy (tmp, rsp2->mnc, sizeof (rsp2->mnc));
+ wmc_assert (sizeof (rsp3->mnc) <= sizeof (tmp));
+ memcpy (tmp, rsp3->mnc, sizeof (rsp3->mnc));
wmc_result_add_string (r, WMC_CMD_DEVICE_INFO_ITEM_MNC, tmp);
}