diff options
-rw-r--r-- | src/argparse.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/argparse.c b/src/argparse.c index 6e6e158..106e818 100644 --- a/src/argparse.c +++ b/src/argparse.c @@ -113,6 +113,7 @@ struct _gpgrt_argparse_internal_s int idx; /* Note that this is saved and restored in _gpgrt_argparser. */ int inarg; /* (index into args) */ unsigned int verbose:1; /* Print diagnostics. */ + unsigned int forceeof:1; /* Force EOF due to an read errror. */ unsigned int stopped:1; /* Option processing has stopped. */ unsigned int in_sysconf:1; /* Processing global config file. */ unsigned int mark_forced:1; /* Mark options as forced. */ @@ -338,6 +339,7 @@ initialize (gpgrt_argparse_t *arg, gpgrt_opt_t *opts, estream_t fp) arg->internal->last = NULL; arg->internal->inarg = 0; arg->internal->stopped = 0; + arg->internal->forceeof = 0; arg->internal->in_sysconf = 0; arg->internal->command_seen = 0; arg->internal->explicit_cmd_mode = 0; @@ -1789,6 +1791,8 @@ _gpgrt_argparse (estream_t fp, gpgrt_argparse_t *arg, gpgrt_opt_t *opts_orig) /* Get the next character from the line. */ if (unread_buf_count) c = unread_buf[3 - unread_buf_count--]; + else if (arg->internal->forceeof) + c = EOF; else c = _gpgrt_fgetc (fp); @@ -1916,10 +1920,18 @@ _gpgrt_argparse (estream_t fp, gpgrt_argparse_t *arg, gpgrt_opt_t *opts_orig) else if (c == EOF) { ignore_invalid_option_clear (arg); - if (_gpgrt_ferror (fp)) - arg->r_opt = ARGPARSE_READ_ERROR; + if (_gpgrt_ferror (fp) && !arg->internal->forceeof) + { + arg->r_opt = ARGPARSE_READ_ERROR; + /* We delay the EOF so that the caller can print a + * "read error". */ + arg->internal->forceeof = 1; + } else - arg->r_opt = 0; /* EOF. */ + { + arg->r_opt = 0; /* EOF. */ + arg->internal->forceeof = 0; + } goto leave; } state = Ainit; @@ -2312,6 +2324,7 @@ _gpgrt_argparser (gpgrt_argparse_t *arg, gpgrt_opt_t *opts, arg->internal->verbose = 0; arg->internal->expand = 0; arg->internal->stopped = 0; + arg->internal->forceeof = 0; arg->internal->inarg = 0; _gpgrt_fclose (arg->internal->conffp); arg->internal->conffp = _gpgrt_fopen (arg->internal->confname, "r"); @@ -2397,6 +2410,7 @@ _gpgrt_argparser (gpgrt_argparse_t *arg, gpgrt_opt_t *opts, arg->internal->verbose = 0; arg->internal->expand = 0; arg->internal->stopped = 0; + arg->internal->forceeof = 0; arg->internal->inarg = 0; arg->internal->in_sysconf = 0; _gpgrt_fclose (arg->internal->conffp); @@ -2444,6 +2458,7 @@ _gpgrt_argparser (gpgrt_argparse_t *arg, gpgrt_opt_t *opts, arg->internal->verbose = 0; arg->internal->expand = 0; arg->internal->stopped = 0; + arg->internal->forceeof = 0; arg->internal->inarg = 0; arg->internal->in_sysconf = 0; if (!arg->argc || !arg->argv || !*arg->argv) |