X-Git-Url: http://git.silcnet.org/gitweb/?p=runtime.git;a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcerrno.c;h=ae7af839add398c7b3e0f03e36e10af30110aa0c;hp=c8245c647e6b330fc127d219e21fcb41b8f153da;hb=40232f82d09bb31e3ef245db06d60a925210c501;hpb=c22cb24cf6491d315f26416c276141918207190c diff --git a/lib/silcutil/silcerrno.c b/lib/silcutil/silcerrno.c index c8245c64..ae7af839 100644 --- a/lib/silcutil/silcerrno.c +++ b/lib/silcutil/silcerrno.c @@ -45,6 +45,7 @@ void silc_set_errno(SilcResult error) } tls->error_reason[0] = '\0'; + tls->filename[0] = '\0'; tls->error = error; } @@ -58,6 +59,7 @@ void silc_set_errno_nofail(SilcResult error) return; tls->error_reason[0] = '\0'; + tls->filename[0] = '\0'; tls->error = error; } @@ -75,9 +77,11 @@ void silc_set_errno_reason(SilcResult error, const char *format, ...) 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; } @@ -92,9 +96,11 @@ void silc_set_errno_reason_nofail(SilcResult error, const char *format, ...) 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; } @@ -435,3 +441,43 @@ const char *silc_errno_string(SilcResult 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; +}