From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: joakim@verona.se Newsgroups: gmane.emacs.devel Subject: Re: using libmagic in Emacs? Date: Fri, 21 Aug 2009 11:55:45 +0200 Message-ID: References: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: ger.gmane.org 1250848599 19142 80.91.229.12 (21 Aug 2009 09:56:39 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 21 Aug 2009 09:56:39 +0000 (UTC) Cc: Stefan Monnier , Emacs Development To: Andreas Schwab Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Fri Aug 21 11:56:31 2009 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1MeQrG-0003Ip-Lm for ged-emacs-devel@m.gmane.org; Fri, 21 Aug 2009 11:56:31 +0200 Original-Received: from localhost ([127.0.0.1]:39117 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MeQrF-00068i-VH for ged-emacs-devel@m.gmane.org; Fri, 21 Aug 2009 05:56:29 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MeQqw-00065A-1T for emacs-devel@gnu.org; Fri, 21 Aug 2009 05:56:10 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MeQqq-00064Y-Ie for emacs-devel@gnu.org; Fri, 21 Aug 2009 05:56:08 -0400 Original-Received: from [199.232.76.173] (port=55431 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MeQqq-00064V-C1 for emacs-devel@gnu.org; Fri, 21 Aug 2009 05:56:04 -0400 Original-Received: from proxy3.bredband.net ([195.54.101.73]:59546) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MeQqp-0002Nr-KQ for emacs-devel@gnu.org; Fri, 21 Aug 2009 05:56:04 -0400 Original-Received: from iph1.telenor.se (195.54.127.132) by proxy3.bredband.net (7.3.140.3) id 49F597CD02EEEE8D for emacs-devel@gnu.org; Fri, 21 Aug 2009 11:56:00 +0200 X-SMTPAUTH-B2: X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhmWAEoMjkpT44qWPGdsb2JhbACWRoQ3AQEBATe7QIQYBYFP X-IronPort-AV: E=Sophos;i="4.44,249,1249250400"; d="scan'208";a="37994755" Original-Received: from ua-83-227-138-150.cust.bredbandsbolaget.se (HELO exodia) ([83.227.138.150]) by iph1.telenor.se with ESMTP; 21 Aug 2009 11:56:00 +0200 Original-Received: from localhost.localdomain (DIR-655.lan [192.168.200.113]) (authenticated bits=0) by exodia (8.14.3/8.14.3) with ESMTP id n7L9tjn6008476 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Fri, 21 Aug 2009 11:55:45 +0200 In-Reply-To: (Andreas Schwab's message of "Fri, 21 Aug 2009 00:08:21 +0200") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.50 (gnu/linux) X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:114470 Archived-At: --=-=-= New libmagic patch, mostly fixing Andreas concerns, and some more error handling. I dont understand the autoheader comment below though. When I originaly compiled, the config.h wasnt generated with the libmagic info included, did I do something wrong? Is autoheader supposed to generate config.in? When does that happen? /Joakim Andreas Schwab writes: > joakim@verona.se writes: > >> diff --git a/configure.in b/configure.in >> index f4096db..cb74523 100644 >> --- a/configure.in >> +++ b/configure.in >> @@ -137,6 +137,8 @@ OPTION_DEFAULT_ON([xft],[don't use XFT for anti aliased fonts]) >> OPTION_DEFAULT_ON([libotf],[don't use libotf for OpenType font support]) >> OPTION_DEFAULT_ON([m17n-flt],[don't use m17n-flt for text shaping]) >> >> +OPTION_DEFAULT_ON([filemagic],[don't compile with filemagic support]) > > IMHO the option should be named libmagic, since that's how the library > is named. > >> diff --git a/src/config.in b/src/config.in >> index 404e00b..c966a09 100644 >> --- a/src/config.in >> +++ b/src/config.in >> @@ -262,6 +262,9 @@ along with GNU Emacs. If not, see . */ >> /* Define to 1 if you have the gpm library (-lgpm). */ >> #undef HAVE_GPM >> >> +/* Define to 1 if you have the filemagic library (-lmagic). */ >> +#undef HAVE_LIBMAGIC >> + >> /* Define to 1 if you have the `grantpt' function. */ >> #undef HAVE_GRANTPT >> > > This is generated by autoheader. > >> diff --git a/src/fileio.c b/src/fileio.c >> index 3702d4c..375502e 100644 >> --- a/src/fileio.c >> +++ b/src/fileio.c >> @@ -205,6 +205,10 @@ Lisp_Object Vdirectory_sep_char; >> int write_region_inhibit_fsync; >> #endif >> >> +#ifdef HAVE_LIBMAGIC >> +#include >> +#endif >> + >> /* Non-zero means call move-file-to-trash in Fdelete_file or >> Fdelete_directory. */ >> int delete_by_moving_to_trash; >> @@ -2997,6 +3001,45 @@ DEFUN ("unix-sync", Funix_sync, Sunix_sync, 0, 0, "", >> >> #endif /* HAVE_SYNC */ >> >> +#ifdef HAVE_LIBMAGIC >> +DEFUN ("file-magic-file", Ffile_magic_file, Sfile_magic_file, 1,1,0, >> + doc: /* Return (MIME_TYPE MIME_ENCODING DESCRIPTION) for FILENAME. >> +Return nil on error. */) >> + (filename) >> + Lisp_Object filename; >> +{ >> + magic_t cookie=NULL; >> + if (!STRINGP (filename)) goto libmagic_error; > > Just use CHECK_STRING. > >> + char* f = SDATA (filename); >> + char* rvs; > > No C99 features yet. Be careful with raw string pointers and GC. > >> + cookie = magic_open (MAGIC_NONE); >> + magic_load (cookie,NULL); //load default database > > if (cookie == NULL) ? > >> + >> + magic_setflags (cookie, MAGIC_MIME_TYPE); >> + rvs = magic_file (cookie, f); >> + if (rvs == NULL) goto libmagic_error; > > Use report_file_error, provided that magic_file sets errno appropriately. > >> + Lisp_Object file_freetext = make_specified_string (rvs, strlen(rvs), strlen(rvs), NULL); > > Use build_string. > > Andreas. --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=filemagic3.patch diff --git a/configure.in b/configure.in index f4096db..49a3f15 100644 --- a/configure.in +++ b/configure.in @@ -137,6 +137,8 @@ OPTION_DEFAULT_ON([xft],[don't use XFT for anti aliased fonts]) OPTION_DEFAULT_ON([libotf],[don't use libotf for OpenType font support]) OPTION_DEFAULT_ON([m17n-flt],[don't use m17n-flt for text shaping]) +OPTION_DEFAULT_ON([libmagic],[don't compile with libmagic support]) + OPTION_DEFAULT_ON([toolkit-scroll-bars],[don't use Motif or Xaw3d scroll bars]) OPTION_DEFAULT_ON([xaw3d],[don't use Xaw3d]) OPTION_DEFAULT_ON([xim],[don't use X11 XIM]) @@ -2223,6 +2225,19 @@ if test x"$ac_cv_func_alloca_works" != xyes; then AC_MSG_ERROR( [a system implementation of alloca is required] ) fi + +HAVE_LIBMAGIC=no +if test "${with_libmagic}" != "no"; then + #libmagic support + AC_CHECK_HEADERS(magic.h, [ AC_CHECK_LIB(magic,magic_open,HAVE_LIBMAGIC=yes) ]) +fi + +if test "${HAVE_LIBMAGIC}" = "yes"; then + LIBMAGIC=-lmagic + AC_SUBST(LIBMAGIC) + AC_DEFINE(HAVE_LIBMAGIC, 1, [Define to 1 if using libmagic.]) +fi + # fmod, logb, and frexp are found in -lm on most systems. # On HPUX 9.01, -lm does not contain logb, so check for sqrt. AC_CHECK_LIB(m, sqrt) @@ -2954,6 +2969,7 @@ echo " Does Emacs use -lpng? ${HAVE_PNG}" echo " Does Emacs use -lrsvg-2? ${HAVE_RSVG}" echo " Does Emacs use -lgpm? ${HAVE_GPM}" echo " Does Emacs use -ldbus? ${HAVE_DBUS}" +echo " Does Emacs use -lmagic? ${HAVE_LIBMAGIC}" echo " Does Emacs use -lfreetype? ${HAVE_FREETYPE}" echo " Does Emacs use -lm17n-flt? ${HAVE_M17N_FLT}" diff --git a/src/Makefile.in b/src/Makefile.in index 425cf98..33d1a14 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -420,6 +420,7 @@ LIBX= $(LIBXMENU) LD_SWITCH_X_SITE #endif /* not HAVE_LIBRESOLV */ LIBSOUND= @LIBSOUND@ +LIBMAGIC= @LIBMAGIC@ CFLAGS_SOUND= @CFLAGS_SOUND@ RSVG_LIBS= @RSVG_LIBS@ @@ -878,7 +879,7 @@ SOME_MACHINE_LISP = ../lisp/mouse.elc \ duplicated symbols. If the standard libraries were compiled with GCC, we might need gnulib again after them. */ -LIBES = $(LOADLIBES) $(LIBS) $(LIBX) $(LIBSOUND) $(RSVG_LIBS) $(DBUS_LIBS) \ +LIBES = $(LOADLIBES) $(LIBS) $(LIBX) $(LIBSOUND) $(LIBMAGIC) $(RSVG_LIBS) $(DBUS_LIBS) \ LIBGPM LIBRESOLV LIBS_SYSTEM LIBS_MACHINE LIBS_TERMCAP \ LIBS_DEBUG $(GETLOADAVG_LIBS) \ @FREETYPE_LIBS@ @FONTCONFIG_LIBS@ @LIBOTF_LIBS@ @M17N_FLT_LIBS@ \ diff --git a/src/config.in b/src/config.in index 404e00b..c966a09 100644 --- a/src/config.in +++ b/src/config.in @@ -262,6 +262,9 @@ along with GNU Emacs. If not, see . */ /* Define to 1 if you have the gpm library (-lgpm). */ #undef HAVE_GPM +/* Define to 1 if you have the filemagic library (-lmagic). */ +#undef HAVE_LIBMAGIC + /* Define to 1 if you have the `grantpt' function. */ #undef HAVE_GRANTPT diff --git a/src/fileio.c b/src/fileio.c index 3702d4c..67d271c 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -205,6 +205,10 @@ Lisp_Object Vdirectory_sep_char; int write_region_inhibit_fsync; #endif +#ifdef HAVE_LIBMAGIC +#include +#endif + /* Non-zero means call move-file-to-trash in Fdelete_file or Fdelete_directory. */ int delete_by_moving_to_trash; @@ -2997,6 +3001,52 @@ DEFUN ("unix-sync", Funix_sync, Sunix_sync, 0, 0, "", #endif /* HAVE_SYNC */ +#ifdef HAVE_LIBMAGIC +DEFUN ("libmagic-file-internal", Flibmagic_file_internal, Slibmagic_file_internal, 1,1,0, + doc: /* Return (MIME_TYPE MIME_ENCODING DESCRIPTION) for FILENAME_OR_BUFFER. +Return nil on error. */) + (filename_or_buffer) + Lisp_Object filename_or_buffer; +{ + CHECK_STRING_OR_BUFFER (filename_or_buffer); + magic_t cookie=NULL; + char* f = NULL; + const char* rvs; + + if (STRINGP (filename_or_buffer)) + f = SDATA (filename_or_buffer); + if (BUFFERP (filename_or_buffer)) + f = SDATA (XBUFFER (filename_or_buffer)->filename); + cookie = magic_open (MAGIC_ERROR); + if (cookie == NULL) goto libmagic_error; + magic_load (cookie, NULL); //load default database + + magic_setflags (cookie, MAGIC_MIME_TYPE | MAGIC_ERROR); + rvs = magic_file (cookie, f); + if (rvs == NULL) goto libmagic_error; + Lisp_Object file_mime = intern (rvs); + + magic_setflags (cookie, MAGIC_MIME_ENCODING | MAGIC_ERROR); + rvs=magic_file (cookie, f); + if (rvs == NULL) goto libmagic_error; + Lisp_Object file_encoding = intern(rvs); + + magic_setflags (cookie, MAGIC_NONE | MAGIC_ERROR); + rvs=magic_file (cookie, f); + if (rvs == NULL) goto libmagic_error; + + Lisp_Object file_freetext = build_string (rvs); + Lisp_Object rv = Fcons (file_mime, Fcons (file_encoding, Fcons (file_freetext, Qnil))); + + magic_close (cookie); + return rv; + libmagic_error: + if (cookie != NULL) magic_close (cookie); + report_file_error("Libmagic error",Qnil); + return Qnil; +} +#endif + DEFUN ("file-newer-than-file-p", Ffile_newer_than_file_p, Sfile_newer_than_file_p, 2, 2, 0, doc: /* Return t if file FILE1 is newer than file FILE2. If FILE1 does not exist, the answer is nil; @@ -5781,6 +5831,9 @@ When non-nil, the function `move-file-to-trash' will be used by #ifdef HAVE_SYNC defsubr (&Sunix_sync); #endif +#ifdef HAVE_LIBMAGIC + defsubr (&Slibmagic_file_internal); +#endif } /* arch-tag: 64ba3fd7-f844-4fb2-ba4b-427eb928786c --=-=-= -- Joakim Verona --=-=-=--