home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / old / ckermit5a190 / ckoftp.c < prev    next >
C/C++ Source or Header  |  2020-01-01  |  4KB  |  192 lines

  1. /* ckoftp.c
  2.  *
  3.  * TCP/IP interface DLL between C-Kermit and FTP PC/TCP
  4.  *
  5.  */
  6.  
  7. /* PCTCP include file */
  8. #include <pctcp.h>
  9.  
  10. /* BSD include files  */
  11. #include <sys/socket.h>
  12. #include <netinet/in.h>
  13. #include <net\if.h>
  14. #include <netdb.h>
  15.  
  16. #ifndef __IBMC__
  17. #include <stddef.h>
  18. #include <memory.h>
  19. #endif 
  20.  
  21. #define CK_DLL
  22. #include "ckotcp.h"
  23.  
  24. int ENTRY ck_sockinit(void)
  25. {
  26.   /* no sock_init() in ftp pc/tcp */
  27.   return 0;
  28. }
  29.  
  30. /* socket calls */
  31.  
  32. int ENTRY ck_connect(int socket, struct ck_sockaddr *name, int namelen)
  33.   struct sockaddr_in addr;
  34.  
  35.   memset(&addr, 0, sizeof(addr));
  36.   addr.sin_port        = ((struct ck_sockaddr_in *) name) -> sin_port;
  37.   addr.sin_family      = ((struct ck_sockaddr_in *) name) -> sin_family;
  38.   addr.sin_addr.s_addr = ((struct ck_sockaddr_in *) name) -> sin_addr.s_addr;
  39.  
  40.   return connect(socket, (struct sockaddr *) &addr, sizeof(addr)); 
  41. }
  42.  
  43. int ENTRY ck_ioctl(int socket, int cmd, char *data, int length)
  44. {
  45.   switch (cmd)
  46.   {
  47.   case CK_FIONREAD:
  48.     cmd = FIONREAD;
  49.     break;
  50.   case CK_FIONBIO:
  51.     cmd = FIONBIO;
  52.     break;
  53.   default:
  54.     return -1;
  55.   }
  56.  
  57.   return ioctl(socket, cmd, data); 
  58. }
  59.  
  60. int ENTRY ck_recv(int socket, char *buffer, int length, int flags)
  61. {
  62.   if (flags != 0)
  63.     return -1;
  64.  
  65.   return readsocket(socket, buffer, length); 
  66. }
  67.  
  68. int ENTRY ck_select(int *fds, int read, int write, int except, long timeout)
  69. {
  70.   /* Warning: if the called select is 16-bit but the calling code is
  71.    * 32-bit, only one fd can be pointed to by fds! However, calling
  72.    * with one "read" socket is the only use of select() in
  73.    * C-Kermit. Might change in the future, so this must be checked. */
  74.  
  75.   fd_set rfds;
  76.   struct timeval tv;
  77.   int socket = *fds;
  78.  
  79.   if (read != 1 && write != 0 && except != 0)
  80.     return -1;
  81.  
  82.   FD_ZERO(&rfds);
  83.   FD_SET(socket, &rfds);
  84.   tv.tv_sec = tv.tv_usec = 0L;
  85.  
  86.   if (timeout < 1000)
  87.     tv.tv_usec = (long) timeout * 1000L;
  88.   else
  89.     tv.tv_sec = timeout;
  90.  
  91.   return select(FD_SETSIZE, &rfds, NULL, NULL, &tv) && FD_ISSET(socket, &rfds);
  92. }
  93.  
  94. int ENTRY ck_send(int socket, char *buffer, int length, int flags)
  95. {
  96.   if (flags != 0)
  97.     return -1;
  98.  
  99.   return writesocket(socket, buffer, length); 
  100. }
  101.  
  102. int ENTRY ck_setsockopt(int socket, int level, int optname, 
  103.           char *optvalue, int optlength)
  104. {
  105.   if (level == CK_SOL_SOCKET)
  106.     level = SOL_SOCKET;
  107.   else
  108.     return -1;
  109.  
  110.   if (optname == CK_SO_OOBINLINE)
  111.     optname = SO_OOBINLINE;
  112.   else
  113.     return -1;
  114.  
  115.   return setsockopt(socket, level, optname, optvalue, optlength); 
  116. }
  117.  
  118. int ENTRY ck_socket(int domain, int type, int protocol)
  119. {
  120.   if (domain == CK_AF_INET)
  121.     domain = AF_INET;
  122.   else
  123.     return -1;
  124.  
  125.   if (type == CK_SOCK_STREAM)
  126.     type = SOCK_STREAM;
  127.   else
  128.     return -1;
  129.  
  130.   if (protocol != 0)
  131.     return -1;
  132.  
  133.   return socket(domain, type, protocol); 
  134. }
  135.  
  136. int ENTRY ck_soclose(int socket)
  137. {
  138.   return closesocket(socket); 
  139. }
  140.  
  141. /* utility calls */
  142.  
  143. struct ck_hostent * ENTRY ck_gethostbyname(char *name)
  144.   struct hostent *host = gethostbyname(name);
  145.   static struct ck_hostent ckhost;
  146.  
  147.   if (host == NULL)
  148.     return NULL;
  149.  
  150.   ckhost.h_name     = host -> h_name;
  151.   ckhost.h_aliases  = NULL;
  152.   ckhost.h_addrtype = host -> h_addrtype;
  153.   ckhost.h_length   = host -> h_length;
  154.   ckhost.h_address  = host -> h_addr;
  155.  
  156.   return &ckhost; 
  157. }
  158.  
  159. struct ck_servent * ENTRY ck_getservbyname(char *name, char *protocol)
  160. {
  161.   struct servent *serv = getservbyname(name, protocol);
  162.   static struct ck_servent ckserv;
  163.  
  164.   if (serv == NULL)
  165.     return NULL;
  166.  
  167.   ckserv.s_name    = serv -> s_name;
  168.   ckserv.s_aliases = NULL;
  169.   ckserv.s_port    = serv -> s_port;
  170.   ckserv.s_proto   = serv -> s_proto;
  171.  
  172.   return &ckserv; 
  173. }
  174.  
  175. unsigned long ENTRY ck_inet_addr(char *cp)
  176. {
  177.   return inet_addr(cp); 
  178. }
  179.  
  180. char * ENTRY ck_inet_ntoa(struct ck_in_addr in)
  181. {
  182.   struct in_addr addr;
  183.  
  184.   addr.s_addr = in.s_addr;
  185.  
  186.   return inet_ntoa(addr); 
  187. }
  188.  
  189. /* end of ckotcp.c */
  190.