untar - improved EOF marker handling
This commit is contained in:
parent
4e04c5044c
commit
9bea60d43a
@ -34,7 +34,7 @@ int main (int argc, char* argv[])
|
|||||||
if (!fp)
|
if (!fp)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "Error: unable to open file %s\n", argv[1]);
|
fprintf (stderr, "Error: unable to open file %s\n", argv[1]);
|
||||||
hio_tar_close (hio);
|
hio_tar_close (untar);
|
||||||
hio_close (hio);
|
hio_close (hio);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -43,7 +43,7 @@ int main (int argc, char* argv[])
|
|||||||
while (!feof(fp) && !ferror(fp))
|
while (!feof(fp) && !ferror(fp))
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
char buf[99]; /* TODO: use a different buffer size???*/
|
char buf[512]; /* TODO: use a different buffer size???*/
|
||||||
n = fread(buf, 1, sizeof(buf), fp);
|
n = fread(buf, 1, sizeof(buf), fp);
|
||||||
if (n > 0)
|
if (n > 0)
|
||||||
{
|
{
|
||||||
|
@ -75,7 +75,8 @@ enum hio_tar_state_t
|
|||||||
{
|
{
|
||||||
HIO_TAR_STATE_START,
|
HIO_TAR_STATE_START,
|
||||||
HIO_TAR_STATE_FILE,
|
HIO_TAR_STATE_FILE,
|
||||||
HIO_TAR_STATE_END
|
HIO_TAR_STATE_END_1,
|
||||||
|
HIO_TAR_STATE_END_2
|
||||||
};
|
};
|
||||||
typedef enum hio_tar_state_t hio_tar_state_t;
|
typedef enum hio_tar_state_t hio_tar_state_t;
|
||||||
|
|
||||||
|
20
lib/tar.c
20
lib/tar.c
@ -245,9 +245,8 @@ printf("process_header...\n");
|
|||||||
/* all-zero byte block ends the archive */
|
/* all-zero byte block ends the archive */
|
||||||
if (HIO_MEMCMP(hdr, _end_block, HIO_TAR_BLKSIZE) == 0)
|
if (HIO_MEMCMP(hdr, _end_block, HIO_TAR_BLKSIZE) == 0)
|
||||||
{
|
{
|
||||||
/* TODO: is it correct? */
|
/* two all-zero blocks are expected as the EOF indicator */
|
||||||
printf ("end of input\n");
|
tar->state = HIO_TAR_STATE_END_1;
|
||||||
tar->state = HIO_TAR_STATE_END;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -362,11 +361,10 @@ static int process_content (hio_tar_t* tar)
|
|||||||
|
|
||||||
int hio_tar_feed (hio_tar_t* tar, const void* ptr, hio_oow_t len)
|
int hio_tar_feed (hio_tar_t* tar, const void* ptr, hio_oow_t len)
|
||||||
{
|
{
|
||||||
printf ("feed len = %d\n", len);
|
|
||||||
if (!ptr)
|
if (!ptr)
|
||||||
{
|
{
|
||||||
/* EOF indicator */
|
/* EOF indicator */
|
||||||
if (tar->state != HIO_TAR_STATE_END || tar->blk.len > 0)
|
if ((tar->state != HIO_TAR_STATE_END_1 && tar->state != HIO_TAR_STATE_END_2) || tar->blk.len > 0)
|
||||||
{
|
{
|
||||||
/* ERROR - premature end of file */
|
/* ERROR - premature end of file */
|
||||||
hio_seterrbfmt (tar->hio, HIO_EINVAL, "premature end of feed");
|
hio_seterrbfmt (tar->hio, HIO_EINVAL, "premature end of feed");
|
||||||
@ -393,17 +391,25 @@ printf ("feed len = %d\n", len);
|
|||||||
{
|
{
|
||||||
case HIO_TAR_STATE_START:
|
case HIO_TAR_STATE_START:
|
||||||
if (process_header(tar) <= -1) return -1;
|
if (process_header(tar) <= -1) return -1;
|
||||||
if (tar->state == HIO_TAR_STATE_END) printf ("remaining data len %d\n", len);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HIO_TAR_STATE_FILE:
|
case HIO_TAR_STATE_FILE:
|
||||||
if (process_content(tar) <= -1) return -1;
|
if (process_content(tar) <= -1) return -1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HIO_TAR_STATE_END:
|
case HIO_TAR_STATE_END_1:
|
||||||
|
if (HIO_MEMCMP(tar->blk.buf, _end_block, HIO_TAR_BLKSIZE) == 0)
|
||||||
|
{
|
||||||
|
tar->state = HIO_TAR_STATE_END_2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* fall thru here for the trailing garbage error */
|
||||||
|
|
||||||
|
case HIO_TAR_STATE_END_2:
|
||||||
/* garbage after the final ending block */
|
/* garbage after the final ending block */
|
||||||
hio_seterrbfmt (tar->hio, HIO_EINVAL, "trailing garbage at the end of feed");
|
hio_seterrbfmt (tar->hio, HIO_EINVAL, "trailing garbage at the end of feed");
|
||||||
return -1;
|
return -1;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
tar->blk.len = 0;
|
tar->blk.len = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user