Skip to content

Commit 8e74578

Browse files
committed
Interface for io flags.
1 parent c584bfb commit 8e74578

File tree

3 files changed

+21
-6
lines changed

3 files changed

+21
-6
lines changed

include/ruby/io.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,14 @@ int rb_ioptr_descriptor(const rb_io_t *fptr);
610610
*/
611611
VALUE rb_ioptr_tied_io_for_writing(const rb_io_t *fptr);
612612

613+
/**
614+
* Returns all the io mode flags, e.g. FMODE_SYNC.
615+
*
616+
* @param[in] fptr An IO fptr.
617+
* @retval enum rb_io_mode The flags.
618+
*/
619+
enum rb_io_mode rb_ioptr_mode(const rb_io_t *fptr);
620+
613621
RBIMPL_ATTR_NORETURN()
614622
void rb_ioptr_sys_fail(rb_io_t *fptr);
615623

io.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2775,6 +2775,12 @@ rb_ioptr_tied_io_for_writing(const rb_io_t *fptr)
27752775
return fptr->tied_io_for_writing;
27762776
}
27772777

2778+
enum rb_io_mode
2779+
rb_ioptr_mode(const rb_io_t *fptr)
2780+
{
2781+
return fptr->mode;
2782+
}
2783+
27782784
/*
27792785
* call-seq:
27802786
* pid -> integer or nil

spec/ruby/optional/capi/ext/io_spec.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ VALUE io_spec_rb_io_set_nonblock(VALUE self, VALUE io) {
229229
GetOpenFile(io, fp);
230230
rb_io_set_nonblock(fp);
231231
#ifdef F_GETFL
232-
flags = fcntl(fp->fd, F_GETFL, 0);
232+
flags = fcntl(io_spec_get_fd(io), F_GETFL, 0);
233233
return flags & O_NONBLOCK ? Qtrue : Qfalse;
234234
#else
235235
return Qfalse;
@@ -250,11 +250,12 @@ static VALUE io_spec_errno_set(VALUE self, VALUE val) {
250250
VALUE io_spec_mode_sync_flag(VALUE self, VALUE io) {
251251
rb_io_t *fp;
252252
GetOpenFile(io, fp);
253-
if (fp->mode & FMODE_SYNC) {
254-
return Qtrue;
255-
} else {
256-
return Qfalse;
257-
}
253+
254+
#ifdef RUBY_VERSION_IS_3_2
255+
return RBOOL(rb_ioptr_mode(fp) & FMODE_SYNC);
256+
#else
257+
return RBOOL(fp->mode & FMODE_SYNC);
258+
#endif
258259
}
259260

260261
void Init_io_spec(void) {

0 commit comments

Comments
 (0)