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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: Admin.c++,v 1.1.1.1 2005/11/11 21:32:03 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1995-1996 Sam Leffler
  4.  * Copyright (c) 1995-1996 Silicon Graphics, Inc.
  5.  * HylaFAX is a trademark of Silicon Graphics
  6.  *
  7.  * Permission to use, copy, modify, distribute, and sell this software and 
  8.  * its documentation for any purpose is hereby granted without fee, provided
  9.  * that (i) the above copyright notices and this permission notice appear in
  10.  * all copies of the software and related documentation, and (ii) the names of
  11.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  12.  * publicity relating to the software without the specific, prior written
  13.  * permission of Sam Leffler and Silicon Graphics.
  14.  * 
  15.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  16.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  17.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  18.  * 
  19.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  20.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  21.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  22.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  23.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  24.  * OF THIS SOFTWARE.
  25.  */
  26. /*
  27.  * Administrative Support.
  28.  */
  29. #include "HylaFAXServer.h"
  30. #include "Sys.h"
  31. #include "config.h"
  32. #include <time.h>
  33. /*
  34.  * Abort an active call on the specified modem.
  35.  * The best we can do is send a message to the
  36.  * current process via the FIFO for that modem;
  37.  * we cannot be certain if the abort operation
  38.  * actually takes place.
  39.  */
  40. void
  41. HylaFAXServer::abortCallCmd(const char* modem)
  42. {
  43.     logcmd(T_ABOR, "%s", modem);
  44.     fxStr emsg;
  45.     if (sendModem(modem, emsg, "Z"))
  46. reply(200, "Modem %s told to abort current call.", modem);
  47.     else
  48. reply(500, "Abort request failed: %s.", (const char*) emsg);
  49. }
  50. /*
  51.  * Answer an inbound call on the specified modem.
  52.  * The best we can do is send a message to the
  53.  * faxgetty process via the FIFO for that modem;
  54.  * we cannot be certain if the operation happens
  55.  * or is successful because there is no return
  56.  * channel.
  57.  *
  58.  * The ``how'' parameter should be one of fax,
  59.  * data, voice, or any (note all lower case).
  60.  */
  61. void
  62. HylaFAXServer::answerCallCmd(const char* modem, const char* how)
  63. {
  64.     logcmd(T_ANSWER, "%s %s", modem, how);
  65.     fxStr emsg;
  66.     if (sendModem(modem, emsg, "A%s", how))
  67. reply(200, "Modem %s told to answer call as %s.", modem, how);
  68.     else
  69. reply(500, "Answer request failed: %s.", (const char*) emsg);
  70. }
  71. /*
  72.  * Disable outbound use of the specified modem.  We
  73.  * first try to notify the appropriate faxgetty process
  74.  * and if that fails then go directly to the scheduler.
  75.  * This should handle both send+recv and send-only system
  76.  * configurations.
  77.  *
  78.  * NB: There currently is no place to stash the reason
  79.  *     the modem's use is disabled.
  80.  */
  81. void
  82. HylaFAXServer::disableModemCmd(const char* modem, const char* reason)
  83. {
  84.     logcmd(T_DISABLE, "%s %s", modem, reason);
  85.     fxStr emsg;
  86.     if (sendModem(modem, emsg, "SD"))
  87. reply(200, "Modem %s told to disable outbound use.", modem);
  88.     else if (sendQueuer(emsg, "+%s:D", modem))
  89. reply(200, "Scheduler told to disable use of modem %s.", modem);
  90.     else
  91. reply(500, "Unable to disable use of %s: %s.",
  92.     modem, (const char*) emsg);
  93. }
  94. /*
  95.  * Enable outbound use of the specified modem.  We
  96.  * first try to notify the appropriate faxgetty process
  97.  * and if that fails then go directly to the scheduler.
  98.  * This should handle both send+recv and send-only system
  99.  * configurations.
  100.  */
  101. void
  102. HylaFAXServer::enableModemCmd(const char* modem)
  103. {
  104.     logcmd(T_ENABLE, "%s", modem);
  105.     fxStr emsg;
  106.     if (sendModem(modem, emsg, "SR"))
  107. reply(200, "Modem %s told to enable outbound use.", modem);
  108.     else if (sendQueuer(emsg, "+%s:R", modem))
  109. reply(200, "Scheduler told to enable use of modem %s.", modem);
  110.     else
  111. reply(500, "Unable to enable use of %s: %s.",
  112.     modem, (const char*) emsg);
  113. }
  114. /*
  115.  * Shutdown client access to the server machine by installing
  116.  * a shutdown file with the specified reason.  The shutdown
  117.  * may be scheduled for some time in the future in which case
  118.  * when indicates when the shutdown is to take place.
  119.  */
  120. void
  121. HylaFAXServer::shutCmd(const struct tm& when, const char* reason)
  122. {
  123.     logcmd(T_SHUT, "%.24s %s", asctime(&when), reason);
  124.     if (shutdownFile == "") {
  125.         reply(503, "Null configured shutdown filename; something is hosed.");
  126.         return;
  127.     }
  128.     const char* msg = "Shutdown failed; ";
  129.     const char* templ = FAX_TMPDIR "/shutXXXXXX";
  130.     char* buff = strcpy(new char[strlen(templ) + 1], templ);
  131.     int fd = Sys::mkstemp(buff);
  132.     fxStr tfile = buff;
  133.     delete [] buff;
  134.     if (fd < 0) {
  135.         reply(550, "%serror creating temp file %s: %s.", msg,
  136.             (const char*) tfile, strerror(errno));
  137.         return;
  138.     }
  139.     FILE* fp = fdopen(fd, "w");
  140.     if (fp) {
  141.         fprintf(fp, "%d %d %d %d %d 5 1n"
  142.             , when.tm_year+1900
  143.             , when.tm_mon
  144.             , when.tm_mday
  145.             , when.tm_hour
  146.             , when.tm_min
  147.         );
  148.         fprintf(fp, "n%snn", reason);
  149.         if (fclose(fp) != 0) {
  150.             reply(450, "%sI/O error writing %s.", msg, (const char*) tfile);
  151.             (void) Sys::unlink(tfile);
  152.         } else if (Sys::rename(tfile, fixPathname(shutdownFile)) < 0) {
  153.             reply(550, "%srename %s.", msg, strerror(errno));
  154.         } else {
  155.             reply(200, "System shutdown scheduled for %.24s.",
  156.          asctime(&when));
  157.             return;
  158.         }
  159.     } else {
  160.         reply(550, "%serror opening file: %s", msg, strerror(errno));
  161.         Sys::close(fd);
  162.     }
  163.     (void) Sys::unlink(tfile);
  164. }
  165. void
  166. HylaFAXServer::addModemCmd(const char* modem)
  167. {
  168.     logcmd(T_ADDMODEM, "%s", modem);
  169.     reply(200, "Modem %s added.", modem); // XXX
  170. }
  171. void
  172. HylaFAXServer::delModemCmd(const char* modem)
  173. {
  174.     logcmd(T_DELMODEM, "%s", modem);
  175.     reply(200, "Modem %s deleted.", modem); // XXX
  176. }
  177. void
  178. HylaFAXServer::configQueryCmd(const char* where)
  179. {
  180.     logcmd(T_CONFIG, "%s", where);
  181.     lreply(200, "Configuration info for %s.", where); // XXX
  182.     // XXX
  183.     reply(200, "End of configuration info.");
  184. }
  185. void
  186. HylaFAXServer::configCmd(const char* where, const char* info)
  187. {
  188.     logcmd(T_CONFIG, "%s %s", where, info);
  189.     reply(200, "Config info %s sent to %s.", info, where); // XXX
  190. }