ev-layer.c

来自「LINUX 2.6.17.4的源码」· C语言 代码 · 共 1,986 行 · 第 1/4 页

C
1,986
字号
/* * Stuff used by all variants of the driver * * Copyright (c) 2001 by Stefan Eilers, *                       Hansjoerg Lipp <hjlipp@web.de>, *                       Tilman Schmidt <tilman@imap.cc>. * * ===================================================================== *	This program is free software; you can redistribute it and/or *	modify it under the terms of the GNU General Public License as *	published by the Free Software Foundation; either version 2 of *	the License, or (at your option) any later version. * ===================================================================== */#include "gigaset.h"/* ========================================================== *//* bit masks for pending commands */#define PC_DIAL		0x001#define PC_HUP		0x002#define PC_INIT		0x004#define PC_DLE0		0x008#define PC_DLE1		0x010#define PC_SHUTDOWN	0x020#define PC_ACCEPT	0x040#define PC_CID		0x080#define PC_NOCID	0x100#define PC_CIDMODE	0x200#define PC_UMMODE	0x400/* types of modem responses */#define RT_NOTHING	0#define RT_ZSAU		1#define RT_RING		2#define RT_NUMBER	3#define RT_STRING	4#define RT_HEX		5#define RT_ZCAU		6/* Possible ASCII responses */#define RSP_OK		0//#define RSP_BUSY	1//#define RSP_CONNECT	2#define RSP_ZGCI	3#define RSP_RING	4#define RSP_ZAOC	5#define RSP_ZCSTR	6#define RSP_ZCFGT	7#define RSP_ZCFG	8#define RSP_ZCCR	9#define RSP_EMPTY	10#define RSP_ZLOG	11#define RSP_ZCAU	12#define RSP_ZMWI	13#define RSP_ZABINFO	14#define RSP_ZSMLSTCHG	15#define RSP_VAR		100#define RSP_ZSAU	(RSP_VAR + VAR_ZSAU)#define RSP_ZDLE	(RSP_VAR + VAR_ZDLE)#define RSP_ZVLS	(RSP_VAR + VAR_ZVLS)#define RSP_ZCTP	(RSP_VAR + VAR_ZCTP)#define RSP_STR		(RSP_VAR + VAR_NUM)#define RSP_NMBR	(RSP_STR + STR_NMBR)#define RSP_ZCPN	(RSP_STR + STR_ZCPN)#define RSP_ZCON	(RSP_STR + STR_ZCON)#define RSP_ZBC		(RSP_STR + STR_ZBC)#define RSP_ZHLC	(RSP_STR + STR_ZHLC)#define RSP_ERROR	-1	/* ERROR              */#define RSP_WRONG_CID	-2	/* unknown cid in cmd *///#define RSP_EMPTY	-3#define RSP_UNKNOWN	-4	/* unknown response   */#define RSP_FAIL	-5	/* internal error     */#define RSP_INVAL	-6	/* invalid response   */#define RSP_NONE	-19#define RSP_STRING	-20#define RSP_NULL	-21//#define RSP_RETRYFAIL	-22//#define RSP_RETRY	-23//#define RSP_SKIP	-24#define RSP_INIT	-27#define RSP_ANY		-26#define RSP_LAST	-28#define RSP_NODEV	-9/* actions for process_response */#define ACT_NOTHING		0#define ACT_SETDLE1		1#define ACT_SETDLE0		2#define ACT_FAILINIT		3#define ACT_HUPMODEM		4#define ACT_CONFIGMODE		5#define ACT_INIT		6#define ACT_DLE0		7#define ACT_DLE1		8#define ACT_FAILDLE0		9#define ACT_FAILDLE1		10#define ACT_RING		11#define ACT_CID			12#define ACT_FAILCID		13#define ACT_SDOWN		14#define ACT_FAILSDOWN		15#define ACT_DEBUG		16#define ACT_WARN		17#define ACT_DIALING		18#define ACT_ABORTDIAL		19#define ACT_DISCONNECT		20#define ACT_CONNECT		21#define ACT_REMOTEREJECT	22#define ACT_CONNTIMEOUT		23#define ACT_REMOTEHUP		24#define ACT_ABORTHUP		25#define ACT_ICALL		26#define ACT_ACCEPTED		27#define ACT_ABORTACCEPT		28#define ACT_TIMEOUT		29#define ACT_GETSTRING		30#define ACT_SETVER		31#define ACT_FAILVER		32#define ACT_GOTVER		33#define ACT_TEST		34#define ACT_ERROR		35#define ACT_ABORTCID		36#define ACT_ZCAU		37#define ACT_NOTIFY_BC_DOWN	38#define ACT_NOTIFY_BC_UP	39#define ACT_DIAL		40#define ACT_ACCEPT		41#define ACT_PROTO_L2		42#define ACT_HUP			43#define ACT_IF_LOCK		44#define ACT_START		45#define ACT_STOP		46#define ACT_FAKEDLE0		47#define ACT_FAKEHUP		48#define ACT_FAKESDOWN		49#define ACT_SHUTDOWN		50#define ACT_PROC_CIDMODE	51#define ACT_UMODESET		52#define ACT_FAILUMODE		53#define ACT_CMODESET		54#define ACT_FAILCMODE		55#define ACT_IF_VER		56#define ACT_CMD			100/* at command sequences */#define SEQ_NONE	0#define SEQ_INIT	100#define SEQ_DLE0	200#define SEQ_DLE1	250#define SEQ_CID		300#define SEQ_NOCID	350#define SEQ_HUP		400#define SEQ_DIAL	600#define SEQ_ACCEPT	720#define SEQ_SHUTDOWN	500#define SEQ_CIDMODE	10#define SEQ_UMMODE	11// 100: init, 200: dle0, 250:dle1, 300: get cid (dial), 350: "hup" (no cid), 400: hup, 500: reset, 600: dial, 700: ringstruct reply_t gigaset_tab_nocid_m10x[]= /* with dle mode */{	/* resp_code, min_ConState, max_ConState, parameter, new_ConState, timeout, action, command */	/* initialize device, set cid mode if possible */	//{RSP_INIT,     -1, -1,100,                900, 0, {ACT_TEST}},	//{RSP_ERROR,   900,900, -1,                  0, 0, {ACT_FAILINIT}},	//{RSP_OK,      900,900, -1,                100, INIT_TIMEOUT,	//                                                  {ACT_TIMEOUT}},	{RSP_INIT,     -1, -1,SEQ_INIT,           100, INIT_TIMEOUT,							  {ACT_TIMEOUT}},                /* wait until device is ready */	{EV_TIMEOUT,  100,100, -1,                101, 3, {0},             "Z\r"},       /* device in transparent mode? try to initialize it. */	{RSP_OK,      101,103, -1,                120, 5, {ACT_GETSTRING}, "+GMR\r"},    /* get version */	{EV_TIMEOUT,  101,101, -1,                102, 5, {0},             "Z\r"},       /* timeout => try once again. */	{RSP_ERROR,   101,101, -1,                102, 5, {0},             "Z\r"},       /* error => try once again. */	{EV_TIMEOUT,  102,102, -1,                108, 5, {ACT_SETDLE1},   "^SDLE=0\r"}, /* timeout => try again in DLE mode. */	{RSP_OK,      108,108, -1,                104,-1},	{RSP_ZDLE,    104,104,  0,                103, 5, {0},             "Z\r"},	{EV_TIMEOUT,  104,104, -1,                  0, 0, {ACT_FAILINIT}},	{RSP_ERROR,   108,108, -1,                  0, 0, {ACT_FAILINIT}},	{EV_TIMEOUT,  108,108, -1,                105, 2, {ACT_SETDLE0,							   ACT_HUPMODEM,							   ACT_TIMEOUT}},                /* still timeout => connection in unimodem mode? */	{EV_TIMEOUT,  105,105, -1,                103, 5, {0},             "Z\r"},	{RSP_ERROR,   102,102, -1,                107, 5, {0},             "^GETPRE\r"}, /* ERROR on ATZ => maybe in config mode? */	{RSP_OK,      107,107, -1,                  0, 0, {ACT_CONFIGMODE}},	{RSP_ERROR,   107,107, -1,                  0, 0, {ACT_FAILINIT}},	{EV_TIMEOUT,  107,107, -1,                  0, 0, {ACT_FAILINIT}},	{RSP_ERROR,   103,103, -1,                  0, 0, {ACT_FAILINIT}},	{EV_TIMEOUT,  103,103, -1,                  0, 0, {ACT_FAILINIT}},	{RSP_STRING,  120,120, -1,                121,-1, {ACT_SETVER}},	{EV_TIMEOUT,  120,121, -1,                  0, 0, {ACT_FAILVER, ACT_INIT}},	{RSP_ERROR,   120,121, -1,                  0, 0, {ACT_FAILVER, ACT_INIT}},	{RSP_OK,      121,121, -1,                  0, 0, {ACT_GOTVER,  ACT_INIT}},#if 0	{EV_TIMEOUT,  120,121, -1,                130, 5, {ACT_FAILVER},   "^SGCI=1\r"},	{RSP_ERROR,   120,121, -1,                130, 5, {ACT_FAILVER},   "^SGCI=1\r"},	{RSP_OK,      121,121, -1,                130, 5, {ACT_GOTVER},    "^SGCI=1\r"},	{RSP_OK,      130,130, -1,                  0, 0, {ACT_INIT}},	{RSP_ERROR,   130,130, -1,                  0, 0, {ACT_FAILINIT}},	{EV_TIMEOUT,  130,130, -1,                  0, 0, {ACT_FAILINIT}},#endif	/* leave dle mode */	{RSP_INIT,      0,  0,SEQ_DLE0,           201, 5, {0},             "^SDLE=0\r"},	{RSP_OK,      201,201, -1,                202,-1},	//{RSP_ZDLE,    202,202,  0,                202, 0, {ACT_ERROR}},//DELETE	{RSP_ZDLE,    202,202,  0,                  0, 0, {ACT_DLE0}},	{RSP_NODEV,   200,249, -1,                  0, 0, {ACT_FAKEDLE0}},	{RSP_ERROR,   200,249, -1,                  0, 0, {ACT_FAILDLE0}},	{EV_TIMEOUT,  200,249, -1,                  0, 0, {ACT_FAILDLE0}},	/* enter dle mode */	{RSP_INIT,      0,  0,SEQ_DLE1,           251, 5, {0},             "^SDLE=1\r"},	{RSP_OK,      251,251, -1,                252,-1},	{RSP_ZDLE,    252,252,  1,                  0, 0, {ACT_DLE1}},	{RSP_ERROR,   250,299, -1,                  0, 0, {ACT_FAILDLE1}},	{EV_TIMEOUT,  250,299, -1,                  0, 0, {ACT_FAILDLE1}},	/* incoming call */	{RSP_RING,     -1, -1, -1,                 -1,-1, {ACT_RING}},	/* get cid */	//{RSP_INIT,      0,  0,300,                901, 0, {ACT_TEST}},	//{RSP_ERROR,   901,901, -1,                  0, 0, {ACT_FAILCID}},	//{RSP_OK,      901,901, -1,                301, 5, {0},             "^SGCI?\r"},	{RSP_INIT,      0,  0,SEQ_CID,            301, 5, {0},             "^SGCI?\r"},	{RSP_OK,      301,301, -1,                302,-1},	{RSP_ZGCI,    302,302, -1,                  0, 0, {ACT_CID}},	{RSP_ERROR,   301,349, -1,                  0, 0, {ACT_FAILCID}},	{EV_TIMEOUT,  301,349, -1,                  0, 0, {ACT_FAILCID}},	/* enter cid mode */	{RSP_INIT,      0,  0,SEQ_CIDMODE,        150, 5, {0},             "^SGCI=1\r"},	{RSP_OK,      150,150, -1,                  0, 0, {ACT_CMODESET}},	{RSP_ERROR,   150,150, -1,                  0, 0, {ACT_FAILCMODE}},	{EV_TIMEOUT,  150,150, -1,                  0, 0, {ACT_FAILCMODE}},	/* leave cid mode */	//{RSP_INIT,      0,  0,SEQ_UMMODE,         160, 5, {0},             "^SGCI=0\r"},	{RSP_INIT,      0,  0,SEQ_UMMODE,         160, 5, {0},             "Z\r"},	{RSP_OK,      160,160, -1,                  0, 0, {ACT_UMODESET}},	{RSP_ERROR,   160,160, -1,                  0, 0, {ACT_FAILUMODE}},	{EV_TIMEOUT,  160,160, -1,                  0, 0, {ACT_FAILUMODE}},	/* abort getting cid */	{RSP_INIT,      0,  0,SEQ_NOCID,            0, 0, {ACT_ABORTCID}},	/* reset */#if 0	{RSP_INIT,      0,  0,SEQ_SHUTDOWN,       503, 5, {0},             "^SGCI=0\r"},	{RSP_OK,      503,503, -1,                504, 5, {0},             "Z\r"},#endif	{RSP_INIT,      0,  0,SEQ_SHUTDOWN,       504, 5, {0},             "Z\r"},	{RSP_OK,      504,504, -1,                  0, 0, {ACT_SDOWN}},	{RSP_ERROR,   501,599, -1,                  0, 0, {ACT_FAILSDOWN}},	{EV_TIMEOUT,  501,599, -1,                  0, 0, {ACT_FAILSDOWN}},	{RSP_NODEV,   501,599, -1,                  0, 0, {ACT_FAKESDOWN}},	{EV_PROC_CIDMODE,-1, -1, -1,               -1,-1, {ACT_PROC_CIDMODE}}, //FIXME	{EV_IF_LOCK,   -1, -1, -1,                 -1,-1, {ACT_IF_LOCK}}, //FIXME	{EV_IF_VER,    -1, -1, -1,                 -1,-1, {ACT_IF_VER}}, //FIXME	{EV_START,     -1, -1, -1,                 -1,-1, {ACT_START}}, //FIXME	{EV_STOP,      -1, -1, -1,                 -1,-1, {ACT_STOP}}, //FIXME	{EV_SHUTDOWN,  -1, -1, -1,                 -1,-1, {ACT_SHUTDOWN}}, //FIXME	/* misc. */	{RSP_EMPTY,    -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME	{RSP_ZCFGT,    -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME	{RSP_ZCFG,     -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME	{RSP_ZLOG,     -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME	{RSP_ZMWI,     -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME	{RSP_ZABINFO,  -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME	{RSP_ZSMLSTCHG,-1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME	{RSP_ZCAU,     -1, -1, -1,                 -1,-1, {ACT_ZCAU}},	{RSP_NONE,     -1, -1, -1,                 -1,-1, {ACT_DEBUG}},	{RSP_ANY,      -1, -1, -1,                 -1,-1, {ACT_WARN}},	{RSP_LAST}};// 600: start dialing, 650: dial in progress, 800: connection is up, 700: ring, 400: hup, 750: accepted icallstruct reply_t gigaset_tab_cid_m10x[] = /* for M10x */{	/* resp_code, min_ConState, max_ConState, parameter, new_ConState, timeout, action, command */	/* dial */	{EV_DIAL,      -1, -1, -1,                 -1,-1, {ACT_DIAL}}, //FIXME	{RSP_INIT,      0,  0,SEQ_DIAL,           601, 5, {ACT_CMD+AT_BC}},	{RSP_OK,      601,601, -1,                602, 5, {ACT_CMD+AT_HLC}},	{RSP_NULL,    602,602, -1,                603, 5, {ACT_CMD+AT_PROTO}},	{RSP_OK,      602,602, -1,                603, 5, {ACT_CMD+AT_PROTO}},	{RSP_OK,      603,603, -1,                604, 5, {ACT_CMD+AT_TYPE}},	{RSP_OK,      604,604, -1,                605, 5, {ACT_CMD+AT_MSN}},	{RSP_OK,      605,605, -1,                606, 5, {ACT_CMD+AT_ISO}},	{RSP_NULL,    605,605, -1,                606, 5, {ACT_CMD+AT_ISO}},	{RSP_OK,      606,606, -1,                607, 5, {0},             "+VLS=17\r"}, /* set "Endgeraetemodus" */	{RSP_OK,      607,607, -1,                608,-1},	//{RSP_ZSAU,    608,608,ZSAU_PROCEEDING,    608, 0, {ACT_ERROR}},//DELETE	{RSP_ZSAU,    608,608,ZSAU_PROCEEDING,    609, 5, {ACT_CMD+AT_DIAL}},	{RSP_OK,      609,609, -1,                650, 0, {ACT_DIALING}},	{RSP_ZVLS,    608,608, 17,                 -1,-1, {ACT_DEBUG}},	{RSP_ZCTP,    609,609, -1,                 -1,-1, {ACT_DEBUG}},	{RSP_ZCPN,    609,609, -1,                 -1,-1, {ACT_DEBUG}},	{RSP_ERROR,   601,609, -1,                  0, 0, {ACT_ABORTDIAL}},	{EV_TIMEOUT,  601,609, -1,                  0, 0, {ACT_ABORTDIAL}},	/* dialing */	{RSP_ZCTP,    650,650, -1,                 -1,-1, {ACT_DEBUG}},	{RSP_ZCPN,    650,650, -1,                 -1,-1, {ACT_DEBUG}},	{RSP_ZSAU,    650,650,ZSAU_CALL_DELIVERED, -1,-1, {ACT_DEBUG}}, /* some devices don't send this */	/* connection established  */	{RSP_ZSAU,    650,650,ZSAU_ACTIVE,        800,-1, {ACT_CONNECT}}, //FIXME -> DLE1	{RSP_ZSAU,    750,750,ZSAU_ACTIVE,        800,-1, {ACT_CONNECT}}, //FIXME -> DLE1	{EV_BC_OPEN,  800,800, -1,                800,-1, {ACT_NOTIFY_BC_UP}}, //FIXME new constate + timeout	/* remote hangup */	{RSP_ZSAU,    650,650,ZSAU_DISCONNECT_IND,  0, 0, {ACT_REMOTEREJECT}},	{RSP_ZSAU,    750,750,ZSAU_DISCONNECT_IND,  0, 0, {ACT_REMOTEHUP}},	{RSP_ZSAU,    800,800,ZSAU_DISCONNECT_IND,  0, 0, {ACT_REMOTEHUP}},	/* hangup */	{EV_HUP,       -1, -1, -1,                 -1,-1, {ACT_HUP}}, //FIXME	{RSP_INIT,     -1, -1,SEQ_HUP,            401, 5, {0},             "+VLS=0\r"}, /* hang up */ //-1,-1?	{RSP_OK,      401,401, -1,                402, 5},	{RSP_ZVLS,    402,402,  0,                403, 5},	{RSP_ZSAU,    403,403,ZSAU_DISCONNECT_REQ, -1,-1, {ACT_DEBUG}}, /* if not remote hup */	//{RSP_ZSAU,    403,403,ZSAU_NULL,          401, 0, {ACT_ERROR}}, //DELETE//FIXME -> DLE0 // should we do this _before_ hanging up for base driver?	{RSP_ZSAU,    403,403,ZSAU_NULL,            0, 0, {ACT_DISCONNECT}}, //FIXME -> DLE0 // should we do this _before_ hanging up for base driver?	{RSP_NODEV,   401,403, -1,                  0, 0, {ACT_FAKEHUP}}, //FIXME -> DLE0 // should we do this _before_ hanging up for base driver?	{RSP_ERROR,   401,401, -1,                  0, 0, {ACT_ABORTHUP}},	{EV_TIMEOUT,  401,403, -1,                  0, 0, {ACT_ABORTHUP}},	{EV_BC_CLOSED,  0,  0, -1,                  0,-1, {ACT_NOTIFY_BC_DOWN}}, //FIXME new constate + timeout	/* ring */	{RSP_ZBC,     700,700, -1,                 -1,-1, {0}},	{RSP_ZHLC,    700,700, -1,                 -1,-1, {0}},	{RSP_NMBR,    700,700, -1,                 -1,-1, {0}},	{RSP_ZCPN,    700,700, -1,                 -1,-1, {0}},	{RSP_ZCTP,    700,700, -1,                 -1,-1, {0}},	{EV_TIMEOUT,  700,700, -1,               720,720, {ACT_ICALL}},	{EV_BC_CLOSED,720,720, -1,                  0,-1, {ACT_NOTIFY_BC_DOWN}},	/*accept icall*/	{EV_ACCEPT,    -1, -1, -1,                 -1,-1, {ACT_ACCEPT}}, //FIXME	{RSP_INIT,    720,720,SEQ_ACCEPT,         721, 5, {ACT_CMD+AT_PROTO}},	{RSP_OK,      721,721, -1,                722, 5, {ACT_CMD+AT_ISO}},	{RSP_OK,      722,722, -1,                723, 5, {0},             "+VLS=17\r"}, /* set "Endgeraetemodus" */	{RSP_OK,      723,723, -1,                724, 5, {0}},	{RSP_ZVLS,    724,724, 17,                750,50, {ACT_ACCEPTED}},	{RSP_ERROR,   721,729, -1,                  0, 0, {ACT_ABORTACCEPT}},	{EV_TIMEOUT,  721,729, -1,                  0, 0, {ACT_ABORTACCEPT}},	{RSP_ZSAU,    700,729,ZSAU_NULL,            0, 0, {ACT_ABORTACCEPT}},	{RSP_ZSAU,    700,729,ZSAU_ACTIVE,          0, 0, {ACT_ABORTACCEPT}},	{RSP_ZSAU,    700,729,ZSAU_DISCONNECT_IND,  0, 0, {ACT_ABORTACCEPT}},	{EV_TIMEOUT,  750,750, -1,                  0, 0, {ACT_CONNTIMEOUT}},	/* B channel closed (general case) */	{EV_BC_CLOSED, -1, -1, -1,                 -1,-1, {ACT_NOTIFY_BC_DOWN}}, //FIXME	/* misc. */	{EV_PROTO_L2,  -1, -1, -1,                 -1,-1, {ACT_PROTO_L2}}, //FIXME	{RSP_ZCON,     -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME	{RSP_ZCCR,     -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME	{RSP_ZAOC,     -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME	{RSP_ZCSTR,    -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME	{RSP_ZCAU,     -1, -1, -1,                 -1,-1, {ACT_ZCAU}},	{RSP_NONE,     -1, -1, -1,                 -1,-1, {ACT_DEBUG}},	{RSP_ANY,      -1, -1, -1,                 -1,-1, {ACT_WARN}},	{RSP_LAST}};#if 0static struct reply_t tab_nocid[]= /* no dle mode */ //FIXME{	/* resp_code, min_ConState, max_ConState, parameter, new_ConState, timeout, action, command */	{RSP_ANY,      -1, -1, -1,                 -1,-1, ACT_WARN,         NULL},	{RSP_LAST,0,0,0,0,0,0}};static struct reply_t tab_cid[] = /* no dle mode */ //FIXME{	/* resp_code, min_ConState, max_ConState, parameter, new_ConState, timeout, action, command */	{RSP_ANY,      -1, -1, -1,                 -1,-1, ACT_WARN,         NULL},	{RSP_LAST,0,0,0,0,0,0}};#endifstatic struct resp_type_t resp_type[]={	/*{"",		RSP_EMPTY,	RT_NOTHING},*/	{"OK",		RSP_OK,		RT_NOTHING},	{"ERROR",	RSP_ERROR,	RT_NOTHING},	{"ZSAU",	RSP_ZSAU,	RT_ZSAU},	{"ZCAU",	RSP_ZCAU,	RT_ZCAU},	{"RING",	RSP_RING,	RT_RING},	{"ZGCI",	RSP_ZGCI,	RT_NUMBER},	{"ZVLS",	RSP_ZVLS,	RT_NUMBER},	{"ZCTP",	RSP_ZCTP,	RT_NUMBER},	{"ZDLE",	RSP_ZDLE,	RT_NUMBER},	{"ZCFGT",	RSP_ZCFGT,	RT_NUMBER},	{"ZCCR",	RSP_ZCCR,	RT_NUMBER},	{"ZMWI",	RSP_ZMWI,	RT_NUMBER},	{"ZHLC",	RSP_ZHLC,	RT_STRING},	{"ZBC",		RSP_ZBC,	RT_STRING},	{"NMBR",	RSP_NMBR,	RT_STRING},	{"ZCPN",	RSP_ZCPN,	RT_STRING},	{"ZCON",	RSP_ZCON,	RT_STRING},	{"ZAOC",	RSP_ZAOC,	RT_STRING},	{"ZCSTR",	RSP_ZCSTR,	RT_STRING},	{"ZCFG",	RSP_ZCFG,	RT_HEX},	{"ZLOG",	RSP_ZLOG,	RT_NOTHING},	{"ZABINFO",	RSP_ZABINFO,	RT_NOTHING},	{"ZSMLSTCHG",	RSP_ZSMLSTCHG,	RT_NOTHING},	{NULL,0,0}};/* * Get integer from char-pointer */static int isdn_getnum(char *p){	int v = -1;	gig_dbg(DEBUG_TRANSCMD, "string: %s", p);	while (*p >= '0' && *p <= '9')		v = ((v < 0) ? 0 : (v * 10)) + (int) ((*p++) - '0');	if (*p)		v = -1; /* invalid Character */	return v;}/* * Get integer from char-pointer */static int isdn_gethex(char *p){	int v = 0;	int c;	gig_dbg(DEBUG_TRANSCMD, "string: %s", p);	if (!*p)		return -1;	do {		if (v > (INT_MAX - 15) / 16)			return -1;		c = *p;		if (c >= '0' && c <= '9')			c -= '0';		else if (c >= 'a' && c <= 'f')			c -= 'a' - 10;		else if (c >= 'A' && c <= 'F')			c -= 'A' - 10;		else			return -1;		v = v * 16 + c;	} while (*++p);	return v;}/* retrieve CID from parsed response * returns 0 if no CID, -1 if invalid CID, or CID value 1..65535 */static int cid_of_response(char *s){	int cid;	if (s[-1] != ';')		return 0;	/* no CID separator */	cid = isdn_getnum(s);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?