faxmsg.c
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:4k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: faxmsg.c,v 1.3 2006/06/22 15:06:36 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1990-1996 Sam Leffler
  4.  * Copyright (c) 1991-1996 Silicon Graphics, Inc.
  5.  *
  6.  * Permission to use, copy, modify, distribute, and sell this software and 
  7.  * its documentation for any purpose is hereby granted without fee, provided
  8.  * that (i) the above copyright notices and this permission notice appear in
  9.  * all copies of the software and related documentation, and (ii) the names of
  10.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  11.  * publicity relating to the software without the specific, prior written
  12.  * permission of Sam Leffler and Silicon Graphics.
  13.  * 
  14.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  15.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  16.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  17.  * 
  18.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  19.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  20.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  21.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  22.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  23.  * OF THIS SOFTWARE.
  24.  */
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <syslog.h>
  28. #include <stdarg.h>
  29. #include <errno.h>
  30. #include <fcntl.h>
  31. #include <stdlib.h>
  32. #include <unistd.h>
  33. #include "config.h"
  34. #include "port.h"
  35. static void
  36. fatal(char* fmt, ...)
  37. {
  38.     va_list ap;
  39.     va_start(ap, fmt);
  40.     if (isatty(fileno(stderr))) {
  41.         vfprintf(stderr, fmt, ap);
  42.         putc('n', stderr);
  43.     } else {
  44.         vsyslog(LOG_ERR, fmt, ap);
  45.     }
  46.     va_end(ap);
  47.     exit(-1);
  48. }
  49. extern int cvtFacility(const char*, int*);
  50. int
  51. main(int argc, char** argv)
  52. {
  53.     extern int optind;
  54.     extern char* optarg;
  55.     int fifo, c;
  56.     char* spooldir = FAX_SPOOLDIR;
  57.     const char* arg = NULL;
  58.     char fifoname[256];
  59.     int cmdlen, fnlen;
  60.     char cmd[80];
  61.     char* appname;
  62.     const char* opts = NULL;
  63.     const char* usage = NULL;
  64.     const char* cmdfmt = NULL;
  65.     char* cp;
  66.     int facility = LOG_DAEMON;
  67.     int modemRequired = 0;
  68.     (void) cvtFacility(LOG_FAX, &facility);
  69.     openlog(argv[0], LOG_PID|LOG_ODELAY, facility);
  70.     appname = strrchr(argv[0], '/');
  71.     if (appname)
  72. appname++;
  73.     else
  74. appname = argv[0];
  75.     if (strcmp(appname, "faxanswer") == 0) {
  76. opts = "h:q:";
  77. usage = "[-h how] [-q queue-dir] modem";
  78. cmdfmt = "A%s";
  79. arg = ""; /* default how */
  80. modemRequired = 1;
  81.     } else if (strcmp(appname, "faxquit") == 0) {
  82. opts = "q:";
  83. usage = "[-q queue-dir] [modem]";
  84. cmdfmt = "Q";
  85. modemRequired = 0;
  86.     } else if (strcmp(appname, "faxabort") == 0) {
  87. opts = "q:";
  88. usage = "[-q queue-dir] modem";
  89. cmdfmt = "Z";
  90. modemRequired = 1;
  91.     } else if (strcmp(appname, "faxlock") == 0) {
  92. opts = "q:";
  93. usage = "[-q queue-dir] modem";
  94. cmdfmt = "L";
  95. modemRequired = 1;
  96.     } else {
  97. fatal("Unrecognized command name %s", appname);
  98.     }
  99.     while ((c = getopt(argc, argv, opts)) != -1)
  100. switch (c) {
  101. case 'h':
  102.     arg = optarg;
  103.     break;
  104. case 'q':
  105.     spooldir = optarg;
  106.     break;
  107. case '?':
  108.     fatal("usage: %s %s", argv[0], usage);
  109.     /*NOTREACHED*/
  110. }
  111.     if (optind == argc-1) {
  112.         if (argv[optind][0] == FAX_FIFO[0]) {
  113.             if (strlen(argv[optind]) < sizeof(fifoname)) {
  114.                 strcpy(fifoname, argv[optind]);
  115.             } else {
  116.                 fatal("Argument name too long: %s", argv[optind]);
  117.             }
  118.         } else {
  119.             fnlen = snprintf(fifoname, sizeof(fifoname), "%s.%.*s", FAX_FIFO,
  120.                 (int) (sizeof(fifoname) - sizeof(FAX_FIFO)), argv[optind]);
  121.             if (fnlen < 0 || fnlen >= sizeof(fifoname)) {
  122.                 fatal("Argument name too long: %s", argv[optind]);
  123.             }
  124.         }
  125.     } else if (!modemRequired) {
  126.         strcpy(fifoname, FAX_FIFO);
  127.     } else {
  128.         fatal("usage: %s %s", argv[0], usage);
  129.     }
  130.     for (cp = fifoname; (cp = strchr(cp, '/')); *cp++ = '_')
  131. ;
  132.     if (chdir(spooldir) < 0) {
  133.         fatal("%s: chdir: %s", spooldir, strerror(errno));
  134.     }
  135.     fifo = open(fifoname, O_WRONLY|O_NDELAY);
  136.     if (fifo < 0) {
  137.         fatal("%s: open: %s", fifoname, strerror(errno));
  138.     }
  139.     cmdlen = snprintf(cmd, sizeof(cmd), cmdfmt, arg);
  140.     if (write(fifo, cmd, cmdlen) != cmdlen) {
  141.         fatal("FIFO write failed for command (%s)", strerror(errno));
  142.     }
  143.     (void) close(fifo);
  144.     return 0;
  145. }