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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: faxconfig.c,v 1.4 2006/06/22 15:06:36 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1995-1996 Sam Leffler
  4.  * Copyright (c) 1995-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 <string.h>
  26. #include <stdio.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 <ctype.h>
  34. #include "config.h"
  35. #include "port.h"
  36. static void
  37. fatal(char* fmt, ...)
  38. {
  39.     va_list ap;
  40.     va_start(ap, fmt);
  41.     if (isatty(fileno(stderr))) {
  42.         vfprintf(stderr, fmt, ap);
  43.         putc('n', stderr);
  44.     } else {
  45.         vsyslog(LOG_ERR, fmt, ap);
  46.     }
  47.     va_end(ap);
  48.     exit(-1);
  49. }
  50. extern int cvtFacility(const char*, int*);
  51. int
  52. main(int argc, char** argv)
  53. {
  54.     extern int optind;
  55.     extern char* optarg;
  56.     int c;
  57.     char* spooldir = FAX_SPOOLDIR;
  58.     char* devid = NULL;
  59.     char fifoname[80];
  60.     const char* usage = "[-q queue-dir] [-m devid]";
  61.     char* cp;
  62.     int facility = LOG_DAEMON;
  63.     (void) cvtFacility(LOG_FAX, &facility);
  64.     openlog(argv[0], LOG_PID|LOG_ODELAY, facility);
  65.     while ((c = getopt(argc, argv, "m:q:")) != -1)
  66. switch (c) {
  67. case 'q':
  68.     spooldir = optarg;
  69.     break;
  70. case 'm':
  71.     devid = optarg;
  72.     break;
  73. case '?':
  74.     fatal("usage: %s %s [param value ...]", argv[0], usage);
  75.     /*NOTREACHED*/
  76. }
  77.     if (devid != NULL) {
  78.         if (devid[0] == FAX_FIFO[0]) {
  79.             if (strlen(devid) < sizeof(fifoname)) {
  80.                 strcpy(fifoname, devid);
  81.             } else {
  82.                 fatal("Argument is too long: %s", devid);
  83.             }
  84.         } else {
  85.             snprintf(fifoname, sizeof(fifoname), "%s.%.*s", FAX_FIFO,
  86.                 (int) (sizeof(fifoname) - sizeof(FAX_FIFO)), devid);
  87.         }
  88.     } else {
  89.         strcpy(fifoname, FAX_FIFO);
  90.     }
  91.     for (cp = fifoname; (cp = strchr(cp, '/')); *cp++ = '_')
  92. ;
  93.     if (chdir(spooldir) < 0)
  94. fatal("%s: chdir: %s", spooldir, strerror(errno));
  95.     if (optind < argc) {
  96. int isQueuer = (strcmp(fifoname, FAX_FIFO) == 0);
  97. int fifo = open(fifoname, O_WRONLY|O_NDELAY);
  98. if (fifo < 0)
  99.     fatal("%s: open: %s", fifoname, strerror(errno));
  100.         do {
  101.             int quote;
  102.             int cmdlen;
  103.             int cmdsize;
  104.             char *cmd;
  105.             if (argc - optind < 2) {
  106.                 fatal("Missing value for "%s" parameter.n", argv[optind]);
  107.             }
  108.             cp = argv[optind+1];
  109.             if (*cp != '"') {
  110.              for (; *cp && !isspace(*cp); cp++) 
  111.                 ;
  112.              quote = (*cp != '');
  113.             } else {
  114.                 quote = 1;
  115.             }
  116.             cmdsize = strlen(argv[optind]) + strlen(argv[optind+1]) + 10;
  117.             cmd = (char*) malloc(cmdsize);
  118.             if (quote) {
  119.                 cmdlen = snprintf(cmd, cmdsize, "C%s%s:"%s"",
  120.                     isQueuer ? ":" : "", argv[optind], argv[optind+1]);
  121.             } else {
  122.                 cmdlen = snprintf(cmd, cmdsize, "C%s%s:%s",
  123.                     isQueuer ? ":" : "", argv[optind], argv[optind+1]);
  124.             }
  125.             if (cmdlen < 0 || cmdlen >= cmdsize || write(fifo, cmd, cmdlen) != cmdlen) {
  126.                 fatal("%s: FIFO write failed for command (%s)",
  127.                  argv[0], strerror(errno));
  128.             }
  129.             free(cmd);
  130.         } while ((optind += 2) < argc);
  131.         (void) close(fifo);
  132.     }
  133.     return 0;
  134. }