00001
00005 #include "system.h"
00006
00007 #if defined(HAVE_MAGIC_H)
00008 #include "magic.h"
00009 #endif
00010
00011 #include <rpmiotypes.h>
00012 #include <rpmio.h>
00013 #include <rpmlog.h>
00014 #define _RPMMG_INTERNAL
00015 #include <rpmmg.h>
00016
00017 #include "debug.h"
00018
00019
00020 int _rpmmg_debug = 0;
00021
00022
00023 static void rpmmgFini(void * _mg)
00024
00025
00026 {
00027 rpmmg mg = _mg;
00028
00029 #if defined(HAVE_MAGIC_H)
00030 if (mg->ms) {
00031 magic_close(mg->ms);
00032 mg->ms = NULL;
00033 }
00034 #endif
00035 mg->fn = _free(mg->fn);
00036 }
00037
00038
00039
00040 rpmioPool _rpmmgPool = NULL;
00041
00042 static rpmmg rpmmgGetPool( rpmioPool pool)
00043
00044
00045 {
00046 rpmmg mg;
00047
00048 if (_rpmmgPool == NULL) {
00049 _rpmmgPool = rpmioNewPool("mg", sizeof(*mg), -1, _rpmmg_debug,
00050 NULL, NULL, rpmmgFini);
00051 pool = _rpmmgPool;
00052 }
00053 return (rpmmg) rpmioGetPool(pool, sizeof(*mg));
00054 }
00055
00056 rpmmg rpmmgNew(const char * fn, int flags)
00057 {
00058 rpmmg mg = rpmmgGetPool(_rpmmgPool);
00059 int xx;
00060
00061 if (fn)
00062 mg->fn = xstrdup(fn);
00063 #if defined(HAVE_MAGIC_H)
00064 mg->flags = (flags ? flags : MAGIC_CHECK);
00065 mg->ms = magic_open(flags);
00066 if (mg->ms == NULL) {
00067 rpmlog(RPMLOG_ERR, _("magic_open(0x%x) failed: %s\n"),
00068 flags, strerror(errno));
00069 return rpmmgFree(mg);
00070 }
00071 xx = magic_load(mg->ms, mg->fn);
00072 if (xx == -1) {
00073 rpmlog(RPMLOG_ERR, _("magic_load(ms, %s) failed: %s\n"),
00074 (fn ? fn : "(nil)"), magic_error(mg->ms));
00075 return rpmmgFree(mg);
00076 }
00077 #endif
00078
00079 return rpmmgLink(mg);
00080 }
00081
00082 const char * rpmmgFile(rpmmg mg, const char *fn)
00083 {
00084 const char * t = NULL;
00085
00086 #if defined(HAVE_MAGIC_H)
00087 if (mg->ms) {
00088 t = magic_file(mg->ms, fn);
00089
00090 if (t == NULL) {
00091 const char * msg = magic_error(mg->ms);
00092 if (strstr(msg, "regexec error 17, (match failed)") == NULL)
00093 rpmlog(RPMLOG_ERR, _("magic_file(ms, %s) failed: %s\n"),
00094 (fn ? fn : "(nil)"), msg);
00095 }
00096 }
00097 #endif
00098
00099 if (t == NULL) t = "";
00100 t = xstrdup(t);
00101
00102 if (_rpmmg_debug)
00103 fprintf(stderr, "--> rpmmgFile(%p, %s) %s\n", mg, (fn ? fn : "(nil)"), t);
00104 return t;
00105 }
00106
00107 const char * rpmmgBuffer(rpmmg mg, const char * b, size_t nb)
00108 {
00109 const char * t = NULL;
00110
00111 #if defined(HAVE_MAGIC_H)
00112 if (mg->ms) {
00113 t = magic_buffer(mg->ms, b, nb);
00114
00115 if (t == NULL) {
00116 const char * msg = magic_error(mg->ms);
00117 if (strstr(msg, "regexec error 17, (match failed)") == NULL)
00118 rpmlog(RPMLOG_ERR, _("magic_buffer(ms, %p[%u]) failed: %s\n"),
00119 b, (unsigned)nb, msg);
00120 }
00121 }
00122 #endif
00123
00124 if (t == NULL) t = "";
00125 t = xstrdup(t);
00126
00127 if (_rpmmg_debug)
00128 fprintf(stderr, "--> rpmmgBuffer(%p, %p[%d]) %s\n", mg, b, (int)nb, t);
00129 return t;
00130 }