aboutsummaryrefslogtreecommitdiff
path: root/fmtutils.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2019-06-29 19:30:05 -0700
committerGuy Harris <guy@alum.mit.edu>2019-06-29 19:30:05 -0700
commit81e850934fc00eb60c12b240fda57b7c05223cff (patch)
tree600f1099d3c3b58415cd455c5ab51569b35d23af /fmtutils.c
parent94dfe9f2fe7abcd306ec67b7c8a44cbc7e6b1f75 (diff)
Have a pcap_fmt_errmsg_for_win32_err() routine and use it.
It's like pcap_fmt_errmsg_for_errno(), but for Windows error codes. Use it, rather than calling pcap_win32_err_to_str() and then formatting a message with pcap_strerror(). Clean up some error messages while we're at it.
Diffstat (limited to 'fmtutils.c')
-rw-r--r--fmtutils.c61
1 files changed, 37 insertions, 24 deletions
diff --git a/fmtutils.c b/fmtutils.c
index d01dc3e2..091e0d35 100644
--- a/fmtutils.c
+++ b/fmtutils.c
@@ -146,18 +146,44 @@ pcap_fmt_errmsg_for_errno(char *errbuf, size_t errbuflen, int errnum,
#ifdef _WIN32
/*
- * Generate a string for a Win32-specific error (i.e. an error generated when
- * calling a Win32 API).
- * For errors occurred during standard C calls, we still use pcap_strerror().
+ * Generate an error message based on a format, arguments, and a
+ * Win32 error, with a message for the Win32 error after the formatted output.
*/
void
-pcap_win32_err_to_str(DWORD error, char *errbuf)
+pcap_fmt_errmsg_for_win32_err(char *errbuf, size_t errbuflen, DWORD errnum,
+ const char *fmt, ...)
{
- DWORD retval;
- size_t errlen;
+ va_list ap;
+ size_t msglen;
char *p;
+ size_t errbuflen_remaining;
+ DWORD retval;
+ char win32_errbuf[PCAP_ERRBUF_SIZE+1];
+
+ va_start(ap, fmt);
+ pcap_vsnprintf(errbuf, errbuflen, fmt, ap);
+ va_end(ap);
+ msglen = strlen(errbuf);
+
+ /*
+ * Do we have enough space to append ": "?
+ * Including the terminating '\0', that's 3 bytes.
+ */
+ if (msglen + 3 > errbuflen) {
+ /* No - just give them what we've produced. */
+ return;
+ }
+ p = errbuf + msglen;
+ errbuflen_remaining = errbuflen - msglen;
+ *p++ = ':';
+ *p++ = ' ';
+ *p = '\0';
+ msglen += 2;
+ errbuflen_remaining -= 2;
/*
+ * Now append the string for the error code.
+ *
* XXX - what language ID to use?
*
* For UN*Xes, pcap_strerror() may or may not return localized
@@ -172,30 +198,17 @@ pcap_win32_err_to_str(DWORD error, char *errbuf)
* happen to understand.
*/
retval = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_MAX_WIDTH_MASK,
- NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- errbuf, PCAP_ERRBUF_SIZE, NULL);
+ NULL, errnum, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ win32_errbuf, PCAP_ERRBUF_SIZE, NULL);
if (retval == 0) {
/*
* Failed.
*/
- pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
- "Couldn't get error message for error (%lu)", error);
+ pcap_snprintf(p, errbuflen_remaining,
+ "Couldn't get error message for error (%lu)", errnum);
return;
}
- /*
- * "FormatMessage()" "helpfully" sticks CR/LF at the end of the
- * message. Get rid of it.
- *
- * XXX - still true with FORMAT_MESSAGE_MAX_WIDTH_MASK?
- */
- errlen = strlen(errbuf);
- if (errlen >= 2 &&
- errbuf[errlen - 2] == '\r' && errbuf[errlen - 1] == '\n') {
- errbuf[errlen - 2] = '\0';
- errbuf[errlen - 1] = '\0';
- }
- p = strchr(errbuf, '\0');
- pcap_snprintf(p, PCAP_ERRBUF_SIZE+1-(p-errbuf), " (%lu)", error);
+ pcap_snprintf(p, errbuflen_remaining, "%s (%lu)", win32_errbuf, errnum);
}
#endif