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

手机短信编程

开发平台:

Unix_Linux

  1. /* -------------------------------------------------------------------- */
  2. /* SMS Client, send messages to mobile phones and pagers */
  3. /* */
  4. /* smsd.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 <ctype.h>
  33. #include <sys/types.h>
  34. #include <sys/socket.h>
  35. #include <sys/stat.h>
  36. #include <fcntl.h>
  37. #include <unistd.h>
  38. #include <errno.h>
  39. #if !defined(AIX) && !defined(SOLARIS) && !defined(UNIXWARE)
  40. #include <getopt.h>
  41. #endif
  42. #include "server.h"
  43. #include "logfile.h"
  44. #include "common.h"
  45. /* -------------------------------------------------------------------- */
  46. #if !defined(MSMSDLOGFILE)
  47. #error "MSMSDLOGFILE undefined"
  48. #else
  49. #define LOGFILE         MSMSDLOGFILE
  50. #endif
  51. #if !defined(MSMSDLOGLEVEL)
  52. #error "MSMSDLOGLEVEL undefined" 
  53. #else
  54. #define LOGLEVEL MSMSDLOGLEVEL
  55. #endif
  56. /* -------------------------------------------------------------------- */
  57. #define SMS_PORT 4563 /* Standard port number  */
  58. /* assigned for sms traffic */
  59. #define SMS_SPOOLDIR "/var/spool/sms"
  60. #define SMS_INCOMINGDIR "incoming"
  61. #define SMS_SERVICESDIR "services"
  62. #define SMS_MAXID 32000
  63. /* -------------------------------------------------------------------- */
  64. #define ERROR_STATE -2
  65. #define EXIT_STATE -1
  66. #define NULL_STATE  0
  67. #define UNKNOWN_STATE  1
  68. /* -------------------------------------------------------------------- */
  69. struct sms_control_data_struct
  70. {
  71. char  *user,
  72. *host,
  73. *mail,
  74. *alen,
  75. *destination,
  76. *control_file,
  77. *data_file,
  78. *id;
  79. long len;
  80. };
  81. typedef struct sms_control_data_struct SMS_CONTROL_DATA;
  82. struct sms_data_struct
  83. {
  84. char  *data;
  85. };
  86. typedef struct sms_data_struct SMS_DATA;
  87. /* -------------------------------------------------------------------- */
  88. SMS_DATA sms_data;
  89. /* -------------------------------------------------------------------- */
  90. #define SAFEOUTPUT(X) ((X == NULL)?("<NULL>"):(X))
  91. #define SAFECONTROLOUTPUT(X) ((X == NULL)?(""):(X))
  92. /* -------------------------------------------------------------------- */
  93. void cleanup_files(SMS_CONTROL_DATA *control_data);
  94. void display_current(int fd, SMS_CONTROL_DATA *control_data);
  95. char *get_data(char *buf);
  96. int gen_controlfile(SMS_CONTROL_DATA *control_data);
  97. void gateway(int new_fd);
  98. int copy_data(int dst_fd, int src_fd, long dlen);
  99. void usage(char *file);
  100. /* -------------------------------------------------------------------- */
  101. /* -------------------------------------------------------------------- */
  102. void display_current(int fd, SMS_CONTROL_DATA *control_data)
  103. {
  104. hprintf(fd, "     Current Control Record info:rn");
  105. hprintf(fd, "         Username: %srn", SAFEOUTPUT(control_data->user));
  106. hprintf(fd, "         Hostname: %srn", SAFEOUTPUT(control_data->host));
  107. hprintf(fd, "         Mail on Delivery: %srn", SAFEOUTPUT(control_data->mail));
  108. hprintf(fd, "         Destination: %srn", SAFEOUTPUT(control_data->destination));
  109. hprintf(fd, "         Control File: %srn", SAFEOUTPUT(control_data->control_file));
  110. hprintf(fd, "         Data File: %srn", SAFEOUTPUT(control_data->data_file));
  111. hprintf(fd, "         ID: %srn", SAFEOUTPUT(control_data->id));
  112. hprintf(fd, "         Length: %ldrn", control_data->len);
  113. }
  114. /* -------------------------------------------------------------------- */
  115. /* -------------------------------------------------------------------- */
  116. void write_control_data(SMS_CONTROL_DATA *control_data)
  117. {
  118. FILE *fp;
  119. fp = fopen(control_data->control_file, "w");
  120. if (fp == NULL)
  121. { lprintf(LOG_ERROR, "opening control_file %sn", control_data->control_file);
  122. exit(-1);
  123. }
  124. fprintf(fp, "{n");
  125. fprintf(fp, "tUsername         = "%s";n", SAFECONTROLOUTPUT(control_data->user));
  126. fprintf(fp, "tHostname         = "%s";n", SAFECONTROLOUTPUT(control_data->host));
  127. fprintf(fp, "tMail_on_Delivery = "%s";n", SAFECONTROLOUTPUT(control_data->mail));
  128. fprintf(fp, "tDestination      = "%s";n", SAFECONTROLOUTPUT(control_data->destination));
  129. fprintf(fp, "tControl_File     = "%s";n", SAFECONTROLOUTPUT(control_data->control_file));
  130. fprintf(fp, "tData_File        = "%s";n", SAFECONTROLOUTPUT(control_data->data_file));
  131. fprintf(fp, "tID               = "%s";n", SAFECONTROLOUTPUT(control_data->id));
  132. fprintf(fp, "tLength           = "%ld"n";, control_data->len);
  133. fprintf(fp, "}n");
  134. fclose(fp);
  135. }
  136. /* -------------------------------------------------------------------- */
  137. /* Parse string of form: */
  138. /* */
  139. /* COMMAND<SP>DATA<EOL> */
  140. /*  */
  141. /* Copy data to newly allocated buffer and return */
  142. /* a pointer to it. If no data available return NULL */
  143. /* -------------------------------------------------------------------- */
  144. char *get_data(char *buf)
  145. {
  146. char  *src, 
  147. *dst,
  148. *data;
  149. int i, j,
  150. cmd;
  151. cmd = TRUE;
  152. src = buf;
  153. i   = 0;
  154. j   = 0;
  155. while ((*src != 'n') && (*src != '') && (*src != 'r'))
  156. {
  157. if ((cmd) && (*src == ' '))
  158. { cmd = FALSE;
  159. j = i+1;
  160. i = 0;
  161. else
  162. { i++;
  163. }
  164. src++;
  165. }
  166. #if 0
  167. if ((j == 0) ||
  168.     ((i == 1) && ((*src == 'n') || (*src == 'r') || (isspace(*src)) || (*src == ''))))
  169. { return NULL;
  170. }
  171. #else
  172. if (j == 0)
  173. { return NULL;
  174. }
  175. #endif
  176. data = (char *)malloc(sizeof(char) * i + 1);
  177. if (dst == NULL)
  178. { lprintf(LOG_ERROR, "Allocating memoryn");
  179. exit(-1);
  180. }
  181. dst = data;
  182. src = &buf[j];
  183. while ((*src != 'n') && (*src != '') && (*src != 'r'))
  184. {
  185. *dst++ = *src++;
  186. }
  187. *dst = '';
  188. return data;
  189. }
  190. int is_complete(SMS_CONTROL_DATA *control_data)
  191. {
  192. if ((control_data->user == NULL) ||
  193.     (control_data->host == NULL) ||
  194.     (control_data->mail == NULL) ||
  195.     (control_data->alen == NULL) ||
  196.     (control_data->id   == NULL) ||
  197.     (control_data->destination  == NULL) ||
  198.     (control_data->control_file == NULL) ||
  199.     (control_data->data_file    == NULL))
  200. {
  201. return 0;
  202. }
  203. return 1;
  204. }
  205. /* -------------------------------------------------------------------- */
  206. /* -------------------------------------------------------------------- */
  207. SMS_CONTROL_DATA *init_control_data(void)
  208. {
  209. SMS_CONTROL_DATA
  210. *control_data;
  211. control_data = (SMS_CONTROL_DATA *)malloc(sizeof(SMS_CONTROL_DATA));
  212. if (control_data == NULL)
  213. { lprintf(LOG_ERROR, "Allocating memoryn");
  214. exit(-1);
  215. }
  216. control_data->user = NULL;
  217. control_data->host = NULL;
  218. control_data->mail = NULL;
  219. control_data->alen = NULL;
  220. control_data->id   = NULL;
  221. control_data->destination  = NULL;
  222. control_data->control_file = NULL;
  223. control_data->data_file    = NULL;
  224. control_data->len = 0;
  225. return control_data;
  226. }
  227. /* -------------------------------------------------------------------- */
  228. /* Generate a control file in the incoming directory.  */
  229. /* The control file is empty.  */
  230. /* The control_data structure is updated to include the full path */
  231. /* to the generated control file and it's corresponding data file. */
  232. /* Note that memory is allocated for each of control_file,  */
  233. /* data_file and id. It is the responsibility of the caller to */
  234. /* free this memory. */
  235. /* */
  236. /* Return Value: */
  237. /* */
  238. /* -1 error */
  239. /*   0 Success */
  240. /* -------------------------------------------------------------------- */
  241. int gen_controlfile(SMS_CONTROL_DATA *control_data)
  242. {
  243. int n,
  244. fd;
  245. cleanup_files(control_data);
  246. control_data->id = (char *)malloc(sizeof(char) * 8);
  247. if (control_data->id == NULL)
  248. {
  249. lprintf(LOG_ERROR, "Allocating memoryn");
  250. exit(-1);
  251. }
  252. control_data->control_file = (char *)malloc(sizeof(char) * (sms_strlen(SMS_SPOOLDIR) + 
  253.                                             sms_strlen(SMS_INCOMINGDIR) + 10));
  254. if (control_data->control_file == NULL)
  255. {
  256. lprintf(LOG_ERROR, "Allocating memoryn");
  257. exit(-1);
  258. }
  259. control_data->data_file = (char *)malloc(sizeof(char) * (sms_strlen(SMS_SPOOLDIR) + 
  260.                                          sms_strlen(SMS_INCOMINGDIR) + 10));
  261. if (control_data->data_file == NULL)
  262. {
  263. lprintf(LOG_ERROR, "Allocating memoryn");
  264. exit(-1);
  265. }
  266.    sms_strcpy(control_data->control_file, SMS_SPOOLDIR);
  267.    sms_strcpy(control_data->data_file, SMS_SPOOLDIR);
  268. if (control_data->control_file[sms_strlen(control_data->control_file) -1] != '/')
  269. {
  270. sms_strcat(control_data->data_file, "/");
  271. sms_strcat(control_data->control_file, "/");
  272. }
  273. sms_strcat(control_data->control_file, SMS_INCOMINGDIR);
  274. sms_strcat(control_data->data_file, SMS_INCOMINGDIR);
  275. if (control_data->control_file[sms_strlen(control_data->control_file) -1] != '/')
  276. {
  277. sms_strcat(control_data->data_file, "/");
  278. sms_strcat(control_data->control_file, "/");
  279. }
  280. for (n = getpid(); n < SMS_MAXID; n++)
  281. {
  282. sprintf(control_data->id, "%05d", n);
  283. sprintf(control_data->control_file, "%scf%s", control_data->control_file, control_data->id);
  284. sprintf(control_data->data_file, "%sdf%s", control_data->data_file, control_data->id);
  285. if (access(control_data->control_file, F_OK) == 0)
  286. { continue;
  287. }
  288. else
  289. { fd = open(control_data->control_file, O_CREAT|O_WRONLY|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
  290. if (fd == -1)
  291. { if (errno == EEXIST)
  292. { continue;
  293. }
  294. lprintf(LOG_WARNING, "Cannot create file %sn", control_data->control_file);
  295. free(control_data->control_file);
  296. free(control_data->data_file);
  297. free(control_data->id);
  298. return -1;
  299. }
  300. else
  301. { close(fd);
  302. break;
  303. }
  304. }
  305. }
  306. if (n == SMS_MAXID)
  307. { lprintf(LOG_WARNING, "Cannot create file as MAXID exceededn");
  308. free(control_data->control_file);
  309. free(control_data->data_file);
  310. free(control_data->id);
  311. return -1;
  312. }
  313. return 0;
  314. }
  315. /* -------------------------------------------------------------------- */
  316. /* -------------------------------------------------------------------- */
  317. void cleanup_files(SMS_CONTROL_DATA *control_data)
  318. {
  319. if (control_data->control_file != NULL)
  320. {
  321. unlink(control_data->control_file);
  322. free(control_data->control_file);
  323. control_data->control_file = NULL;
  324. }
  325. if (control_data->data_file != NULL)
  326. {
  327. unlink(control_data->data_file);
  328. free(control_data->data_file);
  329. control_data->data_file = NULL;
  330. }
  331. if (control_data->id != NULL)
  332. {
  333. free(control_data->id);
  334. control_data->id = NULL;
  335. }
  336. }
  337. /* -------------------------------------------------------------------- */
  338. /* -------------------------------------------------------------------- */
  339. void gateway(int new_fd)
  340. {
  341. char buf[MAX_STRING_LEN],
  342. host_name[512],
  343. ip_address[512];
  344. int  state, 
  345. data_fd;
  346. SMS_CONTROL_DATA
  347. *control_data;
  348. control_data = init_control_data();
  349. if (get_client_information(new_fd, host_name, ip_address) == 0)
  350. { lprintf(LOG_STANDARD, "Connection from %s [%s]n", host_name, ip_address);
  351. }
  352. hprintf(new_fd, "400 SMS Gateway Readyrn");
  353. while ((state != EXIT_STATE) &&
  354.        (state != ERROR_STATE) &&
  355.        (hgets(buf, MAX_STRING_LEN, new_fd) != NULL))
  356. {
  357. state = NULL_STATE;
  358. if (strncasecmp(buf, "MAIL", 4) == 0)
  359. {
  360. control_data->mail = get_data(buf);
  361. if (control_data->mail == NULL)
  362. { state = ERROR_STATE;
  363. }
  364. }
  365. else if (strncasecmp(buf, "HOST", 4) == 0)
  366. {
  367. control_data->host = get_data(buf);
  368. if (control_data->host == NULL)
  369. { state = ERROR_STATE;
  370. }
  371. }
  372. else if (strncasecmp(buf, "DEST", 4) == 0)
  373. {
  374. control_data->destination = get_data(buf);
  375. if (control_data->destination == NULL)
  376. { state = ERROR_STATE;
  377. }
  378. }
  379. else if (strncasecmp(buf, "DATA", 4) == 0)
  380. {
  381. control_data->alen = get_data(buf);
  382. if (control_data->alen == NULL)
  383. { state = ERROR_STATE;
  384. }
  385. else
  386. { control_data->len = atoi(control_data->alen);
  387. /* WARNING - use strtol and strict  */
  388. /* checks  */
  389. /* Read 'len' bytes of data from fd */
  390. /* and copy to data_file */
  391. /* Open up the data_file -  */
  392. /* ensure we have a control file and    */
  393. /* all locks are setup */
  394. if (gen_controlfile(control_data) == -1)
  395. { state = ERROR_STATE;
  396. }
  397. else
  398. {
  399. data_fd = open(control_data->data_file, O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
  400. if (data_fd < 0)
  401. { lprintf(LOG_ERROR, "opening data_file %sn", control_data->data_file);
  402. exit(-1);
  403. }
  404. if (copy_data(data_fd, new_fd, control_data->len) != 0)
  405. { lprintf(LOG_ERROR, "copying datan");
  406. exit(-1);
  407. }
  408. close(data_fd);
  409. read(new_fd, &buf[0], 1);
  410. if (buf[0] == 'n')
  411. {
  412. }
  413. else if (buf[0] == 'r')
  414. {
  415. read(new_fd, &buf[0], 1);
  416. if (buf[0] == 'n')
  417. {
  418. }
  419. else
  420. { state = ERROR_STATE;
  421. }
  422. }
  423. else
  424. { state = ERROR_STATE;
  425. }
  426. }
  427. }
  428. }
  429. else if (strncasecmp(buf, "USER", 4) == 0)
  430. {
  431. control_data->user = get_data(buf);
  432. if (control_data->user == NULL)
  433. { state = ERROR_STATE;
  434. }
  435. }
  436. else if (strncasecmp(buf, "SEND", 4) == 0)
  437. {
  438. if (is_complete(control_data))
  439. {
  440. write_control_data(control_data);
  441. }
  442. else
  443. { state = ERROR_STATE;
  444. }
  445. }
  446. else if (strncasecmp(buf, "SENJ", 4) == 0)
  447. {
  448. if (is_complete(control_data))
  449. {
  450. write_control_data(control_data);
  451. }
  452. else
  453. { state = ERROR_STATE;
  454. }
  455. }
  456. else if (strncasecmp(buf, "SENQ", 4) == 0)
  457. {
  458. if (is_complete(control_data))
  459. {
  460. write_control_data(control_data);
  461. }
  462. else
  463. { state = ERROR_STATE;
  464. }
  465. }
  466. else if (strncasecmp(buf, "SENA", 4) == 0)
  467. {
  468. if (is_complete(control_data))
  469. {
  470. write_control_data(control_data);
  471. }
  472. else
  473. { state = ERROR_STATE;
  474. }
  475. }
  476. else if (strncasecmp(buf, "STAJ", 4) == 0)
  477. {
  478. }
  479. else if (strncasecmp(buf, "STAQ", 4) == 0)
  480. {
  481. }
  482. else if (strncasecmp(buf, "STAT", 4) == 0)
  483. {
  484. }
  485. else if (strncasecmp(buf, "INFO", 4) == 0)
  486. {
  487. if (((buf[4] == 'r') && (buf[5] == 'n')) ||
  488.      (buf[4] == 'n'))
  489. {
  490. hprintf(new_fd, "231- SMS Server info:rn");
  491. hprintf(new_fd, "         Version: 0.1rn");
  492. display_current(new_fd, control_data);
  493. hprintf(new_fd, "231 End of Info.rn");
  494. continue;
  495. }
  496. else
  497. {
  498. }
  499. }
  500. else if (strncasecmp(buf, "QUIT", 4) == 0)
  501. {
  502. hprintf(new_fd, "220 Goodbye.rn");
  503. state = EXIT_STATE;
  504. continue;
  505. }
  506. else if (strncasecmp(buf, "HELP", 4) == 0)
  507. {
  508. if (((buf[4] == 'r') && (buf[5] == 'n')) ||
  509.      (buf[4] == 'n'))
  510. {
  511. hprintf(new_fd, "230- The following commands are recognizedrn");
  512. hprintf(new_fd, "     USER    DATA    MAIL    HOST    DESTrn");
  513. hprintf(new_fd, "     SEND    SENJ    SENQ    SENA        rn");
  514. hprintf(new_fd, "     STAT    STAJ    STAQ                rn");
  515. hprintf(new_fd, "     QUIT    INFO    HELP                rn");
  516. hprintf(new_fd, "230 End of Help.rn");
  517. continue;
  518. }
  519. else
  520. {
  521. }
  522. }
  523. else 
  524. { state = UNKNOWN_STATE;
  525. }
  526. if (state == ERROR_STATE)
  527. { hprintf(new_fd, "510 Error Connection Terminated.rn");
  528. }
  529. else if (state == UNKNOWN_STATE)
  530. { hprintf(new_fd, "511 Error Command not understood.rn");
  531. }
  532. else
  533. { hprintf(new_fd, "210 Ok.rn");
  534. }
  535. }
  536. if (state == ERROR_STATE)
  537. { cleanup_files(control_data);
  538. }
  539. free(control_data);
  540. }
  541. /* -------------------------------------------------------------------- */
  542. /* Read 'len' bytes of data from src_fd and copy to 'dst_fd'  */
  543. /* Return Values */
  544. /* */
  545. /*  0 Success */
  546. /*  -1 Failure */
  547. /* -------------------------------------------------------------------- */
  548. int copy_data(int dst_fd, int src_fd, long dlen)
  549. {
  550. int  len, 
  551. sent;
  552. char *ptr;
  553. char *mbuf;
  554. mbuf = (char *)malloc(sizeof(char) * 1024);
  555. if (mbuf == NULL)
  556. { lprintf(LOG_ERROR, "Allocating memoryn");
  557. exit(-1);
  558. }
  559. {
  560. len = read(src_fd, mbuf, ((dlen<1024)?(dlen):(1024)));
  561. if (len < 0)
  562. { if (errno != EINTR)
  563. { lprintf(LOG_ERROR, "readn");
  564. return(-1);
  565. }
  566. }
  567. } while (len < 0);
  568. while(len)
  569. {
  570. dlen -= len;
  571. ptr = mbuf;
  572. sent = 0;
  573. while (len - sent)
  574. {
  575. len -= sent;
  576. ptr += sent;
  577. {
  578. sent = write(dst_fd, ptr, len);
  579. if (sent < 0)
  580. { if (errno != EINTR)
  581. { lprintf(LOG_ERROR, "write");
  582. return(-1);
  583. }
  584. }
  585. } while (len < 0);
  586. if (sent == 0)
  587. { lprintf(LOG_ERROR, "writen");
  588. return(-1);
  589. }
  590. }
  591. if (dlen <= 0)
  592. { break;
  593. }
  594. {
  595. len = read(src_fd, mbuf, ((dlen<1024)?(dlen):(1024)));
  596. if (len < 0)
  597. { if (errno != EINTR)
  598. { lprintf(LOG_ERROR, "read");
  599. return(-1);
  600. }
  601. }
  602. } while (len < 0);
  603. }
  604. free(mbuf);
  605. return 0;
  606. }
  607. /* -------------------------------------------------------------------- */
  608. /* -------------------------------------------------------------------- */
  609. void usage(char *file)
  610. {
  611. lprintf(LOG_STANDARD, "Usage: %s [-l loglevel] [-p port]n", file);
  612. }
  613. /* -------------------------------------------------------------------- */
  614. /* -------------------------------------------------------------------- */
  615. int main(int argc, char *argv[])
  616. {
  617. int  c,
  618. port;
  619. char *ptr;
  620. struct  sockaddr 
  621. sa_client;
  622. /* ---------------------------- */
  623. set_logfile(LOGFILE);
  624. set_loglevel(LOGLEVEL);
  625. set_consolelog(TRUE);
  626. /* ---------------------------- */
  627. port = SMS_PORT;
  628. while ((c = getopt (argc, argv, "p:l:")) != -1)
  629.         {
  630.                 switch (c)
  631.                 {
  632.                         case 'p':  
  633. port = (int)strtol(optarg, &ptr, 10);
  634.                                 break;
  635.                         case 'l':  
  636. set_loglevel((int)strtol(optarg, &ptr, 10));
  637. if (ptr == optarg)
  638. {
  639. lprintf(LOG_ERROR, "Option l requires an argumentn");
  640.                               usage(argv[0]);
  641.                                  exit(-1);
  642. }
  643.                                 
  644.                                 break;
  645.                         case '?':
  646.                                 lprintf(LOG_ERROR, "Unknown option `-%c'n", optopt);
  647.                                 usage(argv[0]);
  648.                                 exit(-1);
  649.                         default:
  650.                                 abort ();
  651.                 }
  652.         }
  653. if ((argc - optind) != 0)
  654. { usage(argv[0]);
  655. exit(-1);
  656. }
  657. /* ---------------------------- */
  658. c = sizeof(sa_client);
  659. if (getpeername(fileno(stdin), &sa_client, &c) < 0)
  660. {
  661. /* getpeername() fails if fd isn't a  */
  662. /* socket. If this is the case we can  */
  663. /* assume that we aren't running */
  664. /* from inetd and should startup and */
  665. /* as and run as a daemon ourselves. */
  666. lprintf(LOG_STANDARD, "Starting SMSD Standalone Server deamon...n");
  667. if (server_main(port, gateway) != 0)
  668. { lprintf(LOG_STANDARD, "Failed to start SMSD Standalone Server deamonn");
  669. exit(-1);
  670. }
  671. }
  672. else
  673. { set_consolelog(FALSE);
  674. lprintf(LOG_STANDARD, "Starting SMSD Server as an INETD servicen");
  675. gateway(fileno(stdin));
  676. }
  677. return 0;
  678. }