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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: UnixTransport.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. #include "config.h"
  27. #include "FaxClient.h"
  28. #include "UnixTransport.h"
  29. #include "Sys.h"
  30. UnixTransport::UnixTransport(FaxClient& c) : Transport(c) {}
  31. UnixTransport::~UnixTransport() {}
  32. #if CONFIG_UNIXTRANSPORT
  33. bool
  34. UnixTransport::isA(const char* address)
  35. {
  36.      return Sys::isSocketFile(address);
  37. }
  38. #include "Socket.h"
  39. extern "C" {
  40. #include <sys/un.h>
  41. }
  42. bool
  43. UnixTransport::callServer(fxStr& emsg)
  44. {
  45.     int fd = socket(AF_UNIX, SOCK_STREAM, 0);
  46.     if (fd < 0) {
  47. emsg = "Can not create socket to connect to server.";
  48. return (false);
  49.     }
  50.     struct sockaddr_un Sun;
  51.     memset(&Sun, 0, sizeof (Sun));
  52.     Sun.sun_family = AF_UNIX;
  53.     strncpy(Sun.sun_path, client.getHost(), sizeof (Sun.sun_path));
  54.     if (client.getVerbose())
  55. client.traceServer("connect to server at %s",
  56.     (const char*) client.getHost());
  57.     if (Socket::connect(fd, &Sun, sizeof (Sun)) >= 0) {
  58. client.setCtrlFds(fd, dup(fd));
  59. return (true);
  60.     } else {
  61. emsg = fxStr::format("Can not reach server at Unix domain socket "%s".",
  62.     (const char*) client.getHost());
  63. Sys::close(fd), fd = -1;
  64. return (false);
  65.     }
  66. }
  67. bool
  68. UnixTransport::initDataConn(fxStr&)
  69. {
  70. #ifdef notdef
  71.     struct sockaddr_in data_addr;
  72.     Socket::socklen_t dlen = sizeof (data_addr);
  73.     if (Socket::getsockname(fileno(client.getCtrlFd()), &data_addr, &dlen) < 0) {
  74. emsg = fxStr::format("getsockname(ctrl): %s", strerror(errno));
  75. return (false);
  76.     }
  77.     data_addr.sin_port = 0; // let system allocate port
  78.     fd = socket(AF_INET, SOCK_STREAM, 0);
  79.     if (fd < 0) {
  80. emsg = fxStr::format("socket: %s", strerror(errno));
  81. return (false);
  82.     }
  83.     if (Socket::bind(fd, &data_addr, sizeof (data_addr)) < 0) {
  84. emsg = fxStr::format("bind: %s", strerror(errno));
  85. goto bad;
  86.     }
  87.     dlen = sizeof (data_addr);
  88.     if (Socket::getsockname(fd, &data_addr, &dlen) < 0) {
  89. emsg = fxStr::format("getsockname: %s", strerror(errno));
  90. goto bad;
  91.     }
  92.     if (listen(fd, 1) < 0) {
  93. emsg = fxStr::format("listen: %s", strerror(errno));
  94. goto bad;
  95.     }
  96.     const char* a = (const char*) &data_addr.sin_addr;
  97.     const char* p = (const char*) &data_addr.sin_port;
  98. #define UC(b) (((int) b) & 0xff)
  99.     if (client.command("PORT %u,%u,%u,%u,%u,%u",
  100. UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]),
  101. UC(p[0]), UC(p[1])) != COMPLETE)
  102. return (false);
  103. #undef UC
  104.     client.setDataFd(fd);
  105.     return (true);
  106. bad:
  107.     Sys::close(fd), fd = -1;
  108. #endif
  109.     return (false);
  110. }
  111. bool
  112. UnixTransport::openDataConn(fxStr&)
  113. {
  114. #ifdef notdef
  115.     int s = Socket::accept(fileno(client.getDataFd()), NULL, NULL);
  116.     if (s >= 0) {
  117. client.setDataFd(s);
  118. return (true);
  119.     } else {
  120. emsg = fxStr::format("accept: %s", strerror(errno));
  121. return (false);
  122.     }
  123. #else
  124.     return (false);
  125. #endif
  126. }
  127. #else
  128. bool UnixTransport::callServer(fxStr& emsg)
  129.     { notConfigured("Unix domain", emsg); return (false); }
  130. bool UnixTransport::initDataConn(fxStr& emsg)
  131.     { notConfigured("Unix domain", emsg); return (false); }
  132. bool UnixTransport::openDataConn(fxStr& emsg)
  133.     { notConfigured("Unix domain", emsg); return (false); }
  134. #endif