diff options
| author | 2009-03-11 10:49:34 +0100 | |
|---|---|---|
| committer | 2009-03-11 10:49:34 +0100 | |
| commit | d95c3578120e5bc4784069439f00ccb1b5f87717 (patch) | |
| tree | c819de31de3983f3d69f223ede07667ff23bf7da /lib/decompress.c | |
| parent | fix warning in arch/x86/kernel/cpu/intel_cacheinfo.c (diff) | |
| parent | Merge branches 'x86/cleanups', 'x86/kexec', 'x86/mce2' and 'linus' into x86/core (diff) | |
| download | wireguard-linux-d95c3578120e5bc4784069439f00ccb1b5f87717.tar.xz wireguard-linux-d95c3578120e5bc4784069439f00ccb1b5f87717.zip | |
Merge branch 'x86/core' into cpus4096
Diffstat (limited to 'lib/decompress.c')
| -rw-r--r-- | lib/decompress.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/decompress.c b/lib/decompress.c new file mode 100644 index 000000000000..d2842f571674 --- /dev/null +++ b/lib/decompress.c @@ -0,0 +1,54 @@ +/* + * decompress.c + * + * Detect the decompression method based on magic number + */ + +#include <linux/decompress/generic.h> + +#include <linux/decompress/bunzip2.h> +#include <linux/decompress/unlzma.h> +#include <linux/decompress/inflate.h> + +#include <linux/types.h> +#include <linux/string.h> + +#ifndef CONFIG_DECOMPRESS_GZIP +# define gunzip NULL +#endif +#ifndef CONFIG_DECOMPRESS_BZIP2 +# define bunzip2 NULL +#endif +#ifndef CONFIG_DECOMPRESS_LZMA +# define unlzma NULL +#endif + +static const struct compress_format { + unsigned char magic[2]; + const char *name; + decompress_fn decompressor; +} compressed_formats[] = { + { {037, 0213}, "gzip", gunzip }, + { {037, 0236}, "gzip", gunzip }, + { {0x42, 0x5a}, "bzip2", bunzip2 }, + { {0x5d, 0x00}, "lzma", unlzma }, + { {0, 0}, NULL, NULL } +}; + +decompress_fn decompress_method(const unsigned char *inbuf, int len, + const char **name) +{ + const struct compress_format *cf; + + if (len < 2) + return NULL; /* Need at least this much... */ + + for (cf = compressed_formats; cf->name; cf++) { + if (!memcmp(inbuf, cf->magic, 2)) + break; + + } + if (name) + *name = cf->name; + return cf->decompressor; +} |
