/* *---------------------------------------------------------------------- * * FCGI_feof, FCGI_ferror, FCGI_clearerr -- * * Wrappers for functions defined in H&S Section 15.14 * *---------------------------------------------------------------------- */ int FCGI_feof(FCGI_FILE *fp) { if(fp->stdio_stream) { return feof(fp->stdio_stream); } else if (fp->fcgx_stream){ return FCGX_HasSeenEOF(fp->fcgx_stream); } return -1; }
static VALUE fcgi_stream_read(int argc, VALUE *argv, VALUE self) { VALUE num,str; FCGX_Stream *stream; char *buff; int n; if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) { rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO"); } Data_Get_Struct(self, FCGX_Stream, stream); if (argc==0) { buff = ALLOC_N(char, 16384); n = FCGX_GetStr(buff, 16384, stream); CHECK_STREAM_ERROR(stream); if (n == 0) { free(buff); return Qnil; } str = rb_str_new(buff, n); OBJ_TAINT(str); while(!FCGX_HasSeenEOF(stream)) { n = FCGX_GetStr(buff, 16384, stream); CHECK_STREAM_ERROR(stream); if (n > 0) { rb_str_cat(str, buff, n); } else { free(buff); return Qnil; } } free(buff); return str; }
static PyObject * fcgi_Stream_read(fcgi_Stream *self, PyObject *args) { FCGX_Stream *s; long bytesrequested = -1; size_t bytesread, buffersize, chunksize; PyObject *v; fcgi_Stream_Check(); s = *(self->s); if (!PyArg_ParseTuple(args, "|l:read", &bytesrequested)) return NULL; if (bytesrequested == 0) return PyString_FromString(""); if (bytesrequested < 0) buffersize = new_buffersize((size_t)0); else buffersize = bytesrequested; if (buffersize > INT_MAX) { PyErr_SetString(PyExc_OverflowError, "requested number of bytes is more than a Python string can hold"); return NULL; } v = PyString_FromStringAndSize((char *)NULL, buffersize); if (v == NULL) return NULL; bytesread = 0; for (;;) { Py_BEGIN_ALLOW_THREADS chunksize = FCGX_GetStr(BUF(v) + bytesread, buffersize - bytesread, s); Py_END_ALLOW_THREADS if (chunksize == 0) { if (FCGX_HasSeenEOF(s)) break; PyErr_SetString(PyExc_IOError, "Read failed"); Py_DECREF(v); return NULL; } bytesread += chunksize; if (bytesread < buffersize) { break; } if (bytesrequested < 0) { buffersize = new_buffersize(buffersize); if (_PyString_Resize(&v, buffersize) < 0) return NULL; } else { /* Got what was requested. */ break; } } if (bytesread != buffersize) _PyString_Resize(&v, bytesread); return v; }
bool FastCgiDevice::atEnd() const { return FCGX_HasSeenEOF( m_stream ); }