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

手机短信编程

开发平台:

Unix_Linux

  1. /* -------------------------------------------------------------------- */
  2. /* SMS Client, send messages to mobile phones and pagers */
  3. /* */
  4. /* parserc.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: parserc.c,v 5.1 1998/02/01 07:10:39 root Exp root $
  28.    -------------------------------------------------------------------- */
  29. #include <stdio.h>
  30. #include <ctype.h>
  31. #include <string.h>
  32. #include <stdlib.h>
  33. #include <limits.h>
  34. #include <sys/types.h>
  35. #include <pwd.h>
  36. #include <unistd.h>
  37. #include <stddef.h>
  38. #if defined(NEXT)
  39. #include <sys/dir.h>
  40. #include <sys/dirent.h>
  41. #define NAME_MAX 255
  42. #define PATH_MAX 1024
  43. #else
  44. #include <dirent.h>
  45. #endif
  46. #include "sms_error.h"
  47. #include "logfile.h"
  48. #include "parserc.h"
  49. #include "sms_list.h"
  50. #include "sms_resource.h"
  51. #include "driver/driver.h"
  52. #include "token.h"
  53. #include "common.h"
  54. /* -------------------------------------------------------------------- */
  55. /* -------------------------------------------------------------------- */
  56. #define MAXRCLINELEN  80
  57. #define DELIMETER  '='
  58. #if !defined(MLOCALSMSRC)
  59. #error "MLOCALSMSRC undefined"
  60. #else
  61. #define LOCALSMSRC      MLOCALSMSRC
  62. #endif
  63. #if !defined(MGLOBALSMSRC)
  64. #error "MGLOBALSMSRC undefined"
  65. #else
  66. #define GLOBALSMSRC     MGLOBALSMSRC
  67. #endif
  68. #if !defined(MSERVICEDIR)
  69. #error "MSERVICEDIR undefined"
  70. #else
  71. #define SERVICEDIR      MSERVICEDIR
  72. #endif
  73. /* -------------------------------------------------------------------- */
  74. static  RESOURCE
  75. *SMS_services_list = NULL;
  76. SMS_list *search_list;
  77. /* -------------------------------------------------------------------- */
  78. static FILE *SMS_open_global_smsrc(void);
  79. static FILE *SMS_open_local_smsrc(void);
  80. static void SMS_close_smsrc(FILE *fp);
  81. static void read_services(void);
  82. static SMS_list *expandnumber(FILE *fp[2], char *id, char *str, char *default_service);
  83. /* -------------------------------------------------------------------- */
  84. /* -------------------------------------------------------------------- */
  85. static FILE *SMS_open_global_smsrc(void)
  86. {
  87. lprintf(LOG_VERBOSE, "Opening Global Addressbook File: %sn", GLOBALSMSRC);
  88. return fopen(GLOBALSMSRC, "r");
  89. }
  90. /* -------------------------------------------------------------------- */
  91. /* -------------------------------------------------------------------- */
  92. #if defined(SOLARIS)
  93. #define NAME_MAX FILENAME_MAX
  94. #endif
  95. #if defined(AIX)
  96. #define NAME_MAX 512
  97. #endif
  98. static FILE *SMS_open_local_smsrc(void)
  99. {
  100. struct passwd
  101. *pentry;
  102. char  filename[PATH_MAX + NAME_MAX +1];
  103. pentry = getpwuid(getuid());
  104. sms_strcpy(filename, pentry->pw_dir);
  105. sms_strcat(filename, "/");
  106. sms_strcat(filename, LOCALSMSRC);
  107. lprintf(LOG_VERBOSE, "Opening Local Addressbook File: %sn", filename);
  108. return fopen(filename, "r");
  109. }
  110. /* -------------------------------------------------------------------- */
  111. /* -------------------------------------------------------------------- */
  112. static void SMS_close_smsrc(FILE *fp)
  113. {
  114. if (fp != NULL)
  115. { fclose(fp);
  116. }
  117. }
  118. /* -------------------------------------------------------------------- */
  119. /* -------------------------------------------------------------------- */
  120. int is_name(char *name)
  121. {
  122. char  *ptr;
  123. ptr = name;
  124. if (isdigit(*ptr)) /* First character NUMERIC  */
  125. { /* This is NOT a NAME */
  126. return FALSE;
  127. }
  128. while (*ptr != '')
  129. {
  130. if (*ptr == ':') /* Contains ':' this */
  131. { /* this is NOT a NAME */
  132. /* */
  133. /* SERVICE:NUMBER */
  134. return FALSE;
  135. }
  136. ptr++;
  137. }
  138. return TRUE;
  139. }
  140. /* -------------------------------------------------------------------- */
  141. /* -------------------------------------------------------------------- */
  142. char *SMS_get_smsrc_value(FILE *fp, char *name)
  143. {
  144. char  line[MAXRCLINELEN],
  145. SMS_name[MAXRCLINELEN],
  146. token[MAXRCLINELEN],
  147.   *SMS_value,
  148.   *src;
  149. int type,
  150. line_count;
  151. if (fp == NULL)
  152. { return NULL;
  153. }
  154. rewind(fp);
  155. SMS_value = (char *)malloc(sizeof(char) * MAXRCLINELEN);
  156. if (SMS_value == NULL)
  157. {
  158. lprintf(LOG_ERROR, "Allocating memoryn");
  159. exit(EMALLOC);
  160. }
  161. line_count = 0;
  162. while (get_line(line, MAXRCLINELEN, &line_count, fp) != NULL)
  163. {
  164. src = line;
  165. type = get_token(SMS_name, MAXRCLINELEN, src, &src);
  166. if (type != STRING_TOKEN)
  167. {
  168. if (type == COMMENT_TOKEN)
  169. { continue;
  170. }
  171. lprintf(LOG_VERBOSE, "Syntax Error: Name expected at line %dn", line_count);
  172. return NULL;
  173. }
  174. type = get_token(token, MAXRCLINELEN, src, &src);
  175. if (type != ASSIGNMENT_TOKEN)
  176. {
  177. lprintf(LOG_VERBOSE, "Syntax Error: Assignment expected at line %dn", line_count);
  178. return NULL;
  179. }
  180. type = get_token(SMS_value, MAXRCLINELEN, src, &src);
  181. if ((type != STRING_TOKEN) &&
  182.     (type != QUOTED_STRING_TOKEN) &&
  183.     (type != SINGLE_QUOTED_STRING_TOKEN) &&
  184.     (type != NULL_TOKEN))
  185. {
  186. lprintf(LOG_VERBOSE, "Syntax Error: String expected at line %dn", line_count);
  187. return NULL;
  188. }
  189. type = get_token(token, MAXRCLINELEN, src, &src);
  190. if ((type != NULL_TOKEN) &&
  191.     (type != COMMENT_TOKEN))
  192. {
  193. lprintf(LOG_VERBOSE, "Syntax Error: EOL or comment expected at line %dn", line_count);
  194. return NULL;
  195. }
  196. if (strcmp(name, SMS_name) == 0)
  197. {
  198. lprintf(LOG_VERBOSE, "Name Found: %s = %sn", SMS_name, SMS_value);
  199. return SMS_value;
  200. }
  201. lprintf(LOG_VERBOSE, "Name NOT Found: %sn", name);
  202. free(SMS_value);
  203. return NULL;
  204. }
  205. /* -------------------------------------------------------------------- */
  206. /* -------------------------------------------------------------------- */
  207. char *SMS_dual_get_smsrc_value(FILE **fp, char *name)
  208. {
  209. char  *ptr;
  210. ptr = SMS_get_smsrc_value(fp[0], name);
  211. if (ptr != NULL)
  212. { return ptr;
  213. }
  214. ptr = SMS_get_smsrc_value(fp[1], name);
  215. if (ptr != NULL)
  216. { return ptr;
  217. }
  218. return NULL;
  219. }
  220. /* -------------------------------------------------------------------- */
  221. /* -------------------------------------------------------------------- */
  222. int SMS_getnamevalue_numeric(FILE *fp, char *name, long *value)
  223. {
  224. char  *str,
  225. *ptr;
  226. str = SMS_get_smsrc_value(fp, name);
  227. if (str == NULL)
  228. { return -1;
  229. }
  230. *value = strtol(str, &ptr, 10);
  231. if (ptr == str)
  232. { return -1;
  233. }
  234. return 0;
  235. }
  236. /* -------------------------------------------------------------------- */
  237. /* -------------------------------------------------------------------- */
  238. int SMS_open_dual_getnamevalue_numeric(char *name, long *value)
  239. {
  240. FILE  *fp[2];
  241. SMS_dual_openrc(fp);
  242. if (SMS_getnamevalue_numeric(fp[0], name, value) == 0)
  243. {
  244. SMS_dual_closerc(fp);
  245. return 0;
  246. }
  247. if (SMS_getnamevalue_numeric(fp[1], name, value) == 0)
  248. {
  249. SMS_dual_closerc(fp);
  250. return 0;
  251. }
  252. SMS_dual_closerc(fp);
  253. return -1;
  254. }
  255. /* -------------------------------------------------------------------- */
  256. /* -------------------------------------------------------------------- */
  257. void SMS_dual_closerc(FILE **fp)
  258. {
  259. SMS_close_smsrc(fp[0]);
  260. SMS_close_smsrc(fp[1]);
  261. }
  262. /* -------------------------------------------------------------------- */
  263. /* -------------------------------------------------------------------- */
  264. void SMS_dual_openrc(FILE **fp)
  265. {
  266. fp[0] = SMS_open_local_smsrc();
  267. if (fp[0] == NULL)
  268. { lprintf(LOG_VERBOSE, "Failed to open local smsrc filen");
  269. }
  270. fp[1] = SMS_open_global_smsrc();
  271. if (fp[1] == NULL)
  272. { lprintf(LOG_WARNING, "Failed to open global smsrc filen");
  273. }
  274. }
  275. /* -------------------------------------------------------------------- */
  276. /* -------------------------------------------------------------------- */
  277. static char *strdup_service(char *str)
  278. {
  279. char  *ptr,
  280. *dst,
  281. *service;
  282. service = (char *)malloc(sizeof(char) * (sms_strlen(str) +1));
  283. if (service == NULL)
  284. {
  285. lprintf(LOG_ERROR, "Allocating memoryn");
  286. exit(EMALLOC);
  287. }
  288. dst = service;
  289. ptr = str;
  290. while(*ptr != '')
  291. {
  292. if (*ptr == ':')
  293. { *dst = '';
  294. break;
  295. }
  296. else
  297. { *dst = *ptr;
  298. }
  299. dst++;
  300. ptr++;
  301. }
  302. if (*ptr == '')
  303. {
  304. *service = '';
  305. }
  306. return service;
  307. }
  308. /* -------------------------------------------------------------------- */
  309. /* -------------------------------------------------------------------- */
  310. static char *strdup_number(char *str)
  311. {
  312. char  *ptr,
  313. *dst,
  314. *number;
  315. number = (char *)malloc(sizeof(char) * (sms_strlen(str) +1));
  316. if (number == NULL)
  317. {
  318. lprintf(LOG_ERROR, "Allocating memoryn");
  319. exit(EMALLOC);
  320. }
  321. dst = number;
  322. ptr = str;
  323. while(*ptr != '')
  324. {
  325. if (*ptr == ':')
  326. { dst = number;
  327. }
  328. else
  329. { *dst = *ptr;
  330. dst++;
  331. }
  332. ptr++;
  333. }
  334. *dst = '';
  335. return number;
  336. }
  337. /* -------------------------------------------------------------------- */
  338. /* -------------------------------------------------------------------- */
  339. SMS_list *add_number(SMS_list *list, char *id, char *number, char *default_service)
  340. {
  341. char  *mnumber,
  342. *mservice;
  343. mnumber  = strdup_number(number);
  344. mservice = strdup_service(number);
  345. if (strcmp(mservice, "") == 0)
  346. {
  347. if (mnumber[0] != '_')
  348. {
  349. list = add_item(list, id, default_service, mnumber);
  350. }
  351. else
  352. {
  353. list = add_item(list, id, default_service, &mnumber[1]);
  354. }
  355. }
  356. else
  357. {
  358. if (mnumber[0] != '_')
  359. {
  360. list = add_item(list, id, mservice, mnumber);
  361. }
  362. else
  363. {
  364. list = add_item(list, id, default_service, &mnumber[1]);
  365. }
  366. }
  367. free(mnumber);
  368. free(mservice);
  369. return list;
  370. }
  371. /* -------------------------------------------------------------------- */
  372. /* -------------------------------------------------------------------- */
  373. static SMS_list *expandnumber(FILE *fp[2], char *id, char *str, char *default_service)
  374. {
  375. char  *src,
  376. *dst,
  377.   *number,
  378. *value;
  379. int  len, num;
  380. SMS_list
  381. *list,
  382. *sub_list;
  383. if (str == NULL)
  384. { return NULL;
  385. }
  386. len = sms_strlen(str);
  387. number = (char *)malloc(sizeof(char) * (len +1));
  388. if (number == NULL)
  389. {
  390. lprintf(LOG_ERROR, "Allocating memoryn");
  391. exit(EMALLOC);
  392. }
  393. list = NULL;
  394. dst = number;
  395. src = str;
  396. num = 1;
  397. while (*src != '')
  398. {
  399. if (*src == ',')
  400. {
  401. *dst = '';
  402. if (is_name(number))
  403. {
  404. /* Expand number */
  405. if (find_number(search_list, number) != NULL)
  406. {
  407. lprintf(LOG_WARNING, "Circular list detectedn");
  408. }
  409. else
  410. { search_list = add_item(search_list, "", "", number);
  411. value = SMS_dual_get_smsrc_value(fp, number);
  412. if (value != NULL)
  413. {
  414. sub_list = expandnumber(fp, number, value, default_service);
  415. list     = insert_list(list, sub_list);
  416. }
  417. else
  418. { list = add_number(list, id, number, default_service);
  419. }
  420. }
  421. }
  422. else
  423. { list = add_number(list, id, number, default_service);
  424. }
  425. dst = number;
  426. num++;
  427. }
  428. else
  429. { *dst = *src;
  430. dst++;
  431. }
  432. src++;
  433. }
  434. *dst = '';
  435. if (is_name(number))
  436. {
  437. /* Expand number */
  438. if (find_number(search_list, number) != NULL)
  439. {
  440. lprintf(LOG_WARNING, "Circular list detectedn");
  441. }
  442. else
  443. { search_list = add_item(search_list, "", "", number);
  444. value = SMS_dual_get_smsrc_value(fp, number);
  445. if (value != NULL)
  446. {
  447. sub_list = expandnumber(fp, number, value, default_service);
  448. list     = insert_list(list, sub_list);
  449. }
  450. else
  451. { list = add_number(list, id, number, default_service);
  452. }
  453. }
  454. }
  455. else
  456. { list = add_number(list, id, number, default_service);
  457. }
  458. free(number);
  459. return list;
  460. }
  461. /* -------------------------------------------------------------------- */
  462. /* -------------------------------------------------------------------- */
  463. SMS_list *SMS_expandnumber(FILE *fp[2], char *id, char *number, char *default_service)
  464. {
  465. SMS_list
  466. *list;
  467. search_list = NULL;
  468. list = expandnumber(fp, id, number, default_service);
  469. free_list(search_list);
  470. return list;
  471. }
  472. /* -------------------------------------------------------------------- */
  473. /* -------------------------------------------------------------------- */
  474. static void read_services(void)
  475. {
  476. char  fname[1024],
  477. dname[1024];
  478. int num,
  479. i;
  480. DIR  *dp;
  481. struct  dirent 
  482. *ep;
  483. sms_strcpy(dname, SERVICEDIR);
  484. sms_strcat(dname, "/services");
  485. dp = opendir (dname);
  486.         if (dp == NULL)
  487. { lprintf(LOG_ERROR, "Opening Services directory %sn", dname); 
  488. exit(-1);
  489. }
  490. num = 0;
  491. while ((ep = readdir(dp)))
  492. {
  493. if (ep->d_name[0] == '.')
  494. { continue;
  495. }
  496. num++;
  497. }
  498. SMS_services_list = (RESOURCE *)malloc(sizeof(RESOURCE) * (num +1));
  499. if (SMS_services_list == NULL)
  500. { lprintf(LOG_ERROR, "Allocating memory for SMS_services_listn");
  501. exit(-1);
  502. }
  503. i = 0;
  504. rewinddir(dp);
  505. while ((ep = readdir(dp)))
  506. {
  507. if (ep->d_name[0] == '.')
  508. { continue;
  509. }
  510. SMS_services_list[i].type = RESOURCE_STRING;
  511. SMS_services_list[i].name = malloc(sms_strlen("SMS_protocol_") + sms_strlen(ep->d_name) +1);
  512. if (SMS_services_list[i].name == NULL)
  513. { lprintf(LOG_ERROR, "Allocating memory for SMS_services_list[%d].namen", i);
  514. exit(-1);
  515. }
  516. sms_strcpy(SMS_services_list[i].name, "SMS_protocol_");
  517. sms_strcat(SMS_services_list[i].name, ep->d_name);
  518. SMS_services_list[i].found = 0;
  519. SMS_services_list[i].default_warning = 1; 
  520. SMS_services_list[i].str_value = NULL; 
  521. SMS_services_list[i].int_value = 0; 
  522. SMS_services_list[i].default_str_value = NULL; 
  523. SMS_services_list[i].default_int_value = 0; 
  524. SMS_services_list[i].var = NULL; 
  525. i++;
  526. }
  527. SMS_services_list[i].type = RESOURCE_NULL;
  528. SMS_services_list[i].name = NULL;
  529. SMS_services_list[i].found = 0;
  530. SMS_services_list[i].default_warning = 1; 
  531. SMS_services_list[i].str_value = NULL; 
  532. SMS_services_list[i].int_value = 0; 
  533. SMS_services_list[i].default_str_value = NULL; 
  534. SMS_services_list[i].default_int_value = 0; 
  535. SMS_services_list[i].var = NULL;
  536. sms_strcpy(fname, SERVICEDIR);
  537. sms_strcat(fname, "/sms_services");
  538. if (read_resource_file(fname, SMS_services_list, FALSE) != RESOURCE_FILE_OK)
  539. { lprintf(LOG_ERROR, "Unrecoverable Failure Parsing service file %sn", fname); 
  540. exit(-1);
  541. }
  542. }
  543. /* -------------------------------------------------------------------- */
  544. /* -------------------------------------------------------------------- */
  545. char *get_protocol(char *service)
  546. {
  547. char name[512];
  548. RESOURCE
  549. *resource;
  550. if (SMS_services_list == NULL)
  551. { read_services();
  552. }
  553. sms_strcpy(name, "SMS_protocol_");
  554. sms_strcat(name, service);
  555. resource = SMS_services_list;
  556. while (resource->type != RESOURCE_NULL)
  557. {
  558. if (strcmp(name, resource->name) == 0)
  559. { lprintf(LOG_VERBOSE, "Found %s = %sn", resource->name, resource->str_value);
  560. return resource->str_value;
  561. }
  562. resource++;
  563. }
  564. return NULL;
  565. }
  566. /* -------------------------------------------------------------------- */
  567. /* -------------------------------------------------------------------- */
  568. int validate_expanded_numbers(SMS_list *numbers)
  569. {
  570. DEVICE_ENTRY
  571. *device;
  572. char *id,
  573. *service,
  574. *protocol;
  575. int count;
  576. SMS_list
  577. *node;
  578. count = 0;
  579. node = get_first(numbers);
  580. while (node != NULL)
  581. {
  582. service  = get_service(node);
  583. protocol = get_protocol(service);
  584. device = get_device(protocol);
  585. if (device == NULL)
  586. { lprintf(LOG_ERROR, "Driver for service %s NOT foundn", service);
  587. count++;
  588. }
  589. else
  590. { id = get_number(node);
  591. if (!((*device->validate_id)(id)))
  592. {
  593. lprintf(LOG_WARNING, "Invalid id: %sn", id);
  594. count++;
  595. }
  596. }
  597. node = get_next(node);
  598. }
  599. return count;
  600. }
  601. /* -------------------------------------------------------------------- */
  602. /* -------------------------------------------------------------------- */
  603. int is_numeric(char *ptr)
  604. {
  605. while (*ptr != '')
  606. {
  607. if (!isdigit(*ptr))
  608. { return FALSE;
  609. }
  610. ptr++;
  611. }
  612. return TRUE;
  613. }