diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ipsw.c | 26 | ||||
| -rw-r--r-- | src/ipsw.h | 2 | 
2 files changed, 28 insertions, 0 deletions
| @@ -56,6 +56,32 @@ ipsw_archive* ipsw_open(const char* ipsw) {  	return archive;  } +int ipsw_get_file_size(const char* ipsw, const char* infile, off_t* size) { +	ipsw_archive* archive = ipsw_open(ipsw); +	if (archive == NULL || archive->zip == NULL) { +		error("ERROR: Invalid archive\n"); +		return -1; +	} + +	int zindex = zip_name_locate(archive->zip, infile, 0); +	if (zindex < 0) { +		error("ERROR: zip_name_locate: %s\n", infile); +		return -1; +	} + +	struct zip_stat zstat; +	zip_stat_init(&zstat); +	if (zip_stat_index(archive->zip, zindex, 0, &zstat) != 0) { +		error("ERROR: zip_stat_index: %s\n", infile); +		return -1; +	} + +	*size = zstat.size; + +	ipsw_close(archive); +	return 0; +} +  int ipsw_extract_to_file(const char* ipsw, const char* infile, const char* outfile) {  	ipsw_archive* archive = ipsw_open(ipsw);  	if (archive == NULL || archive->zip == NULL) { @@ -37,6 +37,8 @@ typedef struct {  	unsigned char* data;  } ipsw_file; +int ipsw_get_file_size(const char* ipsw, const char* infile, off_t* size); +int ipsw_extract_to_file(const char* ipsw, const char* infile, const char* outfile);  int ipsw_extract_to_memory(const char* ipsw, const char* infile, char** pbuffer, uint32_t* psize);  int ipsw_extract_build_manifest(const char* ipsw, plist_t* buildmanifest, int *tss_enabled);  int ipsw_extract_restore_plist(const char* ipsw, plist_t* restore_plist); | 
