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

手机短信编程

开发平台:

Unix_Linux

  1. /* -------------------------------------------------------------------- */
  2. /* SMS Client, send messages to mobile phones and pagers */
  3. /* */
  4. /* snppd.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$
  28.    -------------------------------------------------------------------- */
  29. #include <stdio.h>
  30. #include <stdlib.h>
  31. #include <string.h>
  32. #include <sys/types.h>
  33. #include <sys/socket.h>
  34. #if !defined(SOLARIS) && !defined(AIX) && !defined(UNIXWARE)
  35. #include <getopt.h>
  36. #endif
  37. #include "server.h"
  38. #include "logfile.h"
  39. #include "common.h"
  40. /* -------------------------------------------------------------------- */
  41. #if !defined(MSNPPDLOGFILE)
  42. #error "MSNPPDLOGFILE undefined"
  43. #else
  44. #define LOGFILE         MSNPPDLOGFILE
  45. #endif
  46. #if !defined(MSNPPDLOGLEVEL)
  47. #error "MSNPPDLOGLEVEL undefined" 
  48. #else
  49. #define LOGLEVEL MSNPPDLOGLEVEL
  50. #endif
  51. /* -------------------------------------------------------------------- */
  52. #define SNPP_PORT 444 /* Standard port number  */
  53. /* assigned for snpp traffic */
  54. /* -------------------------------------------------------------------- */
  55. #define ERROR_STATE -2
  56. #define EXIT_STATE -1
  57. #define LOGIN_STATE 0
  58. #define PAGE_STATE  1
  59. #define MESSAGE_STATE 2
  60. #define SEND_STATE 3
  61. #define HELP_STATE 4
  62. /* -------------------------------------------------------------------- */
  63. /* -------------------------------------------------------------------- */
  64. void gateway(int new_fd)
  65. {
  66. char buf[MAX_STRING_LEN],
  67. host_name[512],
  68. ip_address[512];
  69. int  state;
  70. if (get_client_information(new_fd, host_name, ip_address) == 0)
  71. { lprintf(LOG_STANDARD, "Connection from %s [%s]n", host_name, ip_address);
  72. }
  73. hprintf(new_fd, "220 SNPP Gateway Readyn");
  74. state = LOGIN_STATE;
  75. while ((state != EXIT_STATE) &&
  76.        (state != ERROR_STATE) &&
  77.        (hgets(buf, MAX_STRING_LEN, new_fd) != NULL))
  78. {
  79. if (strncasecmp(buf, "PAGE", 4) == 0)
  80. {
  81. if (state == LOGIN_STATE)
  82. {
  83. hprintf(new_fd, "250 Pager ID Acceptedn");
  84. state = PAGE_STATE;
  85. }
  86. else
  87. { state = ERROR_STATE;
  88. }
  89. }
  90. else
  91. if (strncasecmp(buf, "MESS", 4) == 0)
  92. {
  93. if (state == PAGE_STATE)
  94. {
  95. hprintf(new_fd, "250 Message OKn");
  96. state = MESSAGE_STATE;
  97. }
  98. else
  99. { state = ERROR_STATE;
  100. }
  101. }
  102. else
  103. if (strncasecmp(buf, "SEND", 4) == 0)
  104. {
  105. if (state == MESSAGE_STATE)
  106. {
  107. hprintf(new_fd, "250 Message Sent Successfullyn");
  108. state = SEND_STATE;
  109. }
  110. else
  111. { state = ERROR_STATE;
  112. }
  113. }
  114. else
  115. if (strncasecmp(buf, "QUIT", 4) == 0)
  116. {
  117. hprintf(new_fd, "221 OK, Goodbyen");
  118. state = EXIT_STATE;
  119. }
  120. else
  121. if (strncasecmp(buf, "RESE", 4) == 0)
  122. {
  123. hprintf(new_fd, "250 RESET OKn");
  124. state = LOGIN_STATE;
  125. }
  126. else
  127. if (strncasecmp(buf, "HELP", 4) == 0)
  128. {
  129. hprintf(new_fd, "214 PAGE <Pager ID>n");
  130. hprintf(new_fd, "214 MESS <Alpha or Numeric Message>n");
  131. hprintf(new_fd, "214 SENDn");
  132. hprintf(new_fd, "214 QUITn");
  133. hprintf(new_fd, "250 End of Help Informationn");
  134. state = LOGIN_STATE;
  135. }
  136. else
  137. { state = ERROR_STATE;
  138. }
  139. if (state == ERROR_STATE)
  140. { hprintf(new_fd, "421 Error Connection Terminatedn");
  141. }
  142. }
  143. }
  144. /* -------------------------------------------------------------------- */
  145. /* -------------------------------------------------------------------- */
  146. void usage(char *file)
  147. {
  148. lprintf(LOG_STANDARD, "Usage: %s [-l loglevel] [-p port]n", file);
  149. }
  150. /* -------------------------------------------------------------------- */
  151. /* -------------------------------------------------------------------- */
  152. int main(int argc, char *argv[])
  153. {
  154. int  c,
  155. port;
  156. char *ptr;
  157. struct  sockaddr 
  158. sa_client;
  159. /* ---------------------------- */
  160. set_logfile(LOGFILE);
  161. set_loglevel(LOGLEVEL);
  162. set_consolelog(TRUE);
  163. /* ---------------------------- */
  164. port = SNPP_PORT;
  165. while ((c = getopt (argc, argv, "p:l:")) != -1)
  166.         {
  167.                 switch (c)
  168.                 {
  169.                         case 'p':  
  170. port = (int)strtol(optarg, &ptr, 10);
  171.                                 break;
  172.                         case 'l':  
  173. set_loglevel((int)strtol(optarg, &ptr, 10));
  174. if (ptr == optarg)
  175. {
  176. lprintf(LOG_ERROR, "Option l requires an argumentn");
  177.                               usage(argv[0]);
  178.                                  exit(-1);
  179. }
  180.                                 
  181.                                 break;
  182.                         case '?':
  183.                                 lprintf(LOG_ERROR, "Unknown option `-%c'n", optopt);
  184.                                 usage(argv[0]);
  185.                                 exit(-1);
  186.                         default:
  187.                                 abort ();
  188.                 }
  189.         }
  190. if ((argc - optind) != 0)
  191. { usage(argv[0]);
  192. exit(-1);
  193. }
  194. /* ---------------------------- */
  195. c = sizeof(sa_client);
  196. if (getpeername(fileno(stdin), &sa_client, &c) < 0)
  197. {
  198. /* getpeername() fails if fd isn't a  */
  199. /* socket. If this is the case we can  */
  200. /* assume that we aren't running */
  201. /* from inetd and should startup and */
  202. /* as and run as a daemon ourselves. */
  203. lprintf(LOG_STANDARD, "Starting SNPPD Standalone Server deamon...n");
  204. if (server_main(port, gateway) != 0)
  205. { lprintf(LOG_STANDARD, "Failed to start SNPPD Standalone Server deamonn");
  206. exit(-1);
  207. }
  208. }
  209. else
  210. { set_consolelog(FALSE);
  211. lprintf(LOG_STANDARD, "Starting SNPPD Server as an INETD servicen");
  212. gateway(fileno(stdin));
  213. }
  214. return 0;
  215. }