]>
cygwin.com Git - cygwin-apps/setup.git/blob - archive_tar_file.cc
9e3f8ab860f8c1b151988afd391f7631bd8ef001
2 * Copyright (c) 2001, Robert Collins
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * A copy of the GNU General Public License can be found at
12 * Written by Robert Collins <rbtcollins@hotmail.com>
16 /* An individual stream from a tar archive. */
19 static const char *cvsid
= "\n%%% $Id$\n";
25 #include <sys/types.h>
26 #include <sys/fcntl.h>
29 #include "zlib/zlib.h"
30 #include "io_stream.h"
33 #include "archive_tar.h"
39 archive_tar_file::archive_tar_file (tar_state
& newstate
):state (newstate
)
43 archive_tar_file::~archive_tar_file ()
45 state
.header_read
= 0;
50 ssize_t
archive_tar_file::read (void *buffer
, size_t len
)
52 /* how many bytes do we want to give the user */
54 want
= min (len
, state
.file_length
- state
.file_offset
);
55 /* how many do we need to read after that to line up the file pointer */
57 roundup
= (512 - (want
% 512)) % 512;
61 got
= state
.parent
->read (buffer
, want
);
65 got2
= state
.parent
->read (throwaway
, roundup
);
66 if (got
== want
&& got2
== roundup
)
68 state
.file_offset
+= got
;
73 /* unexpected EOF or read error in the tar parent stream */
74 /* the user can query the parent for the error */
82 /* provide data to (double duh!) */
83 ssize_t
archive_tar_file::write (const void *buffer
, size_t len
)
85 /* write not supported */
89 /* read data without removing it from the class's internal buffer */
90 ssize_t
archive_tar_file::peek (void *buffer
, size_t len
)
93 want
= min (len
, state
.file_length
- state
.file_offset
);
97 got
= state
.parent
->peek (buffer
, want
);
104 /* unexpected EOF or read error in the tar parent stream */
105 /* the user can query the parent for the error */
114 archive_tar_file::tell ()
116 return state
.file_offset
;
120 archive_tar_file::seek (long where
, io_stream_seek_t whence
)
122 /* nothing needs seeking here yet. Implement when needed
127 /* try guessing this one */
129 archive_tar_file::error ()
131 return state
.lasterr
;
135 archive_tar_file::get_mtime ()
138 sscanf (state
.tar_header
.mtime
, "%o", &mtime
);
This page took 0.041551 seconds and 5 git commands to generate.