This is tricky, I suppose you could do it this way... by the way, I have downloaded the libmagic source and looking at it...
There's a function in there called magic_read_entries
within the minifile.c
(this is the pure vanilla source that I downloaded from sourceforge where it is reading from the external file.
You could append the magic
file (which is found in the /etc directory) to the end of the library code, like this cat magic >> libmagic.a
. In my system, magic
is 474443 bytes, libmagic.a
is 38588 bytes.
In the magic.c
file, you would need to change the magichandle_t* magic_init(unsigned flags)
function, at the end of the function, add the line magic_read_entries
and modify the function itself to read at the offset of the library itself to pull in the data, treat it as a pointer to pointer to char's (char **) and use that instead of reading from the file. Since you know where the offset is to the library data for reading, that should not be difficult.
Now the function magic_read_entries
will no longer be used, as it is not going to be read from a file anymore. The function `magichandle_t* magic_init(unsigned flags)' will take care of loading the entries and you should be ok there.
If you need further help, let me know,
Edit:
I have used the old 'libmagic' from sourceforge.net and here is what I did:
- Extracted the downloaded archive into my home directory, ungzipping/untarring the archive will create a folder called libmagic.
- Create a folder within libmagic and call it Test
- Copy the original magic.c and minifile.c into Test
- Using the enclosed diff output highlighting the difference, apply it onto the magic.c source.
48a49,51
> #define MAGIC_DATA_OFFSET 0x971C
> #define MAGIC_STAT_LIB_NAME "libmagic.a"
>
125a129,130
> /* magic_read_entries is obsolete... */
> magic_read_entries(mh, MAGIC_STAT_LIB_NAME);
251c256,262
<
---
>
> if (!fseek(fp, MAGIC_DATA_OFFSET, SEEK_SET)){
> if (ftell(fp) != MAGIC_DATA_OFFSET) return 0;
> }else{
> return 0;
> }
>
- Then issue make
- The magic file (which I copied from /etc, under Slackware Linux 12.2) is concatenated to the libmagic.a file, i.e.
cat magic >> libmagic.a
. The SHA checksum for magic is (4abf536f2ada050ce945fbba796564342d6c9a61 magic),
here's the exact data for magic
(-rw-r--r-- 1 root root 474443 2007-06-03 00:52 /etc/file/magic) as found on my system.
- Here's the diff for the minifile.c source, apply it and rebuild minifile executable by running make again.
40c40
< magic_read_entries(mh,"magic");
---
> /*magic_read_entries(mh,"magic");*/
It should work then. If not, you will need to adjust the offset into the library for reading by modifying the MAGIC_DATA_OFFSET. If you wish, I can stick up the magic data file into pastebin. Let me know.
Hope this helps,
Best regards,
Tom.
man libmagic
or check linux.die.net/include/magic.h, the timestamp is 2003. The one from SF is 2000 (sourceforge.net/projects/libmagic/files). Otherwise, I imagine this would be a good solution, and I could start figuring out how to pull it off. – Transposal