📄 unsolicited.c
字号:
/* FIXME: parse */ return 0;}/* Chapter 10.1.14, GPRS network registration status */static int cgreg_parse(const char *buf, int len, const char *param, struct gsmd *gsmd){ /* FIXME: parse */ return 0;}/* Chapter 7.6, calling line identification presentation */static int clip_parse(const char *buf, int len, const char *param, struct gsmd *gsmd){ struct gsmd_ucmd *ucmd = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_IN_CLIP, sizeof(struct gsmd_evt_auxdata)); struct gsmd_evt_auxdata *aux; struct gsm_extrsp *er; if (!ucmd) return -ENOMEM; aux = (struct gsmd_evt_auxdata *) ucmd->buf; er = extrsp_parse(gsmd_tallocs, param); if ( !er ) return -ENOMEM; if ( er->num_tokens >= 2 && er->tokens[0].type == GSMD_ECMD_RTT_STRING && er->tokens[1].type == GSMD_ECMD_RTT_NUMERIC ) { /* * <number>,<type>[,<subaddr>,<satype>[,[<alpha>][,<CLI validity>]]] */ strcpy(aux->u.clip.addr.number, er->tokens[0].u.string); aux->u.clip.addr.type = er->tokens[1].u.numeric; } else { DEBUGP("Invalid Input : Parse error\n"); return -EINVAL; } return usock_evt_send(gsmd, ucmd, GSMD_EVT_IN_CLIP);}/* Chapter 7.9, calling line identification presentation */static int colp_parse(const char *buf, int len, const char *param, struct gsmd *gsmd){ struct gsmd_ucmd *ucmd = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_OUT_COLP, sizeof(struct gsmd_evt_auxdata)); struct gsmd_evt_auxdata *aux; struct gsm_extrsp *er; if (!ucmd) return -ENOMEM; aux = (struct gsmd_evt_auxdata *) ucmd->buf; er = extrsp_parse(gsmd_tallocs, param); if ( !er ) return -ENOMEM; if ( er->num_tokens >= 2 && er->tokens[0].type == GSMD_ECMD_RTT_STRING && er->tokens[1].type == GSMD_ECMD_RTT_NUMERIC ) { /* * <number>,<type>[,<subaddr>,<satype> [,<alpha>]] */ strcpy(aux->u.colp.addr.number, er->tokens[0].u.string); aux->u.colp.addr.type = er->tokens[1].u.numeric; } else { DEBUGP("Invalid Input : Parse error\n"); return -EINVAL; } return usock_evt_send(gsmd, ucmd, GSMD_EVT_OUT_COLP);}static int ctzv_parse(const char *buf, int len, const char *param, struct gsmd *gsmd){ struct gsmd_ucmd *ucmd = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_TIMEZONE, sizeof(struct gsmd_evt_auxdata)); struct gsmd_evt_auxdata *aux; int tz; if (!ucmd) return -ENOMEM; aux = (struct gsmd_evt_auxdata *) ucmd->buf; /* timezones are expressed in quarters of hours +/- GMT (-48...+48) */ tz = atoi(param); if (tz < -48 || tz > 48) return -EINVAL; aux->u.timezone.tz = tz; return usock_evt_send(gsmd, ucmd, GSMD_EVT_TIMEZONE);}static int copn_parse(const char *buf, int len, const char *param, struct gsmd *gsmd){ struct gsm_extrsp *er = extrsp_parse(gsmd_tallocs, param); int rc = 0; if (!er) return -ENOMEM; extrsp_dump(er); if (er->num_tokens == 2 && er->tokens[0].type == GSMD_ECMD_RTT_STRING && er->tokens[1].type == GSMD_ECMD_RTT_STRING) rc = gsmd_opname_add(gsmd, er->tokens[0].u.string, er->tokens[1].u.string); talloc_free(er); return rc;}static const struct gsmd_unsolicit gsm0707_unsolicit[] = { { "RING", &ring_parse }, { "+CRING", &cring_parse }, { "+CREG", &creg_parse }, /* Network registration */ { "+CCWA", &ccwa_parse }, /* Call waiting */ { "+CUSD", &cusd_parse }, /* Unstructured supplementary data */ { "+CCCM", &cccm_parse }, /* Advice of Charge */ { "+CGEV", &cgev_parse }, /* GPRS Event */ { "+CGREG", &cgreg_parse }, /* GPRS Registration */ { "+CLIP", &clip_parse }, { "+COLP", &colp_parse }, { "+CTZV", &ctzv_parse }, /* Timezone */ { "+COPN", &copn_parse }, /* operator names, treat as unsolicited */ /* { "+CKEV", &ckev_parse }, { "+CDEV", &cdev_parse }, { "+CIEV", &ciev_parse }, { "+CLAV", &clav_parse }, { "+CCWV", &ccwv_parse }, { "+CLAV", &clav_parse }, { "+CSSU", &cssu_parse }, */};static struct gsmd_unsolicit unsolicit[256] = {{ 0, 0 }};/* called by midlevel parser if a response seems unsolicited */int unsolicited_parse(struct gsmd *g, const char *buf, int len, const char *param){ struct gsmd_unsolicit *i; int rc; /* call unsolicited code parser */ for (i = unsolicit; i->prefix; i ++) { const char *colon; if (strncmp(buf, i->prefix, strlen(i->prefix))) continue; colon = strchr(buf, ':') + 2; if (colon > buf+len) colon = NULL; rc = i->parse(buf, len, colon, g); if (rc == -EAGAIN) return rc; if (rc < 0) gsmd_log(GSMD_ERROR, "error %d during parsing of " "an unsolicied response `%s'\n", rc, buf); return rc; } gsmd_log(GSMD_NOTICE, "no parser for unsolicited response `%s'\n", buf); return -ENOENT;}int unsolicited_register_array(const struct gsmd_unsolicit *arr, int len){ int curlen = 0; while (unsolicit[curlen ++].prefix); if (len + curlen > ARRAY_SIZE(unsolicit)) return -ENOMEM; /* Add at the beginning for overriding to be possible */ memmove(&unsolicit[len], unsolicit, sizeof(struct gsmd_unsolicit) * curlen); memcpy(unsolicit, arr, sizeof(struct gsmd_unsolicit) * len); return 0;}void unsolicited_init(struct gsmd *g){ struct gsmd_vendor_plugin *vpl = g->vendorpl; /* register generic unsolicited code parser */ unsolicited_register_array(gsm0707_unsolicit, ARRAY_SIZE(gsm0707_unsolicit)); /* register vendor-specific unsolicited code parser */ if (vpl && vpl->num_unsolicit) if (unsolicited_register_array(vpl->unsolicit, vpl->num_unsolicit)) gsmd_log(GSMD_ERROR, "registering vendor-specific " "unsolicited responses failed\n");}static unsigned int errors_creating_events[] = { GSM0707_CME_PHONE_FAILURE, GSM0707_CME_PHONE_NOCONNECT, GSM0707_CME_PHONE_ADAPT_RESERVED, GSM0707_CME_PH_SIM_PIN_REQUIRED, GSM0707_CME_PH_FSIM_PIN_REQUIRED, GSM0707_CME_PH_FSIM_PUK_REQUIRED, GSM0707_CME_SIM_NOT_INSERTED, GSM0707_CME_SIM_PIN_REQUIRED, GSM0707_CME_SIM_PUK_REQUIRED,/* GSM0707_CME_SIM_FAILURE, GSM0707_CME_SIM_BUSY, GSM0707_CME_SIM_WRONG,*/ GSM0707_CME_SIM_PIN2_REQUIRED, GSM0707_CME_SIM_PUK2_REQUIRED,/* GSM0707_CME_MEMORY_FULL, GSM0707_CME_MEMORY_FAILURE,*/ GSM0707_CME_NETPERS_PIN_REQUIRED, GSM0707_CME_NETPERS_PUK_REQUIRED, GSM0707_CME_NETSUBSET_PIN_REQUIRED, GSM0707_CME_NETSUBSET_PUK_REQUIRED, GSM0707_CME_PROVIDER_PIN_REQUIRED, GSM0707_CME_PROVIDER_PUK_REQUIRED, GSM0707_CME_CORPORATE_PIN_REQUIRED, GSM0707_CME_CORPORATE_PUK_REQUIRED,};static int is_in_array(unsigned int val, unsigned int *arr, unsigned int arr_len){ unsigned int i; for (i = 0; i < arr_len; i++) { if (arr[i] == val) return 1; } return 0;}const int pintype_from_cme[GSM0707_CME_UNKNOWN] = { [GSM0707_CME_PH_SIM_PIN_REQUIRED] = GSMD_PIN_PH_SIM_PIN, [GSM0707_CME_PH_FSIM_PIN_REQUIRED] = GSMD_PIN_PH_FSIM_PIN, [GSM0707_CME_PH_FSIM_PUK_REQUIRED] = GSMD_PIN_PH_FSIM_PUK, [GSM0707_CME_SIM_PIN_REQUIRED] = GSMD_PIN_SIM_PIN, [GSM0707_CME_SIM_PUK_REQUIRED] = GSMD_PIN_SIM_PUK, [GSM0707_CME_SIM_PIN2_REQUIRED] = GSMD_PIN_SIM_PIN2, [GSM0707_CME_SIM_PUK2_REQUIRED] = GSMD_PIN_SIM_PUK2, [GSM0707_CME_NETPERS_PIN_REQUIRED] = GSMD_PIN_PH_NET_PIN, [GSM0707_CME_NETPERS_PUK_REQUIRED] = GSMD_PIN_PH_NET_PUK, [GSM0707_CME_NETSUBSET_PIN_REQUIRED] = GSMD_PIN_PH_NETSUB_PIN, [GSM0707_CME_NETSUBSET_PUK_REQUIRED] = GSMD_PIN_PH_NETSUB_PUK, [GSM0707_CME_PROVIDER_PIN_REQUIRED] = GSMD_PIN_PH_SP_PIN, [GSM0707_CME_PROVIDER_PUK_REQUIRED] = GSMD_PIN_PH_SP_PUK, [GSM0707_CME_CORPORATE_PIN_REQUIRED] = GSMD_PIN_PH_CORP_PIN, [GSM0707_CME_CORPORATE_PUK_REQUIRED] = GSMD_PIN_PH_CORP_PUK, /* FIXME: */ [GSM0707_CME_SIM_FAILURE] = 0, [GSM0707_CME_SIM_BUSY] = 0, [GSM0707_CME_SIM_WRONG] = 0, [GSM0707_CME_MEMORY_FULL] = 0, [GSM0707_CME_MEMORY_FAILURE] = 0, [GSM0707_CME_PHONE_FAILURE] = 0, [GSM0707_CME_PHONE_NOCONNECT] = 0, [GSM0707_CME_PHONE_ADAPT_RESERVED] = 0, [GSM0707_CME_SIM_NOT_INSERTED] = 0,};int generate_event_from_cme(struct gsmd *g, unsigned int cme_error){ struct gsmd_ucmd *gu; struct gsmd_evt_auxdata *eaux; if (!is_in_array(cme_error, errors_creating_events, ARRAY_SIZE(errors_creating_events))) { gu = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_IN_ERROR, sizeof(*eaux)); if (!gu) return -1; eaux = ((void *)gu) + sizeof(*gu); eaux->u.cme_err.number = cme_error; return usock_evt_send(g, gu, GSMD_EVT_IN_ERROR); } else { if (cme_error >= GSM0707_CME_UNKNOWN || !pintype_from_cme[cme_error]) return 0; gu = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_PIN, sizeof(*eaux)); if (!gu) return -1; eaux = ((void *)gu) + sizeof(*gu); eaux->u.pin.type = pintype_from_cme[cme_error]; return usock_evt_send(g, gu, GSMD_EVT_PIN); }}int generate_event_from_cms(struct gsmd *g, unsigned int cms_error){ struct gsmd_ucmd *gu; struct gsmd_evt_auxdata *eaux; gu = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_IN_ERROR, sizeof(*eaux)); if (!gu) return -1; eaux = ((void *)gu) + sizeof(*gu); eaux->u.cms_err.number = cms_error; return usock_evt_send(g, gu, GSMD_EVT_IN_ERROR);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -