class FCGI::Stream
Public Instance Methods
<<(p1)
click to toggle source
static VALUE fcgi_stream_addstr(VALUE out, VALUE str)
{
fcgi_stream_write(out, str);
return out;
}
binmode()
click to toggle source
static VALUE fcgi_stream_binmode(VALUE self)
{
if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) {
rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
}
return self;
}
close()
click to toggle source
static VALUE fcgi_stream_close(VALUE self)
{
FCGX_Stream *stream;
if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) {
rb_raise(rb_eSecurityError, "Insecure: can't close");
}
Data_Get_Stream(self, stream);
if (FCGX_FClose(stream) == EOF)
CHECK_STREAM_ERROR(stream);
return Qnil;
}
closed?()
click to toggle source
static VALUE fcgi_stream_closed(VALUE self)
{
FCGX_Stream *stream;
Data_Get_Stream(self, stream);
return stream->isClosed ? Qtrue : Qfalse;
}
eof()
click to toggle source
static VALUE fcgi_stream_eof(VALUE self)
{
FCGX_Stream *stream;
if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) {
rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
}
Data_Get_Stream(self, stream);
return FCGX_HasSeenEOF(stream) ? Qtrue : Qfalse;
}
eof?()
click to toggle source
static VALUE fcgi_stream_eof(VALUE self)
{
FCGX_Stream *stream;
if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) {
rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
}
Data_Get_Stream(self, stream);
return FCGX_HasSeenEOF(stream) ? Qtrue : Qfalse;
}
flush()
click to toggle source
static VALUE fcgi_stream_flush(VALUE self)
{
FCGX_Stream *stream;
Data_Get_Stream(self, stream);
if (FCGX_FFlush(stream) == EOF)
CHECK_STREAM_ERROR(stream);
return Qnil;
}
getc()
click to toggle source
static VALUE fcgi_stream_getc(VALUE self)
{
FCGX_Stream *stream;
int c;
Data_Get_Stream(self, stream);
if ((c = FCGX_GetChar(stream)) == EOF) {
CHECK_STREAM_ERROR(stream);
return Qnil;
}
else {
return INT2NUM(c);
}
}
gets()
click to toggle source
static VALUE fcgi_stream_gets(VALUE self) {
FCGX_Stream *stream;
char buff[BUFSIZ];
VALUE str = rb_str_new(0,0);
OBJ_TAINT(str);
if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) {
rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
}
Data_Get_Stream(self, stream);
for (;;) {
if (FCGX_GetLine(buff, BUFSIZ, stream) == NULL) {
CHECK_STREAM_ERROR(stream);
break;
}
rb_str_cat(str, buff, strlen(buff));
if (strchr(buff, '\n')) break;
}
if (RSTRING_LEN(str) > 0)
return str;
else
return Qnil;
}
isatty()
click to toggle source
static VALUE fcgi_stream_isatty(VALUE self)
{
if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) {
rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
}
return Qfalse;
}
print(*args)
click to toggle source
static VALUE fcgi_stream_print(int argc, VALUE *argv, VALUE out)
{
int i;
VALUE line;
/* if no argument given, print `$_' */
if (argc == 0) {
argc = 1;
line = rb_lastline_get();
argv = &line;
}
for (i=0; i<argc; i++) {
if (!NIL_P(rb_output_fs) && i>0) {
fcgi_stream_write(out, rb_output_fs);
}
switch (TYPE(argv[i])) {
case T_NIL:
fcgi_stream_write(out, rb_str_new2("nil"));
break;
default:
fcgi_stream_write(out, argv[i]);
break;
}
}
if (!NIL_P(rb_output_rs)) {
fcgi_stream_write(out, rb_output_rs);
}
return Qnil;
}
printf(*args)
click to toggle source
static VALUE fcgi_stream_printf(int argc, VALUE *argv, VALUE out)
{
fcgi_stream_write(out, rb_f_sprintf(argc, argv));
return Qnil;
}
putc(p1)
click to toggle source
static VALUE fcgi_stream_putc(VALUE self, VALUE ch)
{
FCGX_Stream *stream;
int c;
rb_secure(4);
Data_Get_Stream(self, stream);
if ((c = FCGX_PutChar(NUM2INT(ch), stream)) == EOF)
CHECK_STREAM_ERROR(stream);
return INT2NUM(c);
}
puts(*args)
click to toggle source
static VALUE fcgi_stream_puts(int argc, VALUE *argv, VALUE out)
{
int i;
VALUE line;
/* if no argument given, print newline. */
if (argc == 0) {
fcgi_stream_write(out, rb_default_rs);
return Qnil;
}
for (i=0; i<argc; i++) {
switch (TYPE(argv[i])) {
case T_NIL:
line = rb_str_new2("nil");
break;
case T_ARRAY:
rb_exec_recursive(fcgi_stream_puts_ary, argv[i], out);
continue;
default:
line = argv[i];
break;
}
line = rb_obj_as_string(line);
fcgi_stream_write(out, line);
if (RSTRING_PTR(line)[RSTRING_LEN(line)-1] != '\n') {
fcgi_stream_write(out, rb_default_rs);
}
}
return Qnil;
}
read(*args)
click to toggle source
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_Stream(self, 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;
}
num = argv[0];
n = NUM2INT(num);
buff = ALLOC_N(char, n);
n = FCGX_GetStr(buff, n, stream);
CHECK_STREAM_ERROR(stream);
if (n > 0) {
str = rb_str_new(buff, n);
OBJ_TAINT(str);
free(buff);
return str;
}
else {
free(buff);
return Qnil;
}
}
sync()
click to toggle source
static VALUE fcgi_stream_sync(VALUE self)
{
if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) {
rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
}
return Qfalse;
}
sync=(p1)
click to toggle source
static VALUE fcgi_stream_setsync(VALUE self,VALUE sync)
{
if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) {
rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
}
return Qfalse;
}
tty?()
click to toggle source
static VALUE fcgi_stream_isatty(VALUE self)
{
if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) {
rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
}
return Qfalse;
}
ungetc(p1)
click to toggle source
static VALUE fcgi_stream_ungetc(VALUE self, VALUE ch)
{
FCGX_Stream *stream;
int c;
if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) {
rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
}
Data_Get_Stream(self, stream);
c = FCGX_UnGetChar(NUM2INT(ch), stream);
CHECK_STREAM_ERROR(stream);
return INT2NUM(c);
}
write(p1)
click to toggle source
static VALUE fcgi_stream_write(VALUE self, VALUE str)
{
FCGX_Stream *stream;
int len;
rb_secure(4);
Data_Get_Stream(self, stream);
str = rb_obj_as_string(str);
len = FCGX_PutStr(RSTRING_PTR(str), RSTRING_LEN(str), stream);
if (len == EOF) CHECK_STREAM_ERROR(stream);
return INT2NUM(len);
}