home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / kaffe-0.5p4-src.tgz / tar.out / contrib / kaffe / lib / net / java.net / PlainSocketImpl.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  5KB  |  196 lines

  1. /*
  2.  * java.net.PlainSocketImpl.c
  3.  *
  4.  * Copyright (c) 1996 Systems Architecture Research Centre,
  5.  *           City University, London, UK.
  6.  *
  7.  * See the file "license.terms" for information on usage and redistribution
  8.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  9.  *
  10.  * Written by Tim Wilkinson <tim@sarc.city.ac.uk>, February 1996.
  11.  */
  12.  
  13. #include "config.h"
  14. #include <stdio.h>
  15. #include <sys/types.h>
  16. #include <sys/socket.h>
  17. #include <netinet/in.h>
  18. #include <sys/ioctl.h>
  19. #if defined(HAVE_SYS_FILIO_H)
  20. #include <sys/filio.h>
  21. #endif
  22. #include <native.h>
  23. #include "../native/java.io.stubs/FileDescriptor.h"
  24. #include "java.net.stubs/SocketImpl.h"
  25. #include "java.net.stubs/InetAddress.h"
  26. #include "java.net.stubs/PlainSocketImpl.h"
  27. #include "nets.h"
  28. #include "kthread.h"
  29.  
  30. /*
  31.  * Create a stream or datagram socket.
  32.  */
  33. void
  34. java_net_PlainSocketImpl_socketCreate(struct Hjava_net_PlainSocketImpl* this, jint /* bool */ stream)
  35. {
  36.     int fd;
  37.     int type;
  38.  
  39.     if (stream == 0) {
  40.         type = SOCK_DGRAM;
  41.     }
  42.     else {
  43.         type = SOCK_STREAM;
  44.     }
  45.  
  46.     fd = threadedSocket(AF_INET, type, 0);
  47.     if (fd < 0) {
  48.         SignalError(0, "java.io.IOException", SYS_ERROR);
  49.     }
  50.     unhand(unhand(this)->fd)->fd = fd;
  51. }
  52.  
  53. /*
  54.  * Connect the socket to someone.
  55.  */
  56. void
  57. java_net_PlainSocketImpl_socketConnect(struct Hjava_net_PlainSocketImpl* this, struct Hjava_net_InetAddress* daddr, jint dport)
  58. {
  59.     int fd;
  60.     int r;
  61.     struct sockaddr_in addr;
  62.     int alen;
  63.  
  64. #if defined(BSD44)
  65.     addr.sin_len = sizeof(addr);
  66. #endif
  67.     addr.sin_family = AF_INET;
  68.     addr.sin_port = htons(dport);
  69.     addr.sin_addr.s_addr = htonl(unhand(daddr)->address);
  70.  
  71.     fd = unhand(unhand(this)->fd)->fd;
  72.     r = threadedConnect(fd, (struct sockaddr*)&addr, sizeof(addr));
  73.     if (r < 0) {
  74.         SignalError(0, "java.io.IOException", SYS_ERROR);
  75.     }
  76.  
  77.     /* Enter information into socket object */
  78.     alen = sizeof(addr);
  79.     r = getsockname(fd, (struct sockaddr*)&addr, &alen);
  80.     if (r < 0) {
  81.         SignalError(0, "java.io.IOException", SYS_ERROR);
  82.     }
  83.  
  84.     unhand(this)->address = daddr;
  85.     unhand(this)->port = dport;
  86.     unhand(this)->localport = ntohs(addr.sin_port);
  87. }
  88.  
  89. /*
  90.  * Bind this socket to an address.
  91.  */
  92. void
  93. java_net_PlainSocketImpl_socketBind(struct Hjava_net_PlainSocketImpl* this, struct Hjava_net_InetAddress* laddr, jint lport)
  94. {
  95.     int r;
  96.     struct sockaddr_in addr;
  97.  
  98. #if defined(BSD44)
  99.     addr.sin_len = sizeof(addr);
  100. #endif
  101.     addr.sin_family = AF_INET;
  102.     addr.sin_port = htons(lport);
  103.     addr.sin_addr.s_addr = unhand(laddr)->address;
  104.  
  105.     r = bind(unhand(unhand(this)->fd)->fd, (struct sockaddr*)&addr, sizeof(addr));
  106.     if (r < 0) {
  107.         SignalError(0, "java.io.IOException", SYS_ERROR);
  108.     }
  109.  
  110.     /* Enter information into socket object */
  111.     unhand(this)->address = laddr;
  112.     unhand(this)->localport = lport;
  113. }
  114.  
  115. /*
  116.  * Turn this socket into a listener.
  117.  */
  118. void
  119. java_net_PlainSocketImpl_socketListen(struct Hjava_net_PlainSocketImpl* this, jint count)
  120. {
  121.     int r;
  122.  
  123.     r = listen(unhand(unhand(this)->fd)->fd, count);
  124.     if (r < 0) {
  125.         SignalError(0, "java.io.IOException", SYS_ERROR);
  126.     }
  127. }
  128.  
  129. /*
  130.  * Accept a connection.
  131.  */
  132. void
  133. java_net_PlainSocketImpl_socketAccept(struct Hjava_net_PlainSocketImpl* this, struct Hjava_net_SocketImpl* sock)
  134. {
  135.     int r;
  136.     int alen;
  137.     struct sockaddr_in addr;
  138.  
  139.     alen = sizeof(addr);
  140. #if defined(BSD44)
  141.     addr.sin_len = sizeof(addr);
  142. #endif
  143.     addr.sin_family = AF_INET;
  144.     addr.sin_port = htons(unhand(sock)->localport);
  145.     addr.sin_addr.s_addr = unhand(unhand(sock)->address)->address;
  146.  
  147.     r = threadedAccept(unhand(unhand(this)->fd)->fd, (struct sockaddr*)&addr, &alen);
  148.     if (r < 0) {
  149.         SignalError(0, "java.io.IOException", SYS_ERROR);
  150.     }
  151.     unhand(unhand(sock)->fd)->fd = r;
  152.  
  153.     /* Enter information into socket object */
  154.     alen = sizeof(addr);
  155.     r = getpeername(r, (struct sockaddr*)&addr, &alen);
  156.     if (r < 0) {
  157.         SignalError(0, "java.io.IOException", SYS_ERROR);
  158.     }
  159.  
  160.     unhand(unhand(sock)->address)->address = ntohl(addr.sin_addr.s_addr);
  161.     unhand(sock)->port = ntohs(addr.sin_port);
  162. }
  163.  
  164. /*
  165.  * Return how many bytes can be read without blocking.
  166.  */
  167. jint
  168. java_net_PlainSocketImpl_socketAvailable(struct Hjava_net_PlainSocketImpl* this)
  169. {
  170.     int r;
  171.     jint len;
  172.  
  173.     r = ioctl(unhand(unhand(this)->fd)->fd, FIONREAD, &len);
  174.     if (r < 0) {
  175.         SignalError(0, "java.io.IOException", SYS_ERROR);
  176.     }
  177.     return (len);
  178. }
  179.  
  180. /*
  181.  * Close this socket.
  182.  */
  183. void
  184. java_net_PlainSocketImpl_socketClose(struct Hjava_net_PlainSocketImpl* this)
  185. {
  186.     int r;
  187.  
  188.     if (unhand(unhand(this)->fd)->fd != -1) {
  189.         r = close(unhand(unhand(this)->fd)->fd);
  190.         unhand(unhand(this)->fd)->fd = -1;
  191.         if (r < 0) {
  192.             SignalError(0, "java.io.IOException", SYS_ERROR);
  193.         }
  194.     }
  195. }
  196.