Skip to content
Advertisement

Linux. Not printing to file

i’m just coding module for HLDS server extension metamod. I wrote a simple utility function for writing logs in format %LOGNAME%_%DATE%.log In windows that function is working fine, but in linux it create file but write nothing. First I try to search information about that, but I do not found a solution. I try to fflush file handle, set buffer to _IONBF mode, but nothing is helping. Thank you very much for reading this and helping me with that problem.

void UTIL_LogToFile(char* szFileName, const char *fmt, ...)
{
va_list     argptr;
va_start ( argptr, fmt );
vsnprintf ( g_szLogString, sizeof(g_szLogString), fmt, argptr );
va_end   ( argptr );

char* szFilePath = new char[strlen(GlobalVariables::g_szDLLDirPath) + 12 + 30 + 1];
char* szLogFile = get_timestring("_%Y%m%d.log");
sprintf(szFilePath, "%slogs/%s%s", (GlobalVariables::g_szDLLDirPath), szFileName, szLogFile);
FILE* hFile = fopen(szFilePath, "a+");
delete[] szFilePath;
delete[] szLogFile;
if(hFile == NULL)
{
    char szError[256];
    sprintf(szError, "Error fopen: %sn", strerror(errno));
    SERVER_PRINT(szError);
    clearerr(hFile);
    return;
}

fprintf(hFile, g_szLogString);
if(ferror(hFile))
{
    char szError[256];
    sprintf(szError, "Error fprintf: %sn", strerror(errno));
    SERVER_PRINT(szError);
    clearerr(hFile);
    return;
}
fclose(hFile);

}

Advertisement

Answer

You should only check errno if and only if the previous function failed.

If the previous call didn’t fail the value of errno is undefined.

So to properly check for errors you must first check if the fopen call returned a null pointer:

FILE* hFile = fopen(szFilePath, "a+");
if (hFile == nullptr)
{
    perror(szFilePath);
    return;
}
Advertisement