/* * Handle one file or directory. */ static int apprentice_1(RMagic *ms, const char *fn, int action, struct mlist *mlist) { struct r_magic *magic = NULL; ut32 nmagic = 0; struct mlist *ml; int rv = -1; int mapped; if (!ms) return -1; ms->haderr = 0; if (magicsize != FILE_MAGICSIZE) { file_error(ms, 0, "magic element size %lu != %lu", (unsigned long)(size_t)sizeof (*magic), (unsigned long)FILE_MAGICSIZE); return -1; } ms->file = fn; // fix use of ms->file before being initialized if (action == FILE_COMPILE) { rv = apprentice_load (ms, &magic, &nmagic, fn, action); if (rv != 0) return -1; rv = apprentice_compile (ms, &magic, &nmagic, fn); free (magic); return rv; } if ((rv = apprentice_map (ms, &magic, &nmagic, fn)) == -1) { //if (ms->flags & R_MAGIC_CHECK) // file_magwarn(ms, "using regular magic file `%s'", fn); rv = apprentice_load (ms, &magic, &nmagic, fn, action); if (rv != 0) return -1; } mapped = rv; if (magic == NULL) { file_delmagic (magic, mapped, nmagic); return -1; } if ((ml = malloc (sizeof (*ml))) == NULL) { file_delmagic (magic, mapped, nmagic); file_oomem (ms, sizeof(*ml)); free (magic); return -1; } ml->magic = magic; ml->nmagic = nmagic; ml->mapped = mapped; mlist->prev->next = ml; ml->prev = mlist->prev; ml->next = mlist; mlist->prev = ml; return 0; }
static void free_mlist(struct mlist *mlist) { struct mlist *ml; if (!mlist) return; for (ml = mlist->next; ml != mlist;) { struct mlist *next = ml->next; struct r_magic *mg = ml->magic; file_delmagic (mg, ml->mapped, ml->nmagic); free (ml); ml = next; } free (ml); }