this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add unxip tool for unpacking XIP files

+102
+1
src/CMakeLists.txt
··· 171 171 add_subdirectory(external/openssh) 172 172 #add_subdirectory(external/top) 173 173 add_subdirectory(external/perl) 174 + add_subdirectory(unxip) 174 175 175 176 ###################### 176 177 # libc++ & libc++abi #
+16
src/unxip/CMakeLists.txt
··· 1 + project(unxip) 2 + 3 + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -nostdinc") 4 + 5 + include_directories( 6 + ${CMAKE_SOURCE_DIR}/src/xar 7 + ${CMAKE_SOURCE_DIR}/src/external/liblzma/src/liblzma/api 8 + ) 9 + 10 + 11 + add_darling_executable(xip_extract_cpio xip_extract_cpio.c) 12 + target_link_libraries(xip_extract_cpio system lzma xar) 13 + 14 + install(TARGETS xip_extract_cpio DESTINATION libexec/darling/usr/libexec) 15 + install(FILES unxip DESTINATION libexec/darling/usr/bin) 16 +
+10
src/unxip/unxip
··· 1 + #!/bin/sh 2 + 3 + if [ $# != 1 ]; then 4 + echo "Unpack a XIP file" 5 + echo "Usage: unxip <xip-file>" 6 + exit 1 7 + fi 8 + 9 + /usr/libexec/xip_extract_cpio "$1" | cpio -i 10 +
+75
src/unxip/xip_extract_cpio.c
··· 1 + // 2 + // main.c 3 + // pbzx 4 + // 5 + // Created by PHPdev32 on 6/20/14. 6 + // Licensed under GPLv3, full text at http://www.gnu.org/licenses/gpl-3.0.txt 7 + // 8 + // This code originated here: http://www.tonymacx86.com/threads/pbzx-stream-parser.135458/ 9 + 10 + #include <stdio.h> 11 + #include <stdint.h> 12 + #include <string.h> 13 + #include <stdlib.h> 14 + #include <xar/xar.h> 15 + 16 + #define min(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; }) 17 + #define err(c, m) if (c) { fprintf(stderr, m"\n"); exit(__COUNTER__ + 1); } 18 + #define XBSZ 1024*4 19 + #define ZBSZ 1024 20 + 21 + static inline void xar_read(char *buffer, uint32_t size, xar_stream *stream) { 22 + stream->next_out = buffer; 23 + stream->avail_out = size; 24 + while (stream->avail_out) 25 + err(xar_extract_tostream(stream) != XAR_STREAM_OK, "XAR extraction failure"); 26 + } 27 + 28 + static inline size_t cpio_out(char *buffer, size_t size) { 29 + size_t c = 0; 30 + while (c < size) 31 + c+= fwrite(buffer + c, 1, size - c, stdout); 32 + return c; 33 + } 34 + 35 + static inline uint64_t xar_read_64(xar_stream *stream) { 36 + char t[8]; 37 + xar_read(t, 8, stream); 38 + return __builtin_bswap64(*(uint64_t *)t); 39 + } 40 + 41 + int main(int argc, const char * argv[]) 42 + { 43 + char xbuf[XBSZ], *zbuf = malloc(ZBSZ); 44 + xar_t x; 45 + err(argc < 2, "No file specified"); 46 + err(!(x = xar_open(argv[1], READ)), "XAR open failure"); 47 + xar_iter_t i = xar_iter_new(); 48 + xar_file_t f = xar_file_first(x, i); 49 + char *path; 50 + while (strncmp((path = xar_get_path(f)), "Content", 7) && (f = xar_file_next(i))) 51 + free(path); 52 + free(path); 53 + xar_iter_free(i); 54 + err(!f, "No payload"); 55 + err(xar_verify(x, f) != XAR_STREAM_OK, "File verification failed"); 56 + xar_stream xs; 57 + err(xar_extract_tostream_init(x, f, &xs) != XAR_STREAM_OK, "XAR init failed"); 58 + xar_read(xbuf, 4, &xs); 59 + err(strncmp(xbuf, "pbzx", 4), "Not a pbzx stream"); 60 + uint64_t length = 0, flags = xar_read_64(&xs), last = 0; 61 + while (flags & 1 << 24) { 62 + flags = xar_read_64(&xs); 63 + length = xar_read_64(&xs); 64 + 65 + while (length) { 66 + xar_read(xbuf, min(XBSZ, (uint32_t)length), &xs); 67 + cpio_out(xbuf, min(XBSZ, length)); 68 + length -= last = min(XBSZ, length); 69 + } 70 + } 71 + xar_extract_tostream_end(&xs); 72 + free(zbuf); 73 + xar_close(x); 74 + return 0; 75 + }