}
/* Allocates memory */
-void factor_vm::io_error() {
+void factor_vm::io_error_if_not_EINTR() {
if (errno == EINTR)
return;
for (;;) {
file = fopen(filename, mode);
if (file == NULL)
- io_error();
+ io_error_if_not_EINTR();
else
break;
}
if (feof(stream))
return EOF;
else
- io_error();
+ io_error_if_not_EINTR();
} else
break;
}
if (feof(stream))
break;
else
- io_error();
+ io_error_if_not_EINTR();
}
items_read += ret;
} while (items_read != nitems);
void factor_vm::safe_fputc(int c, FILE* stream) {
for (;;) {
if (putc(c, stream) == EOF)
- io_error();
+ io_error_if_not_EINTR();
else
break;
}
ret = fwrite((void*)((int*)ptr + items_written * size), size,
nitems - items_written, stream);
if (ret == 0)
- io_error();
+ io_error_if_not_EINTR();
items_written += ret;
} while (items_written != nitems);
off_t offset;
for (;;) {
if ((offset = FTELL(stream)) == -1)
- io_error();
+ io_error_if_not_EINTR();
else
break;
}
for (;;) {
if (FSEEK(stream, offset, whence) == -1)
- io_error();
+ io_error_if_not_EINTR();
else
break;
}
void factor_vm::safe_fflush(FILE* stream) {
for (;;) {
if (fflush(stream) == EOF)
- io_error();
+ io_error_if_not_EINTR();
else
break;
}
}
+// Call fclose() once only. Issues #1335, #908.
void factor_vm::safe_fclose(FILE* stream) {
- for (;;) {
- if (fclose(stream) == EOF)
- io_error();
- else
- break;
- }
+ if (fclose(stream) == EOF && errno != EINTR)
+ general_error(ERROR_IO, tag_fixnum(errno), false_object);
}
void factor_vm::primitive_fopen() {
size_t written = safe_fwrite(text, 1, length, file);
if (written != length)
- io_error();
+ io_error_if_not_EINTR();
}
void factor_vm::primitive_ftell() {