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