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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: faxstate.c,v 1.5 2006/10/12 23:15:11 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. static const char*
  51. modemstate(const char* arg)
  52. {
  53.     static struct {
  54. const char* tag;
  55. const char* state;
  56.     } modemstates[] = {
  57. { "busy",  "B" }, { "exempt",  "E" },
  58. { "ready", "R" }, { "up",      "R" },
  59. { "down",  "D" }, { "disable", "D" },
  60. { NULL }
  61.     };
  62.     int i;
  63.     for (i = 0; modemstates[i].tag != NULL; i++)
  64. if (strcmp(modemstates[i].tag, arg) == 0)
  65.     return (modemstates[i].state);
  66.     fatal("Bad modem ready state `%s'; use one of busy, ready, down, and exempt", arg);
  67.     /*NOTREACHED*/
  68.     return (NULL);
  69. }
  70. int
  71. main(int argc, char** argv)
  72. {
  73.     extern int optind;
  74.     extern char* optarg;
  75.     int fifo, c;
  76.     char* spooldir = FAX_SPOOLDIR;
  77.     const char* arg = modemstate("ready");
  78.     char fifoname[256];
  79.     char devid[256];
  80.     int cmdlen;
  81.     char cmd[80];
  82.     char* appname;
  83.     char* usage = "[-s state] [-q queue-dir] [-n]";
  84.     char* cp;
  85.     int facility = LOG_DAEMON;
  86.     int nofaxgetty = 0;
  87.     (void) cvtFacility(LOG_FAX, &facility);
  88.     openlog(argv[0], LOG_PID|LOG_ODELAY, facility);
  89.     appname = strrchr(argv[0], '/');
  90.     if (appname)
  91. appname++;
  92.     else
  93. appname = argv[0];
  94.     while ((c = getopt(argc, argv, "s:q:n")) != -1)
  95. switch (c) {
  96. case 'n':
  97.     nofaxgetty = 1;
  98.     break;
  99. case 's':
  100.     arg = modemstate(optarg);
  101.     break;
  102. case 'q':
  103.     spooldir = optarg;
  104.     break;
  105. case '?':
  106.     fatal("usage: %s %s devid", argv[0], usage);
  107.     /*NOTREACHED*/
  108. }
  109.     if (optind != argc-1) {
  110.         fatal("usage: %s %s modem", argv[0], usage);
  111.     }
  112.     if (strlen(argv[optind]) < sizeof(devid)) {
  113.         strcpy(devid, argv[optind]);
  114.     } else {
  115.         fatal("Argument is too large: %s", argv[optind]);
  116.     }
  117.     for (cp = devid; (cp = strchr(cp, '/')); *cp++ = '_')
  118. ;
  119.     if (chdir(spooldir) < 0)
  120. fatal("%s: chdir: %s", spooldir, strerror(errno));
  121.     if (nofaxgetty) {
  122. /*
  123.  * No faxgetty process, contact faxq directly and emulate
  124.  * what faxgetty would send.
  125.  */
  126. fifo = open(FAX_FIFO, O_WRONLY|O_NDELAY);
  127.         if (fifo < 0) {
  128.             fatal("%s: open: %s", FAX_FIFO, strerror(errno));
  129.         }
  130.         cmdlen = snprintf(cmd, sizeof(cmd), "+%s:%s", devid, arg);
  131.         if (cmdlen < 0 || cmdlen >= sizeof(cmd) || write(fifo, cmd, cmdlen) != cmdlen) {
  132.             fatal("FIFO write failed for command (%s)", strerror(errno));
  133.         }
  134.     } else {
  135.         snprintf(fifoname, sizeof(fifoname), "%s.%.*s", FAX_FIFO,
  136.             sizeof (fifoname) - sizeof (FAX_FIFO), devid);
  137.         fifo = open(fifoname, O_WRONLY|O_NDELAY);
  138.         if (fifo < 0) {
  139.             fatal("%s: open: %s", fifoname, strerror(errno));
  140.         }
  141.         cmdlen = snprintf(cmd, sizeof(cmd), "S%s", arg);
  142.         if (cmdlen < 0 || cmdlen >= sizeof(cmd) || write(fifo, cmd, cmdlen) != cmdlen) {
  143.             fatal("FIFO write failed for command (%s)", strerror(errno));
  144.         }
  145.     }
  146.     (void) close(fifo);
  147.     return 0;
  148. }