#SYSREAD
########

SV*
sysread(fd, data, len, ...)
    SV* fd;
    SV* data
		size_t len
		INIT:
			ssize_t ret;
			char *buf;
			long offset=0;

    PPCODE:
			//TODO: allow unspecified len and offset

			//grow scalar to fit potental read
      if(SvOK(fd) && SvIOK(fd)){
        if(SvREADONLY(data)){
            Perl_croak(aTHX_ "%s", PL_no_modify);
        }
        if(items >=4 ){
          //len=SvIOK(ST(2))?SvIV(ST(2)):0;
          offset=SvIOK(ST(3))?SvIV(ST(3)):0;
        }

        size_t data_len=sv_len(data);
        size_t request_len;
        if(offset<0){
          offset=data_len-offset;
        }
        else{

        }
        request_len=len+offset;

        //fprintf(stderr, "Length of buffer is: %d\n", data_len);
        //fprintf(stderr, "Length of request is: %d\n", request_len);

        buf = SvPOK(data) ? SvGROW(data, request_len+1) : 0;

        //data_len=sv_len(data);
        //fprintf(stderr, "Length of buffer is: %d\n", data_len);
        //TODO: fill with nulls if offset past end of original data

        buf+=offset;

        ret=read(SvIV(fd), buf, len);
        if(ret<0){

          //RETVAL=&PL_sv_undef;
          XSRETURN_UNDEF;
        }
        else {
          buf[ret]='\0';
          SvCUR_set(data,ret+offset);
          //RETVAL=newSViv(ret);
          mXPUSHs(newSViv(ret));
          XSRETURN(1);
        }
      }
      else{
        errno=EBADF;
        Perl_warn(aTHX_ "%s", "IO::FD::sysread called with something other than a file descriptor");
        XSRETURN_UNDEF;
      }

SV*
pread(fd, data, len, offset)
  SV *fd;
  SV *data;
  size_t len
  long offset;

		INIT:
			ssize_t ret;
			char *buf;

    PPCODE:
			//TODO: allow unspecified len and offset

			//grow scalar to fit potental read
      if(SvOK(fd) && SvIOK(fd)){
        if(SvREADONLY(data)){
            Perl_croak(aTHX_ "%s", PL_no_modify);
        }

        buf = SvPOK(data) ? SvGROW(data, len+1) : 0;

        ret=pread(SvIV(fd), buf, len, offset);

        if(ret<0){
          XSRETURN_UNDEF;
        }
        else {
          buf[ret]='\0';
          SvCUR_set(data,ret);
          mXPUSHs(newSViv(ret));
          XSRETURN(1);
        }
      }
      else{
        errno=EBADF;
        Perl_warn(aTHX_ "%s", "IO::FD::pread called with something other than a file descriptor");
        XSRETURN_UNDEF;
      }





SV*
sysread3(fd, data, len)
		SV *fd;
		SV* data
		size_t len

		INIT:
			ssize_t ret;
			char *buf;
			long offset;

		PPCODE:
    if(SvOK(fd) &&SvIOK(fd)){
      if(SvREADONLY(data)){
        Perl_croak(aTHX_ "%s", PL_no_modify);
      }
			size_t data_len=SvCUR(data);

			//fprintf(stderr, "Length of buffer is: %d\n", data_len);
			//fprintf(stderr, "Length of request is: %d\n",len);

			buf = SvPOK(data) ? SvGROW(data,len+1) : 0;

			//data_len=SvPVX(data);
			//fprintf(stderr, "Length of buffer is: %d\n", data_len);


			ret=read(SvIV(fd), buf, len);
			if(ret<0){

				//RETVAL=&PL_sv_undef;
        XSRETURN_UNDEF;
			}
			else {
				buf[ret]='\0';
				SvCUR_set(data,ret);
        mXPUSHs(newSViv(ret));
        XSRETURN(1);
				//RETVAL=newSViv(ret);
			}
      }

      else {
        errno=EBADF;
        Perl_warn(aTHX_ "%s", "IO::FD::sysread called with something other than a file descriptor");
        XSRETURN_UNDEF;
      }


SV*
sysread4(fd, data, len, offset)
    SV* fd;
    SV* data
    size_t len
		long offset

		INIT:
			ssize_t ret;
			char *buf;

      PPCODE:
      if(SvOK(fd) &&SvIOK(fd)){
        if(SvREADONLY(data)){
          Perl_croak(aTHX_ "%s", PL_no_modify);
        }

#grow scalar to fit potental read
        long data_len=sv_len(data);
        long request_len;
        if(offset<0){
          offset=data_len-offset;
        }
        else{

        }
        request_len=len+offset;


        buf = SvPOK(data) ? SvGROW(data, request_len+1) : 0;

        //data_len=sv_len(data);

        buf+=offset;

        ret=read(SvIV(fd), buf, len);
        if(ret<0){

          //RETVAL=&PL_sv_undef;
          XSRETURN_UNDEF;
        }
        else {
          buf[ret]='\0';
          SvCUR_set(data,ret+offset);
          //RETVAL=newSViv(ret);
          mXPUSHs(newSViv(ret));
          XSRETURN(1);
        }
      }
      else {
        errno=EBADF;
        Perl_warn(aTHX_ "%s", "IO::FD::sysread called with something other than a file descriptor");
        XSRETURN_UNDEF;
      }