; hacky way to get PIN capability. Proper version should check AT+CPIN? ; first and then decide if PIN is needed at all. ; arekm@maven.pl, 20120409 diff -ur ../../test/chan_dongle/at_command.c chan_dongle/at_command.c --- ../../test/chan_dongle/at_command.c 2012-04-26 11:11:01.000000000 +0200 +++ chan_dongle/at_command.c 2012-05-09 14:43:39.994983010 +0200 @@ -148,6 +148,7 @@ ATQ_CMD_DECLARE_ST(CMD_AT_CGMR, cmd8), /* Get software version */ ATQ_CMD_DECLARE_ST(CMD_AT_CMEE, cmd9), /* set MS Error Report to 'ERROR' only TODO: change to 1 or 2 and add support in response handlers */ + ATQ_CMD_DECLARE_DYNI(CMD_AT_CPIN_NUMBER), ATQ_CMD_DECLARE_ST(CMD_AT_CGSN, cmd10), /* IMEI Read */ ATQ_CMD_DECLARE_ST(CMD_AT_CIMI, cmd11), /* IMSI Read */ ATQ_CMD_DECLARE_ST(CMD_AT_CPIN, cmd12), /* check is password authentication requirement and the remainder validation times */ @@ -173,6 +174,7 @@ unsigned in, out; int begin = -1; int err; + char * ptmp0 = NULL; char * ptmp1 = NULL; char * ptmp2 = NULL; pvt_t * pvt = cpvt->pvt; @@ -193,10 +195,18 @@ continue; if(st_cmds[in].cmd == CMD_AT_U2DIAG && CONF_SHARED(pvt, u2diag) == -1) continue; + if(st_cmds[in].cmd == CMD_AT_CPIN_NUMBER && (!CONF_UNIQ(pvt, pin) || !strlen(CONF_UNIQ(pvt, pin)))) + continue; memcpy(&cmds[out], &st_cmds[in], sizeof(st_cmds[in])); - if(cmds[out].cmd == CMD_AT_U2DIAG) + if(st_cmds[in].cmd == CMD_AT_CPIN_NUMBER) { + err = at_fill_generic_cmd(&cmds[out], "AT+CPIN=\"%s\"\r", CONF_UNIQ(pvt, pin)); + if (err) + goto failure; + ptmp0 = cmds[out].data; + } + else if(cmds[out].cmd == CMD_AT_U2DIAG) { err = at_fill_generic_cmd(&cmds[out], "AT^U2DIAG=%d\r", CONF_SHARED(pvt, u2diag)); if(err) @@ -219,6 +229,8 @@ return at_queue_insert(cpvt, cmds, out, 0); return 0; failure: + if(ptmp0) + ast_free(ptmp0); if(ptmp1) ast_free(ptmp1); if(ptmp2) diff -ur ../../test/chan_dongle/at_command.h chan_dongle/at_command.h --- ../../test/chan_dongle/at_command.h 2012-04-26 11:11:01.000000000 +0200 +++ chan_dongle/at_command.h 2012-05-08 12:20:28.218759636 +0200 @@ -43,6 +43,7 @@ CMD_AT_COPS, CMD_AT_COPS_INIT, + CMD_AT_CPIN_NUMBER, CMD_AT_CPIN, CMD_AT_CPMS, diff -ur ../../test/chan_dongle/at_response.c chan_dongle/at_response.c --- ../../test/chan_dongle/at_response.c 2012-04-26 11:11:01.000000000 +0200 +++ chan_dongle/at_response.c 2012-05-09 14:39:54.298193606 +0200 @@ -135,6 +135,7 @@ case CMD_AT_CGSN: case CMD_AT_CIMI: case CMD_AT_CPIN: + case CMD_AT_CPIN_NUMBER: case CMD_AT_CCWA_SET: case CMD_AT_CCWA_STATUS: case CMD_AT_CHLD_2: @@ -364,6 +365,11 @@ ast_log (LOG_ERROR, "[%s] Getting IMSI number failed\n", PVT_ID(pvt)); goto e_return; + case CMD_AT_CPIN_NUMBER: + ast_log (LOG_ERROR, "[%s] Error sending PIN - ignored\n", PVT_ID(pvt)); + break; + //goto e_return; + case CMD_AT_CPIN: ast_log (LOG_ERROR, "[%s] Error checking PIN state\n", PVT_ID(pvt)); goto e_return; diff -ur ../../test/chan_dongle/dc_config.c chan_dongle/dc_config.c --- ../../test/chan_dongle/dc_config.c 2012-04-26 11:11:01.000000000 +0200 +++ chan_dongle/dc_config.c 2012-05-09 14:43:14.849045773 +0200 @@ -32,11 +32,13 @@ const char * data_tty; const char * imei; const char * imsi; + const char * pin; audio_tty = ast_variable_retrieve (cfg, cat, "audio"); data_tty = ast_variable_retrieve (cfg, cat, "data"); imei = ast_variable_retrieve (cfg, cat, "imei"); imsi = ast_variable_retrieve (cfg, cat, "imsi"); + pin = ast_variable_retrieve (cfg, cat, "pin"); if(imei && strlen(imei) != IMEI_SIZE) { ast_log (LOG_WARNING, "[%s] Ignore invalid IMEI value '%s'\n", cat, imei); @@ -46,6 +48,10 @@ ast_log (LOG_WARNING, "[%s] Ignore invalid IMSI value '%s'\n", cat, imsi); imsi = NULL; } + if(pin && strlen(pin) == 0) { + ast_log (LOG_WARNING, "[%s] Ignore invalid PIN value '%s'\n", cat, pin); + pin = NULL; + } if(!audio_tty && !imei && !imsi) { @@ -70,6 +76,7 @@ ast_copy_string (config->audio_tty, S_OR(audio_tty, ""), sizeof (config->audio_tty)); ast_copy_string (config->imei, S_OR(imei, ""), sizeof (config->imei)); ast_copy_string (config->imsi, S_OR(imsi, ""), sizeof (config->imsi)); + ast_copy_string (config->pin, S_OR(pin, ""), sizeof (config->pin)); return 0; } diff -ur ../../test/chan_dongle/dc_config.h chan_dongle/dc_config.h --- ../../test/chan_dongle/dc_config.h 2012-04-26 11:11:01.000000000 +0200 +++ chan_dongle/dc_config.h 2012-05-09 14:41:42.945044440 +0200 @@ -109,6 +109,7 @@ char data_tty[DEVPATHLEN]; /*!< tty for AT commands */ char imei[IMEI_SIZE+1]; /*!< search device by imei */ char imsi[IMSI_SIZE+1]; /*!< search device by imsi */ + char pin[128]; // how long it can be really? } dc_uconfig_t; /* all Config settings join in one place */