ad7b3b8
diff --git a/lib/isc/include/isc/stdio.h b/lib/isc/include/isc/stdio.h
ad7b3b8
index 1f44b5a..a3625f9 100644
ad7b3b8
--- a/lib/isc/include/isc/stdio.h
ad7b3b8
+++ b/lib/isc/include/isc/stdio.h
ad7b3b8
@@ -69,6 +69,9 @@ isc_stdio_sync(FILE *f);
ad7b3b8
  * direct counterpart in the stdio library.
ad7b3b8
  */
ad7b3b8
 
ad7b3b8
+isc_result_t
ad7b3b8
+isc_stdio_fgetc(FILE *f, int *ret);
ad7b3b8
+
ad7b3b8
 ISC_LANG_ENDDECLS
ad7b3b8
 
ad7b3b8
 #endif /* ISC_STDIO_H */
ad7b3b8
diff --git a/lib/isc/lex.c b/lib/isc/lex.c
7726ce7
index ca5fe6d..b0152eb 100644
ad7b3b8
--- a/lib/isc/lex.c
ad7b3b8
+++ b/lib/isc/lex.c
7726ce7
@@ -433,15 +433,11 @@ isc_lex_gettoken(isc_lex_t *lex, unsigned int options, isc_token_t *tokenp) {
Adam Tkac 3475d4c
 			if (source->is_file) {
Adam Tkac 3475d4c
 				stream = source->input;
Adam Tkac 3475d4c
 
7726ce7
-#if defined(HAVE_FLOCKFILE) && defined(HAVE_GETC_UNLOCKED)
Adam Tkac 3475d4c
-				c = getc_unlocked(stream);
Adam Tkac 3475d4c
-#else
Adam Tkac 3475d4c
-				c = getc(stream);
Adam Tkac 3475d4c
-#endif
Adam Tkac 3475d4c
-				if (c == EOF) {
Adam Tkac 3475d4c
-					if (ferror(stream)) {
Adam Tkac 3475d4c
-						source->result = ISC_R_IOERROR;
Adam Tkac 3475d4c
-						result = source->result;
Adam Tkac 3475d4c
+				result = isc_stdio_fgetc(stream, &c);
Adam Tkac 3475d4c
+
Adam Tkac 3475d4c
+				if (result != ISC_R_SUCCESS) {
Adam Tkac 3475d4c
+					if (result != ISC_R_EOF) {
Adam Tkac 3475d4c
+						source->result = result;
Adam Tkac 3475d4c
 						goto done;
Adam Tkac 3475d4c
 					}
ad7b3b8
 					source->at_eof = true;
ad7b3b8
diff --git a/lib/isc/unix/errno2result.c b/lib/isc/unix/errno2result.c
7726ce7
index d72d56f..4287ff3 100644
ad7b3b8
--- a/lib/isc/unix/errno2result.c
ad7b3b8
+++ b/lib/isc/unix/errno2result.c
7726ce7
@@ -42,6 +42,7 @@ isc___errno2result(int posixerrno, bool dolog,
Adam Tkac 3475d4c
 	case EINVAL:		/* XXX sometimes this is not for files */
Adam Tkac 3475d4c
 	case ENAMETOOLONG:
Adam Tkac 3475d4c
 	case EBADF:
Adam Tkac 3475d4c
+	case EISDIR:
Adam Tkac 3475d4c
 		return (ISC_R_INVALIDFILE);
Adam Tkac 3475d4c
 	case ENOENT:
Adam Tkac 3475d4c
 		return (ISC_R_FILENOTFOUND);
ad7b3b8
diff --git a/lib/isc/unix/stdio.c b/lib/isc/unix/stdio.c
7726ce7
index d2b1dda..79630b2 100644
ad7b3b8
--- a/lib/isc/unix/stdio.c
ad7b3b8
+++ b/lib/isc/unix/stdio.c
7726ce7
@@ -141,3 +141,22 @@ isc_stdio_sync(FILE *f) {
Adam Tkac 3475d4c
 		return (isc__errno2result(errno));
Adam Tkac 3475d4c
 }
Adam Tkac 3475d4c
 
Adam Tkac 3475d4c
+isc_result_t
Adam Tkac 3475d4c
+isc_stdio_fgetc(FILE *f, int *ret) {
Adam Tkac 3475d4c
+	int r;
Adam Tkac 3475d4c
+	isc_result_t result = ISC_R_SUCCESS;
Adam Tkac 3475d4c
+
Adam Tkac 3475d4c
+#if defined(HAVE_FLOCKFILE) && defined(HAVE_GETCUNLOCKED)
Adam Tkac 3475d4c
+	r = fgetc_unlocked(f);
Adam Tkac 3475d4c
+#else
7726ce7
+	r = fgetc(f);
Adam Tkac 3475d4c
+#endif
Adam Tkac 3475d4c
+
Adam Tkac 3475d4c
+	if (r == EOF)
Adam Tkac 3475d4c
+		result = ferror(f) ? isc__errno2result(errno) : ISC_R_EOF;
Adam Tkac 3475d4c
+
Adam Tkac 3475d4c
+	*ret = r;
Adam Tkac 3475d4c
+
Adam Tkac 3475d4c
+	return result;
Adam Tkac 3475d4c
+}
Adam Tkac 3475d4c
+