1 1.1 ad /* $NetBSD: bin2blob.c,v 1.1 2008/05/04 23:50:32 ad Exp $ */ 2 1.1 ad 3 1.1 ad /*- 4 1.1 ad * Copyright (c) 2008 The NetBSD Foundation, Inc. 5 1.1 ad * All rights reserved. 6 1.1 ad * 7 1.1 ad * Redistribution and use in source and binary forms, with or without 8 1.1 ad * modification, are permitted provided that the following conditions 9 1.1 ad * are met: 10 1.1 ad * 1. Redistributions of source code must retain the above copyright 11 1.1 ad * notice, this list of conditions and the following disclaimer. 12 1.1 ad * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 ad * notice, this list of conditions and the following disclaimer in the 14 1.1 ad * documentation and/or other materials provided with the distribution. 15 1.1 ad * 16 1.1 ad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 1.1 ad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 1.1 ad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 1.1 ad * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 1.1 ad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 1.1 ad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 1.1 ad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 1.1 ad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 1.1 ad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 1.1 ad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 1.1 ad * POSSIBILITY OF SUCH DAMAGE. 27 1.1 ad */ 28 1.1 ad 29 1.1 ad /* 30 1.1 ad * Reads data from stdin (must be a regular file so we can do stat()), and 31 1.1 ad * outputs a 32-bit array of format: 32 1.1 ad * 33 1.1 ad * [0] signature: BLOB 34 1.1 ad * [1] original, uncompressed length 35 1.1 ad * [2] length of compressed data that follows, unpadded 36 1.1 ad * [n] zlib compressed data, padded to 4 bytes 37 1.1 ad */ 38 1.1 ad 39 1.1 ad #include <sys/cdefs.h> 40 1.1 ad #ifndef lint 41 1.1 ad __RCSID("$NetBSD: bin2blob.c,v 1.1 2008/05/04 23:50:32 ad Exp $"); 42 1.1 ad #endif /* !lint */ 43 1.1 ad 44 1.1 ad #include <sys/module.h> 45 1.1 ad #include <sys/stat.h> 46 1.1 ad 47 1.1 ad #include <stdio.h> 48 1.1 ad #include <stdlib.h> 49 1.1 ad #include <unistd.h> 50 1.1 ad #include <string.h> 51 1.1 ad #include <err.h> 52 1.1 ad #include <zlib.h> 53 1.1 ad 54 1.1 ad int main(int, char **); 55 1.1 ad 56 1.1 ad #define SIG 0x424c4f42 57 1.1 ad 58 1.1 ad void 59 1.1 ad put(uint32_t val) 60 1.1 ad { 61 1.1 ad static int n; 62 1.1 ad 63 1.1 ad switch (n) { 64 1.1 ad case 6: 65 1.1 ad putc('\n', stdout); 66 1.1 ad n = 0; 67 1.1 ad /* FALLTHROUGH */ 68 1.1 ad case 0: 69 1.1 ad putc('\t', stdout); 70 1.1 ad break; 71 1.1 ad } 72 1.1 ad printf("0x%08x,", val); 73 1.1 ad n++; 74 1.1 ad } 75 1.1 ad 76 1.1 ad int 77 1.1 ad main(int argc, char **argv) 78 1.1 ad { 79 1.1 ad struct stat sb; 80 1.1 ad uint8_t *src, *dst; 81 1.1 ad u_long slen, dlen; 82 1.1 ad uint32_t *dp; 83 1.1 ad 84 1.1 ad if (fstat(STDIN_FILENO, &sb) < 0) 85 1.1 ad err(1, "stat(stdin)"); 86 1.1 ad 87 1.1 ad src = malloc(sb.st_size); 88 1.1 ad dlen = sb.st_size * 1002 / 1000 + 12 + 3 + 4*2; 89 1.1 ad dst = malloc(dlen); 90 1.1 ad if (src == NULL || dst == NULL) 91 1.1 ad errx(1, "malloc"); 92 1.1 ad 93 1.1 ad if (read(STDIN_FILENO, src, sb.st_size) != sb.st_size) 94 1.1 ad errx(1, "read"); 95 1.1 ad 96 1.1 ad slen = sb.st_size; 97 1.1 ad memset(dst, 0, dlen); 98 1.1 ad if (compress2(dst, &dlen, src, slen, 9) != Z_OK) 99 1.1 ad errx(1, "compress2"); 100 1.1 ad 101 1.1 ad printf("static const uint32_t blob[] = {\n"); 102 1.1 ad put(SIG); 103 1.1 ad put(slen); 104 1.1 ad put(dlen); 105 1.1 ad dlen = ((dlen + 3) & ~3) >> 2; 106 1.1 ad dp = (uint32_t *)dst; 107 1.1 ad while (dlen--) 108 1.1 ad put(*dp++); 109 1.1 ad printf("\n};\n"); 110 1.1 ad 111 1.1 ad exit(EXIT_SUCCESS); 112 1.1 ad } 113