aboutsummaryrefslogtreecommitdiffstats
path: root/extension/readdir.c
diff options
context:
space:
mode:
authorAndrew J. Schorr <aschorr@telemetry-investments.com>2012-07-26 11:56:00 -0400
committerAndrew J. Schorr <aschorr@telemetry-investments.com>2012-07-26 11:56:00 -0400
commitca83de0ec92b56c712f7a7376b21a1a1337b3107 (patch)
tree1047916b5164a57d12ff50eaf26e5954803f0e29 /extension/readdir.c
parent1a69f3ec43ba9748ad63443f88b2e26b014c11d2 (diff)
downloadegawk-ca83de0ec92b56c712f7a7376b21a1a1337b3107.tar.gz
egawk-ca83de0ec92b56c712f7a7376b21a1a1337b3107.tar.bz2
egawk-ca83de0ec92b56c712f7a7376b21a1a1337b3107.zip
Document the parser interface and remove some excessive readdir paranoia.
Diffstat (limited to 'extension/readdir.c')
-rw-r--r--extension/readdir.c31
1 files changed, 12 insertions, 19 deletions
diff --git a/extension/readdir.c b/extension/readdir.c
index a39e0c3a..c838ea72 100644
--- a/extension/readdir.c
+++ b/extension/readdir.c
@@ -106,8 +106,10 @@ dir_get_record(char **out, struct iobuf_public *iobuf, int *errcode)
if (out == NULL || iobuf == NULL || iobuf->opaque == NULL)
return EOF;
- if (errcode != NULL)
- *errcode = 0;
+ /*
+ * The caller sets *errcode to 0, so we should set it only if an
+ * error occurs.
+ */
/* FIXME: Need stuff for setting RT */
dp = (DIR *) iobuf->opaque;
@@ -152,32 +154,23 @@ dir_can_take_file(IOBUF_PUBLIC *iobuf)
return (fd >= 0 && fstat(fd, & sbuf) >= 0 && S_ISDIR(sbuf.st_mode));
}
-/* dir_take_control_of --- set up input parser */
+/* dir_take_control_of --- set up input parser. We can assume that dir_can_take_file just returned true, and no state has changed since then. */
static int
dir_take_control_of(IOBUF_PUBLIC *iobuf)
{
struct stat sbuf;
- int fd;
- DIR *dp = NULL;
+ DIR *dp;
- if (iobuf == NULL)
+ dp = fdopendir(iobuf->fd);
+ if (dp == NULL)
return 0;
- fd = iobuf->fd;
- if (dir_can_take_file(iobuf)) {
- dp = fdopendir(fd);
- if (dp == NULL)
- return 0;
-
- iobuf->opaque = dp;
- iobuf->get_record = dir_get_record;
- iobuf->close_func = dir_close;
-
- return 1;
- }
+ iobuf->opaque = dp;
+ iobuf->get_record = dir_get_record;
+ iobuf->close_func = dir_close;
- return 0;
+ return 1;
}
static awk_input_parser_t readdir_parser = {