⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unsolicited.c

📁 Linux下gsm/gprs modem的看守程序。支持短信发送与接受。
💻 C
📖 第 1 页 / 共 2 页
字号:
	/* 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 + -