32 lines
856 B
C
32 lines
856 B
C
#include <magic.h>
|
|
#include <libowfat/errmsg.h>
|
|
#include <libowfat/byte.h>
|
|
#include <libowfat/str.h>
|
|
|
|
#include "pipeshare.h"
|
|
|
|
#define MAX(a,b) (a>b?a:b)
|
|
|
|
#define failmagic(...) do { \
|
|
carp(__VA_ARGS__,": ",magic_error(magic)); \
|
|
return 0; \
|
|
} while(0)
|
|
|
|
int extension(int64 fd,char result[16])
|
|
{
|
|
magic_t magic=magic_open(MAGIC_EXTENSION);
|
|
if(!magic) failmagic("initialize libmagic");
|
|
if(magic_load(magic,NULL)<0) failmagic("load magic database");
|
|
const char *extensions=magic_descriptor(magic,fd);
|
|
if(!extensions) failmagic("get magic data");
|
|
|
|
size_t l=MAX(str_chr(extensions,'/'),16);
|
|
byte_copy(result,l,extensions);
|
|
result[l]=0;
|
|
magic_close(magic);
|
|
if(str_equal(result,"???"))
|
|
str_copy(result,"txt");
|
|
return 1;
|
|
}
|
|
|
|
#undef failmagic
|