}
tls->error_reason[0] = '\0';
+ tls->filename[0] = '\0';
tls->error = error;
}
return;
tls->error_reason[0] = '\0';
+ tls->filename[0] = '\0';
tls->error = error;
}
return;
}
- va_start(va, format);
- silc_vsnprintf(tls->error_reason, sizeof(tls->error_reason), format, va);
- va_end(va);
+ if (format) {
+ va_start(va, format);
+ silc_vsnprintf(tls->error_reason, sizeof(tls->error_reason), format, va);
+ va_end(va);
+ }
tls->error = error;
}
if (!tls)
return;
- va_start(va, format);
- silc_vsnprintf(tls->error_reason, sizeof(tls->error_reason), format, va);
- va_end(va);
+ if (format) {
+ va_start(va, format);
+ silc_vsnprintf(tls->error_reason, sizeof(tls->error_reason), format, va);
+ va_end(va);
+ }
tls->error = error;
}
return silc_errno_strings[error];
}
+
+/* Set error location */
+
+void silc_set_errno_location(const char *filename,
+ SilcUInt32 current_line_number,
+ SilcUInt32 current_column_number)
+{
+ SilcTls tls = silc_thread_get_tls();
+
+ if (!tls)
+ return;
+
+ if (filename)
+ silc_snprintf(tls->filename, sizeof(tls->filename), filename);
+ tls->cur_line = current_line_number;
+ tls->cur_column = current_column_number;
+}
+
+/* Get error location */
+
+SilcBool silc_errno_location(const char **filename,
+ SilcUInt32 *current_line,
+ SilcUInt32 *current_column)
+{
+ SilcTls tls = silc_thread_get_tls();
+
+ if (!tls)
+ return FALSE;
+ if (tls->filename[0] == '\0' && !tls->cur_line && !tls->cur_column)
+ return FALSE;
+
+ if (filename)
+ *filename = tls->filename;
+ if (current_line)
+ *current_line = tls->cur_line;
+ if (current_column)
+ *current_column = tls->cur_column;
+
+ return TRUE;
+}