/* * differences to evil_format_message(): * - shorter string * - no newline * - fallback to error code if format fails */ char * _efl_net_windows_error_msg_get(DWORD win32err) { LPTSTR msg; char *str; char *disp; int len, reqlen; if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, win32err, 0, /* Default language */ (LPTSTR)&msg, 0, NULL)) goto fallback; #ifdef UNICODE str = evil_wchar_to_char(msg); #else str = msg; #endif /* UNICODE */ len = strlen(str); if ((len > 0) && (str[len - 1] == '\n')) str[--len] = '\0'; if ((len > 0) && (str[len - 1] == '\r')) str[--len] = '\0'; if ((len > 0) && (str[len - 1] == '.')) str[--len] = '\0'; reqlen = snprintf("", 0, "%lu(%s)", win32err, str); if (reqlen < 1) goto error; disp = malloc(reqlen + 1); if (!disp) goto error; snprintf(disp, reqlen + 1, "%lu(%s)", win32err, str); #ifdef UNICODE free(str); #endif /* UNICODE */ LocalFree(msg); return disp; error: #ifdef UNICODE free(str); #endif /* UNICODE */ LocalFree(msg); fallback: { char buf[64]; snprintf(buf, sizeof(buf), "%ld", win32err); return strdup(buf); } }
char * evil_format_message(long err) { LPTSTR msg; char *str; char *disp; if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, /* Default language */ (LPTSTR)&msg, 0, NULL)) { char buf[4096]; snprintf(buf, 4096, "FormatMessage failed with error %ld\n", GetLastError()); return strdup(buf); } #ifdef UNICODE str = evil_wchar_to_char(msg); #else str = msg; #endif /* UNICODE */ disp = (char *)malloc((strlen(str) + strlen("(00000) ") + 1) * sizeof(char)); if (!disp) { LocalFree(msg); return NULL; } snprintf(disp, strlen(str) + strlen("(00000) ") + 1, "(%5ld) %s", err, str); #ifdef UNICODE free(str); #endif /* UNICODE */ LocalFree(msg); return disp; }