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 / native / java.io / FileInputStream.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  3KB  |  125 lines

  1. /*
  2.  * java.io.FileInputStream.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 <sys/types.h>
  15. #include <stdio.h>
  16. #include <assert.h>
  17. #if defined(HAVE_IO_H)
  18. #include <io.h>
  19. #endif
  20. #include "defs.h"
  21. #include "files.h"
  22. #include "java.io.stubs/FileInputStream.h"
  23. #include "java.io.stubs/FileDescriptor.h"
  24. #include "kthread.h"
  25.  
  26. /*
  27.  * Open a file for input.
  28.  */
  29. void
  30. java_io_FileInputStream_open(struct Hjava_io_FileInputStream* this, struct Hjava_lang_String* name)
  31. {
  32.     char str[MAXPATHLEN];
  33.     int fd;
  34.  
  35.     javaString2CString(name, str, sizeof(str));
  36.     fd = threadedOpen(str, O_RDONLY|O_BINARY, 0);
  37.     unhand(unhand(this)->fd)->fd = fd;
  38.     if (fd < 0) {
  39.         SignalError(0, "java.io.IOException", SYS_ERROR);
  40.     }
  41. }
  42.  
  43. /*
  44.  * Close file.
  45.  */
  46. void
  47. java_io_FileInputStream_close(struct Hjava_io_FileInputStream* this)
  48. {
  49.     int r;
  50.  
  51.     if (unhand(unhand(this)->fd)->fd >= 0) {
  52.         r = close(unhand(unhand(this)->fd)->fd);
  53.         unhand(unhand(this)->fd)->fd = -1;
  54.         if (r < 0) {
  55.             SignalError(0, "java.io.IOException", SYS_ERROR);
  56.         }
  57.     }
  58. }
  59.  
  60. /*
  61.  * Read in bytes.
  62.  */
  63. jint
  64. java_io_FileInputStream_readBytes(struct Hjava_io_FileInputStream* fh, HArrayOfByte* bytes, jint off, jint len)
  65. {
  66.     jint ret;
  67.  
  68.     ret = threadedRead(unhand(unhand(fh)->fd)->fd, &unhand(bytes)->body[off], len);
  69.     if (ret < 0) {
  70.         SignalError(0, "java.io.IOException", SYS_ERROR);
  71.     }
  72.     return (ret > 0 ? ret : -1);
  73. }
  74.  
  75. /*
  76.  * Read a single byte.
  77.  */
  78. jint
  79. java_io_FileInputStream_read(struct Hjava_io_FileInputStream* fh)
  80. {
  81.     jint ret;
  82.     unsigned char byte;
  83.  
  84.     ret = threadedRead(unhand(unhand(fh)->fd)->fd, &byte, 1);
  85.     if (ret < 0) {
  86.         SignalError(0, "java.io.IOException", SYS_ERROR);
  87.     }
  88.     return (ret > 0 ? byte : -1);
  89. }
  90.  
  91. /*
  92.  * Skip forward in stream.
  93.  */
  94. jlong
  95. java_io_FileInputStream_skip(struct Hjava_io_FileInputStream* fh, jlong off)
  96. {
  97.     off_t ret;
  98.  
  99.     ret = lseek(unhand(unhand(fh)->fd)->fd, jlong2off_t(off), 1);
  100.     if (ret < 0) {
  101.         SignalError(0, "java.io.IOException", SYS_ERROR);
  102.     }
  103.     return (off_t2jlong(ret));
  104. }
  105.  
  106. /*
  107.  * Return the number of bytes available to read without blocking.
  108.  */
  109. jint
  110. java_io_FileInputStream_available(struct Hjava_io_FileInputStream* fh)
  111. {
  112.     int fd;
  113.     struct stat buf;
  114.     int ret;
  115.     off_t sret;
  116.  
  117.     fd = unhand(unhand(fh)->fd)->fd;
  118.     ret = fstat(fd, &buf);
  119.     sret = lseek(fd, 0, 1);
  120.     if (ret < 0 || sret < 0) {
  121.         SignalError(0, "java.io.IOException", SYS_ERROR);
  122.     }
  123.     return (buf.st_size - sret);
  124. }
  125.