tap.c
上传用户:mei_mei897
上传日期:2007-01-05
资源大小:82k
文件大小:17k
源码类别:

手机短信编程

开发平台:

Unix_Linux

  1. /* -------------------------------------------------------------------- */
  2. /* SMS Client, send messages to mobile phones and pagers */
  3. /* */
  4. /* tap.c */
  5. /* */
  6. /*  Copyright (C) 1997,1998 Angelo Masci */
  7. /* */
  8. /*  This library is free software; you can redistribute it and/or */
  9. /*  modify it under the terms of the GNU Library General Public */
  10. /*  License as published by the Free Software Foundation; either */
  11. /*  version 2 of the License, or (at your option) any later version. */
  12. /* */
  13. /*  This library is distributed in the hope that it will be useful, */
  14. /*  but WITHOUT ANY WARRANTY; without even the implied warranty of */
  15. /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU */
  16. /*  Library General Public License for more details. */
  17. /* */
  18. /*  You should have received a copy of the GNU Library General Public */
  19. /*  License along with this library; if not, write to the Free */
  20. /*  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
  21. /* */
  22. /*  You can contact the author at this e-mail address: */
  23. /* */
  24. /*  angelo@styx.demon.co.uk */
  25. /* */
  26. /* -------------------------------------------------------------------- */
  27. /* $Id: tap.c,v 5.1 1998/02/01 07:10:39 root Exp root $
  28.    -------------------------------------------------------------------- */
  29. #include <stdio.h>
  30. #include <string.h>
  31. #include <stdlib.h>
  32. #include <unistd.h>
  33. #include "common.h"
  34. #include "logfile.h"
  35. #include "driver.h"
  36. #include "expect.h"
  37. #include "sms_error.h"
  38. #include "sms_resource.h"
  39. #include "ascii.h"
  40. /* -------------------------------------------------------------------- */
  41. /* -------------------------------------------------------------------- */
  42. static struct tap_env
  43. {
  44. DRIVER_DEFAULT_ENV def;
  45. /* Place any extended driver */ 
  46. /* variables here  */
  47. long  max_tries,
  48.   login_timeout,
  49. init_login_sleep,
  50. login_sleep;
  51. char *select,
  52. *response,
  53. *disconnect;
  54. } driver_env;
  55. /* -------------------------------------------------------------------- */
  56. static  RESOURCE resource_list[] = 
  57. {
  58. { RESOURCE_STRING,  "SMS_comms_params",  0, 1, NULL, 0,  "8N1",  0,   &(driver_env.def.comms_params)   },
  59. { RESOURCE_STRING,  "SMS_centre_number",  0, 1, NULL, 0,  NULL,   0,   &(driver_env.def.centre_number)   },
  60. { RESOURCE_NUMERIC, "SMS_baud",  0, 1, NULL, 0,  NULL,   9600,   &(driver_env.def.baud)   },
  61. { RESOURCE_NUMERIC, "SMS_deliver_timeout",  0, 0, NULL, 0,  NULL,   30,   &(driver_env.def.deliver_timeout)   },
  62. { RESOURCE_NUMERIC, "SMS_timeout",  0, 0, NULL, 0,  NULL,   10,   &(driver_env.def.timeout)   },
  63. { RESOURCE_NUMERIC, "SMS_login_timeout",  0, 0, NULL, 0,  NULL,   10,   &(driver_env.login_timeout)   },
  64. { RESOURCE_NUMERIC, "SMS_login_sleep",  0, 0, NULL, 0,  NULL,   2000000, &(driver_env.login_sleep)   },
  65. { RESOURCE_NUMERIC, "SMS_init_login_sleep",  0, 0, NULL, 0,  NULL,   1500000, &(driver_env.init_login_sleep)   },
  66. { RESOURCE_NUMERIC, "SMS_write_timeout",  0, 0, NULL, 0,  NULL,   10,   &(driver_env.def.write_timeout)   },
  67. { RESOURCE_NUMERIC, "SMS_max_tries",  0, 0, NULL, 0,  NULL,   5,   &(driver_env.max_tries)   },
  68. { RESOURCE_NUMERIC, "SMS_max_deliver",  0, 0, NULL, 0,  NULL,   0,   &(driver_env.def.max_deliver)          },
  69. { RESOURCE_STRING,  "SMS_tap_select",  0, 0, NULL, 0,  "PG1",  0,   &(driver_env.select)                  },
  70. { RESOURCE_STRING,  "SMS_tap_response",  0, 0, NULL, 0,  "TRUE", 0,   &(driver_env.response)          },
  71. { RESOURCE_STRING,  "SMS_tap_disconnect",  0, 0, NULL, 0,  "TRUE", 0,   &(driver_env.disconnect)          },
  72. { RESOURCE_NULL,     NULL,  0, 1, NULL, 0,  NULL,   0,   NULL   }
  73. };
  74. /* -------------------------------------------------------------------- */
  75. #define DELIVERTIMEOUT  (driver_env.def.deliver_timeout)
  76. #define TIMEOUT  (driver_env.def.timeout)
  77. #define LOGINTIMEOUT  (driver_env.login_timeout)
  78. #define LOGINSLEEP  (driver_env.login_sleep)
  79. #define INITLOGINSLEEP  (driver_env.init_login_sleep)
  80. #define WRITETIMEOUT  (driver_env.def.write_timeout)
  81. #define TAP_SELECT              (driver_env.select)
  82. #define TAP_RESPONSE (strcmp(driver_env.response, "TRUE") == 0)
  83. #define TAP_DISCONNECT (strcmp(driver_env.disconnect, "TRUE") == 0)
  84. /* -------------------------------------------------------------------- */
  85. #define FD (driver_env.def.fd)
  86. /* -------------------------------------------------------------------- */
  87. #define MAX_TRIES (driver_env.max_tries)
  88. #define MAX_TAPMESSAGE 150
  89. #define MAX_ENVELOPE  64
  90. #define MAX_NUMBER 20
  91. #define MAX_MOBILENUM 20
  92. #define MAX_MESSAGE 512
  93. /* -------------------------------------------------------------------- */
  94. /* -------------------------------------------------------------------- */
  95. static char TAP_charset[] =
  96. {
  97. 0x20 /* 0x00    */, 0x20 /* 0x01    */, 0x20 /* 0x02    */,
  98. 0x20 /* 0x03    */, 0x20 /* 0x04    */, 0x20 /* 0x05    */,
  99. 0x20 /* 0x06    */, 0x20 /* 0x07    */, 0x20 /* 0x08    */,
  100. 0x20 /* 0x09    */, 0x0A /* 0x0A LF */, 0x20 /* 0x0B    */,
  101. 0x20 /* 0x0C    */, 0x0A /* 0x0D LF */, 0x20 /* 0x0E    */,
  102. 0x20 /* 0x0F    */, 0x20 /* 0x10    */, 0x20 /* 0x11    */,
  103. 0x20 /* 0x12    */, 0x20 /* 0x13    */, 0x20 /* 0x14    */,
  104. 0x20 /* 0x15    */, 0x20 /* 0x16    */, 0x20 /* 0x17    */,
  105. 0x20 /* 0x18    */, 0x20 /* 0x19    */, 0x20 /* 0x1A    */,
  106. 0x20 /* 0x1B    */, 0x20 /* 0x1C    */, 0x20 /* 0x1D    */,
  107. 0x20 /* 0x1E    */, 0x20 /* 0x1F    */, 0x20 /* 0x20    */,
  108. 0x21 /* 0x21 !  */, 0x22 /* 0x22 "  */, 0x23 /* 0x23 #  */,
  109. 0x24 /* 0x24 $  */, 0x25 /* 0x25 %  */, 0x26 /* 0x26 &  */,
  110. 0x27 /* 0x27 '  */, 0x28 /* 0x28 (  */, 0x29 /* 0x29 )  */,
  111. 0x2A /* 0x2A *  */, 0x2B /* 0x2B +  */, 0x2C /* 0x2C ,  */,
  112. 0x2D /* 0x2D -  */, 0x2E /* 0x2E .  */, 0x2F /* 0x2F /  */,
  113. 0x30 /* 0x30 0  */, 0x31 /* 0x31 1  */, 0x32 /* 0x32 2  */,
  114. 0x33 /* 0x33 3  */, 0x34 /* 0x34 4  */, 0x35 /* 0x35 5  */,
  115. 0x36 /* 0x36 6  */, 0x37 /* 0x37 7  */, 0x38 /* 0x38 8  */,
  116. 0x39 /* 0x39 9  */, 0x3A /* 0x3A :  */, 0x3B /* 0x3B ;  */,
  117. 0x3C /* 0x3C <  */, 0x3D /* 0x3D =  */, 0x3E /* 0x3E >  */,
  118. 0x3F /* 0x3F ?  */, 0x40 /* 0x40 @  */, 0x41 /* 0x41 A  */,
  119. 0x42 /* 0x42 B  */, 0x43 /* 0x43 C  */, 0x44 /* 0x44 D  */,
  120. 0x45 /* 0x45 E  */, 0x46 /* 0x46 F  */, 0x47 /* 0x47 G  */,
  121. 0x48 /* 0x48 H  */, 0x49 /* 0x49 I  */, 0x4A /* 0x4A J  */,
  122. 0x4B /* 0x4B K  */, 0x4C /* 0x4C L  */, 0x4D /* 0x4D M  */,
  123. 0x4E /* 0x4E N  */, 0x4F /* 0x4F O  */, 0x50 /* 0x50 P  */,
  124. 0x51 /* 0x51 Q  */, 0x52 /* 0x52 R  */, 0x53 /* 0x53 S  */,
  125. 0x54 /* 0x54 T  */, 0x55 /* 0x55 U  */, 0x56 /* 0x56 V  */,
  126. 0x57 /* 0x57 W  */, 0x58 /* 0x58 X  */, 0x59 /* 0x59 Y  */,
  127. 0x5A /* 0x5A Z  */, 0x20 /* 0x5B    */, 0x20 /* 0x5C    */,
  128. 0x20 /* 0x5D    */, 0x20 /* 0x5E    */, 0x20 /* 0x5F    */,
  129. 0x20 /* 0x60    */, 0x61 /* 0x61 a  */, 0x62 /* 0x62 b  */,
  130. 0x63 /* 0x63 c  */, 0x64 /* 0x64 d  */, 0x65 /* 0x65 e  */,
  131. 0x66 /* 0x66 f  */, 0x67 /* 0x67 g  */, 0x68 /* 0x68 h  */,
  132. 0x69 /* 0x69 i  */, 0x6A /* 0x6A j  */, 0x6B /* 0x6B k  */,
  133. 0x6C /* 0x6C l  */, 0x6D /* 0x6D m  */, 0x6E /* 0x6E n  */,
  134. 0x6F /* 0x6F o  */, 0x70 /* 0x70 p  */, 0x71 /* 0x71 q  */,
  135. 0x72 /* 0x72 r  */, 0x73 /* 0x73 s  */, 0x74 /* 0x74 t  */,
  136. 0x75 /* 0x75 u  */, 0x76 /* 0x76 v  */, 0x77 /* 0x77 w  */,
  137. 0x78 /* 0x78 x  */, 0x79 /* 0x79 y  */, 0x7A /* 0x7A z  */,
  138. 0x20 /* 0x7B    */, 0x20 /* 0x7C    */, 0x20 /* 0x7D    */,
  139. 0x20 /* 0x7E    */, 0x20 /* 0x7F    */, 0x20 /* 0x80    */,
  140. 0x20 /* 0x81    */, 0x20 /* 0x82    */, 0x20 /* 0x83    */,
  141. 0x20 /* 0x84    */, 0x20 /* 0x85    */, 0x20 /* 0x86    */,
  142. 0x20 /* 0x87    */, 0x20 /* 0x88    */, 0x20 /* 0x89    */,
  143. 0x20 /* 0x8A    */, 0x20 /* 0x8B    */, 0x20 /* 0x8C    */,
  144. 0x20 /* 0x8D    */, 0x20 /* 0x8E    */, 0x20 /* 0x8F    */,
  145. 0x20 /* 0x90    */, 0x20 /* 0x91    */, 0x20 /* 0x92    */,
  146. 0x20 /* 0x93    */, 0x20 /* 0x94    */, 0x20 /* 0x95    */,
  147. 0x20 /* 0x96    */, 0x20 /* 0x97    */, 0x20 /* 0x98    */,
  148. 0x20 /* 0x99    */, 0x20 /* 0x9A    */, 0x20 /* 0x9B    */,
  149. 0x20 /* 0x9C    */, 0x20 /* 0x9D    */, 0x20 /* 0x9E    */,
  150. 0x20 /* 0x9F    */, 0x20 /* 0xA0    */, 0x20 /* 0xA1    */,
  151. 0x20 /* 0xA2    */, 0x20 /* 0xA3    */, 0x20 /* 0xA4    */,
  152. 0x20 /* 0xA5    */, 0x20 /* 0xA6    */, 0x20 /* 0xA7    */,
  153. 0x20 /* 0xA8    */, 0x20 /* 0xA9    */, 0x20 /* 0xAA    */,
  154. 0x20 /* 0xAB    */, 0x20 /* 0xAC    */, 0x20 /* 0xAD    */,
  155. 0x20 /* 0xAE    */, 0x20 /* 0xAF    */, 0x20 /* 0xB0    */,
  156. 0x20 /* 0xB1    */, 0x20 /* 0xB2    */, 0x20 /* 0xB3    */,
  157. 0x20 /* 0xB4    */, 0x20 /* 0xB5    */, 0x20 /* 0xB6    */,
  158. 0x20 /* 0xB7    */, 0x20 /* 0xB8    */, 0x20 /* 0xB9    */,
  159. 0x20 /* 0xBA    */, 0x20 /* 0xBB    */, 0x20 /* 0xBC    */,
  160. 0x20 /* 0xBD    */, 0x20 /* 0xBE    */, 0x20 /* 0xBF    */,
  161. 0x20 /* 0xC0    */, 0x20 /* 0xC1    */, 0x20 /* 0xC2    */,
  162. 0x20 /* 0xC3    */, 0x20 /* 0xC4    */, 0x20 /* 0xC5    */,
  163. 0x20 /* 0xC6    */, 0x20 /* 0xC7    */, 0x20 /* 0xC8    */,
  164. 0x20 /* 0xC9    */, 0x20 /* 0xCA    */, 0x20 /* 0xCB    */,
  165. 0x20 /* 0xCC    */, 0x20 /* 0xCD    */, 0x20 /* 0xCE    */,
  166. 0x20 /* 0xCF    */, 0x20 /* 0xD0    */, 0x20 /* 0xD1    */,
  167. 0x20 /* 0xD2    */, 0x20 /* 0xD3    */, 0x20 /* 0xD4    */,
  168. 0x20 /* 0xD5    */, 0x20 /* 0xD6    */, 0x20 /* 0xD7    */,
  169. 0x20 /* 0xD8    */, 0x20 /* 0xD9    */, 0x20 /* 0xDA    */,
  170. 0x20 /* 0xDB    */, 0x20 /* 0xDC    */, 0x20 /* 0xDD    */,
  171. 0x20 /* 0xDE    */, 0x20 /* 0xDF    */, 0x20 /* 0xE0    */,
  172. 0x20 /* 0xE1    */, 0x20 /* 0xE2    */, 0x20 /* 0xE3    */,
  173. 0x20 /* 0xE4    */, 0x20 /* 0xE5    */, 0x20 /* 0xE6    */,
  174. 0x20 /* 0xE7    */, 0x20 /* 0xE8    */, 0x20 /* 0xE9    */,
  175. 0x20 /* 0xEA    */, 0x20 /* 0xEB    */, 0x20 /* 0xEC    */,
  176. 0x20 /* 0xED    */, 0x20 /* 0xEE    */, 0x20 /* 0xEF    */,
  177. 0x20 /* 0xF0    */, 0x20 /* 0xF1    */, 0x20 /* 0xF2    */,
  178. 0x20 /* 0xF3    */, 0x20 /* 0xF4    */, 0x20 /* 0xF5    */,
  179. 0x20 /* 0xF6    */, 0x20 /* 0xF7    */, 0x20 /* 0xF8    */,
  180. 0x20 /* 0xF9    */, 0x20 /* 0xFA    */, 0x20 /* 0xFB    */,
  181. 0x20 /* 0xFC    */, 0x20 /* 0xFD    */, 0x20 /* 0xFE    */,
  182. 0x20 /* 0xFF    */
  183. };
  184. /* -------------------------------------------------------------------- */
  185. static char ACK1[] = { 'I', 'D', '=', '' };
  186. static char ACK2[] = { S_ACK, S_CR, '' };
  187. static char ACK3[] = { S_ESC, '[',  'p',  S_CR, '' };
  188. static char ACK4[] = { S_CR, '' };
  189. static char ACK5[] = { S_ACK, S_CR, '' };
  190. static char ACK6[] = { S_NAK, S_CR, '' };
  191. static char ACK7[] = { S_RS, S_CR, '' };
  192. static char ACK8[] = { S_ESC, S_EOT, S_CR, '' };
  193. static char REQ1[]  = { S_CR, '' };
  194. static char REQ2a[] = { S_ESC, '' };
  195. static char REQ2b[] = { S_CR, '' };
  196. static char REQ3[]  = { S_STX, '' };
  197. static char REQ4[]  = { S_CR, '' };
  198. static char REQ5[]  = { S_CR, S_ETX, '' };
  199. static char REQ6[]  = { S_CR, '' };
  200. static char REQ7[]  = { S_EOT, S_CR, '' };
  201. /* -------------------------------------------------------------------- */
  202. static char buf[MAX_RESPONSE_BUFSIZE];
  203. /* -------------------------------------------------------------------- */
  204. static void TAP_checksum(char *);
  205. static void TAP_hangup(void);
  206. static void TAP_buildmessage(char *, char *, char *);
  207. static int TAP_send_disconnect(void);
  208. static int TAP_login(void);
  209. static int TAP_sendmessage(char *, char *);
  210. /* -------------------------------------------------------------------- */
  211. /* -------------------------------------------------------------------- */
  212. static void TAP_checksum(char *message)
  213. {
  214. int  i,
  215. checksum;
  216. checksum  = 0;
  217. for (i=0; i<sms_strlen(message); i++)
  218. { checksum += message[i];
  219. }
  220. checksum = (checksum & 0x0FFF); /* Mask low 12Bits */
  221. message[i]   = (((checksum & 0x0F00) >> 8) | 0x30);
  222. message[i+1] = (((checksum & 0x00F0) >> 4) | 0x30);
  223. message[i+2] = (((checksum & 0x000F)     ) | 0x30);
  224. message[i+3] = '';
  225. }
  226. /* -------------------------------------------------------------------- */
  227. /* -------------------------------------------------------------------- */
  228. static void TAP_hangup(void)
  229. { default_hangup((DRIVER_DEFAULT_ENV *)(&driver_env));
  230. }
  231. /* -------------------------------------------------------------------- */
  232. /* -------------------------------------------------------------------- */
  233. static int TAP_send_disconnect(void)
  234. {
  235. lprintf(LOG_STANDARD, "Disconnect...n");
  236. if (TAP_DISCONNECT)
  237. {
  238. twrite(FD, REQ7, sms_strlen(REQ7), WRITETIMEOUT);
  239. if (expstr(FD, buf, ACK8, MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0)
  240. {
  241. lprintf(LOG_STANDARD, "Disconnected from SMSCn");
  242. }
  243. else
  244. { lprintf(LOG_STANDARD, "Failed to disconnect from SMSCn");
  245. TAP_hangup();
  246. return ETAP_NODISCONNECT;
  247. }
  248. }
  249. return 0;
  250. }
  251. /* -------------------------------------------------------------------- */
  252. /* -------------------------------------------------------------------- */
  253. static int TAP_login(void)
  254. {
  255. int  i;
  256. lprintf(LOG_STANDARD, "Login...n");
  257. /* Resend the S_CR every 2 seconds */
  258. /* until ID= received, only try */
  259. /* 5 times then give up. */
  260. sms_usleep(INITLOGINSLEEP);
  261. for (i=0; i < MAX_TRIES; i++)
  262. {
  263. twrite(FD, REQ1, sms_strlen(REQ1), WRITETIMEOUT);
  264. if (expstr(FD, buf, ACK1, MAX_RESPONSE_BUFSIZE, LOGINTIMEOUT) == 0)
  265. {
  266. lprintf(LOG_STANDARD, "SMSC Acknowledgment receivedn");
  267. break;
  268. }
  269. lprintf(LOG_STANDARD, "SMSC Retry for Acknowledgmentn");
  270. sms_usleep(LOGINSLEEP);
  271. }
  272. if (i == MAX_TRIES)
  273. {
  274. lprintf(LOG_STANDARD, "Failed Acknowledgment %ld retries attemptedn", MAX_TRIES);
  275. TAP_hangup();
  276. return ETAP_NOACK;
  277. }
  278. /* Send S_ESC <TAP_SELECT> S_CR and get back */
  279. /* the acknowledgement S_ACK S_CR */
  280. twrite(FD, REQ2a,      sms_strlen(REQ2a),      WRITETIMEOUT);
  281. twrite(FD, TAP_SELECT, sms_strlen(TAP_SELECT), WRITETIMEOUT);
  282. twrite(FD, REQ2b,      sms_strlen(REQ2b),      WRITETIMEOUT);
  283. if (expstr(FD, buf, ACK2, MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0)
  284. {
  285. lprintf(LOG_STANDARD, "Login successfuln");
  286. }
  287. else
  288. { lprintf(LOG_STANDARD, "Login failedn");
  289. TAP_hangup();
  290. return ETAP_NOLOGIN;
  291. }
  292. if (expstr(FD, buf, ACK3, MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0)
  293. {
  294. lprintf(LOG_STANDARD, "Ready to receive messagen");
  295. }
  296. else
  297. { lprintf(LOG_STANDARD, "SMSC NOT Ready to receive messagen");
  298. TAP_hangup();
  299. return ETAP_NOREADY;
  300. }
  301. return 0;
  302. }
  303. /* -------------------------------------------------------------------- */
  304. /* -------------------------------------------------------------------- */
  305. static void TAP_buildmessage(char *tap_message, char *msisdn, char *message)
  306. {
  307. int  i;
  308. char *ptr;
  309. /* ---------------------------- */
  310. tap_message[0] = '';
  311. sms_strcat(tap_message, REQ3);
  312. sms_strcat(tap_message, msisdn);
  313. sms_strcat(tap_message, REQ4);
  314. /* Convert message so that it contains */
  315. /* only TAP valid characters */
  316. /* any invalid characters will be */
  317. /* mapped to a SPACE */
  318. /* Add to tap_message */
  319. ptr = tap_message;
  320. while(*ptr != '')
  321. { ptr++;
  322. }
  323. for (i=0; i<sms_strlen(message) +1; i++)
  324. { *ptr = TAP_charset[(int)message[i]];
  325. ptr++;
  326. }
  327. *ptr = '';
  328. sms_strcat(tap_message, REQ5);
  329. /* Generate TAP checksum. Consisting */
  330. /* of 3 characters. Append this to end */
  331. /* of tap_message. */
  332. TAP_checksum(tap_message);
  333. sms_strcat(tap_message, REQ6);
  334. }
  335. /* -------------------------------------------------------------------- */
  336. /* -------------------------------------------------------------------- */
  337. static int TAP_sendmessage(char *msisdn, char *message)
  338. {
  339. char  tap_message[MAX_MESSAGE + MAX_ENVELOPE];
  340. TAP_buildmessage(tap_message, msisdn, message);
  341. twrite(FD, tap_message, sms_strlen(tap_message), WRITETIMEOUT);
  342. if (TAP_RESPONSE)
  343. {
  344. if (expstr(FD, buf, ACK4, MAX_RESPONSE_BUFSIZE, DELIVERTIMEOUT) == 0)
  345. {
  346. lprintf(LOG_STANDARD, "Received Message Response: %sn", buf);
  347. }
  348. else
  349. { lprintf(LOG_STANDARD, "No Message Responsen");
  350. TAP_hangup();
  351. return ETAP_NOMESSAGE;
  352. }
  353. }
  354. if (expstr(FD, buf, ACK5, MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0)
  355. {
  356. lprintf(LOG_STANDARD, "Successful message submissionn");
  357. }
  358. else
  359. {  if (strncmp(&buf[sms_strlen(buf) - sms_strlen(ACK6)], ACK6, sms_strlen(ACK6)) == 0)
  360. {
  361. lprintf(LOG_STANDARD, "Message submission failed - Transmission incomprehensiblen");
  362. }
  363. else if (strncmp(&buf[sms_strlen(buf) - sms_strlen(ACK7)], ACK7, sms_strlen(ACK7)) == 0)
  364. {
  365. lprintf(LOG_STANDARD, "Message submission failed - Problem with messagen");
  366. }
  367. else
  368. { lprintf(LOG_STANDARD, "Message submission failed - Reason Unknownn");
  369. }
  370. TAP_hangup();
  371. return ETAP_NODELIVERY;
  372. }
  373. return 0;
  374. }
  375. /* -------------------------------------------------------------------- */
  376. /* -------------------------------------------------------------------- */
  377. DEVICE_ENTRY tap_device = {
  378. "TAP",
  379. resource_list,
  380. (DRIVER_DEFAULT_ENV *)(&driver_env),
  381. default_init,
  382. default_main,
  383. default_validate_numeric_id,
  384. default_dial,
  385. default_hangup,
  386. TAP_send_disconnect,
  387. default_multiple_counted_deliver,
  388. TAP_sendmessage,
  389. TAP_login
  390. };