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

手机短信编程

开发平台:

Unix_Linux

  1. /* -------------------------------------------------------------------- */
  2. /* SMS Client, send messages to mobile phones and pagers */
  3. /* */
  4. /* sms_client.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: sms_client.c,v 5.1 1998/02/01 07:10:39 root Exp root $
  28.    -------------------------------------------------------------------- */
  29. #include <stdio.h>
  30. #include <errno.h>
  31. #include <signal.h>
  32. #include <unistd.h>
  33. #include <string.h>
  34. #include <ctype.h>
  35. #include <stdlib.h>
  36. #include <time.h>
  37. #if defined(LINUX)
  38. #include <getopt.h>
  39. #endif
  40. #if defined(NEXT)
  41. #include <libc.h>
  42. #endif
  43. #include "sms_error.h"
  44. #include "sms_list.h"
  45. #include "expect.h"
  46. #include "logfile.h"
  47. #include "parserc.h"
  48. #include "driver/driver.h"
  49. #include "common.h"
  50. #include "sms_lock.h"
  51. #include "sms_resource.h"
  52. /* -------------------------------------------------------------------- */
  53. #if !defined(MVERSION)
  54. #error "MVERSION undefined"
  55. #else
  56. #define VERSION MVERSION
  57. #endif
  58. #if !defined(MLOGFILE)
  59. #error "MLOGFILE undefined"
  60. #else
  61. #define LOGFILE         MLOGFILE
  62. #endif
  63. #if !defined(MLOGLEVEL)
  64. #error "MLOGLEVEL undefined" 
  65. #else
  66. #define LOGLEVEL MLOGLEVEL
  67. #endif
  68. #if !defined(MSERVICEDIR)
  69. #error "MSERVICEDIR undefined"
  70. #else
  71. #define SERVICEDIR      MSERVICEDIR
  72. #endif
  73. #define CONFIG_FILE  (MSERVICEDIR "/sms_config")
  74. #define SMSLOCK_FILE (MSERVICEDIR "/smslock")
  75.  
  76. /* -------------------------------------------------------------------- */
  77. static  char 
  78. *SMS_lock_action,
  79. *SMS_lockfile,
  80. *SMS_default_service;
  81. static  long 
  82. SMS_lock_retry_delay;
  83. /* -------------------------------------------------------------------- */
  84. #define MAXMESSAGELEN 150
  85. #define MAXMESSAGES 256
  86. /* -------------------------------------------------------------------- */
  87. static  RESOURCE resource_list[] = 
  88. {
  89. { RESOURCE_STRING,  "SMS_default_service",  0, 1, NULL, 0,       "CELLNET",    0,  &SMS_default_service },
  90. { RESOURCE_STRING,  "SMS_lock_action",          0, 1, NULL, 0,       "BLOCK",      0,  &SMS_lock_action },
  91. { RESOURCE_NUMERIC, "SMS_lock_retry_delay",  0, 0, NULL, 5000000, NULL,         0,  &SMS_lock_retry_delay  },
  92. { RESOURCE_STRING,  "SMS_lockfile",  0, 1, NULL, 0,       SMSLOCK_FILE, 0,  &SMS_lockfile  },
  93. { RESOURCE_NULL,     NULL,  0, 1, NULL, 0,  NULL,              0,  NULL   }
  94. };
  95. /* -------------------------------------------------------------------- */
  96. void get_message(char *message);
  97. void usage(char *file);
  98. int main(int, char *[]);
  99. /* -------------------------------------------------------------------- */
  100. /* -------------------------------------------------------------------- */
  101. void get_message(char *message)
  102. {
  103. int i,
  104. c;
  105. if (isatty(fileno(stdin)))
  106. { printf("Enter your message and end with Control-Dn");
  107. }
  108. for (i=0; i<MAXMESSAGELEN; i++)
  109. {
  110. c = getchar();
  111. if (c == EOF)
  112. { break;
  113. }
  114. message[i] = c;
  115. }
  116. if (i == MAXMESSAGELEN)
  117. {
  118. lprintf(LOG_ERROR, "Message too longn");
  119. exit(EMESSAGETOOLONG);
  120. }
  121. message[i] = '';
  122. }
  123. /* -------------------------------------------------------------------- */
  124. /* -------------------------------------------------------------------- */
  125. void usage(char *file)
  126. {
  127. char  blank[128], 
  128. *src, 
  129. *dst;
  130. lprintf(LOG_STANDARD, "Usage: %s [-v]n", file);
  131. lprintf(LOG_STANDARD, "Usage: %s [-d]n", file);
  132. lprintf(LOG_STANDARD, "       %s [-q][-l loglevel]n", file);
  133. src = file;
  134. dst = blank;
  135. while(*src != '')
  136. {
  137. *dst = ' ';
  138. dst++;
  139. src++;
  140. }
  141. *dst = '';
  142. lprintf(LOG_STANDARD, "       %s [service:]number|name[,name|[service:]number...]n", blank);
  143. lprintf(LOG_STANDARD, "       %s [message] ...n", blank);
  144. }
  145. /* -------------------------------------------------------------------- */
  146. /* -------------------------------------------------------------------- */
  147. static void SMS_release_lock(void)
  148. { resource_unlock(SMS_lockfile);
  149. }
  150. /* -------------------------------------------------------------------- */
  151. /* -------------------------------------------------------------------- */
  152. static void SMS_obtain_lock(char *sms_lockfile)
  153. {
  154. int  no_block,
  155. notify;
  156. resource_check_lockdir(sms_lockfile);
  157. /* Exit with message if lockdir */
  158. /* does not exist or we dont */
  159. /* have write permissions */
  160. if (strcmp(SMS_lock_action, "NO_BLOCK") == 0)
  161. { no_block = TRUE;
  162. }
  163. else if (strcmp(SMS_lock_action, "BLOCK") == 0)
  164. { no_block = FALSE;
  165. }
  166. else
  167. { lprintf(LOG_WARNING, "SMS_lock_action invalid, defaulting to NO_BLOCKn");
  168. no_block = TRUE;
  169. }
  170. notify = TRUE;
  171. while(resource_lock(sms_lockfile))
  172. {
  173. if (no_block)
  174. { lprintf(LOG_ERROR, "Could not obtain lock for sms_clientn"); 
  175. lprintf(LOG_STANDARD, "Another SMS Client is already running.n"); 
  176. exit(-1);
  177. }
  178. if (notify)
  179. { lprintf(LOG_VERBOSE, "Blocking on lockfile '%s'n", sms_lockfile); 
  180. lprintf(LOG_STANDARD, "Another SMS Client is already running.n"); 
  181. lprintf(LOG_STANDARD, "Waiting...n"); 
  182. notify = FALSE;
  183. }
  184. resource_wait(sms_lockfile, SMS_lock_retry_delay);
  185. }
  186. if (!notify)
  187. { lprintf(LOG_STANDARD, "The other SMS Client has finished.n"); 
  188. lprintf(LOG_STANDARD, "Continuing...n"); 
  189. }
  190. atexit(SMS_release_lock); /* Establish EXIT handler */
  191. /* to release the lockfile if */
  192. /* we leave prematurely */
  193. }
  194. /* -------------------------------------------------------------------- */
  195. /* -------------------------------------------------------------------- */
  196. int main(int argc, char *argv[])
  197. {
  198. DEVICE_ENTRY
  199. *device;
  200. char  *mservice,
  201. message[MAXMESSAGES][MAXMESSAGELEN +1],
  202. *ptr,
  203. *protocol;
  204. int i, num_messages;
  205. SMS_parent_list 
  206. *parent_node,
  207. *parent_list;
  208. SMS_list
  209. *list,
  210. *numbers,
  211. *delivered;
  212. FILE *fp[2];
  213. int num_args,
  214. nind,
  215. mind,
  216. c,
  217. delivery_error = 0;
  218. time_t start_time,
  219. end_time,
  220. driver_start_time,
  221. driver_end_time;
  222. /* ---------------------------- */
  223. set_logfile(LOGFILE);
  224. set_loglevel(LOGLEVEL);
  225. set_consolelog(TRUE);
  226. /* ---------------------------- */
  227. while ((c = getopt (argc, argv, "vql:m:d")) != -1)
  228.         {
  229.                 switch (c)
  230.                 {
  231.                         case 'q':
  232. set_consolelog(FALSE);
  233.                                 break;
  234.                         case 'd':
  235. display_drivers();
  236. exit(0);
  237.                         case 'v':
  238. lprintf(LOG_STANDARD, "sms_client %sn", VERSION);
  239.                                 exit(0);
  240.                         case 'l':  
  241. set_loglevel((int)strtol(optarg, &ptr, 10));
  242. if (ptr == optarg)
  243. {
  244. lprintf(LOG_ERROR, "Option l requires an argumentn");
  245.                               usage(argv[0]);
  246.                                  exit(EUSAGE);
  247. }
  248.                                 
  249.                                 break;
  250.                         case '?':
  251. #if !defined(NEXT)
  252.                                 lprintf(LOG_ERROR, "Unknown option `-%c'n", optopt);
  253. #endif
  254.                                 usage(argv[0]);
  255.                                 exit(EUSAGE);
  256.                         default:
  257.                                 abort ();
  258.                 }
  259.         }
  260.                         
  261. /* ---------------------------- */
  262. num_args = argc - optind;
  263. if (num_args < 1)
  264. {
  265. usage(argv[0]);
  266. exit(EUSAGE);
  267. }
  268. nind = optind;
  269. mind = optind +1;
  270. /* ---------------------------- */
  271. if (read_resource_file(CONFIG_FILE, resource_list, TRUE) != RESOURCE_FILE_OK)
  272. { lprintf(LOG_ERROR, "Unrecoverable Failure Parsing file %sn", CONFIG_FILE);
  273. exit(1);
  274. }
  275. /* ---------------------------- */
  276. /* Get and expand NAMES|NUMBERS */
  277. SMS_dual_openrc(fp);
  278. numbers = SMS_expandnumber(fp, "<NULL>", argv[nind], SMS_default_service);
  279. SMS_dual_closerc(fp);
  280. /* ---------------------------- */
  281. /* Check NAMES|NUMBERS */
  282. if (validate_expanded_numbers(numbers))
  283. {
  284. lprintf(LOG_ERROR, "Expanding namesn"); 
  285. exit(ENAMEEXPANSION);
  286. }
  287. /* ---------------------------- */
  288. if (num_args >= 2)
  289. {
  290. for (i=mind; i<argc; i++)
  291. {
  292. if (sms_strlen(argv[i]) > MAXMESSAGELEN)
  293. {
  294. lprintf(LOG_ERROR, "Message %d too longn", (i - mind +1));
  295. exit(EMESSAGETOOLONG);
  296. }
  297. sms_strcpy(message[i - mind], argv[i]);
  298. }
  299. num_messages = argc - mind;
  300. }
  301. else
  302. { get_message(message[0]);
  303. num_messages = 1;
  304. }
  305. /* ------------------------------------------------------------ */
  306. /* If sms_lock_action is set to BLOCK any other instances of  */
  307. /* sms_client which are running will cause this one to block. */
  308. /* When the other instances have finished executing and the  */
  309. /* lockfile has been released this instance can attemp to  */
  310. /* get the lockfile and run */
  311. /* ------------------------------------------------------------ */
  312. SMS_obtain_lock(SMS_lockfile);
  313. /* ------------------------------------------------------------ */
  314. time(&start_time);
  315. parent_list = gather(numbers);
  316. parent_node = get_first_parent(parent_list);
  317. while (parent_node != NULL)
  318. {
  319. list = get_child(parent_node);
  320. mservice = get_service(list);
  321. protocol = get_protocol(mservice);
  322. device = get_device(protocol);
  323. if (device == NULL)
  324. { lprintf(LOG_ERROR, "Driver for service %s NOT foundn", mservice);
  325. }
  326. else
  327. { for (i=0; i<num_messages; i++)
  328. {
  329. time(&driver_start_time);
  330. (*device->init)(mservice, device);
  331. (*device->main)(list, message[i], device->env);
  332. time(&driver_end_time);
  333. lprintf(LOG_STANDARD, "%s Service Time: %d Secondsn", mservice, (int)(driver_end_time - driver_start_time));
  334. delivered = list;
  335. while (delivered != NULL)
  336. {
  337. if (get_delivery(delivered))
  338. {
  339. lprintf(LOG_WARNING, "Could not deliver message %d to %s on %s delivery code %dn", 
  340. i,
  341.          get_name(delivered), 
  342.         get_number(delivered),
  343.         get_delivery(delivered));
  344. delivery_error = EDELIVERY;
  345. }
  346. lprintf(LOG_STANDARD, "[%03d] %s:%s "%s"n", 
  347.        get_delivery(delivered),
  348.        get_service(delivered),
  349.        get_number(delivered),
  350.        message[i]);
  351. delivered = get_next(delivered);
  352. }
  353. }
  354. }
  355. parent_node = get_next_parent(parent_node);
  356. }
  357. time(&end_time);
  358. lprintf(LOG_STANDARD, "Total Elapsed Time: %d Secondsn", (int)(end_time - start_time));
  359. free_list(numbers);
  360. SMS_release_lock();
  361. return delivery_error;
  362. }