bool smart_device::set_err(int no, const char * msg, ...)
{
  if (!msg)
    return set_err(no);
  m_err.no = no;
  va_list ap; va_start(ap, msg);
  m_err.msg = vstrprintf(msg, ap);
  va_end(ap);
  return false;
}
void smart_interface::set_err(int no, const char * msg, ...)
{
  if (!msg) {
    set_err(no); return;
  }
  m_err.no = no;
  va_list ap; va_start(ap, msg);
  m_err.msg = vstrprintf(msg, ap);
  va_end(ap);
}
std::string strprintf(const char *format, ...)
{
	std::string str;
	va_list args;

	va_start(args, format);
	str = vstrprintf(format, args);
	va_end(args);

	return str;
}