]> granicus.if.org Git - file/commitdiff
Add a raw flag, and translate unprintable chars.
authorChristos Zoulas <christos@zoulas.com>
Thu, 9 Oct 2003 15:15:23 +0000 (15:15 +0000)
committerChristos Zoulas <christos@zoulas.com>
Thu, 9 Oct 2003 15:15:23 +0000 (15:15 +0000)
src/file.c
src/file.h
src/funcs.c
src/magic.c
src/magic.h

index 2a262f87b27a1514a8db4ce497537491c251eba7..751a14235d8ab8a07447478c838555aa41d61a67 100644 (file)
@@ -72,7 +72,7 @@
 #include "patchlevel.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$Id: file.c,v 1.83 2003/10/08 17:09:26 christos Exp $")
+FILE_RCSID("@(#)$Id: file.c,v 1.84 2003/10/09 15:15:23 christos Exp $")
 #endif /* lint */
 
 
@@ -128,7 +128,7 @@ main(int argc, char *argv[])
        int flags = 0;
        char *mime, *home, *usermagic;
        struct stat sb;
-#define OPTSTRING      "bcCdf:F:ikLm:nNpsvz"
+#define OPTSTRING      "bcCdf:F:ikLm:nNprsvz"
 #ifdef HAVE_GETOPT_LONG
        int longindex;
        private struct option long_options[] =
@@ -150,6 +150,7 @@ main(int argc, char *argv[])
                {"preserve-date", 0, 0, 'p'},
 #endif
                {"uncompress", 0, 0, 'z'},
+               {"raw", 0, 0, 'r'},
                {"no-buffer", 0, 0, 'n'},
                {"no-pad", 0, 0, 'N'},
                {"special-files", 0, 0, 's'},
@@ -242,6 +243,9 @@ main(int argc, char *argv[])
                        flags |= MAGIC_PRESERVE_ATIME;
                        break;
 #endif
+               case 'r':
+                       flags |= MAGIC_RAW;
+                       break;
                case 's':
                        flags |= MAGIC_DEVICES;
                        break;
index c05a4fe28d5e25c9606c482a0cdb9588741b29fe..3d2cb2cf1d632a3d6f246aad9506417b575371dc 100644 (file)
@@ -32,7 +32,7 @@
  */
 /*
  * file.h - definitions for file(1) program
- * @(#)$Id: file.h,v 1.57 2003/10/08 16:37:27 christos Exp $
+ * @(#)$Id: file.h,v 1.58 2003/10/09 15:15:23 christos Exp $
  */
 
 #ifndef __file_h__
@@ -178,10 +178,14 @@ struct magic_set {
        int32_t *off;
     } c;
     struct out {
+       /* Accumulation buffer */
        char *buf;
        char *ptr;
        size_t len;
        size_t size;
+       /* Printable buffer */
+       char *pbuf;
+       size_t psize;
     } o;
     int flags;
     int haderr;
@@ -209,6 +213,7 @@ protected void file_error(struct magic_set *, const char *, ...);
 protected void file_magwarn(const char *, ...);
 protected void file_mdump(struct magic *);
 protected void file_showstr(FILE *, const char *, size_t);
+protected const char *file_getbuffer(struct magic_set *);
 
 #ifndef HAVE_STRERROR
 extern int sys_nerr;
index 7d72bd9947541fff099f4bac632bebd8731c3fd0..afb7555c30a2a8fb838ef00c4991e2888e7b5b4c 100644 (file)
@@ -31,6 +31,7 @@
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
+#include <ctype.h>
 
 /*
  * Like printf, only we print to a buffer and advance it.
@@ -135,3 +136,39 @@ file_reset(struct magic_set *ms)
        ms->haderr = 0;
        return 0;
 }
+
+protected const char *
+file_getbuffer(struct magic_set *ms)
+{
+       char *nbuf, *op, *np;
+       size_t nsize;
+
+       if (ms->haderr)
+               return NULL;
+
+       if (ms->flags & MAGIC_RAW)
+               return ms->o.buf;
+
+       nsize = ms->o.len * 4 + 1;
+       if (ms->o.psize < nsize) {
+               if ((nbuf = realloc(ms->o.pbuf, nsize)) == NULL) {
+                       file_oomem(ms);
+                       return NULL;
+               }
+               ms->o.psize = nsize;
+               ms->o.pbuf = nbuf;
+       }
+
+       for (np = ms->o.pbuf, op = ms->o.buf; *op; op++) {
+               if (isprint((unsigned char)*op)) {
+                       *np++ = *op;    
+               } else {
+                       *np++ = '\\';
+                       *np++ = ((*op >> 6) & 3) + '0';
+                       *np++ = ((*op >> 3) & 7) + '0';
+                       *np++ = ((*op >> 0) & 7) + '0';
+               }
+       }
+       *np = '\0';
+       return ms->o.pbuf;
+}
index a0eccb4cdd3f8434872a1db4022bc17b98e567c9..f5473aadec23a2d8d110b1b2e7a5860fe263333f 100644 (file)
@@ -65,7 +65,7 @@
 #include "patchlevel.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$Id: magic.c,v 1.11 2003/10/08 16:37:27 christos Exp $")
+FILE_RCSID("@(#)$Id: magic.c,v 1.12 2003/10/09 15:15:23 christos Exp $")
 #endif /* lint */
 
 #ifdef __EMX__
