version 1.3, 2005/04/11 16:31:35 |
version 1.3.6.1, 2007/07/09 17:32:51 |
|
|
*/ |
*/ |
#include "file.h" |
#include "file.h" |
#include "magic.h" |
#include "magic.h" |
|
#include <limits.h> |
#include <stdarg.h> |
#include <stdarg.h> |
|
#include <stddef.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
#include <ctype.h> |
#include <ctype.h> |
|
|
file_printf(struct magic_set *ms, const char *fmt, ...) |
file_printf(struct magic_set *ms, const char *fmt, ...) |
{ |
{ |
va_list ap; |
va_list ap; |
size_t len; |
int len; |
|
size_t size; |
char *buf; |
char *buf; |
|
ptrdiff_t diff; |
|
|
va_start(ap, fmt); |
va_start(ap, fmt); |
|
|
len = vsnprintf(ms->o.ptr, ms->o.len, fmt, ap); |
len = vsnprintf(ms->o.ptr, ms->o.left, fmt, ap); |
if (len == -1 || len >= ms->o.len) { |
if (len == -1) { |
|
file_error(ms, errno, "vsnprintf failed"); |
|
return -1; |
|
} else if (len >= ms->o.left) { |
va_end(ap); |
va_end(ap); |
if ((buf = realloc(ms->o.buf, len + 1024)) == NULL) { |
size = (ms->o.size - ms->o.left) + len + 1024; |
|
if ((buf = realloc(ms->o.buf, size)) == NULL) { |
file_oomem(ms); |
file_oomem(ms); |
return -1; |
return -1; |
} |
} |
ms->o.ptr = buf + (ms->o.ptr - ms->o.buf); |
diff = ms->o.ptr - ms->o.buf; |
|
ms->o.ptr = buf + diff; |
ms->o.buf = buf; |
ms->o.buf = buf; |
ms->o.len = ms->o.size - (ms->o.ptr - ms->o.buf); |
ms->o.left = size - diff; |
ms->o.size = len + 1024; |
ms->o.size = size; |
|
|
va_start(ap, fmt); |
va_start(ap, fmt); |
len = vsnprintf(ms->o.ptr, ms->o.len, fmt, ap); |
len = vsnprintf(ms->o.ptr, ms->o.left, fmt, ap); |
|
if (len == -1) { |
|
file_error(ms, errno, "vsnprintf failed"); |
|
return -1; |
|
} |
} |
} |
ms->o.ptr += len; |
ms->o.ptr += len; |
ms->o.len -= len; |
ms->o.left -= len; |
va_end(ap); |
va_end(ap); |
return 0; |
return 0; |
} |
} |
|
|
protected const char * |
protected const char * |
file_getbuffer(struct magic_set *ms) |
file_getbuffer(struct magic_set *ms) |
{ |
{ |
char *nbuf, *op, *np; |
char *pbuf, *op, *np; |
size_t nsize; |
size_t psize, len; |
|
|
if (ms->haderr) |
if (ms->haderr) |
return NULL; |
return NULL; |
|
|
if (ms->flags & MAGIC_RAW) |
if (ms->flags & MAGIC_RAW) |
return ms->o.buf; |
return ms->o.buf; |
|
|
nsize = ms->o.len * 4 + 1; |
len = ms->o.size - ms->o.left; |
if (ms->o.psize < nsize) { |
if (len > (SIZE_T_MAX - 1) / 4) { |
if ((nbuf = realloc(ms->o.pbuf, nsize)) == NULL) { |
file_oomem(ms); |
|
return NULL; |
|
} |
|
/* * 4 is for octal representation, + 1 is for NUL */ |
|
psize = len * 4 + 1; |
|
if (ms->o.psize < psize) { |
|
if ((pbuf = realloc(ms->o.pbuf, psize)) == NULL) { |
file_oomem(ms); |
file_oomem(ms); |
return NULL; |
return NULL; |
} |
} |
ms->o.psize = nsize; |
ms->o.psize = psize; |
ms->o.pbuf = nbuf; |
ms->o.pbuf = pbuf; |
} |
} |
|
|
for (np = ms->o.pbuf, op = ms->o.buf; *op; op++) { |
for (np = ms->o.pbuf, op = ms->o.buf; *op; op++) { |