2004-03-04  Jakub Jelinek  <jakub@redhat.com>

	* iconv/iconv_prog.c (process_block): Handle omit_invalid.
	If iconv returns EILSEQ with omit_invalid, continue converting
	and return 1 if no other errors are seen.
	(main): Set status to EXIT_FAILURE whenever process_* returns
	nonzero, but only stop processing further files if iy returns
	negative value.
This commit is contained in:
Ulrich Drepper 2004-03-04 19:14:56 +00:00
parent d8c5a2cc2a
commit f2fcb018ad
3 changed files with 53 additions and 32 deletions

View File

@ -1,3 +1,12 @@
2004-03-04 Jakub Jelinek <jakub@redhat.com>
* iconv/iconv_prog.c (process_block): Handle omit_invalid.
If iconv returns EILSEQ with omit_invalid, continue converting
and return 1 if no other errors are seen.
(main): Set status to EXIT_FAILURE whenever process_* returns
nonzero, but only stop processing further files if iy returns
negative value.
2004-03-03 Jakub Jelinek <jakub@redhat.com> 2004-03-03 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/x86_64/posix_fadvise.c: New file. * sysdeps/unix/sysv/linux/x86_64/posix_fadvise.c: New file.

View File

@ -280,7 +280,7 @@ conversion from `%s' and to `%s' are not supported"),
struct stat st; struct stat st;
char *addr; char *addr;
#endif #endif
int fd; int fd, ret;
if (verbose) if (verbose)
printf ("%s:\n", argv[remaining]); printf ("%s:\n", argv[remaining]);
@ -313,43 +313,42 @@ conversion from `%s' and to `%s' are not supported"),
_("error while closing input `%s'"), _("error while closing input `%s'"),
argv[remaining]); argv[remaining]);
if (process_block (cd, addr, st.st_size, output) < 0) ret = process_block (cd, addr, st.st_size, output);
{
/* Something went wrong. */
status = EXIT_FAILURE;
/* We don't need the input data anymore. */ /* We don't need the input data anymore. */
munmap ((void *) addr, st.st_size); munmap ((void *) addr, st.st_size);
if (ret != 0)
{
status = EXIT_FAILURE;
if (ret < 0)
/* We cannot go on with producing output since it might /* We cannot go on with producing output since it might
lead to problem because the last output might leave lead to problem because the last output might leave
the output stream in an undefined state. */ the output stream in an undefined state. */
break; break;
} }
/* We don't need the input data anymore. */
munmap ((void *) addr, st.st_size);
} }
else else
#endif /* _POSIX_MAPPED_FILES */ #endif /* _POSIX_MAPPED_FILES */
{ {
/* Read the file in pieces. */ /* Read the file in pieces. */
if (process_fd (cd, fd, output) != 0) ret = process_fd (cd, fd, output);
/* Now close the file. */
close (fd);
if (ret != 0)
{ {
/* Something went wrong. */ /* Something went wrong. */
status = EXIT_FAILURE; status = EXIT_FAILURE;
/* We don't need the input file anymore. */ if (ret < 0)
close (fd);
/* We cannot go on with producing output since it might /* We cannot go on with producing output since it might
lead to problem because the last output might leave lead to problem because the last output might leave
the output stream in an undefined state. */ the output stream in an undefined state. */
break; break;
} }
/* Now close the file. */
close (fd);
} }
} }
while (++remaining < argc); while (++remaining < argc);
@ -438,6 +437,7 @@ process_block (iconv_t cd, char *addr, size_t len, FILE *output)
char *outptr; char *outptr;
size_t outlen; size_t outlen;
size_t n; size_t n;
int ret = 0;
while (len > 0) while (len > 0)
{ {
@ -445,6 +445,15 @@ process_block (iconv_t cd, char *addr, size_t len, FILE *output)
outlen = OUTBUF_SIZE; outlen = OUTBUF_SIZE;
n = iconv (cd, &addr, &len, &outptr, &outlen); n = iconv (cd, &addr, &len, &outptr, &outlen);
if (n == (size_t) -1 && omit_invalid && errno == EILSEQ)
{
ret = 1;
if (len == 0)
n = 0;
else
errno = E2BIG;
}
if (outptr != outbuf) if (outptr != outbuf)
{ {
/* We have something to write out. */ /* We have something to write out. */
@ -469,7 +478,7 @@ conversion stopped due to problem in writing the output"));
character sets we have to flush the state now. */ character sets we have to flush the state now. */
outptr = outbuf; outptr = outbuf;
outlen = OUTBUF_SIZE; outlen = OUTBUF_SIZE;
(void) iconv (cd, NULL, NULL, &outptr, &outlen); n = iconv (cd, NULL, NULL, &outptr, &outlen);
if (outptr != outbuf) if (outptr != outbuf)
{ {
@ -489,7 +498,14 @@ conversion stopped due to problem in writing the output"));
errno = errno_save; errno = errno_save;
} }
if (n != (size_t) -1)
break; break;
if (omit_invalid && errno == EILSEQ)
{
ret = 1;
break;
}
} }
if (errno != E2BIG) if (errno != E2BIG)
@ -518,7 +534,7 @@ incomplete character or shift sequence at end of buffer"));
} }
} }
return 0; return ret;
} }

View File

@ -1,4 +0,0 @@
# File name Caller Syscall name # args Strong name Weak names
# System calls with wrappers.
posix_fadvise64 - fadvise64 Vi:iiii posix_fadvise64 posix_fadvise