@@ -98,8 +98,15 @@ magic_open(int flags)
                free(ms);
                return NULL;
        }
+       ms->o.pbuf = malloc(ms->o.psize = 1024);
+       if (ms->o.pbuf == NULL) {
+               free(ms->o.buf);
+               free(ms);
+               return NULL;
+       }
        ms->c.off = malloc((ms->c.len = 10) * sizeof(*ms->c.off));
        if (ms->c.off == NULL) {
+               free(ms->o.pbuf);
                free(ms->o.buf);
                free(ms);
                return NULL;
@@ -216,7 +223,7 @@ magic_file(struct magic_set *ms, const char *inname)
        case 0:
                break;
        default:
-               return ms->o.buf;
+               return file_getbuffer(ms);
        }
 
 #ifndef        STDIN_FILENO
@@ -232,7 +239,7 @@ magic_file(struct magic_set *ms, const char *inname)
                if (sb.st_mode & 0111)
                        if (file_printf(ms, "executable, ") == -1)
                                return NULL;
-               return ms->o.buf;
+               return file_getbuffer(ms);
        }
 
        /*
@@ -258,7 +265,7 @@ magic_file(struct magic_set *ms, const char *inname)
                case 0:
                        break;
                default:
-                       return ms->o.buf;
+                       return file_getbuffer(ms);
                }
 #endif
                if (file_buffer(ms, buf, (size_t)nbytes) == -1)
@@ -279,7 +286,7 @@ magic_file(struct magic_set *ms, const char *inname)
        }
 
        close_and_restore(ms, inname, fd, &sb);
-       return ms->haderr ? NULL : ms->o.buf;
+       return file_getbuffer(ms);
 done:
        close_and_restore(ms, inname, fd, &sb);
        return NULL;
@@ -298,7 +305,7 @@ magic_buffer(struct magic_set *ms, const void *buf, size_t nb)
        if (file_buffer(ms, buf, nb) == -1) {
                return NULL;
        }
-       return ms->haderr ? NULL : ms->o.buf;
+       return file_getbuffer(ms);
 }
 
 public const char *
index ee120d2f9b44c215ec8c88f5ea8eb017c64660b1..9d839d97cda67c0613c58fc401697b19a5eb039e 100644 (file)
 
 #include <sys/types.h>
 
-#define        MAGIC_NONE              0x00    /* No flags */
-#define        MAGIC_DEBUG             0x0   /* Turn on debugging */
-#define        MAGIC_SYMLINK           0x0   /* Follow symlinks */
-#define        MAGIC_COMPRESS          0x0   /* Check inside compressed files */
-#define        MAGIC_DEVICES           0x0   /* Look at the contents of devices */
-#define        MAGIC_MIME              0x10    /* Return a mime string */
-#define        MAGIC_CONTINUE          0x20    /* Return all matches */
-#define        MAGIC_CHECK             0x40    /* Print warnings to stderr */
-#define        MAGIC_PRESERVE_ATIME    0x80    /* Restore access time on exit */
-
+#define        MAGIC_NONE              0x000   /* No flags */
+#define        MAGIC_DEBUG             0x001   /* Turn on debugging */
+#define        MAGIC_SYMLINK           0x002   /* Follow symlinks */
+#define        MAGIC_COMPRESS          0x004   /* Check inside compressed files */
+#define        MAGIC_DEVICES           0x008   /* Look at the contents of devices */
+#define        MAGIC_MIME              0x010   /* Return a mime string */
+#define        MAGIC_CONTINUE          0x020   /* Return all matches */
+#define        MAGIC_CHECK             0x040   /* Print warnings to stderr */
+#define        MAGIC_PRESERVE_ATIME    0x080   /* Restore access time on exit */
+#define        MAGIC_RAW               0x100   /* Don't translate unprintable chars */
 
 #ifdef __cplusplus
 extern "C" {