Skip to content

Commit

Permalink
Drop va_copy as it not fully portable.
Browse files Browse the repository at this point in the history
Also drop max_size() method of POOL_MEM and use size() method.
  • Loading branch information
Marco van Wieringen committed Feb 17, 2015
1 parent 77c5b3e commit fdfdaf5
Show file tree
Hide file tree
Showing 8 changed files with 162 additions and 124 deletions.
14 changes: 0 additions & 14 deletions autoconf/configure.in
Expand Up @@ -800,20 +800,6 @@ AC_CHECK_FUNCS(strcasecmp select poll setenv putenv tcgetattr lstat lchown)
AC_CHECK_FUNCS(nanosleep nl_langinfo)
AC_CHECK_HEADERS(varargs.h)

AC_MSG_CHECKING(for __builtin_va_copy)
AC_TRY_LINK([
#include <stdarg.h>
], [
va_list ap, ap2;
__builtin_va_copy(ap2, ap);
return 0;
], [
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE___BUILTIN_VA_COPY, 1, [Define to 1 if you have the `__builtin_va_copy' function.])
], [
AC_MSG_RESULT(no)
])

dnl -----------------------------------------------------------------------
dnl Check for Python support
dnl
Expand Down
2 changes: 1 addition & 1 deletion src/dird/bsr.c
Expand Up @@ -89,7 +89,7 @@ static void print_bsr_item(POOL_MEM *pool_buf, const char *fmt, ...)
POOL_MEM item(PM_MESSAGE);

while (1) {
maxlen = item.max_size() - 1;
maxlen = item.size() - 1;
va_start(arg_ptr, fmt);
len = bvsnprintf(item.c_str(), maxlen, fmt, arg_ptr);
va_end(arg_ptr);
Expand Down
11 changes: 0 additions & 11 deletions src/include/baconfig.h
Expand Up @@ -318,17 +318,6 @@ typedef off_t boffset_t;
void b_memset(const char *file, int line, void *mem, int val, size_t num);
#endif

/*
* Work around platforms without a proper va_copy.
*/
#if defined(HAVE_VA_COPY)
#define VA_COPY(dest, src) va_copy((dest), (src))
#elif defined(HAVE___BUILTIN_VA_COPY)
#define VA_COPY(dest, src) __builtin_va_copy((dest), (src));
#else
#define VA_COPY(dest, src) (dest) = (src);
#endif

/**
* The digit following Dmsg and Emsg indicates the number of substitutions in
* the message string. We need to do this kludge because non-GNU compilers
Expand Down
54 changes: 40 additions & 14 deletions src/lib/lex.c
Expand Up @@ -68,13 +68,26 @@ int scan_to_next_not_eol(LEX * lc)
*/
static void s_err(const char *file, int line, LEX *lc, const char *msg, ...)
{
int len;
va_list arg_ptr;
POOL_MEM buf(PM_NAME),
more(PM_NAME);
POOL_MEM buf(PM_NAME), more(PM_NAME);

va_start(arg_ptr, msg);
vMmsg(buf, msg, arg_ptr);
va_end(arg_ptr);
while (1) {
va_start(arg_ptr, msg);
len = vMmsg(buf, msg, arg_ptr);
va_end(arg_ptr);

if (len == -1) {
int cur_len, new_len;

cur_len = buf.size();
new_len = cur_len + (cur_len / 2);
buf.check_size(new_len);
continue;
} else {
break;
}
}

if (lc->err_type == 0) { /* M_ERROR_TERM by default */
lc->err_type = M_ERROR_TERM;
Expand All @@ -88,8 +101,8 @@ static void s_err(const char *file, int line, LEX *lc, const char *msg, ...)

if (lc->line_no > 0) {
e_msg(file, line, lc->err_type, 0, _("Config error: %s\n"
" : line %d, col %d of file %s\n%s\n%s"),
buf.c_str(), lc->line_no, lc->col_no, lc->fname, lc->line, more.c_str());
" : line %d, col %d of file %s\n%s\n%s"),
buf.c_str(), lc->line_no, lc->col_no, lc->fname, lc->line, more.c_str());
} else {
e_msg(file, line, lc->err_type, 0, _("Config error: %s\n"), buf.c_str());
}
Expand All @@ -100,13 +113,26 @@ static void s_err(const char *file, int line, LEX *lc, const char *msg, ...)
*/
static void s_warn(const char *file, int line, LEX *lc, const char *msg, ...)
{
int len;
va_list arg_ptr;
POOL_MEM buf(PM_NAME),
more(PM_NAME);
POOL_MEM buf(PM_NAME), more(PM_NAME);

va_start(arg_ptr, msg);
vMmsg(buf, msg, arg_ptr);
va_end(arg_ptr);
while (1) {
va_start(arg_ptr, msg);
len = vMmsg(buf, msg, arg_ptr);
va_end(arg_ptr);

if (len == -1) {
int cur_len, new_len;

cur_len = buf.size();
new_len = cur_len + (cur_len / 2);
buf.check_size(new_len);
continue;
} else {
break;
}
}

if (lc->line_no > lc->begin_line_no) {
Mmsg(more, _("Problem probably begins at line %d.\n"), lc->begin_line_no);
Expand All @@ -116,8 +142,8 @@ static void s_warn(const char *file, int line, LEX *lc, const char *msg, ...)

if (lc->line_no > 0) {
p_msg(file, line, 0, _("Config warning: %s\n"
" : line %d, col %d of file %s\n%s\n%s"),
buf.c_str(), lc->line_no, lc->col_no, lc->fname, lc->line, more.c_str());
" : line %d, col %d of file %s\n%s\n%s"),
buf.c_str(), lc->line_no, lc->col_no, lc->fname, lc->line, more.c_str());
} else {
p_msg(file, line, 0, _("Config warning: %s\n"), buf.c_str());
}
Expand Down
11 changes: 0 additions & 11 deletions src/lib/mem_pool.c
Expand Up @@ -630,17 +630,6 @@ int pm_memcpy(POOL_MEM &pm, const char *data, int32_t n)

/* ============== CLASS POOL_MEM ============== */

/* Return the size of a memory buffer */
int32_t POOL_MEM::max_size()
{
int32_t size;
char *cp = mem;
cp -= HEAD_SIZE;
size = ((struct abufhead *)cp)->ablen;
Dmsg1(900, "max_size=%d\n", size);
return size;
}

void POOL_MEM::realloc_pm(int32_t size)
{
char *cp = mem;
Expand Down
1 change: 0 additions & 1 deletion src/lib/mem_pool.h
Expand Up @@ -92,7 +92,6 @@ class POOL_MEM {
mem = check_pool_memory_size(mem, size);
return mem;
}
int32_t max_size();
void realloc_pm(int32_t size);
int strcpy(const char *str);
int strcat(const char *str);
Expand Down
121 changes: 73 additions & 48 deletions src/lib/message.c
Expand Up @@ -155,7 +155,7 @@ static void delivery_error(const char *fmt,...)

i = Mmsg(pool_buf, "%s Message delivery ERROR: ", dt);

for (;;) {
while (1) {
maxlen = sizeof_pool_memory(pool_buf) - i - 1;
va_start(arg_ptr, fmt);
len = bvsnprintf(pool_buf+i, maxlen, fmt, arg_ptr);
Expand Down Expand Up @@ -1430,7 +1430,7 @@ void j_msg(const char *file, int line, JCR *jcr, int type, utime_t mtime, const
pool_buf = get_pool_memory(PM_EMSG);
i = Mmsg(pool_buf, "%s:%d ", get_basename(file), line);

for (;;) {
while (1) {
maxlen = sizeof_pool_memory(pool_buf) - i - 1;
va_start(arg_ptr, fmt);
len = bvsnprintf(pool_buf+i, maxlen, fmt, arg_ptr);
Expand All @@ -1457,7 +1457,7 @@ int m_msg(const char *file, int line, POOLMEM **pool_buf, const char *fmt, ...)

i = sprintf(*pool_buf, "%s:%d ", get_basename(file), line);

for (;;) {
while (1) {
maxlen = sizeof_pool_memory(*pool_buf) - i - 1;
va_start(arg_ptr, fmt);
len = bvsnprintf(*pool_buf+i, maxlen, fmt, arg_ptr);
Expand All @@ -1478,7 +1478,7 @@ int m_msg(const char *file, int line, POOLMEM *&pool_buf, const char *fmt, ...)

i = sprintf(pool_buf, "%s:%d ", get_basename(file), line);

for (;;) {
while (1) {
maxlen = sizeof_pool_memory(pool_buf) - i - 1;
va_start(arg_ptr, fmt);
len = bvsnprintf(pool_buf+i, maxlen, fmt, arg_ptr);
Expand All @@ -1496,61 +1496,44 @@ int m_msg(const char *file, int line, POOLMEM *&pool_buf, const char *fmt, ...)
* Edit a message into a Pool Memory buffer NO file:lineno
*
* Returns: string length of what was edited.
* -1 when the buffer isn't enough to hold the edited string.
*/
int vMmsg(POOLMEM **pool_buf, const char *fmt, va_list ap)
{
va_list copy;
int len, maxlen;

for (;;) {
maxlen = sizeof_pool_memory(*pool_buf) - 1;
VA_COPY(copy, ap);
len = bvsnprintf(*pool_buf, maxlen, fmt, copy);
va_end(copy);
if (len < 0 || len >= (maxlen - 5)) {
*pool_buf = realloc_pool_memory(*pool_buf, maxlen + maxlen / 2);
continue;
}
break;
maxlen = sizeof_pool_memory(*pool_buf) - 1;
len = bvsnprintf(*pool_buf, maxlen, fmt, ap);
if (len < 0 || len >= (maxlen - 5)) {
return -1;
}

return len;
}

int vMmsg(POOLMEM *&pool_buf, const char *fmt, va_list ap)
{
va_list copy;
int len, maxlen;

for (;;) {
maxlen = sizeof_pool_memory(pool_buf) - 1;
VA_COPY(copy, ap);
len = bvsnprintf(pool_buf, maxlen, fmt, copy);
va_end(copy);
if (len < 0 || len >= (maxlen - 5)) {
pool_buf = realloc_pool_memory(pool_buf, maxlen + maxlen / 2);
continue;
}
break;
maxlen = sizeof_pool_memory(pool_buf) - 1;
len = bvsnprintf(pool_buf, maxlen, fmt, ap);
if (len < 0 || len >= (maxlen - 5)) {
return -1;
}

return len;
}

int vMmsg(POOL_MEM &pool_buf, const char *fmt, va_list ap)
{
va_list copy;
int len, maxlen;

for (;;) {
maxlen = pool_buf.max_size() - 1;
VA_COPY(copy, ap);
len = bvsnprintf(pool_buf.c_str(), maxlen, fmt, copy);
va_end(copy);
if (len < 0 || len >= (maxlen - 5)) {
pool_buf.realloc_pm(maxlen + maxlen / 2);
continue;
}
break;
maxlen = pool_buf.size() - 1;
len = bvsnprintf(pool_buf.c_str(), maxlen, fmt, ap);
if (len < 0 || len >= (maxlen - 5)) {
return -1;
}

return len;
}

Expand All @@ -1559,9 +1542,23 @@ int Mmsg(POOLMEM **pool_buf, const char *fmt, ...)
int len;
va_list ap;

va_start(ap, fmt);
len = vMmsg(pool_buf, fmt, ap);
va_end(ap);
while (1) {
va_start(ap, fmt);
len = vMmsg(pool_buf, fmt, ap);
va_end(ap);

if (len == -1) {
int cur_len, new_len;

cur_len = sizeof_pool_memory(*pool_buf);
new_len = cur_len + (cur_len / 2);

*pool_buf = realloc_pool_memory(*pool_buf, new_len);
continue;
} else {
break;
}
}

return len;
}
Expand All @@ -1571,9 +1568,23 @@ int Mmsg(POOLMEM *&pool_buf, const char *fmt, ...)
int len;
va_list ap;

va_start(ap, fmt);
len = vMmsg(pool_buf, fmt, ap);
va_end(ap);
while (1) {
va_start(ap, fmt);
len = vMmsg(pool_buf, fmt, ap);
va_end(ap);

if (len == -1) {
int cur_len, new_len;

cur_len = sizeof_pool_memory(pool_buf);
new_len = cur_len + (cur_len / 2);

pool_buf = realloc_pool_memory(pool_buf, new_len);
continue;
} else {
break;
}
}

return len;
}
Expand All @@ -1583,9 +1594,23 @@ int Mmsg(POOL_MEM &pool_buf, const char *fmt, ...)
int len;
va_list ap;

va_start(ap, fmt);
len = vMmsg(pool_buf, fmt, ap);
va_end(ap);
while (1) {
va_start(ap, fmt);
len = vMmsg(pool_buf, fmt, ap);
va_end(ap);

if (len == -1) {
int cur_len, new_len;

cur_len = pool_buf.size();
new_len = cur_len + (cur_len / 2);

pool_buf.check_size(new_len);
continue;
} else {
break;
}
}

return len;
}
Expand All @@ -1606,7 +1631,7 @@ void Qmsg(JCR *jcr, int type, utime_t mtime, const char *fmt,...)

pool_buf = get_pool_memory(PM_EMSG);

for (;;) {
while (1) {
maxlen = sizeof_pool_memory(pool_buf) - 1;
va_start(arg_ptr, fmt);
len = bvsnprintf(pool_buf, maxlen, fmt, arg_ptr);
Expand Down Expand Up @@ -1680,7 +1705,7 @@ void q_msg(const char *file, int line, JCR *jcr, int type, utime_t mtime, const
pool_buf = get_pool_memory(PM_EMSG);
i = Mmsg(pool_buf, "%s:%d ", get_basename(file), line);

for (;;) {
while (1) {
maxlen = sizeof_pool_memory(pool_buf) - i - 1;
va_start(arg_ptr, fmt);
len = bvsnprintf(pool_buf+i, maxlen, fmt, arg_ptr);
Expand Down

0 comments on commit fdfdaf5

Please sign in to comment.