/* * call-seq: * ios.sysseek(offset, whence=SEEK_SET) => integer * * Seeks to a given <i>offset</i> in the stream according to the value * of <i>whence</i> (see <code>IO#seek</code> for values of * <i>whence</i>). Returns the new offset into the file. * * f = File.new("testfile") * f.sysseek(-13, IO::SEEK_END) #=> 53 * f.sysread(10) #=> "And so on." */ static VALUE rb_io_sysseek(argc, argv, io) int argc; VALUE *argv; VALUE io; { VALUE offset, ptrname; int whence = SEEK_SET; OpenFile *fptr; off_t pos; if (rb_scan_args(argc, argv, "11", &offset, &ptrname) == 2) { whence = NUM2INT(ptrname); } pos = NUM2OFFT(offset); GetOpenFile(io, fptr); if ((fptr->mode & FMODE_READABLE) && READ_DATA_BUFFERED(fptr->f)) { rb_raise(rb_eIOError, "sysseek for buffered IO"); } if ((fptr->mode & FMODE_WRITABLE) && (fptr->mode & FMODE_WBUF)) { rb_warn("sysseek for buffered IO"); } pos = lseek(fileno(fptr->f), pos, whence); if (pos == -1) rb_sys_fail(fptr->path); clearerr(fptr->f); return OFFT2NUM(pos); }