Как исправить функцию с переменным числом аргументов?
char *format = (char*)malloc((sizeof(PACKAGE_NAME) + sizeof(PACKAGE_VERSION) + sizeof(msg)) * sizeof(arguments));
У вас выделяется (и к тому же не освобождается) буфер совершенно рандомного размера. У меня работает и так, но это вопрос везения. Даже если написатьchar format[200]; будет лучше.
1. Более точно (запас допустим, нехватка  — нет) высчитать длину буфера.
2. Освободить его, наконец!static const char* FORMAT1 = "[%s-%s]: %s\n";
  char *format = (char*)malloc(strlen(FORMAT1) + strlen(msg) + strlen(PACKAGE_NAME) + strlen(PACKAGE_VERSION) + 1);
  sprintf(format, "[%s-%s]: %s\n", PACKAGE_NAME, PACKAGE_VERSION, msg);
  va_start(arguments, msg);
  vprintf(format, arguments);
  va_end(arguments);
  free(format);
Более удачное, но менее универсальное решение — printf заголовок, vprintf строку.printf("[%s-%s]: ", PACKAGE_NAME, PACKAGE_VERSION);

  va_list arguments;
  va_start(arguments, msg);
  vprintf(msg, arguments);
  va_end(arguments);

  putchar('\n');
UPD1.
Ваша новая ошибка — в кодеchar *msgbuf = (char*)malloc(strlen(msg) * sizeof(arguments));
Раз уж хотите так, решение — вычислить длину буфера через snprintf.
По моему с самими аргументами у вас все нормально.
У меня есть похожий код (не мой), успешно работает.
По моему при выделении памяти ошибка, а именно вот этот момент: sizeof(msg)) * sizeof(arguments)
Думаю вместо этого нужно: strlen(msg)*sizeof(char)