summaryrefslogtreecommitdiff
path: root/src/fsmagic.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fsmagic.c')
-rw-r--r--src/fsmagic.c60
1 files changed, 48 insertions, 12 deletions
diff --git a/src/fsmagic.c b/src/fsmagic.c
index dd4f0a0..1e8fd74 100644
--- a/src/fsmagic.c
+++ b/src/fsmagic.c
@@ -32,7 +32,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: fsmagic.c,v 1.66 2013/01/11 19:46:55 christos Exp $")
+FILE_RCSID("@(#)$File: fsmagic.c,v 1.75 2014/12/04 15:56:46 christos Exp $")
#endif /* lint */
#include "magic.h"
@@ -53,7 +53,11 @@ FILE_RCSID("@(#)$File: fsmagic.c,v 1.66 2013/01/11 19:46:55 christos Exp $")
#ifdef major /* Might be defined in sys/types.h. */
# define HAVE_MAJOR
#endif
-
+#ifdef WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
#ifndef HAVE_MAJOR
# define major(dev) (((dev) >> 8) & 0xff)
# define minor(dev) ((dev) & 0xff)
@@ -71,10 +75,10 @@ bad_link(struct magic_set *ms, int err, char *buf)
else if (!mime) {
if (ms->flags & MAGIC_ERROR) {
file_error(ms, err,
- "broken symbolic link to `%s'", buf);
+ "broken symbolic link to %s", buf);
return -1;
}
- if (file_printf(ms, "broken symbolic link to `%s'", buf) == -1)
+ if (file_printf(ms, "broken symbolic link to %s", buf) == -1)
return -1;
}
return 1;
@@ -123,6 +127,35 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
#endif
ret = stat(fn, sb); /* don't merge into if; see "ret =" above */
+#ifdef WIN32
+ {
+ HANDLE hFile = CreateFile((LPCSTR)fn, 0, FILE_SHARE_DELETE |
+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0,
+ NULL);
+ if (hFile != INVALID_HANDLE_VALUE) {
+ /*
+ * Stat failed, but we can still open it - assume it's
+ * a block device, if nothing else.
+ */
+ if (ret) {
+ sb->st_mode = S_IFBLK;
+ ret = 0;
+ }
+ switch (GetFileType(hFile)) {
+ case FILE_TYPE_CHAR:
+ sb->st_mode |= S_IFCHR;
+ sb->st_mode &= ~S_IFREG;
+ break;
+ case FILE_TYPE_PIPE:
+ sb->st_mode |= S_IFIFO;
+ sb->st_mode &= ~S_IFREG;
+ break;
+ }
+ CloseHandle(hFile);
+ }
+ }
+#endif
+
if (ret) {
if (ms->flags & MAGIC_ERROR) {
file_error(ms, errno, "cannot stat `%s'", fn);
@@ -131,8 +164,7 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
if (file_printf(ms, "cannot open `%s' (%s)",
fn, strerror(errno)) == -1)
return -1;
- ms->event_flags |= EVENT_HAD_ERR;
- return -1;
+ return 0;
}
ret = 1;
@@ -169,13 +201,15 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
* like ordinary files. Otherwise, just report that they
* are block special files and go on to the next file.
*/
- if ((ms->flags & MAGIC_DEVICES) != 0)
+ if ((ms->flags & MAGIC_DEVICES) != 0) {
+ ret = 0;
break;
+ }
if (mime) {
if (handle_mime(ms, mime, "chardevice") == -1)
return -1;
} else {
-#ifdef HAVE_STAT_ST_RDEV
+#ifdef HAVE_STRUCT_STAT_ST_RDEV
# ifdef dv_unit
if (file_printf(ms, "%scharacter special (%d/%d/%d)",
COMMA, major(sb->st_rdev), dv_unit(sb->st_rdev),
@@ -201,13 +235,15 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
* like ordinary files. Otherwise, just report that they
* are block special files and go on to the next file.
*/
- if ((ms->flags & MAGIC_DEVICES) != 0)
+ if ((ms->flags & MAGIC_DEVICES) != 0) {
+ ret = 0;
break;
+ }
if (mime) {
if (handle_mime(ms, mime, "blockdevice") == -1)
return -1;
} else {
-#ifdef HAVE_STAT_ST_RDEV
+#ifdef HAVE_STRUCT_STAT_ST_RDEV
# ifdef dv_unit
if (file_printf(ms, "%sblock special (%d/%d/%d)",
COMMA, major(sb->st_rdev), dv_unit(sb->st_rdev),
@@ -316,7 +352,7 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
if (mime) {
if (handle_mime(ms, mime, "symlink") == -1)
return -1;
- } else if (file_printf(ms, "%ssymbolic link to `%s'",
+ } else if (file_printf(ms, "%ssymbolic link to %s",
COMMA, buf) == -1)
return -1;
}
@@ -363,7 +399,7 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
/*NOTREACHED*/
}
- if (!mime && did) {
+ if (!mime && did && ret == 0) {
if (file_printf(ms, " ") == -1)
return -1;
}