Changeset View
Changeset View
Standalone View
Standalone View
contrib/file/src/fsmagic.c
Show First 20 Lines • Show All 94 Lines • ▼ Show 20 Lines | if ((mime & MAGIC_MIME_ENCODING) && file_printf(ms, | ||||
return -1; | return -1; | ||||
} | } | ||||
if ((mime & MAGIC_MIME_ENCODING) && file_printf(ms, "binary") == -1) | if ((mime & MAGIC_MIME_ENCODING) && file_printf(ms, "binary") == -1) | ||||
return -1; | return -1; | ||||
return 0; | return 0; | ||||
} | } | ||||
protected int | protected int | ||||
file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb) | file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb, int fd) | ||||
{ | { | ||||
int ret, did = 0; | int ret, did = 0; | ||||
int mime = ms->flags & MAGIC_MIME; | int mime = ms->flags & MAGIC_MIME; | ||||
#ifdef S_IFLNK | #ifdef S_IFLNK | ||||
char buf[BUFSIZ+4]; | char buf[BUFSIZ+4]; | ||||
ssize_t nch; | ssize_t nch; | ||||
struct stat tstatbuf; | struct stat tstatbuf; | ||||
#endif | #endif | ||||
if (ms->flags & (MAGIC_APPLE|MAGIC_EXTENSION)) | if (ms->flags & (MAGIC_APPLE|MAGIC_EXTENSION)) | ||||
return 0; | return 0; | ||||
if (fn == NULL) | if (fn == NULL) | ||||
return 0; | return 0; | ||||
#define COMMA (did++ ? ", " : "") | #define COMMA (did++ ? ", " : "") | ||||
/* | /* | ||||
* Fstat is cheaper but fails for files you don't have read perms on. | * Fstat is cheaper but fails for files you don't have read perms on. | ||||
* On 4.2BSD and similar systems, use lstat() to identify symlinks. | * On 4.2BSD and similar systems, use lstat() to identify symlinks. | ||||
*/ | */ | ||||
#ifdef HAVE_CAPSICUM /* XXX: TODO: capsicumization breaks symlink check */ | |||||
ret = fstat(fd, sb); | |||||
#else | |||||
#ifdef S_IFLNK | #ifdef S_IFLNK | ||||
if ((ms->flags & MAGIC_SYMLINK) == 0) | if ((ms->flags & MAGIC_SYMLINK) == 0) | ||||
ret = lstat(fn, sb); | ret = lstat(fn, sb); | ||||
else | else | ||||
#endif | #endif | ||||
ret = stat(fn, sb); /* don't merge into if; see "ret =" above */ | ret = stat(fn, sb); /* don't merge into if; see "ret =" above */ | ||||
#endif /* ifndef HAVE_CAPSICUM */ | |||||
#ifdef WIN32 | #ifdef WIN32 | ||||
{ | { | ||||
HANDLE hFile = CreateFile((LPCSTR)fn, 0, FILE_SHARE_DELETE | | HANDLE hFile = CreateFile((LPCSTR)fn, 0, FILE_SHARE_DELETE | | ||||
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, | ||||
NULL); | NULL); | ||||
if (hFile != INVALID_HANDLE_VALUE) { | if (hFile != INVALID_HANDLE_VALUE) { | ||||
/* | /* | ||||
* Stat failed, but we can still open it - assume it's | * Stat failed, but we can still open it - assume it's | ||||
▲ Show 20 Lines • Show All 201 Lines • ▼ Show 20 Lines | if (*buf == '/') { | ||||
if (stat(tmp, &tstatbuf) < 0) | if (stat(tmp, &tstatbuf) < 0) | ||||
return bad_link(ms, errno, buf); | return bad_link(ms, errno, buf); | ||||
} | } | ||||
/* Otherwise, handle it. */ | /* Otherwise, handle it. */ | ||||
if ((ms->flags & MAGIC_SYMLINK) != 0) { | if ((ms->flags & MAGIC_SYMLINK) != 0) { | ||||
const char *p; | const char *p; | ||||
ms->flags &= MAGIC_SYMLINK; | ms->flags &= MAGIC_SYMLINK; | ||||
p = magic_file(ms, buf); | p = magic_file(ms, buf, -1); | ||||
ms->flags |= MAGIC_SYMLINK; | ms->flags |= MAGIC_SYMLINK; | ||||
if (p == NULL) | if (p == NULL) | ||||
return -1; | return -1; | ||||
} else { /* just print what it points to */ | } else { /* just print what it points to */ | ||||
if (mime) { | if (mime) { | ||||
if (handle_mime(ms, mime, "symlink") == -1) | if (handle_mime(ms, mime, "symlink") == -1) | ||||
return -1; | return -1; | ||||
} else if (file_printf(ms, "%ssymbolic link to %s", | } else if (file_printf(ms, "%ssymbolic link to %s", | ||||
▲ Show 20 Lines • Show All 52 Lines • Show Last 20 Lines |