}
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;
+}
***/
const char *silc_errno_reason(void);
+/****d* silcutil/silc_errno_location
+ *
+ * NAME
+ *
+ * SilcBool silc_errno_location(const char **filename,
+ * SilcUInt32 *current_line,
+ * SilcUInt32 *current_column);
+ *
+ * DESCRIPTION
+ *
+ * Returns the error location information. The filename where the error
+ * occurred is returned to `filename'. The line and columns where the
+ * error occurred is returned to `current_line' and `current_column',
+ * respectively, or 0 is returned if the information is not present.
+ *
+ * Returns FALSE if the location information is not available.
+ *
+ ***/
+SilcBool silc_errno_location(const char **filename,
+ SilcUInt32 *current_line,
+ SilcUInt32 *current_column);
+
/* Low-level routines for the error handling. */
/****d* silcutil/silc_set_errno
***/
void silc_set_errno_posix(int error);
+/****d* silcutil/silc_set_errno_location
+ *
+ * NAME
+ *
+ * void silc_set_errno_location(const char *filename,
+ * SilcUInt32 current_line_number,
+ * SilcUInt32 current_column_number);
+ *
+ * DESCRIPTION
+ *
+ * A low level routine to set the error location in a file indicated by
+ * the `filename'. The `current_line_number' is the line where the
+ * error occurred. The `current_column_number' number if the column in
+ * the line where the error occurred or 0 if so such information is
+ * present. The errno must be set before calling this function.
+ *
+ ***/
+void silc_set_errno_location(const char *filename,
+ SilcUInt32 current_line_number,
+ SilcUInt32 current_column_number);
+
/* Return last error */
SilcResult silc_get_errno(void);
void *thread_context; /* Context set with SILC Tls API */
void *platform_context; /* Platform specific context */
char error_reason[256]; /* Reason for the error */
+ char filename[256]; /* File where error occurred */
SilcResult error; /* Errno, last error */
+ SilcUInt32 cur_line; /* Line number of error */
+ SilcUInt32 cur_column; /* Column number of error */
unsigned int shared_data : 1; /* Set when shares data with other
threads in the Tls. */
} *SilcTls, SilcTlsStruct;